/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠSpotify ĠAB Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . spotify . r uler . frontend . components Ċ Ċ import Ġcom . bn orm . react . R Function Ċ import Ġcom . spotify . r uler . frontend . format Size Ċ import Ġcom . spotify . r uler . models . App Report Ċ import Ġcom . spotify . r uler . models . Meas ur able Ċ import Ġkotlinx . html . id Ċ import Ġkotlinx . html . js . onChange Function Ċ import Ġorg . w 3 c . dom . HTML Select Element Ċ import Ġreact . Props Ċ import Ġreact . R Builder Ċ import Ġreact . createElement Ċ import Ġreact . dom . div Ċ import Ġreact . dom . h 3 Ċ import Ġreact . dom . li Ċ import Ġreact . dom . option Ċ import Ġreact . dom . select Ċ import Ġreact . dom . span Ċ import Ġreact . dom . ul Ċ import Ġreact . router . Route Ċ import Ġreact . router . Routes Ċ import Ġreact . router . dom . Hash Router Ċ import Ġreact . router . dom . NavLink Ċ import Ġreact . useState Ċ Ċ @ R Function Ċ fun ĠR Builder . report ( report : ĠApp Report ) Ġ{ ĊĠĠĠ Ġval Ġ( size Type , Ġset Size Type ) Ġ= ĠuseState ( Meas ur able . Size Type . DOWNLOAD ) ĊĊĠĠĠ Ġval Ġhas Ownership Info Ġ= Ġreport . components . any Ġ{ Ġcomponent Ġ-> Ġcomponent . owner Ġ!= Ġnull Ġ} ĊĊĠĠĠ Ġval Ġtabs Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ ĠTab ("/", Ġ" Break down ") Ġ{ Ġbreak down ( report . components , Ġsize Type ) Ġ}, ĊĠĠĠĠĠĠĠ ĠTab ("/ insights ", Ġ" Insights ") Ġ{ Ġinsights ( report . components ) Ġ}, ĊĠĠĠĠĠĠĠ ĠTab ("/ ownership ", Ġ" Ownership ", Ġhas Ownership Info ) Ġ{ Ġownership ( report . components , Ġsize Type ) Ġ}, ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdiv ( classes Ġ= Ġ" container Ġmt - 4 Ġmb - 5 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġdiv ( classes Ġ= Ġ" shadow - sm Ġp - 4 Ġmb - 4 Ġbg - white Ġrounded - 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( report ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdiv ( classes Ġ= Ġ" shadow - sm Ġp - 4 Ġbg - white Ġrounded - 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHash Router Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnavigation ( tabs , Ġon Size Type Selected Ġ= Ġ{ Ġset Size Type ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent ( tabs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ R Function Ċ fun ĠR Builder . header ( report : ĠApp Report ) Ġ{ ĊĠĠĠ Ġdiv ( classes Ġ= Ġ" row ") Ġ{ ĊĠĠĠĠĠĠĠ Ġdiv ( classes Ġ= Ġ" col ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġh 3 Ġ{ Ġ+ report . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġspan ( classes Ġ= Ġ" text - muted ") Ġ{ Ġ+" Version Ġ${ report . version } Ġ(${ report . variant })" Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġheader Size Item ( report . download Size , Ġ" Download Ġsize ") ĊĠĠĠĠĠĠĠ Ġheader Size Item ( report . install Size , Ġ" Install Ġsize ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ R Function Ċ fun ĠR Builder . header Size Item ( size : ĠNumber , Ġlabel : ĠString ) Ġ{ ĊĠĠĠ Ġdiv ( classes Ġ= Ġ" col - auto Ġtext - center Ġms - 5 Ġme - 5 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġh 3 Ġ{ Ġ+ format Size ( size ) Ġ} ĊĠĠĠĠĠĠĠ Ġspan ( classes Ġ= Ġ" text - muted Ġm - 0 ") Ġ{ Ġ+ label Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ R Function Ċ fun ĠR Builder . navigation ( tabs : ĠList < Tab >, Ġon Size Type Selected : Ġ( Meas ur able . Size Type ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġdiv ( classes Ġ= Ġ" row Ġalign - items - center Ġmb - 4 ") Ġ{ ĊĠĠĠĠĠĠĠ Ġdiv ( classes Ġ= Ġ" col ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtabs ( tabs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdiv ( classes Ġ= Ġ" col - auto ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Download Ġsize " Ġto ĠMe as ur able . Size Type . DOWNLOAD , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Install Ġsize " Ġto ĠMe as ur able . Size Type . INSTALL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdropdown ( options . keys , Ġ" size - type - dropdown ") Ġ{ Ġselected Option Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Size Type Selected ( options . getValue ( selected Option )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ R Function Ċ fun ĠR Builder . tabs ( tabs : ĠList < Tab >) Ġ{ ĊĠĠĠ Ġul ( classes Ġ= Ġ" nav Ġnav - pills ") Ġ{ ĊĠĠĠĠĠĠĠ Ġtabs . filter ( Tab :: enabled ). forEach Ġ{ Ġ( path , Ġlabel ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġli ( classes Ġ= Ġ" nav - item ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNav Link Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . to Ġ= Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . className Ġ= Ġ" nav - link " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ label ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ R Function Ċ fun ĠR Builder . content ( tabs : ĠList < Tab >) Ġ{ ĊĠĠĠ ĠRoutes Ġ{ ĊĠĠĠĠĠĠĠ Ġtabs . forEach Ġ{ Ġ( path , Ġ_, Ġ_, Ġcontent ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRoute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . path Ġ= Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . element Ġ= ĠcreateElement < Props >( content ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ R Function Ċ fun ĠR Builder . dropdown ( options : ĠIterable < String >, Ġid : ĠString , Ġon Option Selected : Ġ( String ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġselect ( classes Ġ= Ġ" form - select ") Ġ{ ĊĠĠĠĠĠĠĠ Ġattrs . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġattrs . onChange Function Ġ= Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Option Selected (( event . target Ġas ĠHTML Select Element ). value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġoptions . forEach Ġ{ Ġoption Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoption Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattrs . value Ġ= Ġoption ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ option ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠTab ( ĊĠĠĠ Ġval Ġpath : ĠString , ĊĠĠĠ Ġval Ġlabel : ĠString , ĊĠĠĠ Ġval Ġenabled : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġval Ġcontent : ĠR Builder . () Ġ-> ĠUnit Ċ ) Ċ