Skip to content

Commit 112256e

Browse files
committed
release 0.9.1
1 parent 8eeedd0 commit 112256e

File tree

6 files changed

+78
-44
lines changed

6 files changed

+78
-44
lines changed

.gitattributes

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
*.sqlite3 filter=lfs diff=lfs merge=lfs -text
2-
*.sqlite3* filter=lfs diff=lfs merge=lfs -text
2+
*.sqlite3-wal filter=lfs diff=lfs merge=lfs -text

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## [0.9.1] - 2024-02-28
4+
5+
### Fixes 🐛
6+
7+
- Fixed row height detection for virtualization
8+
- Row count now reloads when the data source triggers changes
9+
310
## [0.9.0] - 2024-02-22
411

512
### Breaking Changes 🛠️

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "leptos-struct-table"
3-
version = "0.9.0"
3+
version = "0.9.1"
44
edition = "2021"
55
authors = ["Marc-Stefan Cassola"]
66
categories = ["gui", "web-programming"]

examples/serverfn_sqlx/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ node_modules/
1111
test-results/
1212
end2end/playwright-report/
1313
playwright/.cache/
14+
*.sqlite3-shm

examples/serverfn_sqlx/db.sqlite3-wal

Whitespace-only changes.

src/components/table_content.rs

Lines changed: 68 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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
173174
where
@@ -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

Comments
 (0)