chore: sync infra docs and coverage
This commit is contained in:
		
							
								
								
									
										506
									
								
								frontend/coverage/clover.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										506
									
								
								frontend/coverage/clover.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,506 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <coverage generated="1760672476421" clover="3.2.0"> | ||||
|   <project timestamp="1760672476421" name="All files"> | ||||
|     <metrics statements="431" coveredstatements="85" conditionals="349" coveredconditionals="27" methods="126" coveredmethods="16" elements="906" coveredelements="128" complexity="0" loc="431" ncloc="431" packages="5" files="18" classes="18"/> | ||||
|     <package name="src"> | ||||
|       <metrics statements="14" coveredstatements="4" conditionals="13" coveredconditionals="2" methods="3" coveredmethods="2"/> | ||||
|       <file name="App.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/App.js"> | ||||
|         <metrics statements="12" coveredstatements="4" conditionals="13" coveredconditionals="2" methods="3" coveredmethods="2"/> | ||||
|         <line num="21" count="1" type="stmt"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="27" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="35" count="0" type="stmt"/> | ||||
|         <line num="38" count="0" type="cond" truecount="0" falsecount="4"/> | ||||
|         <line num="39" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="46" count="1" type="stmt"/> | ||||
|         <line num="48" count="1" type="stmt"/> | ||||
|         <line num="122" count="1" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="index.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/index.js"> | ||||
|         <metrics statements="2" coveredstatements="0" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/> | ||||
|         <line num="7" count="0" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|       </file> | ||||
|     </package> | ||||
|     <package name="src.components"> | ||||
|       <metrics statements="17" coveredstatements="13" conditionals="6" coveredconditionals="5" methods="8" coveredmethods="4"/> | ||||
|       <file name="Layout.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/components/Layout.js"> | ||||
|         <metrics statements="17" coveredstatements="13" conditionals="6" coveredconditionals="5" methods="8" coveredmethods="4"/> | ||||
|         <line num="17" count="2" type="stmt"/> | ||||
|         <line num="18" count="3" type="stmt"/> | ||||
|         <line num="19" count="3" type="stmt"/> | ||||
|         <line num="20" count="3" type="stmt"/> | ||||
|         <line num="22" count="3" type="stmt"/> | ||||
|         <line num="31" count="3" type="stmt"/> | ||||
|         <line num="32" count="18" type="stmt"/> | ||||
|         <line num="35" count="3" type="stmt"/> | ||||
|         <line num="36" count="0" type="stmt"/> | ||||
|         <line num="39" count="3" type="stmt"/> | ||||
|         <line num="43" count="0" type="stmt"/> | ||||
|         <line num="49" count="0" type="stmt"/> | ||||
|         <line num="60" count="12" type="stmt"/> | ||||
|         <line num="61" count="12" type="stmt"/> | ||||
|         <line num="90" count="12" type="stmt"/> | ||||
|         <line num="91" count="12" type="stmt"/> | ||||
|         <line num="131" count="0" type="stmt"/> | ||||
|       </file> | ||||
|     </package> | ||||
|     <package name="src.contexts"> | ||||
|       <metrics statements="57" coveredstatements="35" conditionals="8" coveredconditionals="3" methods="7" coveredmethods="5"/> | ||||
|       <file name="AuthContext.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/contexts/AuthContext.js"> | ||||
|         <metrics statements="57" coveredstatements="35" conditionals="8" coveredconditionals="3" methods="7" coveredmethods="5"/> | ||||
|         <line num="5" count="1" type="stmt"/> | ||||
|         <line num="7" count="1" type="stmt"/> | ||||
|         <line num="8" count="9" type="stmt"/> | ||||
|         <line num="9" count="9" type="cond" truecount="1" falsecount="1"/> | ||||
|         <line num="10" count="0" type="stmt"/> | ||||
|         <line num="12" count="9" type="stmt"/> | ||||
|         <line num="15" count="1" type="stmt"/> | ||||
|         <line num="16" count="9" type="stmt"/> | ||||
|         <line num="17" count="9" type="stmt"/> | ||||
|         <line num="19" count="9" type="stmt"/> | ||||
|         <line num="20" count="3" type="stmt"/> | ||||
|         <line num="21" count="3" type="cond" truecount="1" falsecount="1"/> | ||||
|         <line num="22" count="0" type="stmt"/> | ||||
|         <line num="23" count="0" type="stmt"/> | ||||
|         <line num="25" count="3" type="stmt"/> | ||||
|         <line num="29" count="9" type="stmt"/> | ||||
|         <line num="30" count="0" type="stmt"/> | ||||
|         <line num="31" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|         <line num="35" count="0" type="stmt"/> | ||||
|         <line num="36" count="0" type="stmt"/> | ||||
|         <line num="38" count="0" type="stmt"/> | ||||
|         <line num="42" count="9" type="stmt"/> | ||||
|         <line num="43" count="3" type="stmt"/> | ||||
|         <line num="44" count="3" type="stmt"/> | ||||
|         <line num="45" count="2" type="stmt"/> | ||||
|         <line num="47" count="2" type="stmt"/> | ||||
|         <line num="48" count="2" type="stmt"/> | ||||
|         <line num="49" count="2" type="stmt"/> | ||||
|         <line num="51" count="2" type="stmt"/> | ||||
|         <line num="52" count="2" type="stmt"/> | ||||
|         <line num="54" count="1" type="cond" truecount="1" falsecount="1"/> | ||||
|         <line num="55" count="1" type="stmt"/> | ||||
|         <line num="56" count="1" type="stmt"/> | ||||
|         <line num="60" count="9" type="stmt"/> | ||||
|         <line num="61" count="0" type="stmt"/> | ||||
|         <line num="62" count="0" type="stmt"/> | ||||
|         <line num="63" count="0" type="stmt"/> | ||||
|         <line num="65" count="0" type="stmt"/> | ||||
|         <line num="66" count="0" type="stmt"/> | ||||
|         <line num="67" count="0" type="stmt"/> | ||||
|         <line num="69" count="0" type="stmt"/> | ||||
|         <line num="70" count="0" type="stmt"/> | ||||
|         <line num="72" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="73" count="0" type="stmt"/> | ||||
|         <line num="74" count="0" type="stmt"/> | ||||
|         <line num="78" count="9" type="stmt"/> | ||||
|         <line num="79" count="1" type="stmt"/> | ||||
|         <line num="80" count="1" type="stmt"/> | ||||
|         <line num="82" count="0" type="stmt"/> | ||||
|         <line num="84" count="1" type="stmt"/> | ||||
|         <line num="85" count="1" type="stmt"/> | ||||
|         <line num="86" count="1" type="stmt"/> | ||||
|         <line num="87" count="1" type="stmt"/> | ||||
|         <line num="91" count="9" type="stmt"/> | ||||
|         <line num="100" count="9" type="stmt"/> | ||||
|       </file> | ||||
|     </package> | ||||
|     <package name="src.lib"> | ||||
|       <metrics statements="4" coveredstatements="0" conditionals="4" coveredconditionals="0" methods="0" coveredmethods="0"/> | ||||
|       <file name="configureAxios.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/lib/configureAxios.js"> | ||||
|         <metrics statements="4" coveredstatements="0" conditionals="4" coveredconditionals="0" methods="0" coveredmethods="0"/> | ||||
|         <line num="3" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="5" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="6" count="0" type="stmt"/> | ||||
|         <line num="9" count="0" type="stmt"/> | ||||
|       </file> | ||||
|     </package> | ||||
|     <package name="src.pages"> | ||||
|       <metrics statements="339" coveredstatements="33" conditionals="318" coveredconditionals="17" methods="108" coveredmethods="5"/> | ||||
|       <file name="Applications.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Applications.js"> | ||||
|         <metrics statements="27" coveredstatements="1" conditionals="23" coveredconditionals="0" methods="5" coveredmethods="0"/> | ||||
|         <line num="6" count="1" type="stmt"/> | ||||
|         <line num="7" count="0" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="9" count="0" type="stmt"/> | ||||
|         <line num="12" count="0" type="stmt"/> | ||||
|         <line num="13" count="0" type="cond" truecount="0" falsecount="7"/> | ||||
|         <line num="14" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="17" count="0" type="stmt"/> | ||||
|         <line num="18" count="0" type="stmt"/> | ||||
|         <line num="19" count="0" type="stmt"/> | ||||
|         <line num="20" count="0" type="stmt"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="25" count="0" type="cond" truecount="0" falsecount="8"/> | ||||
|         <line num="26" count="0" type="stmt"/> | ||||
|         <line num="27" count="0" type="stmt"/> | ||||
|         <line num="28" count="0" type="stmt"/> | ||||
|         <line num="29" count="0" type="stmt"/> | ||||
|         <line num="30" count="0" type="stmt"/> | ||||
|         <line num="31" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="stmt"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|         <line num="37" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="38" count="0" type="stmt"/> | ||||
|         <line num="45" count="0" type="stmt"/> | ||||
|         <line num="57" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="CandidateDetails.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/CandidateDetails.js"> | ||||
|         <metrics statements="11" coveredstatements="1" conditionals="23" coveredconditionals="0" methods="3" coveredmethods="0"/> | ||||
|         <line num="7" count="1" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="10" count="0" type="stmt"/> | ||||
|         <line num="11" count="0" type="stmt"/> | ||||
|         <line num="12" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="23" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|         <line num="112" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Candidates.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Candidates.js"> | ||||
|         <metrics statements="26" coveredstatements="1" conditionals="28" coveredconditionals="0" methods="8" coveredmethods="0"/> | ||||
|         <line num="7" count="1" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="17" count="0" type="stmt"/> | ||||
|         <line num="18" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="21" count="0" type="stmt"/> | ||||
|         <line num="22" count="0" type="stmt"/> | ||||
|         <line num="25" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="stmt"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|         <line num="37" count="0" type="stmt"/> | ||||
|         <line num="38" count="0" type="cond" truecount="0" falsecount="6"/> | ||||
|         <line num="39" count="0" type="stmt"/> | ||||
|         <line num="40" count="0" type="stmt"/> | ||||
|         <line num="41" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="43" count="0" type="stmt"/> | ||||
|         <line num="44" count="0" type="stmt"/> | ||||
|         <line num="48" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="49" count="0" type="stmt"/> | ||||
|         <line num="56" count="0" type="stmt"/> | ||||
|         <line num="162" count="0" type="stmt"/> | ||||
|         <line num="205" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="CreateJob.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/CreateJob.js"> | ||||
|         <metrics statements="47" coveredstatements="1" conditionals="22" coveredconditionals="0" methods="37" coveredmethods="0"/> | ||||
|         <line num="8" count="1" type="stmt"/> | ||||
|         <line num="9" count="0" type="stmt"/> | ||||
|         <line num="10" count="0" type="stmt"/> | ||||
|         <line num="27" count="0" type="stmt"/> | ||||
|         <line num="28" count="0" type="stmt"/> | ||||
|         <line num="29" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="stmt"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|         <line num="36" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="40" count="0" type="stmt"/> | ||||
|         <line num="41" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="48" count="0" type="stmt"/> | ||||
|         <line num="49" count="0" type="stmt"/> | ||||
|         <line num="51" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="55" count="0" type="stmt"/> | ||||
|         <line num="56" count="0" type="stmt"/> | ||||
|         <line num="62" count="0" type="stmt"/> | ||||
|         <line num="63" count="0" type="stmt"/> | ||||
|         <line num="65" count="0" type="stmt"/> | ||||
|         <line num="69" count="0" type="stmt"/> | ||||
|         <line num="70" count="0" type="stmt"/> | ||||
|         <line num="73" count="0" type="stmt"/> | ||||
|         <line num="75" count="0" type="stmt"/> | ||||
|         <line num="76" count="0" type="stmt"/> | ||||
|         <line num="77" count="0" type="stmt"/> | ||||
|         <line num="78" count="0" type="stmt"/> | ||||
|         <line num="84" count="0" type="stmt"/> | ||||
|         <line num="87" count="0" type="stmt"/> | ||||
|         <line num="91" count="0" type="stmt"/> | ||||
|         <line num="191" count="0" type="stmt"/> | ||||
|         <line num="196" count="0" type="stmt"/> | ||||
|         <line num="202" count="0" type="stmt"/> | ||||
|         <line num="212" count="0" type="stmt"/> | ||||
|         <line num="225" count="0" type="stmt"/> | ||||
|         <line num="230" count="0" type="stmt"/> | ||||
|         <line num="236" count="0" type="stmt"/> | ||||
|         <line num="246" count="0" type="stmt"/> | ||||
|         <line num="373" count="0" type="stmt"/> | ||||
|         <line num="378" count="0" type="stmt"/> | ||||
|         <line num="384" count="0" type="stmt"/> | ||||
|         <line num="394" count="0" type="stmt"/> | ||||
|         <line num="407" count="0" type="stmt"/> | ||||
|         <line num="412" count="0" type="stmt"/> | ||||
|         <line num="418" count="0" type="stmt"/> | ||||
|         <line num="428" count="0" type="stmt"/> | ||||
|         <line num="443" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Dashboard.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Dashboard.js"> | ||||
|         <metrics statements="25" coveredstatements="1" conditionals="47" coveredconditionals="0" methods="8" coveredmethods="0"/> | ||||
|         <line num="15" count="1" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="18" count="0" type="stmt"/> | ||||
|         <line num="19" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|         <line num="35" count="0" type="stmt"/> | ||||
|         <line num="36" count="0" type="stmt"/> | ||||
|         <line num="39" count="0" type="stmt"/> | ||||
|         <line num="40" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="41" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="44" count="0" type="stmt"/> | ||||
|         <line num="47" count="0" type="stmt"/> | ||||
|         <line num="74" count="0" type="stmt"/> | ||||
|         <line num="75" count="0" type="stmt"/> | ||||
|         <line num="76" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="77" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="78" count="0" type="stmt"/> | ||||
|         <line num="81" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="82" count="0" type="stmt"/> | ||||
|         <line num="93" count="0" type="stmt"/> | ||||
|         <line num="107" count="0" type="stmt"/> | ||||
|         <line num="142" count="0" type="stmt"/> | ||||
|         <line num="175" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="EmployerDetails.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/EmployerDetails.js"> | ||||
|         <metrics statements="10" coveredstatements="1" conditionals="16" coveredconditionals="0" methods="2" coveredmethods="0"/> | ||||
|         <line num="7" count="1" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="10" count="0" type="stmt"/> | ||||
|         <line num="11" count="0" type="stmt"/> | ||||
|         <line num="12" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="23" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Employers.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Employers.js"> | ||||
|         <metrics statements="8" coveredstatements="1" conditionals="12" coveredconditionals="0" methods="3" coveredmethods="0"/> | ||||
|         <line num="7" count="1" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="9" count="0" type="stmt"/> | ||||
|         <line num="10" count="0" type="stmt"/> | ||||
|         <line num="13" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="14" count="0" type="stmt"/> | ||||
|         <line num="21" count="0" type="stmt"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="JobDetails.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/JobDetails.js"> | ||||
|         <metrics statements="34" coveredstatements="1" conditionals="51" coveredconditionals="0" methods="9" coveredmethods="0"/> | ||||
|         <line num="9" count="1" type="stmt"/> | ||||
|         <line num="10" count="0" type="stmt"/> | ||||
|         <line num="11" count="0" type="stmt"/> | ||||
|         <line num="12" count="0" type="stmt"/> | ||||
|         <line num="13" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="17" count="0" type="stmt"/> | ||||
|         <line num="20" count="0" type="stmt"/> | ||||
|         <line num="21" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="22" count="0" type="stmt"/> | ||||
|         <line num="23" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="stmt"/> | ||||
|         <line num="27" count="0" type="stmt"/> | ||||
|         <line num="28" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="stmt"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|         <line num="35" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="37" count="0" type="stmt"/> | ||||
|         <line num="41" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="49" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="50" count="0" type="stmt"/> | ||||
|         <line num="65" count="0" type="cond" truecount="0" falsecount="1"/> | ||||
|         <line num="66" count="0" type="cond" truecount="0" falsecount="4"/> | ||||
|         <line num="67" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="68" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="69" count="0" type="stmt"/> | ||||
|         <line num="72" count="0" type="stmt"/> | ||||
|         <line num="117" count="0" type="stmt"/> | ||||
|         <line num="131" count="0" type="stmt"/> | ||||
|         <line num="145" count="0" type="stmt"/> | ||||
|         <line num="164" count="0" type="stmt"/> | ||||
|         <line num="273" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Jobs.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Jobs.js"> | ||||
|         <metrics statements="33" coveredstatements="21" conditionals="36" coveredconditionals="17" methods="10" coveredmethods="5"/> | ||||
|         <line num="8" count="2" type="stmt"/> | ||||
|         <line num="9" count="3" type="stmt"/> | ||||
|         <line num="10" count="3" type="stmt"/> | ||||
|         <line num="23" count="3" type="stmt"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="25" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="29" count="0" type="stmt"/> | ||||
|         <line num="30" count="0" type="stmt"/> | ||||
|         <line num="33" count="3" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|         <line num="40" count="3" type="stmt"/> | ||||
|         <line num="41" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="45" count="3" type="cond" truecount="1" falsecount="0"/> | ||||
|         <line num="46" count="1" type="cond" truecount="2" falsecount="2"/> | ||||
|         <line num="47" count="1" type="cond" truecount="1" falsecount="1"/> | ||||
|         <line num="48" count="1" type="cond" truecount="1" falsecount="1"/> | ||||
|         <line num="49" count="1" type="stmt"/> | ||||
|         <line num="52" count="3" type="stmt"/> | ||||
|         <line num="53" count="1" type="cond" truecount="1" falsecount="3"/> | ||||
|         <line num="54" count="1" type="stmt"/> | ||||
|         <line num="55" count="0" type="stmt"/> | ||||
|         <line num="56" count="0" type="stmt"/> | ||||
|         <line num="57" count="0" type="stmt"/> | ||||
|         <line num="61" count="3" type="cond" truecount="2" falsecount="0"/> | ||||
|         <line num="62" count="1" type="stmt"/> | ||||
|         <line num="73" count="2" type="cond" truecount="2" falsecount="0"/> | ||||
|         <line num="74" count="1" type="stmt"/> | ||||
|         <line num="80" count="1" type="stmt"/> | ||||
|         <line num="89" count="1" type="stmt"/> | ||||
|         <line num="210" count="1" type="stmt"/> | ||||
|         <line num="252" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Login.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Login.js"> | ||||
|         <metrics statements="15" coveredstatements="1" conditionals="8" coveredconditionals="0" methods="4" coveredmethods="0"/> | ||||
|         <line num="6" count="1" type="stmt"/> | ||||
|         <line num="7" count="0" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="12" count="0" type="stmt"/> | ||||
|         <line num="13" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="22" count="0" type="stmt"/> | ||||
|         <line num="23" count="0" type="stmt"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="stmt"/> | ||||
|         <line num="28" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="29" count="0" type="stmt"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|         <line num="96" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Profile.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Profile.js"> | ||||
|         <metrics statements="16" coveredstatements="1" conditionals="8" coveredconditionals="0" methods="3" coveredmethods="0"/> | ||||
|         <line num="6" count="1" type="stmt"/> | ||||
|         <line num="7" count="0" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="13" count="0" type="stmt"/> | ||||
|         <line num="15" count="0" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="22" count="0" type="stmt"/> | ||||
|         <line num="23" count="0" type="stmt"/> | ||||
|         <line num="24" count="0" type="stmt"/> | ||||
|         <line num="26" count="0" type="stmt"/> | ||||
|         <line num="27" count="0" type="stmt"/> | ||||
|         <line num="36" count="0" type="stmt"/> | ||||
|         <line num="37" count="0" type="stmt"/> | ||||
|         <line num="39" count="0" type="stmt"/> | ||||
|         <line num="41" count="0" type="stmt"/> | ||||
|         <line num="45" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Register.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Register.js"> | ||||
|         <metrics statements="23" coveredstatements="1" conditionals="16" coveredconditionals="0" methods="5" coveredmethods="0"/> | ||||
|         <line num="6" count="1" type="stmt"/> | ||||
|         <line num="7" count="0" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="16" count="0" type="stmt"/> | ||||
|         <line num="17" count="0" type="stmt"/> | ||||
|         <line num="18" count="0" type="stmt"/> | ||||
|         <line num="20" count="0" type="stmt"/> | ||||
|         <line num="21" count="0" type="stmt"/> | ||||
|         <line num="27" count="0" type="stmt"/> | ||||
|         <line num="28" count="0" type="stmt"/> | ||||
|         <line num="30" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="31" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="stmt"/> | ||||
|         <line num="35" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="36" count="0" type="stmt"/> | ||||
|         <line num="37" count="0" type="stmt"/> | ||||
|         <line num="40" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="stmt"/> | ||||
|         <line num="50" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="51" count="0" type="stmt"/> | ||||
|         <line num="55" count="0" type="stmt"/> | ||||
|         <line num="179" count="0" type="stmt"/> | ||||
|         <line num="214" count="0" type="stmt"/> | ||||
|       </file> | ||||
|       <file name="Resumes.js" path="/home/localuser/RalfAIDemo/MerchantsOfHope-SupplyANdDemandPortal/frontend/src/pages/Resumes.js"> | ||||
|         <metrics statements="64" coveredstatements="1" conditionals="28" coveredconditionals="0" methods="11" coveredmethods="0"/> | ||||
|         <line num="7" count="1" type="stmt"/> | ||||
|         <line num="8" count="0" type="stmt"/> | ||||
|         <line num="9" count="0" type="stmt"/> | ||||
|         <line num="11" count="0" type="stmt"/> | ||||
|         <line num="14" count="0" type="stmt"/> | ||||
|         <line num="17" count="0" type="stmt"/> | ||||
|         <line num="18" count="0" type="stmt"/> | ||||
|         <line num="19" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="20" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="21" count="0" type="stmt"/> | ||||
|         <line num="22" count="0" type="stmt"/> | ||||
|         <line num="25" count="0" type="stmt"/> | ||||
|         <line num="32" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="33" count="0" type="stmt"/> | ||||
|         <line num="34" count="0" type="stmt"/> | ||||
|         <line num="37" count="0" type="stmt"/> | ||||
|         <line num="41" count="0" type="stmt"/> | ||||
|         <line num="42" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="43" count="0" type="stmt"/> | ||||
|         <line num="44" count="0" type="stmt"/> | ||||
|         <line num="47" count="0" type="stmt"/> | ||||
|         <line num="48" count="0" type="stmt"/> | ||||
|         <line num="49" count="0" type="stmt"/> | ||||
|         <line num="50" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="52" count="0" type="stmt"/> | ||||
|         <line num="53" count="0" type="stmt"/> | ||||
|         <line num="59" count="0" type="stmt"/> | ||||
|         <line num="60" count="0" type="stmt"/> | ||||
|         <line num="61" count="0" type="stmt"/> | ||||
|         <line num="63" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="65" count="0" type="stmt"/> | ||||
|         <line num="69" count="0" type="stmt"/> | ||||
|         <line num="70" count="0" type="stmt"/> | ||||
|         <line num="71" count="0" type="stmt"/> | ||||
|         <line num="75" count="0" type="stmt"/> | ||||
|         <line num="76" count="0" type="stmt"/> | ||||
|         <line num="77" count="0" type="stmt"/> | ||||
|         <line num="78" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="79" count="0" type="stmt"/> | ||||
|         <line num="80" count="0" type="stmt"/> | ||||
|         <line num="81" count="0" type="stmt"/> | ||||
|         <line num="82" count="0" type="stmt"/> | ||||
|         <line num="84" count="0" type="stmt"/> | ||||
|         <line num="88" count="0" type="stmt"/> | ||||
|         <line num="89" count="0" type="stmt"/> | ||||
|         <line num="90" count="0" type="stmt"/> | ||||
|         <line num="91" count="0" type="stmt"/> | ||||
|         <line num="92" count="0" type="stmt"/> | ||||
|         <line num="94" count="0" type="stmt"/> | ||||
|         <line num="98" count="0" type="stmt"/> | ||||
|         <line num="99" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="100" count="0" type="stmt"/> | ||||
|         <line num="103" count="0" type="stmt"/> | ||||
|         <line num="104" count="0" type="stmt"/> | ||||
|         <line num="105" count="0" type="stmt"/> | ||||
|         <line num="106" count="0" type="stmt"/> | ||||
|         <line num="108" count="0" type="stmt"/> | ||||
|         <line num="112" count="0" type="cond" truecount="0" falsecount="2"/> | ||||
|         <line num="113" count="0" type="stmt"/> | ||||
|         <line num="120" count="0" type="stmt"/> | ||||
|         <line num="177" count="0" type="stmt"/> | ||||
|         <line num="204" count="0" type="stmt"/> | ||||
|         <line num="212" count="0" type="stmt"/> | ||||
|         <line num="220" count="0" type="stmt"/> | ||||
|       </file> | ||||
|     </package> | ||||
|   </project> | ||||
| </coverage> | ||||
							
								
								
									
										19
									
								
								frontend/coverage/coverage-final.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								frontend/coverage/coverage-final.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										224
									
								
								frontend/coverage/lcov-report/base.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								frontend/coverage/lcov-report/base.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,224 @@ | ||||
