* [yew-devel] [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store
@ 2025-11-21 16:14 Shannon Sterz
2025-11-21 16:14 ` [yew-devel] [PATCH yew-widget-toolkit v3 1/1] store: add helper methods to extract a record via a selection Shannon Sterz
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Shannon Sterz @ 2025-11-21 16:14 UTC (permalink / raw)
To: yew-devel
a very common pattern is to use a `Store` combined with a `Selection`.
however, to get the record from a `Store` that has the same `Key` as is
selected by the `Selection` is a little cumbersome. it requires
dealing with several optional values. so many components implement a
helper for that. it usually looks like this:
```rust
fn get_selected_record(&self) -> Option<ApiToken> {
self.selection
.selected_key()
.and_then(|key| self.store.read().lookup_record(&key).cloned())
}
let Some(record) = self.get_selected_record() else {
return false;
}
```
to avoid duplicating this effort in every such component add new helper
methods to the `Store`. they each take a `Selection` and either return
an optional reference or an optional clone of the selected record.
turning the above into:
```rust
let Some(record) = self.store.selected_record(&self.selection) else {
return false;
}
```
there are also helpers that are prefixed with `multi_` to help deal with
`Selection`s in multi-select mode by returning a vector of all selected
entries.
the second commit in this series is mostly for demonstrative purposes.
sending this as an rfc as i am not sure if the naming of these functions
is ideal or whether we want to add both helpers (instead of just one of
them).
Changelog
---------
changes since v2:
* rebase on current master.
changes since v1:
* rebase on current master.
* add helpers for multi selections too.
proxmox-yew-widget-toolkit:
Shannon Sterz (1):
store: add helper methods to extract a record via a selection
src/state/store.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 48 insertions(+), 1 deletion(-)
proxmox-yew-comp:
Shannon Sterz (1):
token panel: use new `selected_record` helper
src/token_panel.rs | 10 ++--------
1 file changed, 2 insertions(+), 8 deletions(-)
Summary over all repositories:
2 files changed, 50 insertions(+), 9 deletions(-)
--
Generated by git-murpp 0.8.1
_______________________________________________
yew-devel mailing list
yew-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel
^ permalink raw reply [flat|nested] 5+ messages in thread* [yew-devel] [PATCH yew-widget-toolkit v3 1/1] store: add helper methods to extract a record via a selection 2025-11-21 16:14 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz @ 2025-11-21 16:14 ` Shannon Sterz 2025-11-21 16:14 ` [yew-devel] [PATCH yew-comp v3 1/1] token panel: use new `selected_record` helper Shannon Sterz 2025-11-21 16:15 ` [yew-devel] Superseded: Re: [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz 2 siblings, 0 replies; 5+ messages in thread From: Shannon Sterz @ 2025-11-21 16:14 UTC (permalink / raw) To: yew-devel this adds helpers to the `Store` (and its `StoreState`) that have similar objectives: - `selected_record(Selection) -> Option<T>`: returns a clone of the record that has the same `Key` as the currently selected item in the `Selection`. this requires the type `T` to implement `Clone`. - `lookup_with_selection(Selection) -> Option<&T>`: requires the user to acquire a read guard on the store first and will then return a reference to the record of the store that matches the currently selected item in the `Selection`. - each also has variation that is prefixed with `multi_` and returns a vector of all entries that have a key selected by a `Selection` in multi-select mode Signed-off-by: Shannon Sterz <s.sterz@proxmox.com> --- src/state/store.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/state/store.rs b/src/state/store.rs index b424f379..1a5ec470 100644 --- a/src/state/store.rs +++ b/src/state/store.rs @@ -14,7 +14,7 @@ use yew::virtual_dom::Key; use crate::props::{ ExtractKeyFn, ExtractPrimaryKey, FilterFn, IntoFilterFn, IntoSorterFn, SorterFn, }; -use crate::state::{optional_rc_ptr_eq, DataNode, DataNodeDerefGuard, DataStore}; +use crate::state::{optional_rc_ptr_eq, DataNode, DataNodeDerefGuard, DataStore, Selection}; /// Hook to use a [Store] with functional components. /// @@ -102,6 +102,29 @@ impl<T: ExtractPrimaryKey + 'static> FromIterator<T> for Store<T> { } } +impl<T: Clone> Store<T> { + /// Returns a clone of the record that is currently selected by `selection`. + pub fn selected_record(&self, selection: &Selection) -> Option<T> { + self.read().lookup_with_selection(selection).cloned() + } + + /// Returns a vector of clones of all records that are selected by the `selection` in + /// multi-select mode. + /// + /// # Note + /// + /// If a `Key` returned by `Selection::selected_keys` is not in the store, it will be filtered + /// from the returned vector. The vector will still contain a record for every other `Key` that + /// a record can be found for. + pub fn multi_selected_records(&self, selection: &Selection) -> Vec<T> { + self.read() + .lookup_with_multi_selection(selection) + .into_iter() + .cloned() + .collect() + } +} + impl<T: 'static> Store<T> { /// Creates a new instance with the specifies extract key function. pub fn with_extract_key(extract_key: impl Into<ExtractKeyFn<T>>) -> Self { @@ -558,6 +581,30 @@ impl<T: 'static> StoreState<T> { pub fn lookup_record_mut(&mut self, key: &Key) -> Option<&mut T> { self.record_pos(key).map(|n| &mut self.data[n]) } + + /// Find the record that has the same key as is currently selected by `selection`. + pub fn lookup_with_selection(&self, selection: &Selection) -> Option<&T> { + if let Some(ref key) = selection.selected_key() { + return self.lookup_record(key); + } + + None + } + + /// Get all records that are selected by the `selection` in multi-select mode. + /// + /// # Note + /// + /// If a `Key` returned by `Selection::selected_keys` is not in the store, it will be filtered + /// from the returned vector. The vector will still contain a record for every other `Key` that + /// a record can be found for. + pub fn lookup_with_multi_selection(&self, selection: &Selection) -> Vec<&T> { + selection + .selected_keys() + .iter() + .filter_map(|k| self.lookup_record(k)) + .collect() + } } #[doc(hidden)] -- 2.47.3 _______________________________________________ yew-devel mailing list yew-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [yew-devel] [PATCH yew-comp v3 1/1] token panel: use new `selected_record` helper 2025-11-21 16:14 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz 2025-11-21 16:14 ` [yew-devel] [PATCH yew-widget-toolkit v3 1/1] store: add helper methods to extract a record via a selection Shannon Sterz @ 2025-11-21 16:14 ` Shannon Sterz 2025-11-21 16:15 ` [yew-devel] Superseded: Re: [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz 2 siblings, 0 replies; 5+ messages in thread From: Shannon Sterz @ 2025-11-21 16:14 UTC (permalink / raw) To: yew-devel instead of re-implementing it here Signed-off-by: Shannon Sterz <s.sterz@proxmox.com> --- src/token_panel.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/token_panel.rs b/src/token_panel.rs index bbd2e79..6dfdccd 100644 --- a/src/token_panel.rs +++ b/src/token_panel.rs @@ -220,7 +220,7 @@ impl LoadableComponent for ProxmoxTokenView { match msg { Msg::Refresh => true, Msg::Remove => { - let Some(record) = self.get_selected_record() else { + let Some(record) = self.store.selected_record(&self.selection) else { return false; }; @@ -245,7 +245,7 @@ impl LoadableComponent for ProxmoxTokenView { false } Msg::Regenerate => { - let Some(record) = self.get_selected_record() else { + let Some(record) = self.store.selected_record(&self.selection) else { return false; }; let user = record.tokenid.user().to_string(); @@ -304,12 +304,6 @@ impl LoadableComponent for ProxmoxTokenView { } impl ProxmoxTokenView { - fn get_selected_record(&self) -> Option<ApiToken> { - self.selection - .selected_key() - .and_then(|key| self.store.read().lookup_record(&key).cloned()) - } - fn create_show_permissions_dialog( &self, ctx: &LoadableComponentContext<Self>, -- 2.47.3 _______________________________________________ yew-devel mailing list yew-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* [yew-devel] Superseded: Re: [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store 2025-11-21 16:14 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz 2025-11-21 16:14 ` [yew-devel] [PATCH yew-widget-toolkit v3 1/1] store: add helper methods to extract a record via a selection Shannon Sterz 2025-11-21 16:14 ` [yew-devel] [PATCH yew-comp v3 1/1] token panel: use new `selected_record` helper Shannon Sterz @ 2025-11-21 16:15 ` Shannon Sterz 2025-11-21 16:17 ` Shannon Sterz 2 siblings, 1 reply; 5+ messages in thread From: Shannon Sterz @ 2025-11-21 16:15 UTC (permalink / raw) To: Shannon Sterz; +Cc: yew-devel Superseded-by: https://lore.proxmox.com/yew-devel/20251121161423.390869-1-s.sterz@proxmox.com/ On Fri Nov 21, 2025 at 5:14 PM CET, Shannon Sterz wrote: > a very common pattern is to use a `Store` combined with a `Selection`. > however, to get the record from a `Store` that has the same `Key` as is > selected by the `Selection` is a little cumbersome. it requires > dealing with several optional values. so many components implement a > helper for that. it usually looks like this: > > ```rust > fn get_selected_record(&self) -> Option<ApiToken> { > self.selection > .selected_key() > .and_then(|key| self.store.read().lookup_record(&key).cloned()) > } > > let Some(record) = self.get_selected_record() else { > return false; > } > ``` > > to avoid duplicating this effort in every such component add new helper > methods to the `Store`. they each take a `Selection` and either return > an optional reference or an optional clone of the selected record. > turning the above into: > > ```rust > let Some(record) = self.store.selected_record(&self.selection) else { > return false; > } > ``` > > there are also helpers that are prefixed with `multi_` to help deal with > `Selection`s in multi-select mode by returning a vector of all selected > entries. > > the second commit in this series is mostly for demonstrative purposes. > sending this as an rfc as i am not sure if the naming of these functions > is ideal or whether we want to add both helpers (instead of just one of > them). > > Changelog > --------- > > changes since v2: > > * rebase on current master. > > changes since v1: > > * rebase on current master. > * add helpers for multi selections too. > > proxmox-yew-widget-toolkit: > > Shannon Sterz (1): > store: add helper methods to extract a record via a selection > > src/state/store.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 48 insertions(+), 1 deletion(-) > > > proxmox-yew-comp: > > Shannon Sterz (1): > token panel: use new `selected_record` helper > > src/token_panel.rs | 10 ++-------- > 1 file changed, 2 insertions(+), 8 deletions(-) > > > Summary over all repositories: > 2 files changed, 50 insertions(+), 9 deletions(-) > > -- > Generated by git-murpp 0.8.1 _______________________________________________ yew-devel mailing list yew-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [yew-devel] Superseded: Re: [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store 2025-11-21 16:15 ` [yew-devel] Superseded: Re: [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz @ 2025-11-21 16:17 ` Shannon Sterz 0 siblings, 0 replies; 5+ messages in thread From: Shannon Sterz @ 2025-11-21 16:17 UTC (permalink / raw) To: Shannon Sterz; +Cc: yew-devel On Fri Nov 21, 2025 at 5:15 PM CET, Shannon Sterz wrote: > Superseded-by: https://lore.proxmox.com/yew-devel/20251121161423.390869-1-s.sterz@proxmox.com/ ignore this, this is still the current version of this patch series... i replied to the wrong email there... > On Fri Nov 21, 2025 at 5:14 PM CET, Shannon Sterz wrote: >> a very common pattern is to use a `Store` combined with a `Selection`. >> however, to get the record from a `Store` that has the same `Key` as is >> selected by the `Selection` is a little cumbersome. it requires >> dealing with several optional values. so many components implement a >> helper for that. it usually looks like this: >> >> ```rust >> fn get_selected_record(&self) -> Option<ApiToken> { >> self.selection >> .selected_key() >> .and_then(|key| self.store.read().lookup_record(&key).cloned()) >> } >> >> let Some(record) = self.get_selected_record() else { >> return false; >> } >> ``` >> >> to avoid duplicating this effort in every such component add new helper >> methods to the `Store`. they each take a `Selection` and either return >> an optional reference or an optional clone of the selected record. >> turning the above into: >> >> ```rust >> let Some(record) = self.store.selected_record(&self.selection) else { >> return false; >> } >> ``` >> >> there are also helpers that are prefixed with `multi_` to help deal with >> `Selection`s in multi-select mode by returning a vector of all selected >> entries. >> >> the second commit in this series is mostly for demonstrative purposes. >> sending this as an rfc as i am not sure if the naming of these functions >> is ideal or whether we want to add both helpers (instead of just one of >> them). >> >> Changelog >> --------- >> >> changes since v2: >> >> * rebase on current master. >> >> changes since v1: >> >> * rebase on current master. >> * add helpers for multi selections too. >> >> proxmox-yew-widget-toolkit: >> >> Shannon Sterz (1): >> store: add helper methods to extract a record via a selection >> >> src/state/store.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 48 insertions(+), 1 deletion(-) >> >> >> proxmox-yew-comp: >> >> Shannon Sterz (1): >> token panel: use new `selected_record` helper >> >> src/token_panel.rs | 10 ++-------- >> 1 file changed, 2 insertions(+), 8 deletions(-) >> >> >> Summary over all repositories: >> 2 files changed, 50 insertions(+), 9 deletions(-) >> >> -- >> Generated by git-murpp 0.8.1 _______________________________________________ yew-devel mailing list yew-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/yew-devel ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-11-21 16:17 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2025-11-21 16:14 [yew-devel] [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz 2025-11-21 16:14 ` [yew-devel] [PATCH yew-widget-toolkit v3 1/1] store: add helper methods to extract a record via a selection Shannon Sterz 2025-11-21 16:14 ` [yew-devel] [PATCH yew-comp v3 1/1] token panel: use new `selected_record` helper Shannon Sterz 2025-11-21 16:15 ` [yew-devel] Superseded: Re: [PATCH yew-comp/yew-widget-toolkit v3 0/2] add helpers to get a record via a Selection from a Store Shannon Sterz 2025-11-21 16:17 ` Shannon Sterz
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox