package Ġorg . ko il . view Ċ Ċ import Ġorg . springframework . data . domain . Page Ċ import Ġorg . springframework . data . domain . Page Request Ċ import Ġorg . springframework . data . domain . Page able Ċ import Ġorg . springframework . data . domain . Sort Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . web . servlet . Model AndView Ċ import Ġkotlin . streams . toList Ċ Ċ interface ĠView Renderer < MODEL > Ġ{ ĊĠĠĠ Ġfun Ġrender ( model : ĠMODEL , Ġhttp Status : ĠHttpStatus Ġ= ĠHttpStatus . OK ): ĠModelAndView Ġ= ĊĠĠĠĠĠĠĠ ĠModelAndView ( template , Ġmap Of (" model " Ġto Ġmodel )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= Ġhttp Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtemplate : ĠString Ċ } Ċ Ċ abstract Ġclass ĠPag inated ViewModel < T >( val Ġpage : ĠPage < T >) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcurrent Ġ= Ġpage . page able ĊĊĠĠĠ Ġfun Ġhas Previous (): ĠBoolean Ġ= Ġpage . has Previous () ĊĠĠĠ Ġfun Ġhas Next (): ĠBoolean Ġ= Ġpage . hasNext () ĊĊĠĠĠ Ġfun Ġpage Number (): ĠString Ġ= Ġ( page . number Ġ+ Ġ 1 ). toString () ĊĠĠĠ Ġfun Ġtotal Pages (): ĠString Ġ= Ġpage . total Pages . toString () ĊĠĠĠ Ġfun ĠnumberOf Elements (): ĠString Ġ= Ġpage . numberOf Elements . toString () ĊĊĠĠĠ Ġfun Ġfirst Page (): ĠString Ġ= Ġcreate QueryString ( current . first ()) ĊĠĠĠ Ġfun Ġprevious Page (): ĠString Ġ= Ġcreate QueryString ( page . previous Or First Page able ()) ĊĊĠĠĠ Ġfun Ġnext Page (): ĠString Ġ= Ġcreate QueryString ( page . next Page able ()) ĊĠĠĠ Ġfun Ġlast Page (): ĠString Ġ= Ġcreate QueryString ( current . with Page ( page . total Pages Ġ- Ġ 1 )) ĊĊĠĠĠ Ġfun ĠsortBy ( property : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpage able Ġ= Ġpage . page able ĊĠĠĠĠĠĠĠ Ġval Ġexisting Direction Ġ= Ġpage able . sort . getOrder For ( property )?. direction ĊĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġif Ġ( existing Direction Ġ== ĠSort . Direction . DESC Ġ|| Ġexisting Direction Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort . Direction . ASC ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSort . Direction . DESC ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsort Ġ= ĠSort . by ( direction , Ġproperty ) ĊĠĠĠĠĠĠĠ Ġval Ġupdated Ġ= ĠPage Request . of ( page able . pageNumber , Ġpage able . pageSize , Ġsort ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate QueryString ( updated ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsort Direction ( property : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġpage . page able . sort ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrder For ( property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . direction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ" ($ it )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . lowercase () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate QueryString ( page able : ĠPage able ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġquery Ġ= Ġ" ?" ĊĠĠĠĠĠĠĠ Ġif Ġ( page able . sort . is Sorted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Ġ+= Ġpage able . sort . get (). map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"& sort =${ it . property }, ${ it . direction }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList (). reduce Ġ{ Ġacc , Ġs Ġ-> Ġ"$ acc $ s " Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġquery Ġ+= Ġ"& page =${ page able . pageNumber }" ĊĠĠĠĠĠĠĠ Ġquery Ġ+= Ġ"& size =${ page able . pageSize }" ĊĊĠĠĠĠĠĠĠ Ġreturn Ġquery ĊĠĠĠ Ġ} Ċ } Ċ