| body, html { | ||||
|   margin:0; padding: 0; | ||||
|   height: 100%; | ||||
| } | ||||
| body { | ||||
|     font-family: Helvetica Neue, Helvetica, Arial; | ||||
|     font-size: 14px; | ||||
|     color:#333; | ||||
| } | ||||
| .small { font-size: 12px; } | ||||
| *, *:after, *:before { | ||||
|   -webkit-box-sizing:border-box; | ||||
|      -moz-box-sizing:border-box; | ||||
|           box-sizing:border-box; | ||||
|   } | ||||
| h1 { font-size: 20px; margin: 0;} | ||||
| h2 { font-size: 14px; } | ||||
| pre { | ||||
|     font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
|     -moz-tab-size: 2; | ||||
|     -o-tab-size:  2; | ||||
|     tab-size: 2; | ||||
| } | ||||
| a { color:#0074D9; text-decoration:none; } | ||||
| a:hover { text-decoration:underline; } | ||||
| .strong { font-weight: bold; } | ||||
| .space-top1 { padding: 10px 0 0 0; } | ||||
| .pad2y { padding: 20px 0; } | ||||
| .pad1y { padding: 10px 0; } | ||||
| .pad2x { padding: 0 20px; } | ||||
| .pad2 { padding: 20px; } | ||||
| .pad1 { padding: 10px; } | ||||
| .space-left2 { padding-left:55px; } | ||||
| .space-right2 { padding-right:20px; } | ||||
| .center { text-align:center; } | ||||
| .clearfix { display:block; } | ||||
| .clearfix:after { | ||||
|   content:''; | ||||
|   display:block; | ||||
|   height:0; | ||||
|   clear:both; | ||||
|   visibility:hidden; | ||||
|   } | ||||
| .fl { float: left; } | ||||
| @media only screen and (max-width:640px) { | ||||
|   .col3 { width:100%; max-width:100%; } | ||||
|   .hide-mobile { display:none!important; } | ||||
| } | ||||
|  | ||||
| .quiet { | ||||
|   color: #7f7f7f; | ||||
|   color: rgba(0,0,0,0.5); | ||||
| } | ||||
| .quiet a { opacity: 0.7; } | ||||
|  | ||||
| .fraction { | ||||
|   font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; | ||||
|   font-size: 10px; | ||||
|   color: #555; | ||||
|   background: #E8E8E8; | ||||
|   padding: 4px 5px; | ||||
|   border-radius: 3px; | ||||
|   vertical-align: middle; | ||||
| } | ||||
|  | ||||
| div.path a:link, div.path a:visited { color: #333; } | ||||
| table.coverage { | ||||
|   border-collapse: collapse; | ||||
|   margin: 10px 0 0 0; | ||||
|   padding: 0; | ||||
| } | ||||
|  | ||||
| table.coverage td { | ||||
|   margin: 0; | ||||
|   padding: 0; | ||||
|   vertical-align: top; | ||||
| } | ||||
| table.coverage td.line-count { | ||||
|     text-align: right; | ||||
|     padding: 0 5px 0 20px; | ||||
| } | ||||
| table.coverage td.line-coverage { | ||||
|     text-align: right; | ||||
|     padding-right: 10px; | ||||
|     min-width:20px; | ||||
| } | ||||
|  | ||||
| table.coverage td span.cline-any { | ||||
|     display: inline-block; | ||||
|     padding: 0 5px; | ||||
|     width: 100%; | ||||
| } | ||||
| .missing-if-branch { | ||||
|     display: inline-block; | ||||
|     margin-right: 5px; | ||||
|     border-radius: 3px; | ||||
|     position: relative; | ||||
|     padding: 0 4px; | ||||
|     background: #333; | ||||
|     color: yellow; | ||||
| } | ||||
|  | ||||
| .skip-if-branch { | ||||
|     display: none; | ||||
|     margin-right: 10px; | ||||
|     position: relative; | ||||
|     padding: 0 4px; | ||||
|     background: #ccc; | ||||
|     color: white; | ||||
| } | ||||
| .missing-if-branch .typ, .skip-if-branch .typ { | ||||
|     color: inherit !important; | ||||
| } | ||||
| .coverage-summary { | ||||
|   border-collapse: collapse; | ||||
|   width: 100%; | ||||
| } | ||||
| .coverage-summary tr { border-bottom: 1px solid #bbb; } | ||||
| .keyline-all { border: 1px solid #ddd; } | ||||
| .coverage-summary td, .coverage-summary th { padding: 10px; } | ||||
| .coverage-summary tbody { border: 1px solid #bbb; } | ||||
| .coverage-summary td { border-right: 1px solid #bbb; } | ||||
| .coverage-summary td:last-child { border-right: none; } | ||||
| .coverage-summary th { | ||||
|   text-align: left; | ||||
|   font-weight: normal; | ||||
|   white-space: nowrap; | ||||
| } | ||||
| .coverage-summary th.file { border-right: none !important; } | ||||
| .coverage-summary th.pct { } | ||||
| .coverage-summary th.pic, | ||||
| .coverage-summary th.abs, | ||||
| .coverage-summary td.pct, | ||||
| .coverage-summary td.abs { text-align: right; } | ||||
| .coverage-summary td.file { white-space: nowrap;  } | ||||
| .coverage-summary td.pic { min-width: 120px !important;  } | ||||
| .coverage-summary tfoot td { } | ||||
|  | ||||
| .coverage-summary .sorter { | ||||
|     height: 10px; | ||||
|     width: 7px; | ||||
|     display: inline-block; | ||||
|     margin-left: 0.5em; | ||||
|     background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; | ||||
| } | ||||
| .coverage-summary .sorted .sorter { | ||||
|     background-position: 0 -20px; | ||||
| } | ||||
| .coverage-summary .sorted-desc .sorter { | ||||
|     background-position: 0 -10px; | ||||
| } | ||||
| .status-line {  height: 10px; } | ||||
| /* yellow */ | ||||
| .cbranch-no { background: yellow !important; color: #111; } | ||||
| /* dark red */ | ||||
| .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } | ||||
| .low .chart { border:1px solid #C21F39 } | ||||
| .highlighted, | ||||
| .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ | ||||
|   background: #C21F39 !important; | ||||
| } | ||||
| /* medium red */ | ||||
| .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } | ||||
| /* light red */ | ||||
| .low, .cline-no { background:#FCE1E5 } | ||||
| /* light green */ | ||||
| .high, .cline-yes { background:rgb(230,245,208) } | ||||
| /* medium green */ | ||||
| .cstat-yes { background:rgb(161,215,106) } | ||||
| /* dark green */ | ||||
| .status-line.high, .high .cover-fill { background:rgb(77,146,33) } | ||||
| .high .chart { border:1px solid rgb(77,146,33) } | ||||
| /* dark yellow (gold) */ | ||||
| .status-line.medium, .medium .cover-fill { background: #f9cd0b; } | ||||
| .medium .chart { border:1px solid #f9cd0b; } | ||||
| /* light yellow */ | ||||
| .medium { background: #fff4c2; } | ||||
|  | ||||
| .cstat-skip { background: #ddd; color: #111; } | ||||
| .fstat-skip { background: #ddd; color: #111 !important; } | ||||
| .cbranch-skip { background: #ddd !important; color: #111; } | ||||
|  | ||||
| span.cline-neutral { background: #eaeaea; } | ||||
|  | ||||
| .coverage-summary td.empty { | ||||
|     opacity: .5; | ||||
|     padding-top: 4px; | ||||
|     padding-bottom: 4px; | ||||
|     line-height: 1; | ||||
|     color: #888; | ||||
| } | ||||
|  | ||||
| .cover-fill, .cover-empty { | ||||
|   display:inline-block; | ||||
|   height: 12px; | ||||
| } | ||||
| .chart { | ||||
|   line-height: 0; | ||||
| } | ||||
| .cover-empty { | ||||
|     background: white; | ||||
| } | ||||
| .cover-full { | ||||
|     border-right: none !important; | ||||
| } | ||||
| pre.prettyprint { | ||||
|     border: none !important; | ||||
|     padding: 0 !important; | ||||
|     margin: 0 !important; | ||||
| } | ||||
| .com { color: #999 !important; } | ||||
| .ignore-none { color: #999; font-weight: normal; } | ||||
|  | ||||
| .wrapper { | ||||
|   min-height: 100%; | ||||
|   height: auto !important; | ||||
|   height: 100%; | ||||
|   margin: 0 auto -48px; | ||||
| } | ||||
| .footer, .push { | ||||
|   height: 48px; | ||||
| } | ||||
							
								
								
									
										87
									
								
								frontend/coverage/lcov-report/block-navigation.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								frontend/coverage/lcov-report/block-navigation.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,87 @@ | ||||
| /* eslint-disable */ | ||||
| var jumpToCode = (function init() { | ||||
|     // Classes of code we would like to highlight in the file view | ||||
|     var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; | ||||
|  | ||||
|     // Elements to highlight in the file listing view | ||||
|     var fileListingElements = ['td.pct.low']; | ||||
|  | ||||
|     // We don't want to select elements that are direct descendants of another match | ||||
|     var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` | ||||
|  | ||||
|     // Selector that finds elements on the page to which we can jump | ||||
|     var selector = | ||||
|         fileListingElements.join(', ') + | ||||
|         ', ' + | ||||
|         notSelector + | ||||
|         missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` | ||||
|  | ||||
|     // The NodeList of matching elements | ||||
|     var missingCoverageElements = document.querySelectorAll(selector); | ||||
|  | ||||
|     var currentIndex; | ||||
|  | ||||
|     function toggleClass(index) { | ||||
|         missingCoverageElements | ||||
|             .item(currentIndex) | ||||
|             .classList.remove('highlighted'); | ||||
|         missingCoverageElements.item(index).classList.add('highlighted'); | ||||
|     } | ||||
|  | ||||
|     function makeCurrent(index) { | ||||
|         toggleClass(index); | ||||
|         currentIndex = index; | ||||
|         missingCoverageElements.item(index).scrollIntoView({ | ||||
|             behavior: 'smooth', | ||||
|             block: 'center', | ||||
|             inline: 'center' | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     function goToPrevious() { | ||||
|         var nextIndex = 0; | ||||
|         if (typeof currentIndex !== 'number' || currentIndex === 0) { | ||||
|             nextIndex = missingCoverageElements.length - 1; | ||||
|         } else if (missingCoverageElements.length > 1) { | ||||
|             nextIndex = currentIndex - 1; | ||||
|         } | ||||
|  | ||||
|         makeCurrent(nextIndex); | ||||
|     } | ||||
|  | ||||
|     function goToNext() { | ||||
|         var nextIndex = 0; | ||||
|  | ||||
|         if ( | ||||
|             typeof currentIndex === 'number' && | ||||
|             currentIndex < missingCoverageElements.length - 1 | ||||
|         ) { | ||||
|             nextIndex = currentIndex + 1; | ||||
|         } | ||||
|  | ||||
|         makeCurrent(nextIndex); | ||||
|     } | ||||
|  | ||||
|     return function jump(event) { | ||||
|         if ( | ||||
|             document.getElementById('fileSearch') === document.activeElement && | ||||
|             document.activeElement != null | ||||
|         ) { | ||||
|             // if we're currently focused on the search input, we don't want to navigate | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         switch (event.which) { | ||||
|             case 78: // n | ||||
|             case 74: // j | ||||
|                 goToNext(); | ||||
|                 break; | ||||
|             case 66: // b | ||||
|             case 75: // k | ||||
|             case 80: // p | ||||
|                 goToPrevious(); | ||||
|                 break; | ||||
|         } | ||||
|     }; | ||||
| })(); | ||||
| window.addEventListener('keydown', jumpToCode); | ||||
							
								
								
									
										
											BIN
										
									
								
								frontend/coverage/lcov-report/favicon.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								frontend/coverage/lcov-report/favicon.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 445 B | 
							
								
								
									
										176
									
								
								frontend/coverage/lcov-report/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								frontend/coverage/lcov-report/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for All files</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="prettify.css" /> | ||||
|     <link rel="stylesheet" href="base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1>All files</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">19.1% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>85/445</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">7.73% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>27/349</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">12.69% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>16/126</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">19.72% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>85/431</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <div class="pad1"> | ||||
| <table class="coverage-summary"> | ||||
| <thead> | ||||
| <tr> | ||||
|    <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||||
|    <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||||
|    <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||||
|    <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||||
|    <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||||
|    <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||||
|    <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody><tr> | ||||
| 	<td class="file low" data-value="src"><a href="src/index.html">src</a></td> | ||||
| 	<td data-value="28.57" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 28%"></div><div class="cover-empty" style="width: 72%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="28.57" class="pct low">28.57%</td> | ||||
| 	<td data-value="14" class="abs low">4/14</td> | ||||
| 	<td data-value="15.38" class="pct low">15.38%</td> | ||||
| 	<td data-value="13" class="abs low">2/13</td> | ||||
| 	<td data-value="66.66" class="pct medium">66.66%</td> | ||||
| 	<td data-value="3" class="abs medium">2/3</td> | ||||
| 	<td data-value="28.57" class="pct low">28.57%</td> | ||||
| 	<td data-value="14" class="abs low">4/14</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file medium" data-value="src/components"><a href="src/components/index.html">src/components</a></td> | ||||
| 	<td data-value="76.47" class="pic medium"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 76%"></div><div class="cover-empty" style="width: 24%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="76.47" class="pct medium">76.47%</td> | ||||
| 	<td data-value="17" class="abs medium">13/17</td> | ||||
| 	<td data-value="83.33" class="pct high">83.33%</td> | ||||
| 	<td data-value="6" class="abs high">5/6</td> | ||||
| 	<td data-value="50" class="pct medium">50%</td> | ||||
| 	<td data-value="8" class="abs medium">4/8</td> | ||||
| 	<td data-value="76.47" class="pct medium">76.47%</td> | ||||
| 	<td data-value="17" class="abs medium">13/17</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file medium" data-value="src/contexts"><a href="src/contexts/index.html">src/contexts</a></td> | ||||
| 	<td data-value="61.4" class="pic medium"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 61%"></div><div class="cover-empty" style="width: 39%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="61.4" class="pct medium">61.4%</td> | ||||
| 	<td data-value="57" class="abs medium">35/57</td> | ||||
| 	<td data-value="37.5" class="pct low">37.5%</td> | ||||
| 	<td data-value="8" class="abs low">3/8</td> | ||||
| 	<td data-value="71.42" class="pct medium">71.42%</td> | ||||
| 	<td data-value="7" class="abs medium">5/7</td> | ||||
| 	<td data-value="61.4" class="pct medium">61.4%</td> | ||||
| 	<td data-value="57" class="abs medium">35/57</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="src/lib"><a href="src/lib/index.html">src/lib</a></td> | ||||
| 	<td data-value="0" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	<td data-value="100" class="pct high">100%</td> | ||||
| 	<td data-value="0" class="abs high">0/0</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="src/pages"><a href="src/pages/index.html">src/pages</a></td> | ||||
| 	<td data-value="9.34" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 9%"></div><div class="cover-empty" style="width: 91%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="9.34" class="pct low">9.34%</td> | ||||
| 	<td data-value="353" class="abs low">33/353</td> | ||||
| 	<td data-value="5.34" class="pct low">5.34%</td> | ||||
| 	<td data-value="318" class="abs low">17/318</td> | ||||
| 	<td data-value="4.62" class="pct low">4.62%</td> | ||||
| 	<td data-value="108" class="abs low">5/108</td> | ||||
| 	<td data-value="9.73" class="pct low">9.73%</td> | ||||
| 	<td data-value="339" class="abs low">33/339</td> | ||||
| 	</tr> | ||||
|  | ||||
| </tbody> | ||||
| </table> | ||||
| </div> | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="sorter.js"></script> | ||||
|         <script src="block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										1
									
								
								frontend/coverage/lcov-report/prettify.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								frontend/coverage/lcov-report/prettify.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} | ||||
							
								
								
									
										2
									
								
								frontend/coverage/lcov-report/prettify.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								frontend/coverage/lcov-report/prettify.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								frontend/coverage/lcov-report/sort-arrow-sprite.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								frontend/coverage/lcov-report/sort-arrow-sprite.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 138 B | 
							
								
								
									
										210
									
								
								frontend/coverage/lcov-report/sorter.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								frontend/coverage/lcov-report/sorter.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,210 @@ | ||||
| /* eslint-disable */ | ||||
| var addSorting = (function() { | ||||
|     'use strict'; | ||||
|     var cols, | ||||
|         currentSort = { | ||||
|             index: 0, | ||||
|             desc: false | ||||
|         }; | ||||
|  | ||||
|     // returns the summary table element | ||||
|     function getTable() { | ||||
|         return document.querySelector('.coverage-summary'); | ||||
|     } | ||||
|     // returns the thead element of the summary table | ||||
|     function getTableHeader() { | ||||
|         return getTable().querySelector('thead tr'); | ||||
|     } | ||||
|     // returns the tbody element of the summary table | ||||
|     function getTableBody() { | ||||
|         return getTable().querySelector('tbody'); | ||||
|     } | ||||
|     // returns the th element for nth column | ||||
|     function getNthColumn(n) { | ||||
|         return getTableHeader().querySelectorAll('th')[n]; | ||||
|     } | ||||
|  | ||||
|     function onFilterInput() { | ||||
|         const searchValue = document.getElementById('fileSearch').value; | ||||
|         const rows = document.getElementsByTagName('tbody')[0].children; | ||||
|  | ||||
|         // Try to create a RegExp from the searchValue. If it fails (invalid regex), | ||||
|         // it will be treated as a plain text search | ||||
|         let searchRegex; | ||||
|         try { | ||||
|             searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive | ||||
|         } catch (error) { | ||||
|             searchRegex = null; | ||||
|         } | ||||
|  | ||||
|         for (let i = 0; i < rows.length; i++) { | ||||
|             const row = rows[i]; | ||||
|             let isMatch = false; | ||||
|  | ||||
|             if (searchRegex) { | ||||
|                 // If a valid regex was created, use it for matching | ||||
|                 isMatch = searchRegex.test(row.textContent); | ||||
|             } else { | ||||
|                 // Otherwise, fall back to the original plain text search | ||||
|                 isMatch = row.textContent | ||||
|                     .toLowerCase() | ||||
|                     .includes(searchValue.toLowerCase()); | ||||
|             } | ||||
|  | ||||
|             row.style.display = isMatch ? '' : 'none'; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // loads the search box | ||||
|     function addSearchBox() { | ||||
|         var template = document.getElementById('filterTemplate'); | ||||
|         var templateClone = template.content.cloneNode(true); | ||||
|         templateClone.getElementById('fileSearch').oninput = onFilterInput; | ||||
|         template.parentElement.appendChild(templateClone); | ||||
|     } | ||||
|  | ||||
|     // loads all columns | ||||
|     function loadColumns() { | ||||
|         var colNodes = getTableHeader().querySelectorAll('th'), | ||||
|             colNode, | ||||
|             cols = [], | ||||
|             col, | ||||
|             i; | ||||
|  | ||||
|         for (i = 0; i < colNodes.length; i += 1) { | ||||
|             colNode = colNodes[i]; | ||||
|             col = { | ||||
|                 key: colNode.getAttribute('data-col'), | ||||
|                 sortable: !colNode.getAttribute('data-nosort'), | ||||
|                 type: colNode.getAttribute('data-type') || 'string' | ||||
|             }; | ||||
|             cols.push(col); | ||||
|             if (col.sortable) { | ||||
|                 col.defaultDescSort = col.type === 'number'; | ||||
|                 colNode.innerHTML = | ||||
|                     colNode.innerHTML + '<span class="sorter"></span>'; | ||||
|             } | ||||
|         } | ||||
|         return cols; | ||||
|     } | ||||
|     // attaches a data attribute to every tr element with an object | ||||
|     // of data values keyed by column name | ||||
|     function loadRowData(tableRow) { | ||||
|         var tableCols = tableRow.querySelectorAll('td'), | ||||
|             colNode, | ||||
|             col, | ||||
|             data = {}, | ||||
|             i, | ||||
|             val; | ||||
|         for (i = 0; i < tableCols.length; i += 1) { | ||||
|             colNode = tableCols[i]; | ||||
|             col = cols[i]; | ||||
|             val = colNode.getAttribute('data-value'); | ||||
|             if (col.type === 'number') { | ||||
|                 val = Number(val); | ||||
|             } | ||||
|             data[col.key] = val; | ||||
|         } | ||||
|         return data; | ||||
|     } | ||||
|     // loads all row data | ||||
|     function loadData() { | ||||
|         var rows = getTableBody().querySelectorAll('tr'), | ||||
|             i; | ||||
|  | ||||
|         for (i = 0; i < rows.length; i += 1) { | ||||
|             rows[i].data = loadRowData(rows[i]); | ||||
|         } | ||||
|     } | ||||
|     // sorts the table using the data for the ith column | ||||
|     function sortByIndex(index, desc) { | ||||
|         var key = cols[index].key, | ||||
|             sorter = function(a, b) { | ||||
|                 a = a.data[key]; | ||||
|                 b = b.data[key]; | ||||
|                 return a < b ? -1 : a > b ? 1 : 0; | ||||
|             }, | ||||
|             finalSorter = sorter, | ||||
|             tableBody = document.querySelector('.coverage-summary tbody'), | ||||
|             rowNodes = tableBody.querySelectorAll('tr'), | ||||
|             rows = [], | ||||
|             i; | ||||
|  | ||||
|         if (desc) { | ||||
|             finalSorter = function(a, b) { | ||||
|                 return -1 * sorter(a, b); | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         for (i = 0; i < rowNodes.length; i += 1) { | ||||
|             rows.push(rowNodes[i]); | ||||
|             tableBody.removeChild(rowNodes[i]); | ||||
|         } | ||||
|  | ||||
|         rows.sort(finalSorter); | ||||
|  | ||||
|         for (i = 0; i < rows.length; i += 1) { | ||||
|             tableBody.appendChild(rows[i]); | ||||
|         } | ||||
|     } | ||||
|     // removes sort indicators for current column being sorted | ||||
|     function removeSortIndicators() { | ||||
|         var col = getNthColumn(currentSort.index), | ||||
|             cls = col.className; | ||||
|  | ||||
|         cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); | ||||
|         col.className = cls; | ||||
|     } | ||||
|     // adds sort indicators for current column being sorted | ||||
|     function addSortIndicators() { | ||||
|         getNthColumn(currentSort.index).className += currentSort.desc | ||||
|             ? ' sorted-desc' | ||||
|             : ' sorted'; | ||||
|     } | ||||
|     // adds event listeners for all sorter widgets | ||||
|     function enableUI() { | ||||
|         var i, | ||||
|             el, | ||||
|             ithSorter = function ithSorter(i) { | ||||
|                 var col = cols[i]; | ||||
|  | ||||
|                 return function() { | ||||
|                     var desc = col.defaultDescSort; | ||||
|  | ||||
|                     if (currentSort.index === i) { | ||||
|                         desc = !currentSort.desc; | ||||
|                     } | ||||
|                     sortByIndex(i, desc); | ||||
|                     removeSortIndicators(); | ||||
|                     currentSort.index = i; | ||||
|                     currentSort.desc = desc; | ||||
|                     addSortIndicators(); | ||||
|                 }; | ||||
|             }; | ||||
|         for (i = 0; i < cols.length; i += 1) { | ||||
|             if (cols[i].sortable) { | ||||
|                 // add the click event handler on the th so users | ||||
|                 // dont have to click on those tiny arrows | ||||
|                 el = getNthColumn(i).querySelector('.sorter').parentElement; | ||||
|                 if (el.addEventListener) { | ||||
|                     el.addEventListener('click', ithSorter(i)); | ||||
|                 } else { | ||||
|                     el.attachEvent('onclick', ithSorter(i)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     // adds sorting functionality to the UI | ||||
|     return function() { | ||||
|         if (!getTable()) { | ||||
|             return; | ||||
|         } | ||||
|         cols = loadColumns(); | ||||
|         loadData(); | ||||
|         addSearchBox(); | ||||
|         addSortIndicators(); | ||||
|         enableUI(); | ||||
|     }; | ||||
| })(); | ||||
|  | ||||
| window.addEventListener('load', addSorting); | ||||
							
								
								
									
										493
									
								
								frontend/coverage/lcov-report/src/App.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										493
									
								
								frontend/coverage/lcov-report/src/App.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,493 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/App.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> App.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">33.33% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>4/12</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">15.38% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>2/13</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">66.66% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>2/3</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">33.33% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>4/12</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'; | ||||
| import { QueryClient, QueryClientProvider } from 'react-query'; | ||||
| import { Toaster } from 'react-hot-toast'; | ||||
| import { AuthProvider, useAuth } from './contexts/AuthContext'; | ||||
| import Layout from './components/Layout'; | ||||
| import Login from './pages/Login'; | ||||
| import Register from './pages/Register'; | ||||
| import Dashboard from './pages/Dashboard'; | ||||
| import Jobs from './pages/Jobs'; | ||||
| import JobDetails from './pages/JobDetails'; | ||||
| import CreateJob from './pages/CreateJob'; | ||||
| import Candidates from './pages/Candidates'; | ||||
| import CandidateDetails from './pages/CandidateDetails'; | ||||
| import Applications from './pages/Applications'; | ||||
| import Profile from './pages/Profile'; | ||||
| import Employers from './pages/Employers'; | ||||
| import EmployerDetails from './pages/EmployerDetails'; | ||||
| import Resumes from './pages/Resumes'; | ||||
|   | ||||
| const queryClient = new QueryClient(); | ||||
|   | ||||
| function <span class="fstat-no" title="function not covered" >ProtectedRoute(</span>{ children, allowedRoles = <span class="branch-0 cbranch-no" title="branch not covered" >[] </span>}) { | ||||
|   const { user, loading } = <span class="cstat-no" title="statement not covered" >useAuth();</span> | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (loading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="min-h-screen flex items-center justify-center"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (!user) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return <Navigate to="/login" replace />;</span> | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (allowedRoles.length > 0 && !allowedRoles.includes(user.role)) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return <Navigate to="/dashboard" replace />;</span> | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return children;</span> | ||||
| } | ||||
|   | ||||
| function AppRoutes() { | ||||
|   const { user } = useAuth(); | ||||
|   | ||||
|   return ( | ||||
|     <Routes> | ||||
|       <Route path="/login" element={!user ? <Login /> : <span class="branch-1 cbranch-no" title="branch not covered" ><Navigate to="/dashboard" replace />}</span> /> | ||||
|       <Route path="/register" element={!user ? <Register /> : <span class="branch-1 cbranch-no" title="branch not covered" ><Navigate to="/dashboard" replace />}</span> /> | ||||
|        | ||||
|       <Route path="/" element={<Layout />}> | ||||
|         <Route index element={<Navigate to="/dashboard" replace />} /> | ||||
|         <Route path="dashboard" element={ | ||||
|           <ProtectedRoute> | ||||
|             <Dashboard /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|          | ||||
|         <Route path="jobs" element={ | ||||
|           <ProtectedRoute> | ||||
|             <Jobs /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|         <Route path="jobs/create" element={ | ||||
|           <ProtectedRoute allowedRoles={['employer', 'recruiter']}> | ||||
|             <CreateJob /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|         <Route path="jobs/:id" element={ | ||||
|           <ProtectedRoute> | ||||
|             <JobDetails /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|          | ||||
|         <Route path="candidates" element={ | ||||
|           <ProtectedRoute allowedRoles={['admin', 'recruiter', 'employer']}> | ||||
|             <Candidates /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|         <Route path="candidates/:id" element={ | ||||
|           <ProtectedRoute allowedRoles={['admin', 'recruiter', 'employer']}> | ||||
|             <CandidateDetails /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|          | ||||
|         <Route path="applications" element={ | ||||
|           <ProtectedRoute> | ||||
|             <Applications /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|          | ||||
|         <Route path="employers" element={ | ||||
|           <ProtectedRoute allowedRoles={['admin', 'recruiter']}> | ||||
|             <Employers /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|         <Route path="employers/:id" element={ | ||||
|           <ProtectedRoute allowedRoles={['admin', 'recruiter']}> | ||||
|             <EmployerDetails /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|          | ||||
|         <Route path="resumes" element={ | ||||
|           <ProtectedRoute allowedRoles={['candidate']}> | ||||
|             <Resumes /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|          | ||||
|         <Route path="profile" element={ | ||||
|           <ProtectedRoute> | ||||
|             <Profile /> | ||||
|           </ProtectedRoute> | ||||
|         } /> | ||||
|       </Route> | ||||
|     </Routes> | ||||
|   ); | ||||
| } | ||||
|   | ||||
| function App() { | ||||
|   return ( | ||||
|     <QueryClientProvider client={queryClient}> | ||||
|       <AuthProvider> | ||||
|         <Router> | ||||
|           <div className="App"> | ||||
|             <AppRoutes /> | ||||
|             <Toaster position="top-right" /> | ||||
|           </div> | ||||
|         </Router> | ||||
|       </AuthProvider> | ||||
|     </QueryClientProvider> | ||||
|   ); | ||||
| } | ||||
|   | ||||
| export default App; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../sorter.js"></script> | ||||
|         <script src="../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										643
									
								
								frontend/coverage/lcov-report/src/components/Layout.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										643
									
								
								frontend/coverage/lcov-report/src/components/Layout.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,643 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/components/Layout.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/components</a> Layout.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">76.47% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>13/17</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">83.33% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>5/6</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">50% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>4/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">76.47% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>13/17</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line medium'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a> | ||||
| <a name='L151'></a><a href='#L151'>151</a> | ||||
| <a name='L152'></a><a href='#L152'>152</a> | ||||
| <a name='L153'></a><a href='#L153'>153</a> | ||||
| <a name='L154'></a><a href='#L154'>154</a> | ||||
| <a name='L155'></a><a href='#L155'>155</a> | ||||
| <a name='L156'></a><a href='#L156'>156</a> | ||||
| <a name='L157'></a><a href='#L157'>157</a> | ||||
| <a name='L158'></a><a href='#L158'>158</a> | ||||
| <a name='L159'></a><a href='#L159'>159</a> | ||||
| <a name='L160'></a><a href='#L160'>160</a> | ||||
| <a name='L161'></a><a href='#L161'>161</a> | ||||
| <a name='L162'></a><a href='#L162'>162</a> | ||||
| <a name='L163'></a><a href='#L163'>163</a> | ||||
| <a name='L164'></a><a href='#L164'>164</a> | ||||
| <a name='L165'></a><a href='#L165'>165</a> | ||||
| <a name='L166'></a><a href='#L166'>166</a> | ||||
| <a name='L167'></a><a href='#L167'>167</a> | ||||
| <a name='L168'></a><a href='#L168'>168</a> | ||||
| <a name='L169'></a><a href='#L169'>169</a> | ||||
| <a name='L170'></a><a href='#L170'>170</a> | ||||
| <a name='L171'></a><a href='#L171'>171</a> | ||||
| <a name='L172'></a><a href='#L172'>172</a> | ||||
| <a name='L173'></a><a href='#L173'>173</a> | ||||
| <a name='L174'></a><a href='#L174'>174</a> | ||||
| <a name='L175'></a><a href='#L175'>175</a> | ||||
| <a name='L176'></a><a href='#L176'>176</a> | ||||
| <a name='L177'></a><a href='#L177'>177</a> | ||||
| <a name='L178'></a><a href='#L178'>178</a> | ||||
| <a name='L179'></a><a href='#L179'>179</a> | ||||
| <a name='L180'></a><a href='#L180'>180</a> | ||||
| <a name='L181'></a><a href='#L181'>181</a> | ||||
| <a name='L182'></a><a href='#L182'>182</a> | ||||
| <a name='L183'></a><a href='#L183'>183</a> | ||||
| <a name='L184'></a><a href='#L184'>184</a> | ||||
| <a name='L185'></a><a href='#L185'>185</a> | ||||
| <a name='L186'></a><a href='#L186'>186</a> | ||||
| <a name='L187'></a><a href='#L187'>187</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-yes">18x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">12x</span> | ||||
| <span class="cline-any cline-yes">12x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">12x</span> | ||||
| <span class="cline-any cline-yes">12x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { Link, useLocation, Outlet } from 'react-router-dom'; | ||||
| import { useAuth } from '../contexts/AuthContext'; | ||||
| import { | ||||
|   Home, | ||||
|   Briefcase, | ||||
|   Users, | ||||
|   FileText, | ||||
|   Building, | ||||
|   User, | ||||
|   LogOut, | ||||
|   Menu, | ||||
|   X, | ||||
|   Bell | ||||
| } from 'lucide-react'; | ||||
|   | ||||
| const Layout = () => { | ||||
|   const { user, logout } = useAuth(); | ||||
|   const location = useLocation(); | ||||
|   const [sidebarOpen, setSidebarOpen] = useState(false); | ||||
|   | ||||
|   const navigation = [ | ||||
|     { name: 'Dashboard', href: '/dashboard', icon: Home, roles: ['admin', 'recruiter', 'employer', 'candidate'] }, | ||||
|     { name: 'Jobs', href: '/jobs', icon: Briefcase, roles: ['admin', 'recruiter', 'employer', 'candidate'] }, | ||||
|     { name: 'Candidates', href: '/candidates', icon: Users, roles: ['admin', 'recruiter', 'employer'] }, | ||||
|     { name: 'Applications', href: '/applications', icon: FileText, roles: ['admin', 'recruiter', 'employer', 'candidate'] }, | ||||
|     { name: 'Employers', href: '/employers', icon: Building, roles: ['admin', 'recruiter'] }, | ||||
|     { name: 'Resumes', href: '/resumes', icon: FileText, roles: ['candidate'] }, | ||||
|   ]; | ||||
|   | ||||
|   const filteredNavigation = navigation.filter(item =>  | ||||
|     item.roles.includes(user?.role) | ||||
|   ); | ||||
|   | ||||
|   const handleLogout = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
| <span class="cstat-no" title="statement not covered" >    logout();</span> | ||||
|   }; | ||||
|   | ||||
|   return ( | ||||
|     <div className="min-h-screen bg-gray-50"> | ||||
|       {/* Mobile sidebar */} | ||||
|       <div className={`fixed inset-0 z-50 lg:hidden ${sidebarOpen ? <span class="branch-0 cbranch-no" title="branch not covered" >'block' </span>: 'hidden'}`}> | ||||
|         <div className="fixed inset-0 bg-gray-600 bg-opacity-75" onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >setSidebarOpen(false)}</span> /> | ||||
|         <div className="relative flex-1 flex flex-col max-w-xs w-full bg-white"> | ||||
|           <div className="absolute top-0 right-0 -mr-12 pt-2"> | ||||
|             <button | ||||
|               type="button" | ||||
|               className="ml-1 flex items-center justify-center h-10 w-10 rounded-full focus:outline-none focus:ring-2 focus:ring-inset focus:ring-white" | ||||
|               onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >setSidebarOpen(false)}</span> | ||||
|             > | ||||
|               <X className="h-6 w-6 text-white" /> | ||||
|             </button> | ||||
|           </div> | ||||
|           <div className="flex-1 h-0 pt-5 pb-4 overflow-y-auto"> | ||||
|             <div className="flex-shrink-0 flex items-center px-4"> | ||||
|               <h1 className="text-xl font-bold text-gray-900">MerchantsOfHope-SupplyANdDemandPortal</h1> | ||||
|             </div> | ||||
|             <nav className="mt-5 px-2 space-y-1"> | ||||
|               {filteredNavigation.map((item) => { | ||||
|                 const isActive = location.pathname === item.href; | ||||
|                 return ( | ||||
|                   <Link | ||||
|                     key={item.name} | ||||
|                     to={item.href} | ||||
|                     className={`${ | ||||
|                       isActive | ||||
|                         ? 'bg-primary-100 text-primary-900' | ||||
|                         : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900' | ||||
|                     } group flex items-center px-2 py-2 text-base font-medium rounded-md`} | ||||
|                   > | ||||
|                     <item.icon className="mr-4 h-6 w-6" /> | ||||
|                     {item.name} | ||||
|                   </Link> | ||||
|                 ); | ||||
|               })} | ||||
|             </nav> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {/* Desktop sidebar */} | ||||
|       <div className="hidden lg:flex lg:w-64 lg:flex-col lg:fixed lg:inset-y-0"> | ||||
|         <div className="flex-1 flex flex-col min-h-0 border-r border-gray-200 bg-white"> | ||||
|           <div className="flex-1 flex flex-col pt-5 pb-4 overflow-y-auto"> | ||||
|             <div className="flex items-center flex-shrink-0 px-4"> | ||||
|               <h1 className="text-xl font-bold text-gray-900">MerchantsOfHope-SupplyANdDemandPortal</h1> | ||||
|             </div> | ||||
|             <nav className="mt-5 flex-1 px-2 space-y-1"> | ||||
|               {filteredNavigation.map((item) => { | ||||
|                 const isActive = location.pathname === item.href; | ||||
|                 return ( | ||||
|                   <Link | ||||
|                     key={item.name} | ||||
|                     to={item.href} | ||||
|                     className={`${ | ||||
|                       isActive | ||||
|                         ? 'bg-primary-100 text-primary-900' | ||||
|                         : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900' | ||||
|                     } group flex items-center px-2 py-2 text-sm font-medium rounded-md`} | ||||
|                   > | ||||
|                     <item.icon className="mr-3 h-6 w-6" /> | ||||
|                     {item.name} | ||||
|                   </Link> | ||||
|                 ); | ||||
|               })} | ||||
|             </nav> | ||||
|           </div> | ||||
|           <div className="flex-shrink-0 flex border-t border-gray-200 p-4"> | ||||
|             <div className="flex-shrink-0 w-full group block"> | ||||
|               <div className="flex items-center"> | ||||
|                 <div className="ml-3"> | ||||
|                   <p className="text-sm font-medium text-gray-700 group-hover:text-gray-900"> | ||||
|                     {user?.firstName} {user?.lastName} | ||||
|                   </p> | ||||
|                   <p className="text-xs font-medium text-gray-500 group-hover:text-gray-700"> | ||||
|                     {user?.role} | ||||
|                   </p> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {/* Main content */} | ||||
|       <div className="lg:pl-64 flex flex-col flex-1"> | ||||
|         <div className="sticky top-0 z-10 lg:hidden pl-1 pt-1 sm:pl-3 sm:pt-3 bg-gray-100"> | ||||
|           <button | ||||
|             type="button" | ||||
|             className="-ml-0.5 -mt-0.5 h-12 w-12 inline-flex items-center justify-center rounded-md text-gray-500 hover:text-gray-900 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-primary-500" | ||||
|             onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >setSidebarOpen(true)}</span> | ||||
|           > | ||||
|             <Menu className="h-6 w-6" /> | ||||
|           </button> | ||||
|         </div> | ||||
|   | ||||
|         <main className="flex-1"> | ||||
|           <div className="py-6"> | ||||
|             <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> | ||||
|               <Outlet /> | ||||
|             </div> | ||||
|           </div> | ||||
|         </main> | ||||
|       </div> | ||||
|   | ||||
|       {/* Top bar for desktop */} | ||||
|       <div className="hidden lg:block lg:pl-64"> | ||||
|         <div className="sticky top-0 z-10 flex-shrink-0 flex h-16 bg-white border-b border-gray-200"> | ||||
|           <div className="flex-1 px-4 flex justify-between"> | ||||
|             <div className="flex-1 flex"> | ||||
|               <div className="w-full flex md:ml-0"> | ||||
|                 <div className="relative w-full text-gray-400 focus-within:text-gray-600"> | ||||
|                   <div className="absolute inset-y-0 left-0 flex items-center pointer-events-none"> | ||||
|                     <Bell className="h-5 w-5" /> | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className="ml-4 flex items-center md:ml-6"> | ||||
|               <div className="ml-3 relative"> | ||||
|                 <div className="flex items-center space-x-4"> | ||||
|                   <Link | ||||
|                     to="/profile" | ||||
|                     className="flex items-center text-sm font-medium text-gray-700 hover:text-gray-900" | ||||
|                   > | ||||
|                     <User className="h-5 w-5 mr-2" /> | ||||
|                     Profile | ||||
|                   </Link> | ||||
|                   <button | ||||
|                     onClick={handleLogout} | ||||
|                     className="flex items-center text-sm font-medium text-gray-700 hover:text-gray-900" | ||||
|                   > | ||||
|                     <LogOut className="h-5 w-5 mr-2" /> | ||||
|                     Logout | ||||
|                   </button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Layout; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										116
									
								
								frontend/coverage/lcov-report/src/components/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								frontend/coverage/lcov-report/src/components/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/components</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> src/components</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">76.47% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>13/17</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">83.33% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>5/6</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">50% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>4/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">76.47% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>13/17</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line medium'></div> | ||||
|     <div class="pad1"> | ||||
| <table class="coverage-summary"> | ||||
| <thead> | ||||
| <tr> | ||||
|    <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||||
|    <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||||
|    <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||||
|    <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||||
|    <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||||
|    <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||||
|    <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody><tr> | ||||
| 	<td class="file medium" data-value="Layout.js"><a href="Layout.js.html">Layout.js</a></td> | ||||
| 	<td data-value="76.47" class="pic medium"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 76%"></div><div class="cover-empty" style="width: 24%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="76.47" class="pct medium">76.47%</td> | ||||
| 	<td data-value="17" class="abs medium">13/17</td> | ||||
| 	<td data-value="83.33" class="pct high">83.33%</td> | ||||
| 	<td data-value="6" class="abs high">5/6</td> | ||||
| 	<td data-value="50" class="pct medium">50%</td> | ||||
| 	<td data-value="8" class="abs medium">4/8</td> | ||||
| 	<td data-value="76.47" class="pct medium">76.47%</td> | ||||
| 	<td data-value="17" class="abs medium">13/17</td> | ||||
| 	</tr> | ||||
|  | ||||
| </tbody> | ||||
| </table> | ||||
| </div> | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										400
									
								
								frontend/coverage/lcov-report/src/contexts/AuthContext.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										400
									
								
								frontend/coverage/lcov-report/src/contexts/AuthContext.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,400 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/contexts/AuthContext.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/contexts</a> AuthContext.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">61.4% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>35/57</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">37.5% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>3/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">71.42% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>5/7</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">61.4% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>35/57</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line medium'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-yes">3x</span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-yes">2x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">9x</span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { createContext, useContext, useState, useEffect } from 'react'; | ||||
| import axios from 'axios'; | ||||
| import toast from 'react-hot-toast'; | ||||
|   | ||||
| const AuthContext = createContext(); | ||||
|   | ||||
| export const useAuth = () => { | ||||
|   const context = useContext(AuthContext); | ||||
|   <span class="missing-if-branch" title="if path not taken" >I</span>if (!context) { | ||||
| <span class="cstat-no" title="statement not covered" >    throw new Error('useAuth must be used within an AuthProvider');</span> | ||||
|   } | ||||
|   return context; | ||||
| }; | ||||
|   | ||||
| export const AuthProvider = ({ children }) => { | ||||
|   const [user, setUser] = useState(null); | ||||
|   const [loading, setLoading] = useState(true); | ||||
|   | ||||
|   useEffect(() => { | ||||
|     const token = localStorage.getItem('token'); | ||||
|     <span class="missing-if-branch" title="if path not taken" >I</span>if (token) { | ||||
| <span class="cstat-no" title="statement not covered" >      axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;</span> | ||||
| <span class="cstat-no" title="statement not covered" >      fetchUser();</span> | ||||
|     } else { | ||||
|       setLoading(false); | ||||
|     } | ||||
|   }, []); | ||||
|   | ||||
|   const fetchUser = <span class="fstat-no" title="function not covered" >as</span>ync () => { | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
|       const response = <span class="cstat-no" title="statement not covered" >await axios.get('/api/auth/me');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      setUser(response.data.user);</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      console.error('Failed to fetch user:', error);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      localStorage.removeItem('token');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      delete axios.defaults.headers.common['Authorization'];</span> | ||||
|     } finally { | ||||
| <span class="cstat-no" title="statement not covered" >      setLoading(false);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const login = async (email, password) => { | ||||
|     try { | ||||
|       const response = await axios.post('/api/auth/login', { email, password }); | ||||
|       const { token, user } = response.data; | ||||
|        | ||||
|       localStorage.setItem('token', token); | ||||
|       axios.defaults.headers.common['Authorization'] = `Bearer ${token}`; | ||||
|       setUser(user); | ||||
|        | ||||
|       toast.success('Login successful!'); | ||||
|       return { success: true }; | ||||
|     } catch (error) { | ||||
|       const message = error.response?.data?.error || <span class="branch-1 cbranch-no" title="branch not covered" >'Login failed';</span> | ||||
|       toast.error(message); | ||||
|       return { success: false, error: message }; | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const register = <span class="fstat-no" title="function not covered" >as</span>ync (userData) => { | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
|       const response = <span class="cstat-no" title="statement not covered" >await axios.post('/api/auth/register', userData);</span> | ||||
|       const { token, user } = <span class="cstat-no" title="statement not covered" >response.data;</span> | ||||
|        | ||||
| <span class="cstat-no" title="statement not covered" >      localStorage.setItem('token', token);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;</span> | ||||
| <span class="cstat-no" title="statement not covered" >      setUser(user);</span> | ||||
|        | ||||
| <span class="cstat-no" title="statement not covered" >      toast.success('Registration successful!');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return { success: true };</span> | ||||
|     } catch (error) { | ||||
|       const message = <span class="cstat-no" title="statement not covered" >error.response?.data?.error || 'Registration failed';</span> | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error(message);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return { success: false, error: message };</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const logout = async () => { | ||||
|     try { | ||||
|       await axios.post('/api/auth/logout'); | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      console.error('Logout error:', error);</span> | ||||
|     } finally { | ||||
|       localStorage.removeItem('token'); | ||||
|       delete axios.defaults.headers.common['Authorization']; | ||||
|       setUser(null); | ||||
|       toast.success('Logged out successfully'); | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const value = { | ||||
|     user, | ||||
|     loading, | ||||
|     login, | ||||
|     register, | ||||
|     logout, | ||||
|     fetchUser | ||||
|   }; | ||||
|   | ||||
|   return ( | ||||
|     <AuthContext.Provider value={value}> | ||||
|       {children} | ||||
|     </AuthContext.Provider> | ||||
|   ); | ||||
| }; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										116
									
								
								frontend/coverage/lcov-report/src/contexts/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								frontend/coverage/lcov-report/src/contexts/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/contexts</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> src/contexts</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">61.4% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>35/57</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">37.5% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>3/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">71.42% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>5/7</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">61.4% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>35/57</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line medium'></div> | ||||
|     <div class="pad1"> | ||||
| <table class="coverage-summary"> | ||||
| <thead> | ||||
| <tr> | ||||
|    <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||||
|    <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||||
|    <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||||
|    <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||||
|    <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||||
|    <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||||
|    <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody><tr> | ||||
| 	<td class="file medium" data-value="AuthContext.js"><a href="AuthContext.js.html">AuthContext.js</a></td> | ||||
| 	<td data-value="61.4" class="pic medium"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 61%"></div><div class="cover-empty" style="width: 39%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="61.4" class="pct medium">61.4%</td> | ||||
| 	<td data-value="57" class="abs medium">35/57</td> | ||||
| 	<td data-value="37.5" class="pct low">37.5%</td> | ||||
| 	<td data-value="8" class="abs low">3/8</td> | ||||
| 	<td data-value="71.42" class="pct medium">71.42%</td> | ||||
| 	<td data-value="7" class="abs medium">5/7</td> | ||||
| 	<td data-value="61.4" class="pct medium">61.4%</td> | ||||
| 	<td data-value="57" class="abs medium">35/57</td> | ||||
| 	</tr> | ||||
|  | ||||
| </tbody> | ||||
| </table> | ||||
| </div> | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										131
									
								
								frontend/coverage/lcov-report/src/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										131
									
								
								frontend/coverage/lcov-report/src/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,131 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../index.html">All files</a> src</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">28.57% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>4/14</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">15.38% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>2/13</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">66.66% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>2/3</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">28.57% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>4/14</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <div class="pad1"> | ||||
| <table class="coverage-summary"> | ||||
| <thead> | ||||
| <tr> | ||||
|    <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||||
|    <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||||
|    <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||||
|    <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||||
|    <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||||
|    <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||||
|    <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody><tr> | ||||
| 	<td class="file low" data-value="App.js"><a href="App.js.html">App.js</a></td> | ||||
| 	<td data-value="33.33" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 33%"></div><div class="cover-empty" style="width: 67%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="33.33" class="pct low">33.33%</td> | ||||
| 	<td data-value="12" class="abs low">4/12</td> | ||||
| 	<td data-value="15.38" class="pct low">15.38%</td> | ||||
| 	<td data-value="13" class="abs low">2/13</td> | ||||
| 	<td data-value="66.66" class="pct medium">66.66%</td> | ||||
| 	<td data-value="3" class="abs medium">2/3</td> | ||||
| 	<td data-value="33.33" class="pct low">33.33%</td> | ||||
| 	<td data-value="12" class="abs low">4/12</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="index.js"><a href="index.js.html">index.js</a></td> | ||||
| 	<td data-value="0" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="2" class="abs low">0/2</td> | ||||
| 	<td data-value="100" class="pct high">100%</td> | ||||
| 	<td data-value="0" class="abs high">0/0</td> | ||||
| 	<td data-value="100" class="pct high">100%</td> | ||||
| 	<td data-value="0" class="abs high">0/0</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="2" class="abs low">0/2</td> | ||||
| 	</tr> | ||||
|  | ||||
| </tbody> | ||||
| </table> | ||||
| </div> | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../sorter.js"></script> | ||||
|         <script src="../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										121
									
								
								frontend/coverage/lcov-report/src/index.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										121
									
								
								frontend/coverage/lcov-report/src/index.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,121 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/index.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../index.html">All files</a> / <a href="index.html">src</a> index.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>0/2</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">100% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/0</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">100% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/0</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>0/2</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import ReactDOM from 'react-dom/client'; | ||||
| import './index.css'; | ||||
| import './lib/configureAxios'; | ||||
| import App from './App'; | ||||
|   | ||||
| const root = <span class="cstat-no" title="statement not covered" >ReactDOM.createRoot(document.getElementById('root'));</span> | ||||
| <span class="cstat-no" title="statement not covered" >root.render(</span> | ||||
|   <React.StrictMode> | ||||
|     <App /> | ||||
|   </React.StrictMode> | ||||
| ); | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../sorter.js"></script> | ||||
|         <script src="../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										118
									
								
								frontend/coverage/lcov-report/src/lib/configureAxios.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								frontend/coverage/lcov-report/src/lib/configureAxios.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,118 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/lib/configureAxios.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/lib</a> configureAxios.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">100% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/0</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import axios from 'axios'; | ||||
|   | ||||
| const baseURL = <span class="cstat-no" title="statement not covered" >process.env.REACT_APP_API_URL || '';</span> | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >if (baseURL) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >  axios.defaults.baseURL = baseURL;</span> | ||||
| } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >axios.defaults.headers.common['Content-Type'] = 'application/json';</span> | ||||
|   | ||||
| export default axios; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										116
									
								
								frontend/coverage/lcov-report/src/lib/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								frontend/coverage/lcov-report/src/lib/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,116 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/lib</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> src/lib</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">100% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/0</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <div class="pad1"> | ||||
| <table class="coverage-summary"> | ||||
| <thead> | ||||
| <tr> | ||||
|    <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||||
|    <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||||
|    <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||||
|    <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||||
|    <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||||
|    <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||||
|    <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody><tr> | ||||
| 	<td class="file low" data-value="configureAxios.js"><a href="configureAxios.js.html">configureAxios.js</a></td> | ||||
| 	<td data-value="0" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	<td data-value="100" class="pct high">100%</td> | ||||
| 	<td data-value="0" class="abs high">0/0</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	</tr> | ||||
|  | ||||
| </tbody> | ||||
| </table> | ||||
| </div> | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										418
									
								
								frontend/coverage/lcov-report/src/pages/Applications.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								frontend/coverage/lcov-report/src/pages/Applications.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,418 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Applications.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Applications.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">3.7% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/27</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/23</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/5</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">3.7% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/27</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { FileText, Building, Clock, CheckCircle, XCircle, AlertCircle } from 'lucide-react'; | ||||
|   | ||||
| const Applications = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { data, isLoading } = <span class="cstat-no" title="statement not covered" >useQuery('applications', <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get('/api/applications');</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data;</span> | ||||
|   }); | ||||
|   | ||||
|   const getStatusIcon = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(s</span>tatus) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    switch (status) {</span> | ||||
|       case 'applied': <span class="cstat-no" title="statement not covered" >return <Clock className="h-4 w-4" />;</span> | ||||
|       case 'reviewed': <span class="cstat-no" title="statement not covered" >return <AlertCircle className="h-4 w-4" />;</span> | ||||
|       case 'shortlisted': <span class="cstat-no" title="statement not covered" >return <CheckCircle className="h-4 w-4" />;</span> | ||||
|       case 'interviewed': <span class="cstat-no" title="statement not covered" >return <CheckCircle className="h-4 w-4" />;</span> | ||||
|       case 'offered': <span class="cstat-no" title="statement not covered" >return <CheckCircle className="h-4 w-4" />;</span> | ||||
|       case 'rejected': <span class="cstat-no" title="statement not covered" >return <XCircle className="h-4 w-4" />;</span> | ||||
|       default: <span class="cstat-no" title="statement not covered" >return <Clock className="h-4 w-4" />;</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const getStatusColor = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(s</span>tatus) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    switch (status) {</span> | ||||
|       case 'applied': <span class="cstat-no" title="statement not covered" >return 'bg-blue-100 text-blue-800';</span> | ||||
|       case 'reviewed': <span class="cstat-no" title="statement not covered" >return 'bg-yellow-100 text-yellow-800';</span> | ||||
|       case 'shortlisted': <span class="cstat-no" title="statement not covered" >return 'bg-green-100 text-green-800';</span> | ||||
|       case 'interviewed': <span class="cstat-no" title="statement not covered" >return 'bg-green-100 text-green-800';</span> | ||||
|       case 'offered': <span class="cstat-no" title="statement not covered" >return 'bg-green-100 text-green-800';</span> | ||||
|       case 'rejected': <span class="cstat-no" title="statement not covered" >return 'bg-red-100 text-red-800';</span> | ||||
|       case 'withdrawn': <span class="cstat-no" title="statement not covered" >return 'bg-gray-100 text-gray-800';</span> | ||||
|       default: <span class="cstat-no" title="statement not covered" >return 'bg-gray-100 text-gray-800';</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div> | ||||
|         <h1 className="text-2xl font-bold text-gray-900">Applications</h1> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           Track your job applications and their status | ||||
|         </p> | ||||
|       </div> | ||||
|   | ||||
|       <div className="space-y-4"> | ||||
|         {data?.applications?.length > 0 ? ( | ||||
|           data.applications.map(<span class="fstat-no" title="function not covered" >(a</span>pplication) => ( | ||||
| <span class="cstat-no" title="statement not covered" >            <div key={application.id} className="bg-white shadow rounded-lg"></span> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <div className="flex items-start justify-between"> | ||||
|                   <div className="flex-1"> | ||||
|                     <div className="flex items-center"> | ||||
|                       <h3 className="text-lg font-medium text-gray-900"> | ||||
|                         {application.job_title} | ||||
|                       </h3> | ||||
|                       <span className={`ml-3 inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getStatusColor(application.status)}`}> | ||||
|                         {getStatusIcon(application.status)} | ||||
|                         <span className="ml-1 capitalize">{application.status}</span> | ||||
|                       </span> | ||||
|                     </div> | ||||
|                     <div className="mt-1 flex items-center text-sm text-gray-500"> | ||||
|                       <Building className="h-4 w-4 mr-1" /> | ||||
|                       {application.company_name} | ||||
|                     </div> | ||||
|                     <div className="mt-2 flex items-center text-sm text-gray-500"> | ||||
|                       <Clock className="h-4 w-4 mr-1" /> | ||||
|                       Applied on {new Date(application.applied_at).toLocaleDateString()} | ||||
|                     </div> | ||||
|                     {application.cover_letter && ( | ||||
|                       <div className="mt-3"> | ||||
|                         <p className="text-sm text-gray-600 line-clamp-2"> | ||||
|                           {application.cover_letter} | ||||
|                         </p> | ||||
|                       </div> | ||||
|                     )} | ||||
|                     {application.notes && ( | ||||
|                       <div className="mt-3"> | ||||
|                         <p className="text-sm text-gray-600"> | ||||
|                           <strong>Notes:</strong> {application.notes} | ||||
|                         </p> | ||||
|                       </div> | ||||
|                     )} | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           )) | ||||
|         ) : ( | ||||
|           <div className="text-center py-12"> | ||||
|             <FileText className="mx-auto h-12 w-12 text-gray-400" /> | ||||
|             <h3 className="mt-2 text-sm font-medium text-gray-900">No applications found</h3> | ||||
|             <p className="mt-1 text-sm text-gray-500"> | ||||
|               You haven't applied to any jobs yet. | ||||
|             </p> | ||||
|           </div> | ||||
|         )} | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Applications; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										532
									
								
								frontend/coverage/lcov-report/src/pages/CandidateDetails.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										532
									
								
								frontend/coverage/lcov-report/src/pages/CandidateDetails.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,532 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/CandidateDetails.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> CandidateDetails.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">9.09% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/11</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/23</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/3</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">9.09% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/11</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import { useParams } from 'react-router-dom'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { MapPin, Phone, Linkedin, Github, Globe, User } from 'lucide-react'; | ||||
|   | ||||
| const CandidateDetails = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { id } = <span class="cstat-no" title="statement not covered" >useParams();</span> | ||||
|   | ||||
|   const { data: candidate, isLoading } = <span class="cstat-no" title="statement not covered" >useQuery(['candidate', id], <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get(`/api/candidates/${id}`);</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data;</span> | ||||
|   }); | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (!candidate) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="text-center py-12"> | ||||
|         <h3 className="text-lg font-medium text-gray-900">Candidate not found</h3> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           The candidate you're looking for doesn't exist. | ||||
|         </p> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div className="bg-white shadow rounded-lg"> | ||||
|         <div className="px-4 py-5 sm:p-6"> | ||||
|           <div className="flex items-start"> | ||||
|             <div className="flex-shrink-0"> | ||||
|               <div className="h-16 w-16 rounded-full bg-primary-100 flex items-center justify-center"> | ||||
|                 <User className="h-8 w-8 text-primary-600" /> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className="ml-6 flex-1"> | ||||
|               <h1 className="text-2xl font-bold text-gray-900"> | ||||
|                 {candidate.first_name} {candidate.last_name} | ||||
|               </h1> | ||||
|               <p className="text-lg text-gray-600">{candidate.email}</p> | ||||
|                | ||||
|               <div className="mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2"> | ||||
|                 {candidate.location && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <MapPin className="h-4 w-4 mr-2" /> | ||||
|                     {candidate.location} | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {candidate.phone && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Phone className="h-4 w-4 mr-2" /> | ||||
|                     {candidate.phone} | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {candidate.linkedin_url && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Linkedin className="h-4 w-4 mr-2" /> | ||||
|                     <a href={candidate.linkedin_url} target="_blank" rel="noopener noreferrer" className="text-primary-600 hover:text-primary-500"> | ||||
|                       LinkedIn Profile | ||||
|                     </a> | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {candidate.github_url && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Github className="h-4 w-4 mr-2" /> | ||||
|                     <a href={candidate.github_url} target="_blank" rel="noopener noreferrer" className="text-primary-600 hover:text-primary-500"> | ||||
|                       GitHub Profile | ||||
|                     </a> | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {candidate.portfolio_url && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Globe className="h-4 w-4 mr-2" /> | ||||
|                     <a href={candidate.portfolio_url} target="_blank" rel="noopener noreferrer" className="text-primary-600 hover:text-primary-500"> | ||||
|                       Portfolio | ||||
|                     </a> | ||||
|                   </div> | ||||
|                 )} | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {candidate.bio && ( | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h2 className="text-lg font-medium text-gray-900 mb-4">About</h2> | ||||
|             <p className="text-gray-600 whitespace-pre-wrap">{candidate.bio}</p> | ||||
|           </div> | ||||
|         </div> | ||||
|       )} | ||||
|   | ||||
|       {candidate.skills && candidate.skills.length > 0 && ( | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h2 className="text-lg font-medium text-gray-900 mb-4">Skills</h2> | ||||
|             <div className="flex flex-wrap gap-2"> | ||||
|               {candidate.skills.map(<span class="fstat-no" title="function not covered" >(s</span>kill, index) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                <span</span> | ||||
|                   key={index} | ||||
|                   className="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-primary-100 text-primary-800" | ||||
|                 > | ||||
|                   {skill} | ||||
|                 </span> | ||||
|               ))} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       )} | ||||
|   | ||||
|       <div className="grid grid-cols-1 lg:grid-cols-2 gap-6"> | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h2 className="text-lg font-medium text-gray-900 mb-4">Experience Level</h2> | ||||
|             <span className="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-primary-100 text-primary-800"> | ||||
|               {candidate.experience_level || 'Not specified'} | ||||
|             </span> | ||||
|           </div> | ||||
|         </div> | ||||
|   | ||||
|         {candidate.salary_expectation && ( | ||||
|           <div className="bg-white shadow rounded-lg"> | ||||
|             <div className="px-4 py-5 sm:p-6"> | ||||
|               <h2 className="text-lg font-medium text-gray-900 mb-4">Salary Expectation</h2> | ||||
|               <p className="text-lg font-medium text-gray-900"> | ||||
|                 ${candidate.salary_expectation.toLocaleString()} | ||||
|               </p> | ||||
|             </div> | ||||
|           </div> | ||||
|         )} | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default CandidateDetails; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										916
									
								
								frontend/coverage/lcov-report/src/pages/Candidates.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										916
									
								
								frontend/coverage/lcov-report/src/pages/Candidates.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,916 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Candidates.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Candidates.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">3.7% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/27</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/28</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">3.84% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/26</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a> | ||||
| <a name='L151'></a><a href='#L151'>151</a> | ||||
| <a name='L152'></a><a href='#L152'>152</a> | ||||
| <a name='L153'></a><a href='#L153'>153</a> | ||||
| <a name='L154'></a><a href='#L154'>154</a> | ||||
| <a name='L155'></a><a href='#L155'>155</a> | ||||
| <a name='L156'></a><a href='#L156'>156</a> | ||||
| <a name='L157'></a><a href='#L157'>157</a> | ||||
| <a name='L158'></a><a href='#L158'>158</a> | ||||
| <a name='L159'></a><a href='#L159'>159</a> | ||||
| <a name='L160'></a><a href='#L160'>160</a> | ||||
| <a name='L161'></a><a href='#L161'>161</a> | ||||
| <a name='L162'></a><a href='#L162'>162</a> | ||||
| <a name='L163'></a><a href='#L163'>163</a> | ||||
| <a name='L164'></a><a href='#L164'>164</a> | ||||
| <a name='L165'></a><a href='#L165'>165</a> | ||||
| <a name='L166'></a><a href='#L166'>166</a> | ||||
| <a name='L167'></a><a href='#L167'>167</a> | ||||
| <a name='L168'></a><a href='#L168'>168</a> | ||||
| <a name='L169'></a><a href='#L169'>169</a> | ||||
| <a name='L170'></a><a href='#L170'>170</a> | ||||
| <a name='L171'></a><a href='#L171'>171</a> | ||||
| <a name='L172'></a><a href='#L172'>172</a> | ||||
| <a name='L173'></a><a href='#L173'>173</a> | ||||
| <a name='L174'></a><a href='#L174'>174</a> | ||||
| <a name='L175'></a><a href='#L175'>175</a> | ||||
| <a name='L176'></a><a href='#L176'>176</a> | ||||
| <a name='L177'></a><a href='#L177'>177</a> | ||||
| <a name='L178'></a><a href='#L178'>178</a> | ||||
| <a name='L179'></a><a href='#L179'>179</a> | ||||
| <a name='L180'></a><a href='#L180'>180</a> | ||||
| <a name='L181'></a><a href='#L181'>181</a> | ||||
| <a name='L182'></a><a href='#L182'>182</a> | ||||
| <a name='L183'></a><a href='#L183'>183</a> | ||||
| <a name='L184'></a><a href='#L184'>184</a> | ||||
| <a name='L185'></a><a href='#L185'>185</a> | ||||
| <a name='L186'></a><a href='#L186'>186</a> | ||||
| <a name='L187'></a><a href='#L187'>187</a> | ||||
| <a name='L188'></a><a href='#L188'>188</a> | ||||
| <a name='L189'></a><a href='#L189'>189</a> | ||||
| <a name='L190'></a><a href='#L190'>190</a> | ||||
| <a name='L191'></a><a href='#L191'>191</a> | ||||
| <a name='L192'></a><a href='#L192'>192</a> | ||||
| <a name='L193'></a><a href='#L193'>193</a> | ||||
| <a name='L194'></a><a href='#L194'>194</a> | ||||
| <a name='L195'></a><a href='#L195'>195</a> | ||||
| <a name='L196'></a><a href='#L196'>196</a> | ||||
| <a name='L197'></a><a href='#L197'>197</a> | ||||
| <a name='L198'></a><a href='#L198'>198</a> | ||||
| <a name='L199'></a><a href='#L199'>199</a> | ||||
| <a name='L200'></a><a href='#L200'>200</a> | ||||
| <a name='L201'></a><a href='#L201'>201</a> | ||||
| <a name='L202'></a><a href='#L202'>202</a> | ||||
| <a name='L203'></a><a href='#L203'>203</a> | ||||
| <a name='L204'></a><a href='#L204'>204</a> | ||||
| <a name='L205'></a><a href='#L205'>205</a> | ||||
| <a name='L206'></a><a href='#L206'>206</a> | ||||
| <a name='L207'></a><a href='#L207'>207</a> | ||||
| <a name='L208'></a><a href='#L208'>208</a> | ||||
| <a name='L209'></a><a href='#L209'>209</a> | ||||
| <a name='L210'></a><a href='#L210'>210</a> | ||||
| <a name='L211'></a><a href='#L211'>211</a> | ||||
| <a name='L212'></a><a href='#L212'>212</a> | ||||
| <a name='L213'></a><a href='#L213'>213</a> | ||||
| <a name='L214'></a><a href='#L214'>214</a> | ||||
| <a name='L215'></a><a href='#L215'>215</a> | ||||
| <a name='L216'></a><a href='#L216'>216</a> | ||||
| <a name='L217'></a><a href='#L217'>217</a> | ||||
| <a name='L218'></a><a href='#L218'>218</a> | ||||
| <a name='L219'></a><a href='#L219'>219</a> | ||||
| <a name='L220'></a><a href='#L220'>220</a> | ||||
| <a name='L221'></a><a href='#L221'>221</a> | ||||
| <a name='L222'></a><a href='#L222'>222</a> | ||||
| <a name='L223'></a><a href='#L223'>223</a> | ||||
| <a name='L224'></a><a href='#L224'>224</a> | ||||
| <a name='L225'></a><a href='#L225'>225</a> | ||||
| <a name='L226'></a><a href='#L226'>226</a> | ||||
| <a name='L227'></a><a href='#L227'>227</a> | ||||
| <a name='L228'></a><a href='#L228'>228</a> | ||||
| <a name='L229'></a><a href='#L229'>229</a> | ||||
| <a name='L230'></a><a href='#L230'>230</a> | ||||
| <a name='L231'></a><a href='#L231'>231</a> | ||||
| <a name='L232'></a><a href='#L232'>232</a> | ||||
| <a name='L233'></a><a href='#L233'>233</a> | ||||
| <a name='L234'></a><a href='#L234'>234</a> | ||||
| <a name='L235'></a><a href='#L235'>235</a> | ||||
| <a name='L236'></a><a href='#L236'>236</a> | ||||
| <a name='L237'></a><a href='#L237'>237</a> | ||||
| <a name='L238'></a><a href='#L238'>238</a> | ||||
| <a name='L239'></a><a href='#L239'>239</a> | ||||
| <a name='L240'></a><a href='#L240'>240</a> | ||||
| <a name='L241'></a><a href='#L241'>241</a> | ||||
| <a name='L242'></a><a href='#L242'>242</a> | ||||
| <a name='L243'></a><a href='#L243'>243</a> | ||||
| <a name='L244'></a><a href='#L244'>244</a> | ||||
| <a name='L245'></a><a href='#L245'>245</a> | ||||
| <a name='L246'></a><a href='#L246'>246</a> | ||||
| <a name='L247'></a><a href='#L247'>247</a> | ||||
| <a name='L248'></a><a href='#L248'>248</a> | ||||
| <a name='L249'></a><a href='#L249'>249</a> | ||||
| <a name='L250'></a><a href='#L250'>250</a> | ||||
| <a name='L251'></a><a href='#L251'>251</a> | ||||
| <a name='L252'></a><a href='#L252'>252</a> | ||||
| <a name='L253'></a><a href='#L253'>253</a> | ||||
| <a name='L254'></a><a href='#L254'>254</a> | ||||
| <a name='L255'></a><a href='#L255'>255</a> | ||||
| <a name='L256'></a><a href='#L256'>256</a> | ||||
| <a name='L257'></a><a href='#L257'>257</a> | ||||
| <a name='L258'></a><a href='#L258'>258</a> | ||||
| <a name='L259'></a><a href='#L259'>259</a> | ||||
| <a name='L260'></a><a href='#L260'>260</a> | ||||
| <a name='L261'></a><a href='#L261'>261</a> | ||||
| <a name='L262'></a><a href='#L262'>262</a> | ||||
| <a name='L263'></a><a href='#L263'>263</a> | ||||
| <a name='L264'></a><a href='#L264'>264</a> | ||||
| <a name='L265'></a><a href='#L265'>265</a> | ||||
| <a name='L266'></a><a href='#L266'>266</a> | ||||
| <a name='L267'></a><a href='#L267'>267</a> | ||||
| <a name='L268'></a><a href='#L268'>268</a> | ||||
| <a name='L269'></a><a href='#L269'>269</a> | ||||
| <a name='L270'></a><a href='#L270'>270</a> | ||||
| <a name='L271'></a><a href='#L271'>271</a> | ||||
| <a name='L272'></a><a href='#L272'>272</a> | ||||
| <a name='L273'></a><a href='#L273'>273</a> | ||||
| <a name='L274'></a><a href='#L274'>274</a> | ||||
| <a name='L275'></a><a href='#L275'>275</a> | ||||
| <a name='L276'></a><a href='#L276'>276</a> | ||||
| <a name='L277'></a><a href='#L277'>277</a> | ||||
| <a name='L278'></a><a href='#L278'>278</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { Search, MapPin, User, Star } from 'lucide-react'; | ||||
|   | ||||
| const Candidates = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const [filters, setFilters] = <span class="cstat-no" title="statement not covered" >useState({</span> | ||||
|     search: '', | ||||
|     location: '', | ||||
|     experienceLevel: '', | ||||
|     skills: '' | ||||
|   }); | ||||
|   | ||||
|   const { data, isLoading, refetch } = <span class="cstat-no" title="statement not covered" >useQuery(['candidates', filters], <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const params = <span class="cstat-no" title="statement not covered" >new URLSearchParams();</span> | ||||
| <span class="cstat-no" title="statement not covered" >    Object.entries(filters).forEach(<span class="fstat-no" title="function not covered" >([</span>key, value]) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      if (value) <span class="cstat-no" title="statement not covered" >params.append(key, value);</span></span> | ||||
|     }); | ||||
|      | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get(`/api/candidates?${params.toString()}`);</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data;</span> | ||||
|   }); | ||||
|   | ||||
|   const handleFilterChange = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(e</span>) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    setFilters({</span> | ||||
|       ...filters, | ||||
|       [e.target.name]: e.target.value | ||||
|     }); | ||||
|   }; | ||||
|   | ||||
|   const handleSearch = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(e</span>) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    e.preventDefault();</span> | ||||
| <span class="cstat-no" title="statement not covered" >    refetch();</span> | ||||
|   }; | ||||
|   | ||||
|   const getExperienceColor = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(l</span>evel) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    switch (level) {</span> | ||||
|       case 'entry': <span class="cstat-no" title="statement not covered" >return 'bg-green-100 text-green-800';</span> | ||||
|       case 'mid': <span class="cstat-no" title="statement not covered" >return 'bg-blue-100 text-blue-800';</span> | ||||
|       case 'senior': <span class="cstat-no" title="statement not covered" >return 'bg-purple-100 text-purple-800';</span> | ||||
|       case 'lead': <span class="cstat-no" title="statement not covered" >return 'bg-orange-100 text-orange-800';</span> | ||||
|       case 'executive': <span class="cstat-no" title="statement not covered" >return 'bg-red-100 text-red-800';</span> | ||||
|       default: <span class="cstat-no" title="statement not covered" >return 'bg-gray-100 text-gray-800';</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div> | ||||
|         <h1 className="text-2xl font-bold text-gray-900">Candidates</h1> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           Browse and discover talented candidates | ||||
|         </p> | ||||
|       </div> | ||||
|   | ||||
|       {/* Filters */} | ||||
|       <div className="bg-white shadow rounded-lg"> | ||||
|         <div className="px-4 py-5 sm:p-6"> | ||||
|           <form onSubmit={handleSearch} className="space-y-4"> | ||||
|             <div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4"> | ||||
|               <div> | ||||
|                 <label htmlFor="search" className="block text-sm font-medium text-gray-700"> | ||||
|                   Search | ||||
|                 </label> | ||||
|                 <div className="mt-1 relative"> | ||||
|                   <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                     <Search className="h-5 w-5 text-gray-400" /> | ||||
|                   </div> | ||||
|                   <input | ||||
|                     type="text" | ||||
|                     name="search" | ||||
|                     id="search" | ||||
|                     className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                     placeholder="Name or keywords" | ||||
|                     value={filters.search} | ||||
|                     onChange={handleFilterChange} | ||||
|                   /> | ||||
|                 </div> | ||||
|               </div> | ||||
|   | ||||
|               <div> | ||||
|                 <label htmlFor="location" className="block text-sm font-medium text-gray-700"> | ||||
|                   Location | ||||
|                 </label> | ||||
|                 <div className="mt-1 relative"> | ||||
|                   <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                     <MapPin className="h-5 w-5 text-gray-400" /> | ||||
|                   </div> | ||||
|                   <input | ||||
|                     type="text" | ||||
|                     name="location" | ||||
|                     id="location" | ||||
|                     className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                     placeholder="City, state, or country" | ||||
|                     value={filters.location} | ||||
|                     onChange={handleFilterChange} | ||||
|                   /> | ||||
|                 </div> | ||||
|               </div> | ||||
|   | ||||
|               <div> | ||||
|                 <label htmlFor="experienceLevel" className="block text-sm font-medium text-gray-700"> | ||||
|                   Experience Level | ||||
|                 </label> | ||||
|                 <select | ||||
|                   id="experienceLevel" | ||||
|                   name="experienceLevel" | ||||
|                   className="mt-1 block w-full pl-3 pr-10 py-2 text-base border border-gray-300 focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm rounded-md" | ||||
|                   value={filters.experienceLevel} | ||||
|                   onChange={handleFilterChange} | ||||
|                 > | ||||
|                   <option value="">All Levels</option> | ||||
|                   <option value="entry">Entry Level</option> | ||||
|                   <option value="mid">Mid Level</option> | ||||
|                   <option value="senior">Senior Level</option> | ||||
|                   <option value="lead">Lead</option> | ||||
|                   <option value="executive">Executive</option> | ||||
|                 </select> | ||||
|               </div> | ||||
|   | ||||
|               <div> | ||||
|                 <label htmlFor="skills" className="block text-sm font-medium text-gray-700"> | ||||
|                   Skills | ||||
|                 </label> | ||||
|                 <input | ||||
|                   type="text" | ||||
|                   name="skills" | ||||
|                   id="skills" | ||||
|                   className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                   placeholder="JavaScript, React, etc." | ||||
|                   value={filters.skills} | ||||
|                   onChange={handleFilterChange} | ||||
|                 /> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
|             <div className="flex justify-end"> | ||||
|               <button | ||||
|                 type="submit" | ||||
|                 className="btn btn-primary" | ||||
|               > | ||||
|                 Search Candidates | ||||
|               </button> | ||||
|             </div> | ||||
|           </form> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {/* Candidates List */} | ||||
|       <div className="grid grid-cols-1 gap-6 lg:grid-cols-2 xl:grid-cols-3"> | ||||
|         {data?.candidates?.length > 0 ? ( | ||||
|           data.candidates.map(<span class="fstat-no" title="function not covered" >(c</span>andidate) => ( | ||||
| <span class="cstat-no" title="statement not covered" >            <div key={candidate.id} className="bg-white shadow rounded-lg"></span> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <div className="flex items-start"> | ||||
|                   <div className="flex-shrink-0"> | ||||
|                     <div className="h-12 w-12 rounded-full bg-primary-100 flex items-center justify-center"> | ||||
|                       <User className="h-6 w-6 text-primary-600" /> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                   <div className="ml-4 flex-1"> | ||||
|                     <h3 className="text-lg font-medium text-gray-900"> | ||||
|                       <Link to={`/candidates/${candidate.id}`} className="hover:text-primary-600"> | ||||
|                         {candidate.first_name} {candidate.last_name} | ||||
|                       </Link> | ||||
|                     </h3> | ||||
|                     <p className="text-sm text-gray-500">{candidate.email}</p> | ||||
|                      | ||||
|                     {candidate.location && ( | ||||
|                       <div className="mt-2 flex items-center text-sm text-gray-500"> | ||||
|                         <MapPin className="h-4 w-4 mr-1" /> | ||||
|                         {candidate.location} | ||||
|                       </div> | ||||
|                     )} | ||||
|   | ||||
|                     {candidate.experience_level && ( | ||||
|                       <div className="mt-2"> | ||||
|                         <span className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${getExperienceColor(candidate.experience_level)}`}> | ||||
|                           {candidate.experience_level} level | ||||
|                         </span> | ||||
|                       </div> | ||||
|                     )} | ||||
|   | ||||
|                     {candidate.bio && ( | ||||
|                       <div className="mt-3"> | ||||
|                         <p className="text-sm text-gray-600 line-clamp-3"> | ||||
|                           {candidate.bio} | ||||
|                         </p> | ||||
|                       </div> | ||||
|                     )} | ||||
|   | ||||
|                     {candidate.skills && candidate.skills.length > 0 && ( | ||||
|                       <div className="mt-3"> | ||||
|                         <div className="flex flex-wrap gap-1"> | ||||
|                           {candidate.skills.slice(0, 4).map(<span class="fstat-no" title="function not covered" >(s</span>kill, index) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                            <span</span> | ||||
|                               key={index} | ||||
|                               className="inline-flex items-center px-2 py-1 rounded text-xs font-medium bg-gray-100 text-gray-800" | ||||
|                             > | ||||
|                               {skill} | ||||
|                             </span> | ||||
|                           ))} | ||||
|                           {candidate.skills.length > 4 && ( | ||||
|                             <span className="text-xs text-gray-500"> | ||||
|                               +{candidate.skills.length - 4} more | ||||
|                             </span> | ||||
|                           )} | ||||
|                         </div> | ||||
|                       </div> | ||||
|                     )} | ||||
|   | ||||
|                     {candidate.salary_expectation && ( | ||||
|                       <div className="mt-3 flex items-center text-sm text-gray-500"> | ||||
|                         <Star className="h-4 w-4 mr-1" /> | ||||
|                         Expected: ${candidate.salary_expectation?.toLocaleString()} | ||||
|                       </div> | ||||
|                     )} | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           )) | ||||
|         ) : ( | ||||
|           <div className="col-span-full text-center py-12"> | ||||
|             <User className="mx-auto h-12 w-12 text-gray-400" /> | ||||
|             <h3 className="mt-2 text-sm font-medium text-gray-900">No candidates found</h3> | ||||
|             <p className="mt-1 text-sm text-gray-500"> | ||||
|               Try adjusting your search criteria | ||||
|             </p> | ||||
|           </div> | ||||
|         )} | ||||
|       </div> | ||||
|   | ||||
|       {/* Pagination */} | ||||
|       {data?.pagination && data.pagination.pages > 1 && ( | ||||
|         <div className="bg-white px-4 py-3 flex items-center justify-between border-t border-gray-200 sm:px-6"> | ||||
|           <div className="flex-1 flex justify-between sm:hidden"> | ||||
|             <button className="relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"> | ||||
|               Previous | ||||
|             </button> | ||||
|             <button className="ml-3 relative inline-flex items-center px-4 py-2 border border-gray-300 text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50"> | ||||
|               Next | ||||
|             </button> | ||||
|           </div> | ||||
|           <div className="hidden sm:flex-1 sm:flex sm:items-center sm:justify-between"> | ||||
|             <div> | ||||
|               <p className="text-sm text-gray-700"> | ||||
|                 Showing{' '} | ||||
|                 <span className="font-medium"> | ||||
|                   {((data.pagination.page - 1) * data.pagination.limit) + 1} | ||||
|                 </span>{' '} | ||||
|                 to{' '} | ||||
|                 <span className="font-medium"> | ||||
|                   {Math.min(data.pagination.page * data.pagination.limit, data.pagination.total)} | ||||
|                 </span>{' '} | ||||
|                 of{' '} | ||||
|                 <span className="font-medium">{data.pagination.total}</span>{' '} | ||||
|                 results | ||||
|               </p> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       )} | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Candidates; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										1471
									
								
								frontend/coverage/lcov-report/src/pages/CreateJob.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1471
									
								
								frontend/coverage/lcov-report/src/pages/CreateJob.js.html
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										934
									
								
								frontend/coverage/lcov-report/src/pages/Dashboard.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										934
									
								
								frontend/coverage/lcov-report/src/pages/Dashboard.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,934 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Dashboard.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Dashboard.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">3.7% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/27</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/47</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">4% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/25</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a> | ||||
| <a name='L151'></a><a href='#L151'>151</a> | ||||
| <a name='L152'></a><a href='#L152'>152</a> | ||||
| <a name='L153'></a><a href='#L153'>153</a> | ||||
| <a name='L154'></a><a href='#L154'>154</a> | ||||
| <a name='L155'></a><a href='#L155'>155</a> | ||||
| <a name='L156'></a><a href='#L156'>156</a> | ||||
| <a name='L157'></a><a href='#L157'>157</a> | ||||
| <a name='L158'></a><a href='#L158'>158</a> | ||||
| <a name='L159'></a><a href='#L159'>159</a> | ||||
| <a name='L160'></a><a href='#L160'>160</a> | ||||
| <a name='L161'></a><a href='#L161'>161</a> | ||||
| <a name='L162'></a><a href='#L162'>162</a> | ||||
| <a name='L163'></a><a href='#L163'>163</a> | ||||
| <a name='L164'></a><a href='#L164'>164</a> | ||||
| <a name='L165'></a><a href='#L165'>165</a> | ||||
| <a name='L166'></a><a href='#L166'>166</a> | ||||
| <a name='L167'></a><a href='#L167'>167</a> | ||||
| <a name='L168'></a><a href='#L168'>168</a> | ||||
| <a name='L169'></a><a href='#L169'>169</a> | ||||
| <a name='L170'></a><a href='#L170'>170</a> | ||||
| <a name='L171'></a><a href='#L171'>171</a> | ||||
| <a name='L172'></a><a href='#L172'>172</a> | ||||
| <a name='L173'></a><a href='#L173'>173</a> | ||||
| <a name='L174'></a><a href='#L174'>174</a> | ||||
| <a name='L175'></a><a href='#L175'>175</a> | ||||
| <a name='L176'></a><a href='#L176'>176</a> | ||||
| <a name='L177'></a><a href='#L177'>177</a> | ||||
| <a name='L178'></a><a href='#L178'>178</a> | ||||
| <a name='L179'></a><a href='#L179'>179</a> | ||||
| <a name='L180'></a><a href='#L180'>180</a> | ||||
| <a name='L181'></a><a href='#L181'>181</a> | ||||
| <a name='L182'></a><a href='#L182'>182</a> | ||||
| <a name='L183'></a><a href='#L183'>183</a> | ||||
| <a name='L184'></a><a href='#L184'>184</a> | ||||
| <a name='L185'></a><a href='#L185'>185</a> | ||||
| <a name='L186'></a><a href='#L186'>186</a> | ||||
| <a name='L187'></a><a href='#L187'>187</a> | ||||
| <a name='L188'></a><a href='#L188'>188</a> | ||||
| <a name='L189'></a><a href='#L189'>189</a> | ||||
| <a name='L190'></a><a href='#L190'>190</a> | ||||
| <a name='L191'></a><a href='#L191'>191</a> | ||||
| <a name='L192'></a><a href='#L192'>192</a> | ||||
| <a name='L193'></a><a href='#L193'>193</a> | ||||
| <a name='L194'></a><a href='#L194'>194</a> | ||||
| <a name='L195'></a><a href='#L195'>195</a> | ||||
| <a name='L196'></a><a href='#L196'>196</a> | ||||
| <a name='L197'></a><a href='#L197'>197</a> | ||||
| <a name='L198'></a><a href='#L198'>198</a> | ||||
| <a name='L199'></a><a href='#L199'>199</a> | ||||
| <a name='L200'></a><a href='#L200'>200</a> | ||||
| <a name='L201'></a><a href='#L201'>201</a> | ||||
| <a name='L202'></a><a href='#L202'>202</a> | ||||
| <a name='L203'></a><a href='#L203'>203</a> | ||||
| <a name='L204'></a><a href='#L204'>204</a> | ||||
| <a name='L205'></a><a href='#L205'>205</a> | ||||
| <a name='L206'></a><a href='#L206'>206</a> | ||||
| <a name='L207'></a><a href='#L207'>207</a> | ||||
| <a name='L208'></a><a href='#L208'>208</a> | ||||
| <a name='L209'></a><a href='#L209'>209</a> | ||||
| <a name='L210'></a><a href='#L210'>210</a> | ||||
| <a name='L211'></a><a href='#L211'>211</a> | ||||
| <a name='L212'></a><a href='#L212'>212</a> | ||||
| <a name='L213'></a><a href='#L213'>213</a> | ||||
| <a name='L214'></a><a href='#L214'>214</a> | ||||
| <a name='L215'></a><a href='#L215'>215</a> | ||||
| <a name='L216'></a><a href='#L216'>216</a> | ||||
| <a name='L217'></a><a href='#L217'>217</a> | ||||
| <a name='L218'></a><a href='#L218'>218</a> | ||||
| <a name='L219'></a><a href='#L219'>219</a> | ||||
| <a name='L220'></a><a href='#L220'>220</a> | ||||
| <a name='L221'></a><a href='#L221'>221</a> | ||||
| <a name='L222'></a><a href='#L222'>222</a> | ||||
| <a name='L223'></a><a href='#L223'>223</a> | ||||
| <a name='L224'></a><a href='#L224'>224</a> | ||||
| <a name='L225'></a><a href='#L225'>225</a> | ||||
| <a name='L226'></a><a href='#L226'>226</a> | ||||
| <a name='L227'></a><a href='#L227'>227</a> | ||||
| <a name='L228'></a><a href='#L228'>228</a> | ||||
| <a name='L229'></a><a href='#L229'>229</a> | ||||
| <a name='L230'></a><a href='#L230'>230</a> | ||||
| <a name='L231'></a><a href='#L231'>231</a> | ||||
| <a name='L232'></a><a href='#L232'>232</a> | ||||
| <a name='L233'></a><a href='#L233'>233</a> | ||||
| <a name='L234'></a><a href='#L234'>234</a> | ||||
| <a name='L235'></a><a href='#L235'>235</a> | ||||
| <a name='L236'></a><a href='#L236'>236</a> | ||||
| <a name='L237'></a><a href='#L237'>237</a> | ||||
| <a name='L238'></a><a href='#L238'>238</a> | ||||
| <a name='L239'></a><a href='#L239'>239</a> | ||||
| <a name='L240'></a><a href='#L240'>240</a> | ||||
| <a name='L241'></a><a href='#L241'>241</a> | ||||
| <a name='L242'></a><a href='#L242'>242</a> | ||||
| <a name='L243'></a><a href='#L243'>243</a> | ||||
| <a name='L244'></a><a href='#L244'>244</a> | ||||
| <a name='L245'></a><a href='#L245'>245</a> | ||||
| <a name='L246'></a><a href='#L246'>246</a> | ||||
| <a name='L247'></a><a href='#L247'>247</a> | ||||
| <a name='L248'></a><a href='#L248'>248</a> | ||||
| <a name='L249'></a><a href='#L249'>249</a> | ||||
| <a name='L250'></a><a href='#L250'>250</a> | ||||
| <a name='L251'></a><a href='#L251'>251</a> | ||||
| <a name='L252'></a><a href='#L252'>252</a> | ||||
| <a name='L253'></a><a href='#L253'>253</a> | ||||
| <a name='L254'></a><a href='#L254'>254</a> | ||||
| <a name='L255'></a><a href='#L255'>255</a> | ||||
| <a name='L256'></a><a href='#L256'>256</a> | ||||
| <a name='L257'></a><a href='#L257'>257</a> | ||||
| <a name='L258'></a><a href='#L258'>258</a> | ||||
| <a name='L259'></a><a href='#L259'>259</a> | ||||
| <a name='L260'></a><a href='#L260'>260</a> | ||||
| <a name='L261'></a><a href='#L261'>261</a> | ||||
| <a name='L262'></a><a href='#L262'>262</a> | ||||
| <a name='L263'></a><a href='#L263'>263</a> | ||||
| <a name='L264'></a><a href='#L264'>264</a> | ||||
| <a name='L265'></a><a href='#L265'>265</a> | ||||
| <a name='L266'></a><a href='#L266'>266</a> | ||||
| <a name='L267'></a><a href='#L267'>267</a> | ||||
| <a name='L268'></a><a href='#L268'>268</a> | ||||
| <a name='L269'></a><a href='#L269'>269</a> | ||||
| <a name='L270'></a><a href='#L270'>270</a> | ||||
| <a name='L271'></a><a href='#L271'>271</a> | ||||
| <a name='L272'></a><a href='#L272'>272</a> | ||||
| <a name='L273'></a><a href='#L273'>273</a> | ||||
| <a name='L274'></a><a href='#L274'>274</a> | ||||
| <a name='L275'></a><a href='#L275'>275</a> | ||||
| <a name='L276'></a><a href='#L276'>276</a> | ||||
| <a name='L277'></a><a href='#L277'>277</a> | ||||
| <a name='L278'></a><a href='#L278'>278</a> | ||||
| <a name='L279'></a><a href='#L279'>279</a> | ||||
| <a name='L280'></a><a href='#L280'>280</a> | ||||
| <a name='L281'></a><a href='#L281'>281</a> | ||||
| <a name='L282'></a><a href='#L282'>282</a> | ||||
| <a name='L283'></a><a href='#L283'>283</a> | ||||
| <a name='L284'></a><a href='#L284'>284</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import { useAuth } from '../contexts/AuthContext'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { | ||||
|   Briefcase, | ||||
|   Users, | ||||
|   FileText, | ||||
|   Building, | ||||
|   TrendingUp, | ||||
|   Clock | ||||
| } from 'lucide-react'; | ||||
|   | ||||
| const Dashboard = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { user } = <span class="cstat-no" title="statement not covered" >useAuth();</span> | ||||
|   | ||||
|   const { data: stats, isLoading } = <span class="cstat-no" title="statement not covered" >useQuery('dashboard-stats', <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const [jobsRes, applicationsRes, candidatesRes, employersRes] = <span class="cstat-no" title="statement not covered" >await Promise.all([</span> | ||||
|       axios.get('/api/jobs?limit=1'), | ||||
|       axios.get('/api/applications?limit=1'), | ||||
|       user?.role === 'candidate' ? Promise.resolve({ data: { applications: { pagination: { total: 0 } } } }) : axios.get('/api/applications?limit=1'), | ||||
|       user?.role === 'employer' || user?.role === 'admin' || user?.role === 'recruiter' ? axios.get('/api/employers?limit=1') : Promise.resolve({ data: [] }) | ||||
|     ]); | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    return {</span> | ||||
|       totalJobs: jobsRes.data.pagination?.total || 0, | ||||
|       totalApplications: applicationsRes.data.pagination?.total || 0, | ||||
|       totalCandidates: candidatesRes.data.pagination?.total || 0, | ||||
|       totalEmployers: employersRes.data.length || 0 | ||||
|     }; | ||||
|   }); | ||||
|   | ||||
|   const { data: recentJobs } = <span class="cstat-no" title="statement not covered" >useQuery('recent-jobs', <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get('/api/jobs?limit=5');</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data.jobs;</span> | ||||
|   }); | ||||
|   | ||||
|   const { data: recentApplications } = <span class="cstat-no" title="statement not covered" >useQuery('recent-applications', <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (user?.role === 'candidate') {</span> | ||||
|       const response = <span class="cstat-no" title="statement not covered" >await axios.get('/api/applications?limit=5');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return response.data.applications;</span> | ||||
|     } | ||||
| <span class="cstat-no" title="statement not covered" >    return [];</span> | ||||
|   }); | ||||
|   | ||||
|   const statsCards = <span class="cstat-no" title="statement not covered" >[</span> | ||||
|     { | ||||
|       name: 'Total Jobs', | ||||
|       value: stats?.totalJobs || 0, | ||||
|       icon: Briefcase, | ||||
|       color: 'bg-blue-500' | ||||
|     }, | ||||
|     { | ||||
|       name: 'Applications', | ||||
|       value: stats?.totalApplications || 0, | ||||
|       icon: FileText, | ||||
|       color: 'bg-green-500' | ||||
|     }, | ||||
|     { | ||||
|       name: 'Candidates', | ||||
|       value: stats?.totalCandidates || 0, | ||||
|       icon: Users, | ||||
|       color: 'bg-purple-500' | ||||
|     }, | ||||
|     { | ||||
|       name: 'Employers', | ||||
|       value: stats?.totalEmployers || 0, | ||||
|       icon: Building, | ||||
|       color: 'bg-orange-500' | ||||
|     } | ||||
|   ]; | ||||
|   | ||||
|   const getGreeting = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >()</span> => {</span> | ||||
|     const hour = <span class="cstat-no" title="statement not covered" >new Date().getHours();</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (hour < 12) <span class="cstat-no" title="statement not covered" >return 'Good morning';</span></span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (hour < 18) <span class="cstat-no" title="statement not covered" >return 'Good afternoon';</span></span> | ||||
| <span class="cstat-no" title="statement not covered" >    return 'Good evening';</span> | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div | ||||
|           role="status" | ||||
|           aria-label="Loading dashboard" | ||||
|           className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600" | ||||
|         ></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div> | ||||
|         <h1 className="text-2xl font-bold text-gray-900"> | ||||
|           {getGreeting()}, {user?.firstName}! | ||||
|         </h1> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           Welcome to your MerchantsOfHope-SupplyANdDemandPortal dashboard | ||||
|         </p> | ||||
|       </div> | ||||
|   | ||||
|       {/* Stats Cards */} | ||||
|       <div className="grid grid-cols-1 gap-5 sm:grid-cols-2 lg:grid-cols-4"> | ||||
|         {statsCards.map(<span class="fstat-no" title="function not covered" >(c</span>ard) => ( | ||||
| <span class="cstat-no" title="statement not covered" >          <div key={card.name} className="bg-white overflow-hidden shadow rounded-lg"></span> | ||||
|             <div className="p-5"> | ||||
|               <div className="flex items-center"> | ||||
|                 <div className="flex-shrink-0"> | ||||
|                   <div className={`p-3 rounded-md ${card.color}`}> | ||||
|                     <card.icon className="h-6 w-6 text-white" /> | ||||
|                   </div> | ||||
|                 </div> | ||||
|                 <div className="ml-5 w-0 flex-1"> | ||||
|                   <dl> | ||||
|                     <dt className="text-sm font-medium text-gray-500 truncate"> | ||||
|                       {card.name} | ||||
|                     </dt> | ||||
|                     <dd className="text-lg font-medium text-gray-900"> | ||||
|                       {card.value} | ||||
|                     </dd> | ||||
|                   </dl> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         ))} | ||||
|       </div> | ||||
|   | ||||
|       <div className="grid grid-cols-1 gap-6 lg:grid-cols-2"> | ||||
|         {/* Recent Jobs */} | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h3 className="text-lg leading-6 font-medium text-gray-900"> | ||||
|               Recent Job Postings | ||||
|             </h3> | ||||
|             <div className="mt-5"> | ||||
|               {recentJobs?.length > 0 ? ( | ||||
|                 <div className="space-y-3"> | ||||
|                   {recentJobs.map(<span class="fstat-no" title="function not covered" >(j</span>ob) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                    <div key={job.id} className="flex items-center justify-between p-3 bg-gray-50 rounded-lg"></span> | ||||
|                       <div className="flex-1 min-w-0"> | ||||
|                         <p className="text-sm font-medium text-gray-900 truncate"> | ||||
|                           {job.title} | ||||
|                         </p> | ||||
|                         <p className="text-sm text-gray-500"> | ||||
|                           {job.company_name} | ||||
|                         </p> | ||||
|                       </div> | ||||
|                       <div className="flex items-center text-sm text-gray-500"> | ||||
|                         <Clock className="h-4 w-4 mr-1" /> | ||||
|                         {new Date(job.created_at).toLocaleDateString()} | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   ))} | ||||
|                 </div> | ||||
|               ) : ( | ||||
|                 <p className="text-sm text-gray-500">No recent jobs found</p> | ||||
|               )} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|   | ||||
|         {/* Recent Applications */} | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h3 className="text-lg leading-6 font-medium text-gray-900"> | ||||
|               Recent Applications | ||||
|             </h3> | ||||
|             <div className="mt-5"> | ||||
|               {recentApplications?.length > 0 ? ( | ||||
|                 <div className="space-y-3"> | ||||
|                   {recentApplications.map(<span class="fstat-no" title="function not covered" >(a</span>pplication) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                    <div key={application.id} className="flex items-center justify-between p-3 bg-gray-50 rounded-lg"></span> | ||||
|                       <div className="flex-1 min-w-0"> | ||||
|                         <p className="text-sm font-medium text-gray-900 truncate"> | ||||
|                           {application.job_title} | ||||
|                         </p> | ||||
|                         <p className="text-sm text-gray-500"> | ||||
|                           {application.company_name} | ||||
|                         </p> | ||||
|                       </div> | ||||
|                       <div className="flex items-center"> | ||||
|                         <span className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${ | ||||
|                           application.status === 'applied' ? 'bg-blue-100 text-blue-800' : | ||||
|                           application.status === 'reviewed' ? 'bg-yellow-100 text-yellow-800' : | ||||
|                           application.status === 'shortlisted' ? 'bg-green-100 text-green-800' : | ||||
|                           application.status === 'rejected' ? 'bg-red-100 text-red-800' : | ||||
|                           'bg-gray-100 text-gray-800' | ||||
|                         }`}> | ||||
|                           {application.status} | ||||
|                         </span> | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   ))} | ||||
|                 </div> | ||||
|               ) : ( | ||||
|                 <p className="text-sm text-gray-500">No recent applications found</p> | ||||
|               )} | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {/* Quick Actions */} | ||||
|       <div className="bg-white shadow rounded-lg"> | ||||
|         <div className="px-4 py-5 sm:p-6"> | ||||
|           <h3 className="text-lg leading-6 font-medium text-gray-900"> | ||||
|             Quick Actions | ||||
|           </h3> | ||||
|           <div className="mt-5 grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-3"> | ||||
|             {user?.role === 'employer' && ( | ||||
|               <Link | ||||
|                 to="/jobs/create" | ||||
|                 className="relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-primary-500 rounded-lg border border-gray-200 hover:border-gray-300" | ||||
|               > | ||||
|                 <div> | ||||
|                   <span className="rounded-lg inline-flex p-3 bg-primary-50 text-primary-700 ring-4 ring-white"> | ||||
|                     <Briefcase className="h-6 w-6" /> | ||||
|                   </span> | ||||
|                 </div> | ||||
|                 <div className="mt-8"> | ||||
|                   <h3 className="text-lg font-medium"> | ||||
|                     <span className="absolute inset-0" /> | ||||
|                     Post a Job | ||||
|                   </h3> | ||||
|                   <p className="mt-2 text-sm text-gray-500"> | ||||
|                     Create a new job posting to attract candidates | ||||
|                   </p> | ||||
|                 </div> | ||||
|               </Link> | ||||
|             )} | ||||
|              | ||||
|             {user?.role === 'candidate' && ( | ||||
|               <a | ||||
|                 href="/jobs" | ||||
|                 className="relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-primary-500 rounded-lg border border-gray-200 hover:border-gray-300" | ||||
|               > | ||||
|                 <div> | ||||
|                   <span className="rounded-lg inline-flex p-3 bg-primary-50 text-primary-700 ring-4 ring-white"> | ||||
|                     <TrendingUp className="h-6 w-6" /> | ||||
|                   </span> | ||||
|                 </div> | ||||
|                 <div className="mt-8"> | ||||
|                   <h3 className="text-lg font-medium"> | ||||
|                     <span className="absolute inset-0" /> | ||||
|                     Browse Jobs | ||||
|                   </h3> | ||||
|                   <p className="mt-2 text-sm text-gray-500"> | ||||
|                     Find your next career opportunity | ||||
|                   </p> | ||||
|                 </div> | ||||
|               </a> | ||||
|             )} | ||||
|   | ||||
|             <a | ||||
|               href="/applications" | ||||
|               className="relative group bg-white p-6 focus-within:ring-2 focus-within:ring-inset focus-within:ring-primary-500 rounded-lg border border-gray-200 hover:border-gray-300" | ||||
|             > | ||||
|               <div> | ||||
|                 <span className="rounded-lg inline-flex p-3 bg-primary-50 text-primary-700 ring-4 ring-white"> | ||||
|                   <FileText className="h-6 w-6" /> | ||||
|                 </span> | ||||
|               </div> | ||||
|               <div className="mt-8"> | ||||
|                 <h3 className="text-lg font-medium"> | ||||
|                   <span className="absolute inset-0" /> | ||||
|                   View Applications | ||||
|                 </h3> | ||||
|                 <p className="mt-2 text-sm text-gray-500"> | ||||
|                   Track your application status | ||||
|                 </p> | ||||
|               </div> | ||||
|             </a> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Dashboard; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										418
									
								
								frontend/coverage/lcov-report/src/pages/EmployerDetails.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										418
									
								
								frontend/coverage/lcov-report/src/pages/EmployerDetails.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,418 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/EmployerDetails.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> EmployerDetails.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">10% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/10</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/16</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/2</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">10% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/10</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import { useParams } from 'react-router-dom'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { Building, MapPin, Users, Globe, Phone } from 'lucide-react'; | ||||
|   | ||||
| const EmployerDetails = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { id } = <span class="cstat-no" title="statement not covered" >useParams();</span> | ||||
|   | ||||
|   const { data: employer, isLoading } = <span class="cstat-no" title="statement not covered" >useQuery(['employer', id], <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get(`/api/employers/${id}`);</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data;</span> | ||||
|   }); | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (!employer) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="text-center py-12"> | ||||
|         <h3 className="text-lg font-medium text-gray-900">Employer not found</h3> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           The employer you're looking for doesn't exist. | ||||
|         </p> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div className="bg-white shadow rounded-lg"> | ||||
|         <div className="px-4 py-5 sm:p-6"> | ||||
|           <div className="flex items-start"> | ||||
|             <div className="flex-shrink-0"> | ||||
|               <div className="h-16 w-16 rounded-full bg-primary-100 flex items-center justify-center"> | ||||
|                 <Building className="h-8 w-8 text-primary-600" /> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div className="ml-6 flex-1"> | ||||
|               <h1 className="text-2xl font-bold text-gray-900"> | ||||
|                 {employer.company_name} | ||||
|               </h1> | ||||
|               <p className="text-lg text-gray-600">{employer.first_name} {employer.last_name}</p> | ||||
|               <p className="text-sm text-gray-500">{employer.email}</p> | ||||
|                | ||||
|               <div className="mt-4 grid grid-cols-1 gap-4 sm:grid-cols-2"> | ||||
|                 {employer.industry && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Building className="h-4 w-4 mr-2" /> | ||||
|                     {employer.industry} | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {employer.company_size && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Users className="h-4 w-4 mr-2" /> | ||||
|                     {employer.company_size} employees | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {employer.website && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Globe className="h-4 w-4 mr-2" /> | ||||
|                     <a href={employer.website} target="_blank" rel="noopener noreferrer" className="text-primary-600 hover:text-primary-500"> | ||||
|                       Website | ||||
|                     </a> | ||||
|                   </div> | ||||
|                 )} | ||||
|                  | ||||
|                 {employer.phone && ( | ||||
|                   <div className="flex items-center text-sm text-gray-500"> | ||||
|                     <Phone className="h-4 w-4 mr-2" /> | ||||
|                     {employer.phone} | ||||
|                   </div> | ||||
|                 )} | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {employer.description && ( | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h2 className="text-lg font-medium text-gray-900 mb-4">About {employer.company_name}</h2> | ||||
|             <p className="text-gray-600 whitespace-pre-wrap">{employer.description}</p> | ||||
|           </div> | ||||
|         </div> | ||||
|       )} | ||||
|   | ||||
|       {employer.address && ( | ||||
|         <div className="bg-white shadow rounded-lg"> | ||||
|           <div className="px-4 py-5 sm:p-6"> | ||||
|             <h2 className="text-lg font-medium text-gray-900 mb-4">Address</h2> | ||||
|             <div className="flex items-start"> | ||||
|               <MapPin className="h-5 w-5 text-gray-400 mr-3 mt-0.5" /> | ||||
|               <p className="text-gray-600">{employer.address}</p> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       )} | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default EmployerDetails; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										379
									
								
								frontend/coverage/lcov-report/src/pages/Employers.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										379
									
								
								frontend/coverage/lcov-report/src/pages/Employers.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,379 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Employers.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Employers.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">12.5% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/12</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/3</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">12.5% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React from 'react'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { Building, Users, Globe } from 'lucide-react'; | ||||
|   | ||||
| const Employers = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { data, isLoading } = <span class="cstat-no" title="statement not covered" >useQuery('employers', <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get('/api/employers');</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data;</span> | ||||
|   }); | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div> | ||||
|         <h1 className="text-2xl font-bold text-gray-900">Employers</h1> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           Browse companies and employers | ||||
|         </p> | ||||
|       </div> | ||||
|   | ||||
|       <div className="grid grid-cols-1 gap-6 lg:grid-cols-2 xl:grid-cols-3"> | ||||
|         {data?.length > 0 ? ( | ||||
|           data.map(<span class="fstat-no" title="function not covered" >(e</span>mployer) => ( | ||||
| <span class="cstat-no" title="statement not covered" >            <div key={employer.id} className="bg-white shadow rounded-lg"></span> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <div className="flex items-start"> | ||||
|                   <div className="flex-shrink-0"> | ||||
|                     <div className="h-12 w-12 rounded-full bg-primary-100 flex items-center justify-center"> | ||||
|                       <Building className="h-6 w-6 text-primary-600" /> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                   <div className="ml-4 flex-1"> | ||||
|                     <h3 className="text-lg font-medium text-gray-900"> | ||||
|                       <Link to={`/employers/${employer.id}`} className="hover:text-primary-600"> | ||||
|                         {employer.company_name} | ||||
|                       </Link> | ||||
|                     </h3> | ||||
|                     <p className="text-sm text-gray-500">{employer.first_name} {employer.last_name}</p> | ||||
|                      | ||||
|                     {employer.industry && ( | ||||
|                       <div className="mt-2 flex items-center text-sm text-gray-500"> | ||||
|                         <Building className="h-4 w-4 mr-1" /> | ||||
|                         {employer.industry} | ||||
|                       </div> | ||||
|                     )} | ||||
|                      | ||||
|                     {employer.company_size && ( | ||||
|                       <div className="mt-1 flex items-center text-sm text-gray-500"> | ||||
|                         <Users className="h-4 w-4 mr-1" /> | ||||
|                         {employer.company_size} employees | ||||
|                       </div> | ||||
|                     )} | ||||
|                      | ||||
|                     {employer.website && ( | ||||
|                       <div className="mt-1 flex items-center text-sm text-gray-500"> | ||||
|                         <Globe className="h-4 w-4 mr-1" /> | ||||
|                         <a href={employer.website} target="_blank" rel="noopener noreferrer" className="text-primary-600 hover:text-primary-500"> | ||||
|                           Website | ||||
|                         </a> | ||||
|                       </div> | ||||
|                     )} | ||||
|                      | ||||
|                     {employer.description && ( | ||||
|                       <div className="mt-3"> | ||||
|                         <p className="text-sm text-gray-600 line-clamp-3"> | ||||
|                           {employer.description} | ||||
|                         </p> | ||||
|                       </div> | ||||
|                     )} | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           )) | ||||
|         ) : ( | ||||
|           <div className="col-span-full text-center py-12"> | ||||
|             <Building className="mx-auto h-12 w-12 text-gray-400" /> | ||||
|             <h3 className="mt-2 text-sm font-medium text-gray-900">No employers found</h3> | ||||
|             <p className="mt-1 text-sm text-gray-500"> | ||||
|               No employers have registered yet. | ||||
|             </p> | ||||
|           </div> | ||||
|         )} | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Employers; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										964
									
								
								frontend/coverage/lcov-report/src/pages/JobDetails.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										964
									
								
								frontend/coverage/lcov-report/src/pages/JobDetails.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,964 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/JobDetails.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> JobDetails.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">2.7% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/37</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/51</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/9</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">2.94% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/34</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a> | ||||
| <a name='L151'></a><a href='#L151'>151</a> | ||||
| <a name='L152'></a><a href='#L152'>152</a> | ||||
| <a name='L153'></a><a href='#L153'>153</a> | ||||
| <a name='L154'></a><a href='#L154'>154</a> | ||||
| <a name='L155'></a><a href='#L155'>155</a> | ||||
| <a name='L156'></a><a href='#L156'>156</a> | ||||
| <a name='L157'></a><a href='#L157'>157</a> | ||||
| <a name='L158'></a><a href='#L158'>158</a> | ||||
| <a name='L159'></a><a href='#L159'>159</a> | ||||
| <a name='L160'></a><a href='#L160'>160</a> | ||||
| <a name='L161'></a><a href='#L161'>161</a> | ||||
| <a name='L162'></a><a href='#L162'>162</a> | ||||
| <a name='L163'></a><a href='#L163'>163</a> | ||||
| <a name='L164'></a><a href='#L164'>164</a> | ||||
| <a name='L165'></a><a href='#L165'>165</a> | ||||
| <a name='L166'></a><a href='#L166'>166</a> | ||||
| <a name='L167'></a><a href='#L167'>167</a> | ||||
| <a name='L168'></a><a href='#L168'>168</a> | ||||
| <a name='L169'></a><a href='#L169'>169</a> | ||||
| <a name='L170'></a><a href='#L170'>170</a> | ||||
| <a name='L171'></a><a href='#L171'>171</a> | ||||
| <a name='L172'></a><a href='#L172'>172</a> | ||||
| <a name='L173'></a><a href='#L173'>173</a> | ||||
| <a name='L174'></a><a href='#L174'>174</a> | ||||
| <a name='L175'></a><a href='#L175'>175</a> | ||||
| <a name='L176'></a><a href='#L176'>176</a> | ||||
| <a name='L177'></a><a href='#L177'>177</a> | ||||
| <a name='L178'></a><a href='#L178'>178</a> | ||||
| <a name='L179'></a><a href='#L179'>179</a> | ||||
| <a name='L180'></a><a href='#L180'>180</a> | ||||
| <a name='L181'></a><a href='#L181'>181</a> | ||||
| <a name='L182'></a><a href='#L182'>182</a> | ||||
| <a name='L183'></a><a href='#L183'>183</a> | ||||
| <a name='L184'></a><a href='#L184'>184</a> | ||||
| <a name='L185'></a><a href='#L185'>185</a> | ||||
| <a name='L186'></a><a href='#L186'>186</a> | ||||
| <a name='L187'></a><a href='#L187'>187</a> | ||||
| <a name='L188'></a><a href='#L188'>188</a> | ||||
| <a name='L189'></a><a href='#L189'>189</a> | ||||
| <a name='L190'></a><a href='#L190'>190</a> | ||||
| <a name='L191'></a><a href='#L191'>191</a> | ||||
| <a name='L192'></a><a href='#L192'>192</a> | ||||
| <a name='L193'></a><a href='#L193'>193</a> | ||||
| <a name='L194'></a><a href='#L194'>194</a> | ||||
| <a name='L195'></a><a href='#L195'>195</a> | ||||
| <a name='L196'></a><a href='#L196'>196</a> | ||||
| <a name='L197'></a><a href='#L197'>197</a> | ||||
| <a name='L198'></a><a href='#L198'>198</a> | ||||
| <a name='L199'></a><a href='#L199'>199</a> | ||||
| <a name='L200'></a><a href='#L200'>200</a> | ||||
| <a name='L201'></a><a href='#L201'>201</a> | ||||
| <a name='L202'></a><a href='#L202'>202</a> | ||||
| <a name='L203'></a><a href='#L203'>203</a> | ||||
| <a name='L204'></a><a href='#L204'>204</a> | ||||
| <a name='L205'></a><a href='#L205'>205</a> | ||||
| <a name='L206'></a><a href='#L206'>206</a> | ||||
| <a name='L207'></a><a href='#L207'>207</a> | ||||
| <a name='L208'></a><a href='#L208'>208</a> | ||||
| <a name='L209'></a><a href='#L209'>209</a> | ||||
| <a name='L210'></a><a href='#L210'>210</a> | ||||
| <a name='L211'></a><a href='#L211'>211</a> | ||||
| <a name='L212'></a><a href='#L212'>212</a> | ||||
| <a name='L213'></a><a href='#L213'>213</a> | ||||
| <a name='L214'></a><a href='#L214'>214</a> | ||||
| <a name='L215'></a><a href='#L215'>215</a> | ||||
| <a name='L216'></a><a href='#L216'>216</a> | ||||
| <a name='L217'></a><a href='#L217'>217</a> | ||||
| <a name='L218'></a><a href='#L218'>218</a> | ||||
| <a name='L219'></a><a href='#L219'>219</a> | ||||
| <a name='L220'></a><a href='#L220'>220</a> | ||||
| <a name='L221'></a><a href='#L221'>221</a> | ||||
| <a name='L222'></a><a href='#L222'>222</a> | ||||
| <a name='L223'></a><a href='#L223'>223</a> | ||||
| <a name='L224'></a><a href='#L224'>224</a> | ||||
| <a name='L225'></a><a href='#L225'>225</a> | ||||
| <a name='L226'></a><a href='#L226'>226</a> | ||||
| <a name='L227'></a><a href='#L227'>227</a> | ||||
| <a name='L228'></a><a href='#L228'>228</a> | ||||
| <a name='L229'></a><a href='#L229'>229</a> | ||||
| <a name='L230'></a><a href='#L230'>230</a> | ||||
| <a name='L231'></a><a href='#L231'>231</a> | ||||
| <a name='L232'></a><a href='#L232'>232</a> | ||||
| <a name='L233'></a><a href='#L233'>233</a> | ||||
| <a name='L234'></a><a href='#L234'>234</a> | ||||
| <a name='L235'></a><a href='#L235'>235</a> | ||||
| <a name='L236'></a><a href='#L236'>236</a> | ||||
| <a name='L237'></a><a href='#L237'>237</a> | ||||
| <a name='L238'></a><a href='#L238'>238</a> | ||||
| <a name='L239'></a><a href='#L239'>239</a> | ||||
| <a name='L240'></a><a href='#L240'>240</a> | ||||
| <a name='L241'></a><a href='#L241'>241</a> | ||||
| <a name='L242'></a><a href='#L242'>242</a> | ||||
| <a name='L243'></a><a href='#L243'>243</a> | ||||
| <a name='L244'></a><a href='#L244'>244</a> | ||||
| <a name='L245'></a><a href='#L245'>245</a> | ||||
| <a name='L246'></a><a href='#L246'>246</a> | ||||
| <a name='L247'></a><a href='#L247'>247</a> | ||||
| <a name='L248'></a><a href='#L248'>248</a> | ||||
| <a name='L249'></a><a href='#L249'>249</a> | ||||
| <a name='L250'></a><a href='#L250'>250</a> | ||||
| <a name='L251'></a><a href='#L251'>251</a> | ||||
| <a name='L252'></a><a href='#L252'>252</a> | ||||
| <a name='L253'></a><a href='#L253'>253</a> | ||||
| <a name='L254'></a><a href='#L254'>254</a> | ||||
| <a name='L255'></a><a href='#L255'>255</a> | ||||
| <a name='L256'></a><a href='#L256'>256</a> | ||||
| <a name='L257'></a><a href='#L257'>257</a> | ||||
| <a name='L258'></a><a href='#L258'>258</a> | ||||
| <a name='L259'></a><a href='#L259'>259</a> | ||||
| <a name='L260'></a><a href='#L260'>260</a> | ||||
| <a name='L261'></a><a href='#L261'>261</a> | ||||
| <a name='L262'></a><a href='#L262'>262</a> | ||||
| <a name='L263'></a><a href='#L263'>263</a> | ||||
| <a name='L264'></a><a href='#L264'>264</a> | ||||
| <a name='L265'></a><a href='#L265'>265</a> | ||||
| <a name='L266'></a><a href='#L266'>266</a> | ||||
| <a name='L267'></a><a href='#L267'>267</a> | ||||
| <a name='L268'></a><a href='#L268'>268</a> | ||||
| <a name='L269'></a><a href='#L269'>269</a> | ||||
| <a name='L270'></a><a href='#L270'>270</a> | ||||
| <a name='L271'></a><a href='#L271'>271</a> | ||||
| <a name='L272'></a><a href='#L272'>272</a> | ||||
| <a name='L273'></a><a href='#L273'>273</a> | ||||
| <a name='L274'></a><a href='#L274'>274</a> | ||||
| <a name='L275'></a><a href='#L275'>275</a> | ||||
| <a name='L276'></a><a href='#L276'>276</a> | ||||
| <a name='L277'></a><a href='#L277'>277</a> | ||||
| <a name='L278'></a><a href='#L278'>278</a> | ||||
| <a name='L279'></a><a href='#L279'>279</a> | ||||
| <a name='L280'></a><a href='#L280'>280</a> | ||||
| <a name='L281'></a><a href='#L281'>281</a> | ||||
| <a name='L282'></a><a href='#L282'>282</a> | ||||
| <a name='L283'></a><a href='#L283'>283</a> | ||||
| <a name='L284'></a><a href='#L284'>284</a> | ||||
| <a name='L285'></a><a href='#L285'>285</a> | ||||
| <a name='L286'></a><a href='#L286'>286</a> | ||||
| <a name='L287'></a><a href='#L287'>287</a> | ||||
| <a name='L288'></a><a href='#L288'>288</a> | ||||
| <a name='L289'></a><a href='#L289'>289</a> | ||||
| <a name='L290'></a><a href='#L290'>290</a> | ||||
| <a name='L291'></a><a href='#L291'>291</a> | ||||
| <a name='L292'></a><a href='#L292'>292</a> | ||||
| <a name='L293'></a><a href='#L293'>293</a> | ||||
| <a name='L294'></a><a href='#L294'>294</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { useParams, Link } from 'react-router-dom'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { useAuth } from '../contexts/AuthContext'; | ||||
| import { MapPin, Clock, DollarSign, Briefcase, Users, Calendar } from 'lucide-react'; | ||||
| import toast from 'react-hot-toast'; | ||||
|   | ||||
| const JobDetails = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { id } = <span class="cstat-no" title="statement not covered" >useParams();</span> | ||||
|   const { user } = <span class="cstat-no" title="statement not covered" >useAuth();</span> | ||||
|   const [applying, setApplying] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   const [coverLetter, setCoverLetter] = <span class="cstat-no" title="statement not covered" >useState('');</span> | ||||
|   | ||||
|   const { data: job, isLoading } = <span class="cstat-no" title="statement not covered" >useQuery(['job', id], <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     const response = <span class="cstat-no" title="statement not covered" >await axios.get(`/api/jobs/${id}`);</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return response.data;</span> | ||||
|   }); | ||||
|   | ||||
|   const handleApply = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (!coverLetter.trim()) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error('Please provide a cover letter');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return;</span> | ||||
|     } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    setApplying(true);</span> | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      await axios.post('/api/applications', {</span> | ||||
|         jobId: id, | ||||
|         coverLetter: coverLetter.trim() | ||||
|       }); | ||||
| <span class="cstat-no" title="statement not covered" >      toast.success('Application submitted successfully!');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      setCoverLetter('');</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error(error.response?.data?.error || 'Failed to submit application');</span> | ||||
|     } finally { | ||||
| <span class="cstat-no" title="statement not covered" >      setApplying(false);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (!job) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="text-center py-12"> | ||||
|         <h3 className="text-lg font-medium text-gray-900">Job not found</h3> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           The job you're looking for doesn't exist or has been removed. | ||||
|         </p> | ||||
|         <div className="mt-6"> | ||||
|           <Link to="/jobs" className="btn btn-primary"> | ||||
|             Browse Jobs | ||||
|           </Link> | ||||
|         </div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
|   const formatSalary = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(m</span>in, max, currency = <span class="branch-0 cbranch-no" title="branch not covered" >'USD')</span> => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (!min && !max) <span class="cstat-no" title="statement not covered" >return 'Salary not specified';</span></span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (!min) <span class="cstat-no" title="statement not covered" >return `Up to ${currency} ${max?.toLocaleString()}`;</span></span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (!max) <span class="cstat-no" title="statement not covered" >return `From ${currency} ${min?.toLocaleString()}`;</span></span> | ||||
| <span class="cstat-no" title="statement not covered" >    return `${currency} ${min?.toLocaleString()} - ${max?.toLocaleString()}`;</span> | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div className="flex items-center justify-between"> | ||||
|         <div> | ||||
|           <Link to="/jobs" className="text-sm text-primary-600 hover:text-primary-500"> | ||||
|             ← Back to Jobs | ||||
|           </Link> | ||||
|           <h1 className="mt-2 text-3xl font-bold text-gray-900">{job.title}</h1> | ||||
|           <div className="mt-2 flex items-center text-lg text-gray-600"> | ||||
|             <Briefcase className="h-5 w-5 mr-2" /> | ||||
|             {job.company_name} | ||||
|           </div> | ||||
|         </div> | ||||
|         {user?.role === 'candidate' && job.status === 'active' && ( | ||||
|           <div className="flex space-x-3"> | ||||
|             <button | ||||
|               onClick={handleApply} | ||||
|               disabled={applying} | ||||
|               className="btn btn-primary disabled:opacity-50" | ||||
|             > | ||||
|               {applying ? 'Applying...' : 'Apply Now'} | ||||
|             </button> | ||||
|           </div> | ||||
|         )} | ||||
|       </div> | ||||
|   | ||||
|       <div className="grid grid-cols-1 lg:grid-cols-3 gap-6"> | ||||
|         <div className="lg:col-span-2 space-y-6"> | ||||
|           {/* Job Description */} | ||||
|           <div className="bg-white shadow rounded-lg"> | ||||
|             <div className="px-4 py-5 sm:p-6"> | ||||
|               <h2 className="text-lg font-medium text-gray-900 mb-4">Job Description</h2> | ||||
|               <div className="prose max-w-none"> | ||||
|                 <p className="text-gray-600 whitespace-pre-wrap">{job.description}</p> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
|           {/* Requirements */} | ||||
|           {job.requirements && job.requirements.length > 0 && ( | ||||
|             <div className="bg-white shadow rounded-lg"> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <h2 className="text-lg font-medium text-gray-900 mb-4">Requirements</h2> | ||||
|                 <ul className="list-disc list-inside space-y-2"> | ||||
|                   {job.requirements.map(<span class="fstat-no" title="function not covered" >(r</span>equirement, index) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                    <li key={index} className="text-gray-600">{requirement}</li></span> | ||||
|                   ))} | ||||
|                 </ul> | ||||
|               </div> | ||||
|             </div> | ||||
|           )} | ||||
|   | ||||
|           {/* Responsibilities */} | ||||
|           {job.responsibilities && job.responsibilities.length > 0 && ( | ||||
|             <div className="bg-white shadow rounded-lg"> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <h2 className="text-lg font-medium text-gray-900 mb-4">Responsibilities</h2> | ||||
|                 <ul className="list-disc list-inside space-y-2"> | ||||
|                   {job.responsibilities.map(<span class="fstat-no" title="function not covered" >(r</span>esponsibility, index) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                    <li key={index} className="text-gray-600">{responsibility}</li></span> | ||||
|                   ))} | ||||
|                 </ul> | ||||
|               </div> | ||||
|             </div> | ||||
|           )} | ||||
|   | ||||
|           {/* Skills Required */} | ||||
|           {job.skills_required && job.skills_required.length > 0 && ( | ||||
|             <div className="bg-white shadow rounded-lg"> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <h2 className="text-lg font-medium text-gray-900 mb-4">Required Skills</h2> | ||||
|                 <div className="flex flex-wrap gap-2"> | ||||
|                   {job.skills_required.map(<span class="fstat-no" title="function not covered" >(s</span>kill, index) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                    <span</span> | ||||
|                       key={index} | ||||
|                       className="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-primary-100 text-primary-800" | ||||
|                     > | ||||
|                       {skill} | ||||
|                     </span> | ||||
|                   ))} | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           )} | ||||
|   | ||||
|           {/* Benefits */} | ||||
|           {job.benefits && job.benefits.length > 0 && ( | ||||
|             <div className="bg-white shadow rounded-lg"> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <h2 className="text-lg font-medium text-gray-900 mb-4">Benefits</h2> | ||||
|                 <ul className="list-disc list-inside space-y-2"> | ||||
|                   {job.benefits.map(<span class="fstat-no" title="function not covered" >(b</span>enefit, index) => ( | ||||
| <span class="cstat-no" title="statement not covered" >                    <li key={index} className="text-gray-600">{benefit}</li></span> | ||||
|                   ))} | ||||
|                 </ul> | ||||
|               </div> | ||||
|             </div> | ||||
|           )} | ||||
|         </div> | ||||
|   | ||||
|         {/* Sidebar */} | ||||
|         <div className="space-y-6"> | ||||
|           {/* Job Details */} | ||||
|           <div className="bg-white shadow rounded-lg"> | ||||
|             <div className="px-4 py-5 sm:p-6"> | ||||
|               <h3 className="text-lg font-medium text-gray-900 mb-4">Job Details</h3> | ||||
|               <div className="space-y-4"> | ||||
|                 <div className="flex items-center"> | ||||
|                   <MapPin className="h-5 w-5 text-gray-400 mr-3" /> | ||||
|                   <div> | ||||
|                     <p className="text-sm font-medium text-gray-900">{job.location}</p> | ||||
|                     {job.remote_allowed && ( | ||||
|                       <p className="text-sm text-gray-500">Remote work allowed</p> | ||||
|                     )} | ||||
|                   </div> | ||||
|                 </div> | ||||
|   | ||||
|                 <div className="flex items-center"> | ||||
|                   <Briefcase className="h-5 w-5 text-gray-400 mr-3" /> | ||||
|                   <div> | ||||
|                     <p className="text-sm font-medium text-gray-900 capitalize"> | ||||
|                       {job.employment_type?.replace('-', ' ')} | ||||
|                     </p> | ||||
|                   </div> | ||||
|                 </div> | ||||
|   | ||||
|                 <div className="flex items-center"> | ||||
|                   <DollarSign className="h-5 w-5 text-gray-400 mr-3" /> | ||||
|                   <div> | ||||
|                     <p className="text-sm font-medium text-gray-900"> | ||||
|                       {formatSalary(job.salary_min, job.salary_max, job.currency)} | ||||
|                     </p> | ||||
|                   </div> | ||||
|                 </div> | ||||
|   | ||||
|                 {job.experience_level && ( | ||||
|                   <div className="flex items-center"> | ||||
|                     <Users className="h-5 w-5 text-gray-400 mr-3" /> | ||||
|                     <div> | ||||
|                       <p className="text-sm font-medium text-gray-900 capitalize"> | ||||
|                         {job.experience_level} level | ||||
|                       </p> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                 )} | ||||
|   | ||||
|                 <div className="flex items-center"> | ||||
|                   <Clock className="h-5 w-5 text-gray-400 mr-3" /> | ||||
|                   <div> | ||||
|                     <p className="text-sm font-medium text-gray-900"> | ||||
|                       Posted {new Date(job.created_at).toLocaleDateString()} | ||||
|                     </p> | ||||
|                   </div> | ||||
|                 </div> | ||||
|   | ||||
|                 {job.application_deadline && ( | ||||
|                   <div className="flex items-center"> | ||||
|                     <Calendar className="h-5 w-5 text-gray-400 mr-3" /> | ||||
|                     <div> | ||||
|                       <p className="text-sm font-medium text-gray-900"> | ||||
|                         Apply by {new Date(job.application_deadline).toLocaleDateString()} | ||||
|                       </p> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                 )} | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
|           {/* Company Info */} | ||||
|           <div className="bg-white shadow rounded-lg"> | ||||
|             <div className="px-4 py-5 sm:p-6"> | ||||
|               <h3 className="text-lg font-medium text-gray-900 mb-4">Company</h3> | ||||
|               <div className="space-y-2"> | ||||
|                 <p className="text-sm font-medium text-gray-900">{job.company_name}</p> | ||||
|                 {job.industry && ( | ||||
|                   <p className="text-sm text-gray-500">{job.industry}</p> | ||||
|                 )} | ||||
|                 {job.company_size && ( | ||||
|                   <p className="text-sm text-gray-500">{job.company_size} employees</p> | ||||
|                 )} | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
|           {/* Apply Section for Candidates */} | ||||
|           {user?.role === 'candidate' && job.status === 'active' && ( | ||||
|             <div className="bg-white shadow rounded-lg"> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <h3 className="text-lg font-medium text-gray-900 mb-4">Apply for this job</h3> | ||||
|                 <div className="space-y-4"> | ||||
|                   <div> | ||||
|                     <label htmlFor="coverLetter" className="block text-sm font-medium text-gray-700"> | ||||
|                       Cover Letter | ||||
|                     </label> | ||||
|                     <textarea | ||||
|                       id="coverLetter" | ||||
|                       rows={4} | ||||
|                       className="mt-1 block w-full border border-gray-300 rounded-md shadow-sm focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                       placeholder="Tell us why you're interested in this position..." | ||||
|                       value={coverLetter} | ||||
|                       onChange={<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >setCoverLetter(e.target.value)}</span> | ||||
|                     /> | ||||
|                   </div> | ||||
|                   <button | ||||
|                     onClick={handleApply} | ||||
|                     disabled={applying || !coverLetter.trim()} | ||||
|                     className="w-full btn btn-primary disabled:opacity-50" | ||||
|                   > | ||||
|                     {applying ? 'Applying...' : 'Submit Application'} | ||||
|                   </button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           )} | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default JobDetails; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										1036
									
								
								frontend/coverage/lcov-report/src/pages/Jobs.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1036
									
								
								frontend/coverage/lcov-report/src/pages/Jobs.js.html
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										493
									
								
								frontend/coverage/lcov-report/src/pages/Login.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										493
									
								
								frontend/coverage/lcov-report/src/pages/Login.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,493 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Login.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Login.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">6.66% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/15</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/4</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">6.66% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/15</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import { useAuth } from '../contexts/AuthContext'; | ||||
| import { Eye, EyeOff, Mail, Lock } from 'lucide-react'; | ||||
|   | ||||
| const Login = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { login } = <span class="cstat-no" title="statement not covered" >useAuth();</span> | ||||
|   const [formData, setFormData] = <span class="cstat-no" title="statement not covered" >useState({</span> | ||||
|     email: '', | ||||
|     password: '' | ||||
|   }); | ||||
|   const [showPassword, setShowPassword] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   const [loading, setLoading] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   | ||||
|   const handleChange = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(e</span>) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    setFormData({</span> | ||||
|       ...formData, | ||||
|       [e.target.name]: e.target.value | ||||
|     }); | ||||
|   }; | ||||
|   | ||||
|   const handleSubmit = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (e) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    e.preventDefault();</span> | ||||
| <span class="cstat-no" title="statement not covered" >    setLoading(true);</span> | ||||
|      | ||||
|     const result = <span class="cstat-no" title="statement not covered" >await login(formData.email, formData.password);</span> | ||||
|      | ||||
| <span class="cstat-no" title="statement not covered" >    if (!result.success) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      setLoading(false);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8"> | ||||
|       <div className="max-w-md w-full space-y-8"> | ||||
|         <div> | ||||
|           <h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900"> | ||||
|             Sign in to your account | ||||
|           </h2> | ||||
|           <p className="mt-2 text-center text-sm text-gray-600"> | ||||
|             Or{' '} | ||||
|             <Link | ||||
|               to="/register" | ||||
|               className="font-medium text-primary-600 hover:text-primary-500" | ||||
|             > | ||||
|               create a new account | ||||
|             </Link> | ||||
|           </p> | ||||
|         </div> | ||||
|         <form className="mt-8 space-y-6" onSubmit={handleSubmit}> | ||||
|           <div className="rounded-md shadow-sm -space-y-px"> | ||||
|             <div> | ||||
|               <label htmlFor="email" className="sr-only"> | ||||
|                 Email address | ||||
|               </label> | ||||
|               <div className="relative"> | ||||
|                 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                   <Mail className="h-5 w-5 text-gray-400" /> | ||||
|                 </div> | ||||
|                 <input | ||||
|                   id="email" | ||||
|                   name="email" | ||||
|                   type="email" | ||||
|                   autoComplete="email" | ||||
|                   required | ||||
|                   className="appearance-none rounded-none relative block w-full px-3 py-2 pl-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-t-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 focus:z-10 sm:text-sm" | ||||
|                   placeholder="Email address" | ||||
|                   value={formData.email} | ||||
|                   onChange={handleChange} | ||||
|                 /> | ||||
|               </div> | ||||
|             </div> | ||||
|             <div> | ||||
|               <label htmlFor="password" className="sr-only"> | ||||
|                 Password | ||||
|               </label> | ||||
|               <div className="relative"> | ||||
|                 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                   <Lock className="h-5 w-5 text-gray-400" /> | ||||
|                 </div> | ||||
|                 <input | ||||
|                   id="password" | ||||
|                   name="password" | ||||
|                   type={showPassword ? 'text' : 'password'} | ||||
|                   autoComplete="current-password" | ||||
|                   required | ||||
|                   className="appearance-none rounded-none relative block w-full px-3 py-2 pl-10 pr-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-b-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 focus:z-10 sm:text-sm" | ||||
|                   placeholder="Password" | ||||
|                   value={formData.password} | ||||
|                   onChange={handleChange} | ||||
|                 /> | ||||
|                 <div className="absolute inset-y-0 right-0 pr-3 flex items-center"> | ||||
|                   <button | ||||
|                     type="button" | ||||
|                     className="text-gray-400 hover:text-gray-500" | ||||
|                     onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >setShowPassword(!showPassword)}</span> | ||||
|                   > | ||||
|                     {showPassword ? ( | ||||
|                       <EyeOff className="h-5 w-5" /> | ||||
|                     ) : ( | ||||
|                       <Eye className="h-5 w-5" /> | ||||
|                     )} | ||||
|                   </button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
|           <div> | ||||
|             <button | ||||
|               type="submit" | ||||
|               disabled={loading} | ||||
|               className="group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-primary-600 hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 disabled:opacity-50 disabled:cursor-not-allowed" | ||||
|             > | ||||
|               {loading ? 'Signing in...' : 'Sign in'} | ||||
|             </button> | ||||
|           </div> | ||||
|   | ||||
|           <div className="text-center"> | ||||
|             <p className="text-sm text-gray-600"> | ||||
|               Demo accounts: | ||||
|             </p> | ||||
|             <div className="mt-2 text-xs text-gray-500 space-y-1"> | ||||
|               <p>Admin: admin@merchantsofhope.org / admin123</p> | ||||
|               <p>Recruiter: recruiter@merchantsofhope.org / recruiter123</p> | ||||
|               <p>Employer: employer@techcorp.com / employer123</p> | ||||
|               <p>Candidate: candidate@example.com / candidate123</p> | ||||
|             </div> | ||||
|           </div> | ||||
|         </form> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Login; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										511
									
								
								frontend/coverage/lcov-report/src/pages/Profile.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										511
									
								
								frontend/coverage/lcov-report/src/pages/Profile.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,511 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Profile.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Profile.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">6.25% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/16</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/8</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/3</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">6.25% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/16</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { useAuth } from '../contexts/AuthContext'; | ||||
| import { User, Mail, Save } from 'lucide-react'; | ||||
| import toast from 'react-hot-toast'; | ||||
|   | ||||
| const Profile = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { user, fetchUser } = <span class="cstat-no" title="statement not covered" >useAuth();</span> | ||||
|   const [formData, setFormData] = <span class="cstat-no" title="statement not covered" >useState({</span> | ||||
|     firstName: user?.firstName || '', | ||||
|     lastName: user?.lastName || '', | ||||
|     email: user?.email || '' | ||||
|   }); | ||||
|   const [loading, setLoading] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   | ||||
|   const handleChange = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(e</span>) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    setFormData({</span> | ||||
|       ...formData, | ||||
|       [e.target.name]: e.target.value | ||||
|     }); | ||||
|   }; | ||||
|   | ||||
|   const handleSubmit = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (e) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    e.preventDefault();</span> | ||||
| <span class="cstat-no" title="statement not covered" >    setLoading(true);</span> | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      await fetch(`/api/users/${user.id}`, {</span> | ||||
|         method: 'PUT', | ||||
|         headers: { | ||||
|           'Content-Type': 'application/json', | ||||
|           'Authorization': `Bearer ${localStorage.getItem('token')}` | ||||
|         }, | ||||
|         body: JSON.stringify(formData) | ||||
|       }); | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >      await fetchUser();</span> | ||||
| <span class="cstat-no" title="statement not covered" >      toast.success('Profile updated successfully!');</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error('Failed to update profile');</span> | ||||
|     } finally { | ||||
| <span class="cstat-no" title="statement not covered" >      setLoading(false);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div> | ||||
|         <h1 className="text-2xl font-bold text-gray-900">Profile</h1> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           Manage your account information | ||||
|         </p> | ||||
|       </div> | ||||
|   | ||||
|       <div className="bg-white shadow rounded-lg"> | ||||
|         <div className="px-4 py-5 sm:p-6"> | ||||
|           <form onSubmit={handleSubmit} className="space-y-6"> | ||||
|             <div className="grid grid-cols-1 gap-6 sm:grid-cols-2"> | ||||
|               <div> | ||||
|                 <label htmlFor="firstName" className="block text-sm font-medium text-gray-700"> | ||||
|                   First Name | ||||
|                 </label> | ||||
|                 <div className="mt-1 relative"> | ||||
|                   <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                     <User className="h-5 w-5 text-gray-400" /> | ||||
|                   </div> | ||||
|                   <input | ||||
|                     type="text" | ||||
|                     name="firstName" | ||||
|                     id="firstName" | ||||
|                     required | ||||
|                     className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                     value={formData.firstName} | ||||
|                     onChange={handleChange} | ||||
|                   /> | ||||
|                 </div> | ||||
|               </div> | ||||
|   | ||||
|               <div> | ||||
|                 <label htmlFor="lastName" className="block text-sm font-medium text-gray-700"> | ||||
|                   Last Name | ||||
|                 </label> | ||||
|                 <div className="mt-1 relative"> | ||||
|                   <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                     <User className="h-5 w-5 text-gray-400" /> | ||||
|                   </div> | ||||
|                   <input | ||||
|                     type="text" | ||||
|                     name="lastName" | ||||
|                     id="lastName" | ||||
|                     required | ||||
|                     className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                     value={formData.lastName} | ||||
|                     onChange={handleChange} | ||||
|                   /> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
|             <div> | ||||
|               <label htmlFor="email" className="block text-sm font-medium text-gray-700"> | ||||
|                 Email Address | ||||
|               </label> | ||||
|               <div className="mt-1 relative"> | ||||
|                 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                   <Mail className="h-5 w-5 text-gray-400" /> | ||||
|                 </div> | ||||
|                 <input | ||||
|                   type="email" | ||||
|                   name="email" | ||||
|                   id="email" | ||||
|                   required | ||||
|                   className="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:placeholder-gray-400 focus:ring-1 focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                   value={formData.email} | ||||
|                   onChange={handleChange} | ||||
|                 /> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
|             <div className="bg-gray-50 px-4 py-3 rounded-md"> | ||||
|               <p className="text-sm text-gray-600"> | ||||
|                 <strong>Role:</strong> {user?.role} | ||||
|               </p> | ||||
|             </div> | ||||
|   | ||||
|             <div className="flex justify-end"> | ||||
|               <button | ||||
|                 type="submit" | ||||
|                 disabled={loading} | ||||
|                 className="btn btn-primary disabled:opacity-50" | ||||
|               > | ||||
|                 <Save className="h-4 w-4 mr-2" /> | ||||
|                 {loading ? 'Saving...' : 'Save Changes'} | ||||
|               </button> | ||||
|             </div> | ||||
|           </form> | ||||
|         </div> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Profile; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										811
									
								
								frontend/coverage/lcov-report/src/pages/Register.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										811
									
								
								frontend/coverage/lcov-report/src/pages/Register.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,811 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Register.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Register.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">4.34% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/23</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/16</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/5</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">4.34% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/23</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a> | ||||
| <a name='L151'></a><a href='#L151'>151</a> | ||||
| <a name='L152'></a><a href='#L152'>152</a> | ||||
| <a name='L153'></a><a href='#L153'>153</a> | ||||
| <a name='L154'></a><a href='#L154'>154</a> | ||||
| <a name='L155'></a><a href='#L155'>155</a> | ||||
| <a name='L156'></a><a href='#L156'>156</a> | ||||
| <a name='L157'></a><a href='#L157'>157</a> | ||||
| <a name='L158'></a><a href='#L158'>158</a> | ||||
| <a name='L159'></a><a href='#L159'>159</a> | ||||
| <a name='L160'></a><a href='#L160'>160</a> | ||||
| <a name='L161'></a><a href='#L161'>161</a> | ||||
| <a name='L162'></a><a href='#L162'>162</a> | ||||
| <a name='L163'></a><a href='#L163'>163</a> | ||||
| <a name='L164'></a><a href='#L164'>164</a> | ||||
| <a name='L165'></a><a href='#L165'>165</a> | ||||
| <a name='L166'></a><a href='#L166'>166</a> | ||||
| <a name='L167'></a><a href='#L167'>167</a> | ||||
| <a name='L168'></a><a href='#L168'>168</a> | ||||
| <a name='L169'></a><a href='#L169'>169</a> | ||||
| <a name='L170'></a><a href='#L170'>170</a> | ||||
| <a name='L171'></a><a href='#L171'>171</a> | ||||
| <a name='L172'></a><a href='#L172'>172</a> | ||||
| <a name='L173'></a><a href='#L173'>173</a> | ||||
| <a name='L174'></a><a href='#L174'>174</a> | ||||
| <a name='L175'></a><a href='#L175'>175</a> | ||||
| <a name='L176'></a><a href='#L176'>176</a> | ||||
| <a name='L177'></a><a href='#L177'>177</a> | ||||
| <a name='L178'></a><a href='#L178'>178</a> | ||||
| <a name='L179'></a><a href='#L179'>179</a> | ||||
| <a name='L180'></a><a href='#L180'>180</a> | ||||
| <a name='L181'></a><a href='#L181'>181</a> | ||||
| <a name='L182'></a><a href='#L182'>182</a> | ||||
| <a name='L183'></a><a href='#L183'>183</a> | ||||
| <a name='L184'></a><a href='#L184'>184</a> | ||||
| <a name='L185'></a><a href='#L185'>185</a> | ||||
| <a name='L186'></a><a href='#L186'>186</a> | ||||
| <a name='L187'></a><a href='#L187'>187</a> | ||||
| <a name='L188'></a><a href='#L188'>188</a> | ||||
| <a name='L189'></a><a href='#L189'>189</a> | ||||
| <a name='L190'></a><a href='#L190'>190</a> | ||||
| <a name='L191'></a><a href='#L191'>191</a> | ||||
| <a name='L192'></a><a href='#L192'>192</a> | ||||
| <a name='L193'></a><a href='#L193'>193</a> | ||||
| <a name='L194'></a><a href='#L194'>194</a> | ||||
| <a name='L195'></a><a href='#L195'>195</a> | ||||
| <a name='L196'></a><a href='#L196'>196</a> | ||||
| <a name='L197'></a><a href='#L197'>197</a> | ||||
| <a name='L198'></a><a href='#L198'>198</a> | ||||
| <a name='L199'></a><a href='#L199'>199</a> | ||||
| <a name='L200'></a><a href='#L200'>200</a> | ||||
| <a name='L201'></a><a href='#L201'>201</a> | ||||
| <a name='L202'></a><a href='#L202'>202</a> | ||||
| <a name='L203'></a><a href='#L203'>203</a> | ||||
| <a name='L204'></a><a href='#L204'>204</a> | ||||
| <a name='L205'></a><a href='#L205'>205</a> | ||||
| <a name='L206'></a><a href='#L206'>206</a> | ||||
| <a name='L207'></a><a href='#L207'>207</a> | ||||
| <a name='L208'></a><a href='#L208'>208</a> | ||||
| <a name='L209'></a><a href='#L209'>209</a> | ||||
| <a name='L210'></a><a href='#L210'>210</a> | ||||
| <a name='L211'></a><a href='#L211'>211</a> | ||||
| <a name='L212'></a><a href='#L212'>212</a> | ||||
| <a name='L213'></a><a href='#L213'>213</a> | ||||
| <a name='L214'></a><a href='#L214'>214</a> | ||||
| <a name='L215'></a><a href='#L215'>215</a> | ||||
| <a name='L216'></a><a href='#L216'>216</a> | ||||
| <a name='L217'></a><a href='#L217'>217</a> | ||||
| <a name='L218'></a><a href='#L218'>218</a> | ||||
| <a name='L219'></a><a href='#L219'>219</a> | ||||
| <a name='L220'></a><a href='#L220'>220</a> | ||||
| <a name='L221'></a><a href='#L221'>221</a> | ||||
| <a name='L222'></a><a href='#L222'>222</a> | ||||
| <a name='L223'></a><a href='#L223'>223</a> | ||||
| <a name='L224'></a><a href='#L224'>224</a> | ||||
| <a name='L225'></a><a href='#L225'>225</a> | ||||
| <a name='L226'></a><a href='#L226'>226</a> | ||||
| <a name='L227'></a><a href='#L227'>227</a> | ||||
| <a name='L228'></a><a href='#L228'>228</a> | ||||
| <a name='L229'></a><a href='#L229'>229</a> | ||||
| <a name='L230'></a><a href='#L230'>230</a> | ||||
| <a name='L231'></a><a href='#L231'>231</a> | ||||
| <a name='L232'></a><a href='#L232'>232</a> | ||||
| <a name='L233'></a><a href='#L233'>233</a> | ||||
| <a name='L234'></a><a href='#L234'>234</a> | ||||
| <a name='L235'></a><a href='#L235'>235</a> | ||||
| <a name='L236'></a><a href='#L236'>236</a> | ||||
| <a name='L237'></a><a href='#L237'>237</a> | ||||
| <a name='L238'></a><a href='#L238'>238</a> | ||||
| <a name='L239'></a><a href='#L239'>239</a> | ||||
| <a name='L240'></a><a href='#L240'>240</a> | ||||
| <a name='L241'></a><a href='#L241'>241</a> | ||||
| <a name='L242'></a><a href='#L242'>242</a> | ||||
| <a name='L243'></a><a href='#L243'>243</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { Link } from 'react-router-dom'; | ||||
| import { useAuth } from '../contexts/AuthContext'; | ||||
| import { Eye, EyeOff, Mail, Lock, User } from 'lucide-react'; | ||||
|   | ||||
| const Register = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const { register } = <span class="cstat-no" title="statement not covered" >useAuth();</span> | ||||
|   const [formData, setFormData] = <span class="cstat-no" title="statement not covered" >useState({</span> | ||||
|     firstName: '', | ||||
|     lastName: '', | ||||
|     email: '', | ||||
|     password: '', | ||||
|     confirmPassword: '', | ||||
|     role: 'candidate' | ||||
|   }); | ||||
|   const [showPassword, setShowPassword] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   const [showConfirmPassword, setShowConfirmPassword] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   const [loading, setLoading] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   | ||||
|   const handleChange = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(e</span>) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    setFormData({</span> | ||||
|       ...formData, | ||||
|       [e.target.name]: e.target.value | ||||
|     }); | ||||
|   }; | ||||
|   | ||||
|   const handleSubmit = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (e) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    e.preventDefault();</span> | ||||
|      | ||||
| <span class="cstat-no" title="statement not covered" >    if (formData.password !== formData.confirmPassword) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      alert('Passwords do not match');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return;</span> | ||||
|     } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    if (formData.password.length < 6) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      alert('Password must be at least 6 characters long');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return;</span> | ||||
|     } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    setLoading(true);</span> | ||||
|      | ||||
|     const result = <span class="cstat-no" title="statement not covered" >await register({</span> | ||||
|       firstName: formData.firstName, | ||||
|       lastName: formData.lastName, | ||||
|       email: formData.email, | ||||
|       password: formData.password, | ||||
|       role: formData.role | ||||
|     }); | ||||
|      | ||||
| <span class="cstat-no" title="statement not covered" >    if (!result.success) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      setLoading(false);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="min-h-screen flex items-center justify-center bg-gray-50 py-12 px-4 sm:px-6 lg:px-8"> | ||||
|       <div className="max-w-md w-full space-y-8"> | ||||
|         <div> | ||||
|           <h2 className="mt-6 text-center text-3xl font-extrabold text-gray-900"> | ||||
|             Create your account | ||||
|           </h2> | ||||
|           <p className="mt-2 text-center text-sm text-gray-600"> | ||||
|             Or{' '} | ||||
|             <Link | ||||
|               to="/login" | ||||
|               className="font-medium text-primary-600 hover:text-primary-500" | ||||
|             > | ||||
|               sign in to your existing account | ||||
|             </Link> | ||||
|           </p> | ||||
|         </div> | ||||
|         <form className="mt-8 space-y-6" onSubmit={handleSubmit}> | ||||
|           <div className="space-y-4"> | ||||
|             <div className="grid grid-cols-2 gap-4"> | ||||
|               <div> | ||||
|                 <label htmlFor="firstName" className="block text-sm font-medium text-gray-700"> | ||||
|                   First Name | ||||
|                 </label> | ||||
|                 <div className="mt-1 relative"> | ||||
|                   <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                     <User className="h-5 w-5 text-gray-400" /> | ||||
|                   </div> | ||||
|                   <input | ||||
|                     id="firstName" | ||||
|                     name="firstName" | ||||
|                     type="text" | ||||
|                     required | ||||
|                     className="appearance-none relative block w-full px-3 py-2 pl-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                     placeholder="First name" | ||||
|                     value={formData.firstName} | ||||
|                     onChange={handleChange} | ||||
|                   /> | ||||
|                 </div> | ||||
|               </div> | ||||
|               <div> | ||||
|                 <label htmlFor="lastName" className="block text-sm font-medium text-gray-700"> | ||||
|                   Last Name | ||||
|                 </label> | ||||
|                 <div className="mt-1 relative"> | ||||
|                   <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                     <User className="h-5 w-5 text-gray-400" /> | ||||
|                   </div> | ||||
|                   <input | ||||
|                     id="lastName" | ||||
|                     name="lastName" | ||||
|                     type="text" | ||||
|                     required | ||||
|                     className="appearance-none relative block w-full px-3 py-2 pl-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                     placeholder="Last name" | ||||
|                     value={formData.lastName} | ||||
|                     onChange={handleChange} | ||||
|                   /> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
|             <div> | ||||
|               <label htmlFor="email" className="block text-sm font-medium text-gray-700"> | ||||
|                 Email Address | ||||
|               </label> | ||||
|               <div className="mt-1 relative"> | ||||
|                 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                   <Mail className="h-5 w-5 text-gray-400" /> | ||||
|                 </div> | ||||
|                 <input | ||||
|                   id="email" | ||||
|                   name="email" | ||||
|                   type="email" | ||||
|                   autoComplete="email" | ||||
|                   required | ||||
|                   className="appearance-none relative block w-full px-3 py-2 pl-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                   placeholder="Email address" | ||||
|                   value={formData.email} | ||||
|                   onChange={handleChange} | ||||
|                 /> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
|             <div> | ||||
|               <label htmlFor="role" className="block text-sm font-medium text-gray-700"> | ||||
|                 Account Type | ||||
|               </label> | ||||
|               <select | ||||
|                 id="role" | ||||
|                 name="role" | ||||
|                 className="mt-1 block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                 value={formData.role} | ||||
|                 onChange={handleChange} | ||||
|               > | ||||
|                 <option value="candidate">Candidate</option> | ||||
|                 <option value="employer">Employer</option> | ||||
|                 <option value="recruiter">Recruiter</option> | ||||
|               </select> | ||||
|             </div> | ||||
|   | ||||
|             <div> | ||||
|               <label htmlFor="password" className="block text-sm font-medium text-gray-700"> | ||||
|                 Password | ||||
|               </label> | ||||
|               <div className="mt-1 relative"> | ||||
|                 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                   <Lock className="h-5 w-5 text-gray-400" /> | ||||
|                 </div> | ||||
|                 <input | ||||
|                   id="password" | ||||
|                   name="password" | ||||
|                   type={showPassword ? 'text' : 'password'} | ||||
|                   autoComplete="new-password" | ||||
|                   required | ||||
|                   className="appearance-none relative block w-full px-3 py-2 pl-10 pr-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                   placeholder="Password" | ||||
|                   value={formData.password} | ||||
|                   onChange={handleChange} | ||||
|                 /> | ||||
|                 <div className="absolute inset-y-0 right-0 pr-3 flex items-center"> | ||||
|                   <button | ||||
|                     type="button" | ||||
|                     className="text-gray-400 hover:text-gray-500" | ||||
|                     onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >setShowPassword(!showPassword)}</span> | ||||
|                   > | ||||
|                     {showPassword ? ( | ||||
|                       <EyeOff className="h-5 w-5" /> | ||||
|                     ) : ( | ||||
|                       <Eye className="h-5 w-5" /> | ||||
|                     )} | ||||
|                   </button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|   | ||||
|             <div> | ||||
|               <label htmlFor="confirmPassword" className="block text-sm font-medium text-gray-700"> | ||||
|                 Confirm Password | ||||
|               </label> | ||||
|               <div className="mt-1 relative"> | ||||
|                 <div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none"> | ||||
|                   <Lock className="h-5 w-5 text-gray-400" /> | ||||
|                 </div> | ||||
|                 <input | ||||
|                   id="confirmPassword" | ||||
|                   name="confirmPassword" | ||||
|                   type={showConfirmPassword ? 'text' : 'password'} | ||||
|                   autoComplete="new-password" | ||||
|                   required | ||||
|                   className="appearance-none relative block w-full px-3 py-2 pl-10 pr-10 border border-gray-300 placeholder-gray-500 text-gray-900 rounded-md focus:outline-none focus:ring-primary-500 focus:border-primary-500 sm:text-sm" | ||||
|                   placeholder="Confirm password" | ||||
|                   value={formData.confirmPassword} | ||||
|                   onChange={handleChange} | ||||
|                 /> | ||||
|                 <div className="absolute inset-y-0 right-0 pr-3 flex items-center"> | ||||
|                   <button | ||||
|                     type="button" | ||||
|                     className="text-gray-400 hover:text-gray-500" | ||||
|                     onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >setShowConfirmPassword(!showConfirmPassword)}</span> | ||||
|                   > | ||||
|                     {showConfirmPassword ? ( | ||||
|                       <EyeOff className="h-5 w-5" /> | ||||
|                     ) : ( | ||||
|                       <Eye className="h-5 w-5" /> | ||||
|                     )} | ||||
|                   </button> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           </div> | ||||
|   | ||||
|           <div> | ||||
|             <button | ||||
|               type="submit" | ||||
|               disabled={loading} | ||||
|               className="group relative w-full flex justify-center py-2 px-4 border border-transparent text-sm font-medium rounded-md text-white bg-primary-600 hover:bg-primary-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary-500 disabled:opacity-50 disabled:cursor-not-allowed" | ||||
|             > | ||||
|               {loading ? 'Creating account...' : 'Create account'} | ||||
|             </button> | ||||
|           </div> | ||||
|         </form> | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Register; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										820
									
								
								frontend/coverage/lcov-report/src/pages/Resumes.js.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										820
									
								
								frontend/coverage/lcov-report/src/pages/Resumes.js.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,820 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages/Resumes.js</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> / <a href="index.html">src/pages</a> Resumes.js</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">1.56% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>1/64</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>0/28</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">0% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>0/11</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">1.56% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>1/64</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <pre><table class="coverage"> | ||||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||||
| <a name='L2'></a><a href='#L2'>2</a> | ||||
| <a name='L3'></a><a href='#L3'>3</a> | ||||
| <a name='L4'></a><a href='#L4'>4</a> | ||||
| <a name='L5'></a><a href='#L5'>5</a> | ||||
| <a name='L6'></a><a href='#L6'>6</a> | ||||
| <a name='L7'></a><a href='#L7'>7</a> | ||||
| <a name='L8'></a><a href='#L8'>8</a> | ||||
| <a name='L9'></a><a href='#L9'>9</a> | ||||
| <a name='L10'></a><a href='#L10'>10</a> | ||||
| <a name='L11'></a><a href='#L11'>11</a> | ||||
| <a name='L12'></a><a href='#L12'>12</a> | ||||
| <a name='L13'></a><a href='#L13'>13</a> | ||||
| <a name='L14'></a><a href='#L14'>14</a> | ||||
| <a name='L15'></a><a href='#L15'>15</a> | ||||
| <a name='L16'></a><a href='#L16'>16</a> | ||||
| <a name='L17'></a><a href='#L17'>17</a> | ||||
| <a name='L18'></a><a href='#L18'>18</a> | ||||
| <a name='L19'></a><a href='#L19'>19</a> | ||||
| <a name='L20'></a><a href='#L20'>20</a> | ||||
| <a name='L21'></a><a href='#L21'>21</a> | ||||
| <a name='L22'></a><a href='#L22'>22</a> | ||||
| <a name='L23'></a><a href='#L23'>23</a> | ||||
| <a name='L24'></a><a href='#L24'>24</a> | ||||
| <a name='L25'></a><a href='#L25'>25</a> | ||||
| <a name='L26'></a><a href='#L26'>26</a> | ||||
| <a name='L27'></a><a href='#L27'>27</a> | ||||
| <a name='L28'></a><a href='#L28'>28</a> | ||||
| <a name='L29'></a><a href='#L29'>29</a> | ||||
| <a name='L30'></a><a href='#L30'>30</a> | ||||
| <a name='L31'></a><a href='#L31'>31</a> | ||||
| <a name='L32'></a><a href='#L32'>32</a> | ||||
| <a name='L33'></a><a href='#L33'>33</a> | ||||
| <a name='L34'></a><a href='#L34'>34</a> | ||||
| <a name='L35'></a><a href='#L35'>35</a> | ||||
| <a name='L36'></a><a href='#L36'>36</a> | ||||
| <a name='L37'></a><a href='#L37'>37</a> | ||||
| <a name='L38'></a><a href='#L38'>38</a> | ||||
| <a name='L39'></a><a href='#L39'>39</a> | ||||
| <a name='L40'></a><a href='#L40'>40</a> | ||||
| <a name='L41'></a><a href='#L41'>41</a> | ||||
| <a name='L42'></a><a href='#L42'>42</a> | ||||
| <a name='L43'></a><a href='#L43'>43</a> | ||||
| <a name='L44'></a><a href='#L44'>44</a> | ||||
| <a name='L45'></a><a href='#L45'>45</a> | ||||
| <a name='L46'></a><a href='#L46'>46</a> | ||||
| <a name='L47'></a><a href='#L47'>47</a> | ||||
| <a name='L48'></a><a href='#L48'>48</a> | ||||
| <a name='L49'></a><a href='#L49'>49</a> | ||||
| <a name='L50'></a><a href='#L50'>50</a> | ||||
| <a name='L51'></a><a href='#L51'>51</a> | ||||
| <a name='L52'></a><a href='#L52'>52</a> | ||||
| <a name='L53'></a><a href='#L53'>53</a> | ||||
| <a name='L54'></a><a href='#L54'>54</a> | ||||
| <a name='L55'></a><a href='#L55'>55</a> | ||||
| <a name='L56'></a><a href='#L56'>56</a> | ||||
| <a name='L57'></a><a href='#L57'>57</a> | ||||
| <a name='L58'></a><a href='#L58'>58</a> | ||||
| <a name='L59'></a><a href='#L59'>59</a> | ||||
| <a name='L60'></a><a href='#L60'>60</a> | ||||
| <a name='L61'></a><a href='#L61'>61</a> | ||||
| <a name='L62'></a><a href='#L62'>62</a> | ||||
| <a name='L63'></a><a href='#L63'>63</a> | ||||
| <a name='L64'></a><a href='#L64'>64</a> | ||||
| <a name='L65'></a><a href='#L65'>65</a> | ||||
| <a name='L66'></a><a href='#L66'>66</a> | ||||
| <a name='L67'></a><a href='#L67'>67</a> | ||||
| <a name='L68'></a><a href='#L68'>68</a> | ||||
| <a name='L69'></a><a href='#L69'>69</a> | ||||
| <a name='L70'></a><a href='#L70'>70</a> | ||||
| <a name='L71'></a><a href='#L71'>71</a> | ||||
| <a name='L72'></a><a href='#L72'>72</a> | ||||
| <a name='L73'></a><a href='#L73'>73</a> | ||||
| <a name='L74'></a><a href='#L74'>74</a> | ||||
| <a name='L75'></a><a href='#L75'>75</a> | ||||
| <a name='L76'></a><a href='#L76'>76</a> | ||||
| <a name='L77'></a><a href='#L77'>77</a> | ||||
| <a name='L78'></a><a href='#L78'>78</a> | ||||
| <a name='L79'></a><a href='#L79'>79</a> | ||||
| <a name='L80'></a><a href='#L80'>80</a> | ||||
| <a name='L81'></a><a href='#L81'>81</a> | ||||
| <a name='L82'></a><a href='#L82'>82</a> | ||||
| <a name='L83'></a><a href='#L83'>83</a> | ||||
| <a name='L84'></a><a href='#L84'>84</a> | ||||
| <a name='L85'></a><a href='#L85'>85</a> | ||||
| <a name='L86'></a><a href='#L86'>86</a> | ||||
| <a name='L87'></a><a href='#L87'>87</a> | ||||
| <a name='L88'></a><a href='#L88'>88</a> | ||||
| <a name='L89'></a><a href='#L89'>89</a> | ||||
| <a name='L90'></a><a href='#L90'>90</a> | ||||
| <a name='L91'></a><a href='#L91'>91</a> | ||||
| <a name='L92'></a><a href='#L92'>92</a> | ||||
| <a name='L93'></a><a href='#L93'>93</a> | ||||
| <a name='L94'></a><a href='#L94'>94</a> | ||||
| <a name='L95'></a><a href='#L95'>95</a> | ||||
| <a name='L96'></a><a href='#L96'>96</a> | ||||
| <a name='L97'></a><a href='#L97'>97</a> | ||||
| <a name='L98'></a><a href='#L98'>98</a> | ||||
| <a name='L99'></a><a href='#L99'>99</a> | ||||
| <a name='L100'></a><a href='#L100'>100</a> | ||||
| <a name='L101'></a><a href='#L101'>101</a> | ||||
| <a name='L102'></a><a href='#L102'>102</a> | ||||
| <a name='L103'></a><a href='#L103'>103</a> | ||||
| <a name='L104'></a><a href='#L104'>104</a> | ||||
| <a name='L105'></a><a href='#L105'>105</a> | ||||
| <a name='L106'></a><a href='#L106'>106</a> | ||||
| <a name='L107'></a><a href='#L107'>107</a> | ||||
| <a name='L108'></a><a href='#L108'>108</a> | ||||
| <a name='L109'></a><a href='#L109'>109</a> | ||||
| <a name='L110'></a><a href='#L110'>110</a> | ||||
| <a name='L111'></a><a href='#L111'>111</a> | ||||
| <a name='L112'></a><a href='#L112'>112</a> | ||||
| <a name='L113'></a><a href='#L113'>113</a> | ||||
| <a name='L114'></a><a href='#L114'>114</a> | ||||
| <a name='L115'></a><a href='#L115'>115</a> | ||||
| <a name='L116'></a><a href='#L116'>116</a> | ||||
| <a name='L117'></a><a href='#L117'>117</a> | ||||
| <a name='L118'></a><a href='#L118'>118</a> | ||||
| <a name='L119'></a><a href='#L119'>119</a> | ||||
| <a name='L120'></a><a href='#L120'>120</a> | ||||
| <a name='L121'></a><a href='#L121'>121</a> | ||||
| <a name='L122'></a><a href='#L122'>122</a> | ||||
| <a name='L123'></a><a href='#L123'>123</a> | ||||
| <a name='L124'></a><a href='#L124'>124</a> | ||||
| <a name='L125'></a><a href='#L125'>125</a> | ||||
| <a name='L126'></a><a href='#L126'>126</a> | ||||
| <a name='L127'></a><a href='#L127'>127</a> | ||||
| <a name='L128'></a><a href='#L128'>128</a> | ||||
| <a name='L129'></a><a href='#L129'>129</a> | ||||
| <a name='L130'></a><a href='#L130'>130</a> | ||||
| <a name='L131'></a><a href='#L131'>131</a> | ||||
| <a name='L132'></a><a href='#L132'>132</a> | ||||
| <a name='L133'></a><a href='#L133'>133</a> | ||||
| <a name='L134'></a><a href='#L134'>134</a> | ||||
| <a name='L135'></a><a href='#L135'>135</a> | ||||
| <a name='L136'></a><a href='#L136'>136</a> | ||||
| <a name='L137'></a><a href='#L137'>137</a> | ||||
| <a name='L138'></a><a href='#L138'>138</a> | ||||
| <a name='L139'></a><a href='#L139'>139</a> | ||||
| <a name='L140'></a><a href='#L140'>140</a> | ||||
| <a name='L141'></a><a href='#L141'>141</a> | ||||
| <a name='L142'></a><a href='#L142'>142</a> | ||||
| <a name='L143'></a><a href='#L143'>143</a> | ||||
| <a name='L144'></a><a href='#L144'>144</a> | ||||
| <a name='L145'></a><a href='#L145'>145</a> | ||||
| <a name='L146'></a><a href='#L146'>146</a> | ||||
| <a name='L147'></a><a href='#L147'>147</a> | ||||
| <a name='L148'></a><a href='#L148'>148</a> | ||||
| <a name='L149'></a><a href='#L149'>149</a> | ||||
| <a name='L150'></a><a href='#L150'>150</a> | ||||
| <a name='L151'></a><a href='#L151'>151</a> | ||||
| <a name='L152'></a><a href='#L152'>152</a> | ||||
| <a name='L153'></a><a href='#L153'>153</a> | ||||
| <a name='L154'></a><a href='#L154'>154</a> | ||||
| <a name='L155'></a><a href='#L155'>155</a> | ||||
| <a name='L156'></a><a href='#L156'>156</a> | ||||
| <a name='L157'></a><a href='#L157'>157</a> | ||||
| <a name='L158'></a><a href='#L158'>158</a> | ||||
| <a name='L159'></a><a href='#L159'>159</a> | ||||
| <a name='L160'></a><a href='#L160'>160</a> | ||||
| <a name='L161'></a><a href='#L161'>161</a> | ||||
| <a name='L162'></a><a href='#L162'>162</a> | ||||
| <a name='L163'></a><a href='#L163'>163</a> | ||||
| <a name='L164'></a><a href='#L164'>164</a> | ||||
| <a name='L165'></a><a href='#L165'>165</a> | ||||
| <a name='L166'></a><a href='#L166'>166</a> | ||||
| <a name='L167'></a><a href='#L167'>167</a> | ||||
| <a name='L168'></a><a href='#L168'>168</a> | ||||
| <a name='L169'></a><a href='#L169'>169</a> | ||||
| <a name='L170'></a><a href='#L170'>170</a> | ||||
| <a name='L171'></a><a href='#L171'>171</a> | ||||
| <a name='L172'></a><a href='#L172'>172</a> | ||||
| <a name='L173'></a><a href='#L173'>173</a> | ||||
| <a name='L174'></a><a href='#L174'>174</a> | ||||
| <a name='L175'></a><a href='#L175'>175</a> | ||||
| <a name='L176'></a><a href='#L176'>176</a> | ||||
| <a name='L177'></a><a href='#L177'>177</a> | ||||
| <a name='L178'></a><a href='#L178'>178</a> | ||||
| <a name='L179'></a><a href='#L179'>179</a> | ||||
| <a name='L180'></a><a href='#L180'>180</a> | ||||
| <a name='L181'></a><a href='#L181'>181</a> | ||||
| <a name='L182'></a><a href='#L182'>182</a> | ||||
| <a name='L183'></a><a href='#L183'>183</a> | ||||
| <a name='L184'></a><a href='#L184'>184</a> | ||||
| <a name='L185'></a><a href='#L185'>185</a> | ||||
| <a name='L186'></a><a href='#L186'>186</a> | ||||
| <a name='L187'></a><a href='#L187'>187</a> | ||||
| <a name='L188'></a><a href='#L188'>188</a> | ||||
| <a name='L189'></a><a href='#L189'>189</a> | ||||
| <a name='L190'></a><a href='#L190'>190</a> | ||||
| <a name='L191'></a><a href='#L191'>191</a> | ||||
| <a name='L192'></a><a href='#L192'>192</a> | ||||
| <a name='L193'></a><a href='#L193'>193</a> | ||||
| <a name='L194'></a><a href='#L194'>194</a> | ||||
| <a name='L195'></a><a href='#L195'>195</a> | ||||
| <a name='L196'></a><a href='#L196'>196</a> | ||||
| <a name='L197'></a><a href='#L197'>197</a> | ||||
| <a name='L198'></a><a href='#L198'>198</a> | ||||
| <a name='L199'></a><a href='#L199'>199</a> | ||||
| <a name='L200'></a><a href='#L200'>200</a> | ||||
| <a name='L201'></a><a href='#L201'>201</a> | ||||
| <a name='L202'></a><a href='#L202'>202</a> | ||||
| <a name='L203'></a><a href='#L203'>203</a> | ||||
| <a name='L204'></a><a href='#L204'>204</a> | ||||
| <a name='L205'></a><a href='#L205'>205</a> | ||||
| <a name='L206'></a><a href='#L206'>206</a> | ||||
| <a name='L207'></a><a href='#L207'>207</a> | ||||
| <a name='L208'></a><a href='#L208'>208</a> | ||||
| <a name='L209'></a><a href='#L209'>209</a> | ||||
| <a name='L210'></a><a href='#L210'>210</a> | ||||
| <a name='L211'></a><a href='#L211'>211</a> | ||||
| <a name='L212'></a><a href='#L212'>212</a> | ||||
| <a name='L213'></a><a href='#L213'>213</a> | ||||
| <a name='L214'></a><a href='#L214'>214</a> | ||||
| <a name='L215'></a><a href='#L215'>215</a> | ||||
| <a name='L216'></a><a href='#L216'>216</a> | ||||
| <a name='L217'></a><a href='#L217'>217</a> | ||||
| <a name='L218'></a><a href='#L218'>218</a> | ||||
| <a name='L219'></a><a href='#L219'>219</a> | ||||
| <a name='L220'></a><a href='#L220'>220</a> | ||||
| <a name='L221'></a><a href='#L221'>221</a> | ||||
| <a name='L222'></a><a href='#L222'>222</a> | ||||
| <a name='L223'></a><a href='#L223'>223</a> | ||||
| <a name='L224'></a><a href='#L224'>224</a> | ||||
| <a name='L225'></a><a href='#L225'>225</a> | ||||
| <a name='L226'></a><a href='#L226'>226</a> | ||||
| <a name='L227'></a><a href='#L227'>227</a> | ||||
| <a name='L228'></a><a href='#L228'>228</a> | ||||
| <a name='L229'></a><a href='#L229'>229</a> | ||||
| <a name='L230'></a><a href='#L230'>230</a> | ||||
| <a name='L231'></a><a href='#L231'>231</a> | ||||
| <a name='L232'></a><a href='#L232'>232</a> | ||||
| <a name='L233'></a><a href='#L233'>233</a> | ||||
| <a name='L234'></a><a href='#L234'>234</a> | ||||
| <a name='L235'></a><a href='#L235'>235</a> | ||||
| <a name='L236'></a><a href='#L236'>236</a> | ||||
| <a name='L237'></a><a href='#L237'>237</a> | ||||
| <a name='L238'></a><a href='#L238'>238</a> | ||||
| <a name='L239'></a><a href='#L239'>239</a> | ||||
| <a name='L240'></a><a href='#L240'>240</a> | ||||
| <a name='L241'></a><a href='#L241'>241</a> | ||||
| <a name='L242'></a><a href='#L242'>242</a> | ||||
| <a name='L243'></a><a href='#L243'>243</a> | ||||
| <a name='L244'></a><a href='#L244'>244</a> | ||||
| <a name='L245'></a><a href='#L245'>245</a> | ||||
| <a name='L246'></a><a href='#L246'>246</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-yes">1x</span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-no"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span> | ||||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import React, { useState } from 'react'; | ||||
| import { useQuery } from 'react-query'; | ||||
| import axios from 'axios'; | ||||
| import { Upload, Download, Trash2, Star, FileText } from 'lucide-react'; | ||||
| import toast from 'react-hot-toast'; | ||||
|   | ||||
| const Resumes = <span class="fstat-no" title="function not covered" >()</span> => { | ||||
|   const [uploading, setUploading] = <span class="cstat-no" title="statement not covered" >useState(false);</span> | ||||
|   const [selectedFile, setSelectedFile] = <span class="cstat-no" title="statement not covered" >useState(null);</span> | ||||
|   | ||||
|   const { data: resumes, isLoading, refetch } = <span class="cstat-no" title="statement not covered" >useQuery('resumes', <span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
|     // This would need to be implemented based on the candidate's ID | ||||
|     // For now, return empty array | ||||
| <span class="cstat-no" title="statement not covered" >    return [];</span> | ||||
|   }); | ||||
|   | ||||
|   const handleFileSelect = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >(e</span>) => {</span> | ||||
|     const file = <span class="cstat-no" title="statement not covered" >e.target.files[0];</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (file) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      if (file.size > 10 * 1024 * 1024) { // 10MB limit</span> | ||||
| <span class="cstat-no" title="statement not covered" >        toast.error('File size must be less than 10MB');</span> | ||||
| <span class="cstat-no" title="statement not covered" >        return;</span> | ||||
|       } | ||||
|        | ||||
|       const allowedTypes = <span class="cstat-no" title="statement not covered" >[</span> | ||||
|         'application/pdf', | ||||
|         'application/msword', | ||||
|         'application/vnd.openxmlformats-officedocument.wordprocessingml.document', | ||||
|         'text/plain' | ||||
|       ]; | ||||
|        | ||||
| <span class="cstat-no" title="statement not covered" >      if (!allowedTypes.includes(file.type)) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >        toast.error('Only PDF, DOC, DOCX, and TXT files are allowed');</span> | ||||
| <span class="cstat-no" title="statement not covered" >        return;</span> | ||||
|       } | ||||
|        | ||||
| <span class="cstat-no" title="statement not covered" >      setSelectedFile(file);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const handleUpload = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync () => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (!selectedFile) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error('Please select a file');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return;</span> | ||||
|     } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    setUploading(true);</span> | ||||
|     const formData = <span class="cstat-no" title="statement not covered" >new FormData();</span> | ||||
| <span class="cstat-no" title="statement not covered" >    formData.append('resume', selectedFile);</span> | ||||
| <span class="cstat-no" title="statement not covered" >    formData.append('isPrimary', resumes?.length === 0 ? 'true' : 'false');</span> | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      await axios.post('/api/resumes/upload', formData, {</span> | ||||
|         headers: { | ||||
|           'Content-Type': 'multipart/form-data' | ||||
|         } | ||||
|       }); | ||||
|        | ||||
| <span class="cstat-no" title="statement not covered" >      toast.success('Resume uploaded successfully!');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      setSelectedFile(null);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      refetch();</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error(error.response?.data?.error || 'Failed to upload resume');</span> | ||||
|     } finally { | ||||
| <span class="cstat-no" title="statement not covered" >      setUploading(false);</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const handleDownload = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (resumeId) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
|       const response = <span class="cstat-no" title="statement not covered" >await axios.get(`/api/resumes/${resumeId}/download`, {</span> | ||||
|         responseType: 'blob' | ||||
|       }); | ||||
|        | ||||
|       const url = <span class="cstat-no" title="statement not covered" >window.URL.createObjectURL(new Blob([response.data]));</span> | ||||
|       const link = <span class="cstat-no" title="statement not covered" >document.createElement('a');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      link.href = url;</span> | ||||
| <span class="cstat-no" title="statement not covered" >      link.setAttribute('download', response.headers['content-disposition']?.split('filename=')[1] || 'resume.pdf');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      document.body.appendChild(link);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      link.click();</span> | ||||
| <span class="cstat-no" title="statement not covered" >      link.remove();</span> | ||||
| <span class="cstat-no" title="statement not covered" >      window.URL.revokeObjectURL(url);</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error('Failed to download resume');</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const handleSetPrimary = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (resumeId) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      await axios.put(`/api/resumes/${resumeId}/primary`);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      toast.success('Primary resume updated!');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      refetch();</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error('Failed to set primary resume');</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
|   const handleDelete = <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >as</span>ync (resumeId) => {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    if (!window.confirm('Are you sure you want to delete this resume?')) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      return;</span> | ||||
|     } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >    try {</span> | ||||
| <span class="cstat-no" title="statement not covered" >      await axios.delete(`/api/resumes/${resumeId}`);</span> | ||||
| <span class="cstat-no" title="statement not covered" >      toast.success('Resume deleted successfully!');</span> | ||||
| <span class="cstat-no" title="statement not covered" >      refetch();</span> | ||||
|     } catch (error) { | ||||
| <span class="cstat-no" title="statement not covered" >      toast.error('Failed to delete resume');</span> | ||||
|     } | ||||
|   }; | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  if (isLoading) {</span> | ||||
| <span class="cstat-no" title="statement not covered" >    return (</span> | ||||
|       <div className="flex items-center justify-center h-64"> | ||||
|         <div className="animate-spin rounded-full h-32 w-32 border-b-2 border-primary-600"></div> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|   | ||||
| <span class="cstat-no" title="statement not covered" >  return (</span> | ||||
|     <div className="space-y-6"> | ||||
|       <div> | ||||
|         <h1 className="text-2xl font-bold text-gray-900">Resumes</h1> | ||||
|         <p className="mt-1 text-sm text-gray-500"> | ||||
|           Manage your resume files | ||||
|         </p> | ||||
|       </div> | ||||
|   | ||||
|       {/* Upload Section */} | ||||
|       <div className="bg-white shadow rounded-lg"> | ||||
|         <div className="px-4 py-5 sm:p-6"> | ||||
|           <h2 className="text-lg font-medium text-gray-900 mb-4">Upload Resume</h2> | ||||
|           <div className="space-y-4"> | ||||
|             <div> | ||||
|               <label htmlFor="resume" className="block text-sm font-medium text-gray-700"> | ||||
|                 Select Resume File | ||||
|               </label> | ||||
|               <input | ||||
|                 type="file" | ||||
|                 id="resume" | ||||
|                 accept=".pdf,.doc,.docx,.txt" | ||||
|                 onChange={handleFileSelect} | ||||
|                 className="mt-1 block w-full text-sm text-gray-500 file:mr-4 file:py-2 file:px-4 file:rounded-full file:border-0 file:text-sm file:font-semibold file:bg-primary-50 file:text-primary-700 hover:file:bg-primary-100" | ||||
|               /> | ||||
|               <p className="mt-1 text-xs text-gray-500"> | ||||
|                 PDF, DOC, DOCX, or TXT files only. Maximum size: 10MB | ||||
|               </p> | ||||
|             </div> | ||||
|              | ||||
|             {selectedFile && ( | ||||
|               <div className="flex items-center justify-between p-3 bg-gray-50 rounded-lg"> | ||||
|                 <div className="flex items-center"> | ||||
|                   <FileText className="h-5 w-5 text-gray-400 mr-2" /> | ||||
|                   <span className="text-sm text-gray-900">{selectedFile.name}</span> | ||||
|                   <span className="ml-2 text-xs text-gray-500"> | ||||
|                     ({(selectedFile.size / 1024 / 1024).toFixed(2)} MB) | ||||
|                   </span> | ||||
|                 </div> | ||||
|                 <button | ||||
|                   onClick={handleUpload} | ||||
|                   disabled={uploading} | ||||
|                   className="btn btn-primary disabled:opacity-50" | ||||
|                 > | ||||
|                   <Upload className="h-4 w-4 mr-2" /> | ||||
|                   {uploading ? 'Uploading...' : 'Upload'} | ||||
|                 </button> | ||||
|               </div> | ||||
|             )} | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
|   | ||||
|       {/* Resumes List */} | ||||
|       <div className="space-y-4"> | ||||
|         {resumes?.length > 0 ? ( | ||||
|           resumes.map(<span class="fstat-no" title="function not covered" >(r</span>esume) => ( | ||||
| <span class="cstat-no" title="statement not covered" >            <div key={resume.id} className="bg-white shadow rounded-lg"></span> | ||||
|               <div className="px-4 py-5 sm:p-6"> | ||||
|                 <div className="flex items-center justify-between"> | ||||
|                   <div className="flex items-center"> | ||||
|                     <FileText className="h-8 w-8 text-gray-400 mr-3" /> | ||||
|                     <div> | ||||
|                       <h3 className="text-lg font-medium text-gray-900"> | ||||
|                         {resume.original_name} | ||||
|                       </h3> | ||||
|                       <div className="flex items-center text-sm text-gray-500"> | ||||
|                         <span>{(resume.file_size / 1024 / 1024).toFixed(2)} MB</span> | ||||
|                         <span className="mx-2">•</span> | ||||
|                         <span>Uploaded {new Date(resume.uploaded_at).toLocaleDateString()}</span> | ||||
|                         {resume.is_primary && ( | ||||
|                           <> | ||||
|                             <span className="mx-2">•</span> | ||||
|                             <span className="inline-flex items-center px-2 py-1 rounded-full text-xs font-medium bg-primary-100 text-primary-800"> | ||||
|                               <Star className="h-3 w-3 mr-1" /> | ||||
|                               Primary | ||||
|                             </span> | ||||
|                           </> | ||||
|                         )} | ||||
|                       </div> | ||||
|                     </div> | ||||
|                   </div> | ||||
|                   <div className="flex items-center space-x-2"> | ||||
|                     <button | ||||
|                       onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >handleDownload(resume.id)}</span> | ||||
|                       className="btn btn-secondary" | ||||
|                     > | ||||
|                       <Download className="h-4 w-4 mr-2" /> | ||||
|                       Download | ||||
|                     </button> | ||||
|                     {!resume.is_primary && ( | ||||
|                       <button | ||||
|                         onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >handleSetPrimary(resume.id)}</span> | ||||
|                         className="btn btn-secondary" | ||||
|                       > | ||||
|                         <Star className="h-4 w-4 mr-2" /> | ||||
|                         Set Primary | ||||
|                       </button> | ||||
|                     )} | ||||
|                     <button | ||||
|                       onClick={<span class="fstat-no" title="function not covered" >()</span> => <span class="cstat-no" title="statement not covered" >handleDelete(resume.id)}</span> | ||||
|                       className="btn btn-danger" | ||||
|                     > | ||||
|                       <Trash2 className="h-4 w-4 mr-2" /> | ||||
|                       Delete | ||||
|                     </button> | ||||
|                   </div> | ||||
|                 </div> | ||||
|               </div> | ||||
|             </div> | ||||
|           )) | ||||
|         ) : ( | ||||
|           <div className="text-center py-12"> | ||||
|             <FileText className="mx-auto h-12 w-12 text-gray-400" /> | ||||
|             <h3 className="mt-2 text-sm font-medium text-gray-900">No resumes uploaded</h3> | ||||
|             <p className="mt-1 text-sm text-gray-500"> | ||||
|               Upload your first resume to get started. | ||||
|             </p> | ||||
|           </div> | ||||
|         )} | ||||
|       </div> | ||||
|     </div> | ||||
|   ); | ||||
| }; | ||||
|   | ||||
| export default Resumes; | ||||
|  </pre></td></tr></table></pre> | ||||
|  | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										296
									
								
								frontend/coverage/lcov-report/src/pages/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								frontend/coverage/lcov-report/src/pages/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,296 @@ | ||||
|  | ||||
| <!doctype html> | ||||
| <html lang="en"> | ||||
|  | ||||
| <head> | ||||
|     <title>Code coverage report for src/pages</title> | ||||
|     <meta charset="utf-8" /> | ||||
|     <link rel="stylesheet" href="../../prettify.css" /> | ||||
|     <link rel="stylesheet" href="../../base.css" /> | ||||
|     <link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" /> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||||
|     <style type='text/css'> | ||||
|         .coverage-summary .sorter { | ||||
|             background-image: url(../../sort-arrow-sprite.png); | ||||
|         } | ||||
|     </style> | ||||
| </head> | ||||
|      | ||||
| <body> | ||||
| <div class='wrapper'> | ||||
|     <div class='pad1'> | ||||
|         <h1><a href="../../index.html">All files</a> src/pages</h1> | ||||
|         <div class='clearfix'> | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">9.34% </span> | ||||
|                 <span class="quiet">Statements</span> | ||||
|                 <span class='fraction'>33/353</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">5.34% </span> | ||||
|                 <span class="quiet">Branches</span> | ||||
|                 <span class='fraction'>17/318</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">4.62% </span> | ||||
|                 <span class="quiet">Functions</span> | ||||
|                 <span class='fraction'>5/108</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|             <div class='fl pad1y space-right2'> | ||||
|                 <span class="strong">9.73% </span> | ||||
|                 <span class="quiet">Lines</span> | ||||
|                 <span class='fraction'>33/339</span> | ||||
|             </div> | ||||
|          | ||||
|              | ||||
|         </div> | ||||
|         <p class="quiet"> | ||||
|             Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||||
|         </p> | ||||
|         <template id="filterTemplate"> | ||||
|             <div class="quiet"> | ||||
|                 Filter: | ||||
|                 <input type="search" id="fileSearch"> | ||||
|             </div> | ||||
|         </template> | ||||
|     </div> | ||||
|     <div class='status-line low'></div> | ||||
|     <div class="pad1"> | ||||
| <table class="coverage-summary"> | ||||
| <thead> | ||||
| <tr> | ||||
|    <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||||
|    <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||||
|    <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||||
|    <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||||
|    <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||||
|    <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
|    <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||||
|    <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody><tr> | ||||
| 	<td class="file low" data-value="Applications.js"><a href="Applications.js.html">Applications.js</a></td> | ||||
| 	<td data-value="3.7" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 3%"></div><div class="cover-empty" style="width: 97%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="3.7" class="pct low">3.7%</td> | ||||
| 	<td data-value="27" class="abs low">1/27</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="23" class="abs low">0/23</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="5" class="abs low">0/5</td> | ||||
| 	<td data-value="3.7" class="pct low">3.7%</td> | ||||
| 	<td data-value="27" class="abs low">1/27</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="CandidateDetails.js"><a href="CandidateDetails.js.html">CandidateDetails.js</a></td> | ||||
| 	<td data-value="9.09" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 9%"></div><div class="cover-empty" style="width: 91%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="9.09" class="pct low">9.09%</td> | ||||
| 	<td data-value="11" class="abs low">1/11</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="23" class="abs low">0/23</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="3" class="abs low">0/3</td> | ||||
| 	<td data-value="9.09" class="pct low">9.09%</td> | ||||
| 	<td data-value="11" class="abs low">1/11</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Candidates.js"><a href="Candidates.js.html">Candidates.js</a></td> | ||||
| 	<td data-value="3.7" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 3%"></div><div class="cover-empty" style="width: 97%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="3.7" class="pct low">3.7%</td> | ||||
| 	<td data-value="27" class="abs low">1/27</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="28" class="abs low">0/28</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="8" class="abs low">0/8</td> | ||||
| 	<td data-value="3.84" class="pct low">3.84%</td> | ||||
| 	<td data-value="26" class="abs low">1/26</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="CreateJob.js"><a href="CreateJob.js.html">CreateJob.js</a></td> | ||||
| 	<td data-value="1.96" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 1%"></div><div class="cover-empty" style="width: 99%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="1.96" class="pct low">1.96%</td> | ||||
| 	<td data-value="51" class="abs low">1/51</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="22" class="abs low">0/22</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="37" class="abs low">0/37</td> | ||||
| 	<td data-value="2.12" class="pct low">2.12%</td> | ||||
| 	<td data-value="47" class="abs low">1/47</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Dashboard.js"><a href="Dashboard.js.html">Dashboard.js</a></td> | ||||
| 	<td data-value="3.7" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 3%"></div><div class="cover-empty" style="width: 97%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="3.7" class="pct low">3.7%</td> | ||||
| 	<td data-value="27" class="abs low">1/27</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="47" class="abs low">0/47</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="8" class="abs low">0/8</td> | ||||
| 	<td data-value="4" class="pct low">4%</td> | ||||
| 	<td data-value="25" class="abs low">1/25</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="EmployerDetails.js"><a href="EmployerDetails.js.html">EmployerDetails.js</a></td> | ||||
| 	<td data-value="10" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 10%"></div><div class="cover-empty" style="width: 90%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="10" class="pct low">10%</td> | ||||
| 	<td data-value="10" class="abs low">1/10</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="16" class="abs low">0/16</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="2" class="abs low">0/2</td> | ||||
| 	<td data-value="10" class="pct low">10%</td> | ||||
| 	<td data-value="10" class="abs low">1/10</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Employers.js"><a href="Employers.js.html">Employers.js</a></td> | ||||
| 	<td data-value="12.5" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 12%"></div><div class="cover-empty" style="width: 88%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="12.5" class="pct low">12.5%</td> | ||||
| 	<td data-value="8" class="abs low">1/8</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="12" class="abs low">0/12</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="3" class="abs low">0/3</td> | ||||
| 	<td data-value="12.5" class="pct low">12.5%</td> | ||||
| 	<td data-value="8" class="abs low">1/8</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="JobDetails.js"><a href="JobDetails.js.html">JobDetails.js</a></td> | ||||
| 	<td data-value="2.7" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 2%"></div><div class="cover-empty" style="width: 98%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="2.7" class="pct low">2.7%</td> | ||||
| 	<td data-value="37" class="abs low">1/37</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="51" class="abs low">0/51</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="9" class="abs low">0/9</td> | ||||
| 	<td data-value="2.94" class="pct low">2.94%</td> | ||||
| 	<td data-value="34" class="abs low">1/34</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file medium" data-value="Jobs.js"><a href="Jobs.js.html">Jobs.js</a></td> | ||||
| 	<td data-value="56.75" class="pic medium"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 56%"></div><div class="cover-empty" style="width: 44%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="56.75" class="pct medium">56.75%</td> | ||||
| 	<td data-value="37" class="abs medium">21/37</td> | ||||
| 	<td data-value="47.22" class="pct low">47.22%</td> | ||||
| 	<td data-value="36" class="abs low">17/36</td> | ||||
| 	<td data-value="50" class="pct medium">50%</td> | ||||
| 	<td data-value="10" class="abs medium">5/10</td> | ||||
| 	<td data-value="63.63" class="pct medium">63.63%</td> | ||||
| 	<td data-value="33" class="abs medium">21/33</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Login.js"><a href="Login.js.html">Login.js</a></td> | ||||
| 	<td data-value="6.66" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 6%"></div><div class="cover-empty" style="width: 94%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="6.66" class="pct low">6.66%</td> | ||||
| 	<td data-value="15" class="abs low">1/15</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="8" class="abs low">0/8</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="4" class="abs low">0/4</td> | ||||
| 	<td data-value="6.66" class="pct low">6.66%</td> | ||||
| 	<td data-value="15" class="abs low">1/15</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Profile.js"><a href="Profile.js.html">Profile.js</a></td> | ||||
| 	<td data-value="6.25" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 6%"></div><div class="cover-empty" style="width: 94%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="6.25" class="pct low">6.25%</td> | ||||
| 	<td data-value="16" class="abs low">1/16</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="8" class="abs low">0/8</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="3" class="abs low">0/3</td> | ||||
| 	<td data-value="6.25" class="pct low">6.25%</td> | ||||
| 	<td data-value="16" class="abs low">1/16</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Register.js"><a href="Register.js.html">Register.js</a></td> | ||||
| 	<td data-value="4.34" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 4%"></div><div class="cover-empty" style="width: 96%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="4.34" class="pct low">4.34%</td> | ||||
| 	<td data-value="23" class="abs low">1/23</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="16" class="abs low">0/16</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="5" class="abs low">0/5</td> | ||||
| 	<td data-value="4.34" class="pct low">4.34%</td> | ||||
| 	<td data-value="23" class="abs low">1/23</td> | ||||
| 	</tr> | ||||
|  | ||||
| <tr> | ||||
| 	<td class="file low" data-value="Resumes.js"><a href="Resumes.js.html">Resumes.js</a></td> | ||||
| 	<td data-value="1.56" class="pic low"> | ||||
| 	<div class="chart"><div class="cover-fill" style="width: 1%"></div><div class="cover-empty" style="width: 99%"></div></div> | ||||
| 	</td> | ||||
| 	<td data-value="1.56" class="pct low">1.56%</td> | ||||
| 	<td data-value="64" class="abs low">1/64</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="28" class="abs low">0/28</td> | ||||
| 	<td data-value="0" class="pct low">0%</td> | ||||
| 	<td data-value="11" class="abs low">0/11</td> | ||||
| 	<td data-value="1.56" class="pct low">1.56%</td> | ||||
| 	<td data-value="64" class="abs low">1/64</td> | ||||
| 	</tr> | ||||
|  | ||||
| </tbody> | ||||
| </table> | ||||
| </div> | ||||
|                 <div class='push'></div><!-- for sticky footer --> | ||||
|             </div><!-- /wrapper --> | ||||
|             <div class='footer quiet pad2 space-top1 center small'> | ||||
|                 Code coverage generated by | ||||
|                 <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||||
|                 at 2025-10-17T03:41:16.344Z | ||||
|             </div> | ||||
|         <script src="../../prettify.js"></script> | ||||
|         <script> | ||||
|             window.onload = function () { | ||||
|                 prettyPrint(); | ||||
|             }; | ||||
|         </script> | ||||
|         <script src="../../sorter.js"></script> | ||||
|         <script src="../../block-navigation.js"></script> | ||||
|     </body> | ||||
| </html> | ||||
|      | ||||
							
								
								
									
										1194
									
								
								frontend/coverage/lcov.info
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1194
									
								
								frontend/coverage/lcov.info
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Reference in New Issue
	
	Block a user