Skip to content

Commit

Permalink
feat: add "SBOM by dependency" tab
Browse files Browse the repository at this point in the history
  • Loading branch information
ctron committed Aug 31, 2023
1 parent 8bdc232 commit d9d6fad
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 9 deletions.
16 changes: 12 additions & 4 deletions spog/ui/src/components/sbom/search.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::{
backend::{self, PackageService},
components::{sbom::SbomResult, search::*},
hooks::SearchOperationContext,
hooks::{use_config, use_generic_search, UseStandardSearch},
utils::pagination_to_offset,
};
Expand Down Expand Up @@ -28,22 +29,27 @@ pub fn sbom_search_controls(props: &SbomSearchControlsProperties) -> Html {
}

#[hook]
pub fn use_sbom_search(
pub fn use_sbom_search<S>(
search_params: UseStateHandle<SearchMode<DynamicSearchParameters>>,
pagination: UsePagination,
callback: Callback<UseAsyncHandleDeps<SearchResult<Rc<Vec<PackageSummary>>>, String>>,
) -> UseStandardSearch {
f: S,
) -> UseStandardSearch
where
S: FnOnce(&SearchOperationContext) -> String + 'static,
{
let config = use_config();
use_generic_search::<Packages, _, _, _, _>(
search_params,
pagination,
callback,
|| config.bombastic.filters.clone(),
|context| async move {
let q = f(&context);
let service = PackageService::new(context.backend, context.access_token);
service
.search_packages(
&context.search_params.as_str(&context.filters),
&q,
&backend::SearchParameters {
offset: Some(pagination_to_offset(context.page, context.per_page)),
limit: Some(context.per_page),
Expand Down Expand Up @@ -91,7 +97,9 @@ pub fn sbom_search(props: &SbomSearchProperties) -> Html {
},
state.clone(),
);
let search = use_sbom_search(search_params.clone(), pagination.clone(), callback);
let search = use_sbom_search(search_params.clone(), pagination.clone(), callback, |context| {
context.search_params.as_str(&context.filters)
});

total.set(state.data().and_then(|d| d.total));

Expand Down
5 changes: 2 additions & 3 deletions spog/ui/src/components/search/simple.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::utils::search::*;
use patternfly_yew::prelude::*;
use std::borrow::Cow;
use std::collections::HashSet;
use std::rc::Rc;
use yew::prelude::*;
Expand Down Expand Up @@ -125,10 +124,10 @@ where
}
}

pub fn as_str(&self, context: &T::Context) -> Cow<'_, str> {
pub fn as_str(&self, context: &T::Context) -> String {
match self {
Self::Complex(s) => s.into(),
Self::Simple(s) => s.to_filter_expression(context).into(),
Self::Simple(s) => s.to_filter_expression(context),
}
}

Expand Down
36 changes: 34 additions & 2 deletions spog/ui/src/pages/search.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub enum TabIndex {
#[default]
Advisories,
Sboms,
SbomsByPackage,
}

#[derive(PartialEq, Properties)]
Expand All @@ -32,8 +33,10 @@ pub struct SearchProperties {
pub struct PageState {
pub terms: Vec<String>,
pub tab: TabIndex,

pub advisory: TabState,
pub sbom: TabState,
pub sbom_by_dependency: TabState,
}

#[derive(Clone, Debug, Default, PartialEq, serde::Deserialize, serde::Serialize)]
Expand Down Expand Up @@ -95,21 +98,37 @@ pub fn search(props: &SearchProperties) -> Html {
&page_state,
|page_state| page_state.sbom.search_params.clone(),
|page_state| page_state.sbom.pagination,
use_sbom_search,
|search_params, pagination, callback| {
use_sbom_search(search_params, pagination, callback, |context| {
context.search_params.as_str(&context.filters)
})
},
);
let sbom_by_dependency = use_unified_search(
&page_state,
|page_state| page_state.sbom_by_dependency.search_params.clone(),
|page_state| page_state.sbom_by_dependency.pagination,
|search_params, pagination, callback| {
use_sbom_search(search_params, pagination, callback, |context| {
format!("in:dependency ( {} )", context.search_params.as_str(&context.filters))
})
},
);

// update search terms

{
use_effect_with_deps(
|(search_terms, advisory, sbom)| {
|(search_terms, advisory, sbom, sbom_by_dependency)| {
advisory.set(advisory.set_simple_terms(search_terms.clone()));
sbom.set(sbom.set_simple_terms(search_terms.clone()));
sbom_by_dependency.set(sbom_by_dependency.set_simple_terms(search_terms.clone()));
},
(
(*search_terms).clone(),
advisory.search_params.clone(),
sbom.search_params.clone(),
sbom_by_dependency.search_params.clone(),
),
);
}
Expand All @@ -129,6 +148,10 @@ pub fn search(props: &SearchProperties) -> Html {
pagination: **sbom.pagination,
search_params: (*sbom.search_params).clone(),
},
sbom_by_dependency: TabState {
pagination: **sbom_by_dependency.pagination,
search_params: (*sbom_by_dependency.search_params).clone(),
},
},
);

Expand Down Expand Up @@ -181,6 +204,9 @@ pub fn search(props: &SearchProperties) -> Html {
<Visible visible={*tab == TabIndex::Sboms}>
<SbomSearchControls search_params={sbom.search_params.clone()} />
</Visible>
<Visible visible={*tab == TabIndex::SbomsByPackage}>
<SbomSearchControls search_params={sbom_by_dependency.search_params.clone()} />
</Visible>
</div>
</GridItem>

Expand All @@ -193,6 +219,7 @@ pub fn search(props: &SearchProperties) -> Html {
>
<Tab<TabIndex> index={TabIndex::Advisories} title={count_tab_title("Advisories", &*advisory.state)} />
<Tab<TabIndex> index={TabIndex::Sboms} title={count_tab_title("SBOMs", &*sbom.state)} />
<Tab<TabIndex> index={TabIndex::SbomsByPackage} title={count_tab_title("SBOMs (by dependency)", &*sbom_by_dependency.state)} />
</Tabs<TabIndex>>

<div class="pf-v5-u-background-color-100">
Expand All @@ -206,6 +233,11 @@ pub fn search(props: &SearchProperties) -> Html {
<SbomResult state={(*sbom.state).clone()} />
</PaginationWrapped>
}
if *tab == TabIndex::SbomsByPackage {
<PaginationWrapped pagination={sbom_by_dependency.pagination} total={*sbom_by_dependency.total}>
<SbomResult state={(*sbom_by_dependency.state).clone()} />
</PaginationWrapped>
}
</div>

</GridItem>
Expand Down

0 comments on commit d9d6fad

Please sign in to comment.