1- import { component$ , useStylesScoped$ , $ , useComputed$ } from '@builder.io/qwik' ;
1+ import { component$ , useSignal , useStylesScoped$ , $ , useComputed$ } from '@builder.io/qwik' ;
22
33
44
@@ -13,15 +13,6 @@ export const Pagination = component$((props) => {
1313 return Math . ceil ( ( props . totalPosts . value / props . postPerPage . value ) ) || 1 ;
1414 } ) ;
1515
16- const changePosts = $ ( ( e ) => {
17- props . postPerPage . value = e . target . value ;
18- props . postPerPageSelectedIndex . value = props . postPerPageValues . indexOf ( props . postPerPage . value ) ;
19- } )
20-
21- const changePageNo = $ ( ( e ) => {
22- props . pageNo . value = e . target . value ;
23- } )
24-
2516 const decPage = $ ( ( ) => {
2617 if ( props . pageNo . value > 1 ) props . pageNo . value -- ;
2718 } )
@@ -38,20 +29,35 @@ export const Pagination = component$((props) => {
3829 if ( props . pageNo . value !== totalPage . value ) props . pageNo . value = totalPage . value ;
3930 } )
4031
32+ const postPerPageLast = useSignal ( props . postPerPage . value ) ;
33+
34+ const postPerPageChange = $ ( ( ) => {
35+ // scale pageNo to keep the first row in focus
36+ const firstRowIdx = postPerPageLast . value * ( props . pageNo . value - 1 ) ;
37+ const totalPage2 = Math . ceil ( ( props . totalPosts . value / props . postPerPage . value ) ) || 1 ;
38+ const pageNo2 = Math . floor ( Math . min ( totalPage2 , ( firstRowIdx / props . postPerPage . value ) + 1 ) ) ;
39+ //console.log(`postPerPage: ${postPerPageLast.value} -> ${props.postPerPage.value}`);
40+ //console.log(`totalPage: ${totalPage.value} -> ${totalPage2}`);
41+ //console.log(`firstRowIdx: ${firstRowIdx}`);
42+ //console.log(`pageNo: ${props.pageNo.value} -> ${pageNo2}`);
43+ props . pageNo . value = pageNo2 ;
44+ postPerPageLast . value = props . postPerPage . value ;
45+ } ) ;
46+
4147 return (
4248 < div class = 'page-cont' >
4349
4450 < div class = 'post-select' >
4551 < div > Rows per page </ div >
46- < select bind :value = { props . postPerPage } >
47- { props . postPerPageValues . map ( postPerPage => (
48- < option selected = { postPerPage == props . postPerPage . value } > { postPerPage } </ option >
52+ < select bind :value = { props . postPerPage } onChange$ = { postPerPageChange } >
53+ { props . postPerPageValues . map ( ( postPerPage , idx ) => (
54+ < option key = { idx } selected = { postPerPage == props . postPerPage . value } > { postPerPage } </ option >
4955 ) ) }
5056 </ select >
5157 </ div >
5258
5359 < div >
54- < div class = 'select-page' > Page < input onInput$ = { changePageNo } value = { props . pageNo . value } type = 'number' min = { 1 } max = { totalPage . value } /> of { totalPage . value } </ div >
60+ < div class = 'select-page' > Page < input bind : value = { props . pageNo } type = 'number' min = { 1 } max = { totalPage . value } /> of { totalPage . value } </ div >
5561 </ div >
5662
5763 < div class = 'btn-cont' >
0 commit comments