@@ -168,6 +168,7 @@ pub fn TableContent<Row, DataP, Err, ClsP>(
168168 /// loading rows.
169169 #[ prop( optional) ]
170170 loading_row_display_limit : Option < usize > ,
171+
171172 #[ prop( optional) ] _marker : PhantomData < Err > ,
172173) -> impl IntoView
173174where
@@ -194,24 +195,60 @@ where
194195
195196 let ( row_count, set_row_count) = create_signal ( None :: < usize > ) ;
196197
197- let ( reload_count, set_reload_count) = create_signal ( 0_usize ) ;
198- let clear = move |clear_row_count : bool | {
199- selection. clear ( ) ;
200- first_selected_index. set ( None ) ;
198+ let set_known_row_count = move |row_count : usize | {
199+ set_row_count. set ( Some ( row_count) ) ;
200+ loaded_rows. update ( |loaded_rows| loaded_rows. resize ( row_count) ) ;
201+ on_row_count. run ( row_count) ;
202+ display_strategy. set_row_count ( row_count) ;
203+ } ;
201204
202- loaded_rows . update ( |loaded_rows| {
203- loaded_rows . clear ( ) ;
204- } ) ;
205+ let load_row_count = {
206+ let rows = Rc :: clone ( & rows ) ;
207+ let set_known_row_count = set_known_row_count . clone ( ) ;
205208
206- if clear_row_count {
207- set_row_count. set ( None ) ;
209+ move || {
210+ spawn_local ( {
211+ let rows = Rc :: clone ( & rows) ;
212+ let set_known_row_count = set_known_row_count. clone ( ) ;
213+
214+ async move {
215+ let row_count = rows. borrow ( ) . row_count ( ) . await ;
216+
217+ if let Some ( row_count) = row_count {
218+ set_known_row_count ( row_count) ;
219+ }
220+ }
221+ } )
208222 }
223+ } ;
224+
225+ let ( reload_count, set_reload_count) = create_signal ( 0_usize ) ;
226+ let clear = {
227+ let load_row_count = load_row_count. clone ( ) ;
228+
229+ move |clear_row_count : bool | {
230+ selection. clear ( ) ;
231+ first_selected_index. set ( None ) ;
209232
210- set_reload_count. set ( reload_count. get ( ) . overflowing_add ( 1 ) . 0 ) ;
233+ loaded_rows. update ( |loaded_rows| {
234+ loaded_rows. clear ( ) ;
235+ } ) ;
236+
237+ if clear_row_count {
238+ let reload = row_count. get_untracked ( ) . is_some ( ) ;
239+ set_row_count. set ( None ) ;
240+ if reload {
241+ load_row_count ( ) ;
242+ }
243+ }
244+
245+ set_reload_count. set ( reload_count. get ( ) . overflowing_add ( 1 ) . 0 ) ;
246+ }
211247 } ;
212248
213249 let on_head_click = {
214250 let rows = Rc :: clone ( & rows) ;
251+ let clear = clear. clone ( ) ;
215252
216253 move |event : TableHeadEvent | {
217254 sorting. update ( move |sorting| update_sorting_from_event ( sorting, event) ) ;
@@ -254,31 +291,13 @@ where
254291 UseElementSizeOptions :: default ( ) . box_ ( web_sys:: ResizeObserverBoxOptions :: ContentBox ) ,
255292 ) ;
256293
257- let set_known_row_count = move |row_count : usize | {
258- set_row_count. set ( Some ( row_count) ) ;
259- loaded_rows. update ( |loaded_rows| loaded_rows. resize ( row_count) ) ;
260- on_row_count. run ( row_count) ;
261- display_strategy. set_row_count ( row_count) ;
262- } ;
263-
264294 if is_browser ( )
265295 && matches ! (
266296 display_strategy,
267297 DisplayStrategy :: Virtualization | DisplayStrategy :: Pagination { .. }
268298 )
269299 {
270- spawn_local ( {
271- let rows = Rc :: clone ( & rows) ;
272- let set_known_row_count = set_known_row_count. clone ( ) ;
273-
274- async move {
275- let row_count = rows. borrow ( ) . row_count ( ) . await ;
276-
277- if let Some ( row_count) = row_count {
278- set_known_row_count ( row_count) ;
279- }
280- }
281- } ) ;
300+ load_row_count ( ) ;
282301 }
283302
284303 let ( average_row_height, set_average_row_height) = create_signal ( 20.0 ) ;
@@ -599,37 +618,44 @@ fn compute_average_row_height_from_loaded<Row, ClsP>(
599618 let display_range = display_range. get_untracked ( ) ;
600619 if display_range. end > 0 {
601620 let avg_row_height = loaded_rows. with_untracked ( |loaded_rows| {
602- let mut loaded_row_end_index = None ;
621+ let mut loading_row_start_index = None ;
622+ let mut loading_row_end_index = None ;
603623
604624 for i in display_range. clone ( ) {
605- if matches ! ( loaded_rows[ i] , RowState :: Loaded ( _) ) {
606- loaded_row_end_index = Some ( i) ;
625+ if matches ! ( loaded_rows[ i] , RowState :: Loaded ( _) | RowState :: Loading ) {
626+ if loading_row_start_index. is_none ( ) {
627+ loading_row_start_index = Some ( i) ;
628+ }
629+ loading_row_end_index = Some ( i) ;
607630 } else {
608- if loaded_row_end_index . is_some ( ) {
631+ if loading_row_end_index . is_some ( ) {
609632 break ;
610633 }
611634 }
612635 }
613636
614- if let Some ( loaded_row_end_index) = loaded_row_end_index {
615- if loaded_row_end_index == 0 {
637+ if let ( Some ( loading_row_start_index) , Some ( loading_row_end_index) ) =
638+ ( loading_row_start_index, loading_row_end_index)
639+ {
640+ if loading_row_end_index == loading_row_start_index {
616641 return None ;
617642 }
618643
619644 let children = el. children ( ) ;
620645
621- let placeholder_before = children. get_with_index ( 0 ) ;
622646 // skip first element, because it's the "before" placeholder
623- let last_loaded_row = children
624- . get_with_index ( ( loaded_row_end_index + 1 - display_range. start ) as u32 ) ;
647+ let first_loading_row = children
648+ . get_with_index ( ( loading_row_start_index + 1 - display_range. start ) as u32 ) ;
649+ let last_loading_row = children
650+ . get_with_index ( ( loading_row_end_index + 1 - display_range. start ) as u32 ) ;
625651
626- if let ( Some ( placeholder_before ) , Some ( last_loaded_row) ) =
627- ( placeholder_before , last_loaded_row )
652+ if let ( Some ( first_loading_row ) , Some ( last_loaded_row) ) =
653+ ( first_loading_row , last_loading_row )
628654 {
629655 return Some (
630656 ( last_loaded_row. get_bounding_client_rect ( ) . top ( )
631- - placeholder_before . get_bounding_client_rect ( ) . top ( ) )
632- / ( loaded_row_end_index - 1 ) as f64 ,
657+ - first_loading_row . get_bounding_client_rect ( ) . top ( ) )
658+ / ( loading_row_end_index - loading_row_start_index ) as f64 ,
633659 ) ;
634660 }
635661 }
0 commit comments