/* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 ĠOn a ĠSystems , ĠInc Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . smart register . fhir core . engine . ui . register Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroidx . lifecycle . Android ViewModel Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġandroidx . lifecycle . viewModel Scope Ċ import Ġandroidx . paging . Pager Ċ import Ġandroidx . paging . Paging Config Ċ import Ġandroidx . paging . Paging Data Ċ import Ġandroidx . paging . filter Ċ import Ġkotlin . math . ceil Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . Mutable State Flow Ċ import Ġkotlinx . coroutines . flow . empty Flow Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . launch Ċ import Ġorg . smart register . fhir core . engine . data . domain . util . Pag inated DataSource Ċ import Ġorg . smart register . fhir core . engine . data . domain . util . Pagination Util Ċ import Ġorg . smart register . fhir core . engine . data . domain . util . Register Repository Ċ import Ġorg . smart register . fhir core . engine . ui . register . model . Register Filter Type Ċ import Ġorg . smart register . fhir core . engine . util . Default Dispatcher Provider Ċ import Ġorg . smart register . fhir core . engine . util . Dispatcher Provider Ċ Ċ class ĠRegister Data ViewModel < I Ġ: ĠAny , ĠO Ġ: ĠAny >( ĊĠ Ġapplication : ĠApplication , ĊĠ Ġval Ġregister Repository : ĠRegister Repository < I , ĠO >, ĊĠ Ġval Ġdispatcher Provider : ĠDispatcher Provider Ġ= ĠDefault Dispatcher Provider Ċ ) Ġ: ĠAndroid ViewModel ( application ) Ġ{ ĊĊĠ Ġprivate Ġval Ġ_ show Loader Ġ= ĠMutable LiveData ( false ) ĊĠ Ġval Ġshow Loader ĊĠĠĠ Ġget () Ġ= Ġ_ show Loader ĊĊĠ Ġprivate Ġval Ġ_ show Results Count Ġ= ĠMutable LiveData ( false ) ĊĠ Ġval Ġshow Results Count ĊĠĠĠ Ġget () Ġ= Ġ_ show Results Count ĊĊĠ Ġprivate Ġval Ġ_ total Records Count Ġ= ĠMutable LiveData ( 1 L ) ĊĊĠ Ġprivate Ġval Ġ_ currentPage Ġ= ĠMutable LiveData ( 0 ) ĊĠ Ġval ĠcurrentPage ĊĠĠĠ Ġget () Ġ= Ġ_ currentPage ĊĊĠ Ġprivate Ġval Ġall Register Data : ĠMutable State Flow < Flow < Paging Data < O >>> Ġ= ĊĠĠĠ ĠMutable State Flow ( getP aging Data ( currentPage Ġ= Ġ 0 , Ġload All Ġ= Ġtrue )) ĊĊĠ Ġvar Ġregister Data : ĠMutable State Flow < Flow < Paging Data < O >>> Ġ= ĠMutable State Flow ( empty Flow ()) ĊĊĠ Ġinit Ġ{ ĊĠĠĠ ĠviewModel Scope . launch Ġ{ Ġ_ total Records Count . post Value ( register Repository . count All ()) Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠPerform Ġfilter Ġon Ġthe Ġpag inated Ġdata Ġby Ġinvoking Ġthe Ġ[ register Filter ] Ġlambda , Ġpassing ĊĠĠ Ġ* Ġ[ filter Value ] Ġand Ġ[ register Filter Type ] Ġas Ġthe Ġtype Ġof Ġfilter Ġthat Ġyou Ġwish Ġto Ġapply Ġe . g . ĊĠĠ Ġ* Ġsearching Ġby Ġname Ġfilter , Ġfilter Ġover due Ġv acc ines Ġetc . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġfilter Register Data ( ĊĠĠĠ Ġregister Filter Type : ĠRegister Filter Type , ĊĠĠĠ Ġfilter Value : ĠAny , ĊĠĠĠ Ġregister Filter : Ġ( Register Filter Type , ĠO , ĠAny ) Ġ-> ĠBoolean ĊĠ Ġ) Ġ{ ĊĠĠĠ ĠviewModel Scope . launch ( dispatcher Provider . io ()) Ġ{ ĊĠĠĠĠĠ Ġregister Data . value Ġ= ĊĠĠĠĠĠĠĠ Ġall Register Data . value . map Ġ{ Ġpaging Data : ĠP aging Data < O > Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġpaging Data . filter Ġ{ Ġregister Filter ( register Filter Type , Ġit , Ġfilter Value ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġload Page Data ( currentPage : ĠInt ) Ġ{ ĊĠĠĠ ĠviewModel Scope . launch ( dispatcher Provider . io ()) Ġ{ ĊĠĠĠĠĠ Ġregister Data . run Ġ{ Ġvalue Ġ= Ġget Paging Data ( currentPage Ġ= ĠcurrentPage , Ġload All Ġ= Ġfalse ) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Paging Data ( currentPage : ĠInt , Ġload All : ĠBoolean ) Ġ= ĊĠĠĠ ĠP ager ( ĊĠĠĠĠĠĠĠ Ġconfig Ġ= ĊĠĠĠĠĠĠĠĠĠ ĠP aging Config ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= ĠPagination Util . DEFAULT _ PAGE _ SIZE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinitial Load Size Ġ= ĠPagination Util . DEFAULT _ INITIAL _ LOAD _ SIZE , ĊĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġpaging Source Factory Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPag inated DataSource ( register Repository ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . load All Ġ= Ġload All ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . currentPage Ġ= ĠcurrentPage ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ. flow ĊĊĠ Ġfun Ġprevious Page () Ġ{ ĊĠĠĠ Ġthis ._ currentPage . value ?. let Ġ{ Ġif Ġ( it Ġ> Ġ 0 ) Ġ_ currentPage . value Ġ= Ġit . minus ( 1 ) Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġnext Page () Ġ{ ĊĠĠĠ Ġthis ._ currentPage . value Ġ= Ġthis ._ currentPage . value ?. plus ( 1 ) ĊĠ Ġ} ĊĊĠ Ġfun ĠcurrentPage () Ġ= Ġthis . currentPage . value ?. plus ( 1 ) Ġ?: Ġ 1 ĊĊĠ Ġfun Ġcount Pages () Ġ= ĊĠĠĠ Ġ_ total Records Count . value ?. toDouble ()?. div ( Pagination Util . DEFAULT _ PAGE _ SIZE . to Long ()) ?. let Ġ{ ĊĠĠĠĠĠ Ġceil ( it ). toInt () ĊĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ?: Ġ 1 ĊĊĠ Ġfun Ġshow Results Count ( show Results Count : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis ._ show Results Count . post Value ( show Results Count ) ĊĠ Ġ} ĊĊĠ Ġfun ĠsetShow Loader ( show Loader : ĠBoolean ) Ġ{ ĊĠĠĠ Ġthis ._ show Loader . post Value ( show Loader ) ĊĠ Ġ} ĊĊĠ Ġfun Ġreload Current Page Data ( refresh Total Records Count : ĠBoolean Ġ= Ġfalse ) Ġ{ ĊĠĠĠ Ġ_ currentPage . value ?. let Ġ{ Ġload Page Data ( it ) Ġ} ĊĠĠĠ Ġif Ġ( refresh Total Records Count ) Ġ{ ĊĠĠĠĠĠ ĠviewModel Scope . launch Ġ{ Ġ_ total Records Count . post Value ( register Repository . count All ()) Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