diff --git a/bin/core/src/api/read/toml.rs b/bin/core/src/api/read/toml.rs index eb757e5f0..612f62393 100644 --- a/bin/core/src/api/read/toml.rs +++ b/bin/core/src/api/read/toml.rs @@ -18,7 +18,7 @@ use monitor_client::{ permission::{PermissionLevel, UserTarget}, procedure::Procedure, repo::Repo, - resource::Resource, + resource::{Resource, ResourceQuery}, server::Server, server_template::ServerTemplate, toml::{ @@ -40,32 +40,41 @@ use crate::{ impl Resolve for State { async fn resolve( &self, - ExportAllResourcesToToml {}: ExportAllResourcesToToml, + ExportAllResourcesToToml { tags }: ExportAllResourcesToToml, user: User, ) -> anyhow::Result { let mut targets = Vec::::new(); targets.extend( - resource::list_for_user::(Default::default(), &user) - .await? - .into_iter() - .map(|resource| ResourceTarget::Alerter(resource.id)), + resource::list_for_user::( + ResourceQuery::builder().tags(tags.clone()).build(), + &user, + ) + .await? + .into_iter() + .map(|resource| ResourceTarget::Alerter(resource.id)), ); targets.extend( - resource::list_for_user::(Default::default(), &user) - .await? - .into_iter() - .map(|resource| ResourceTarget::Builder(resource.id)), + resource::list_for_user::( + ResourceQuery::builder().tags(tags.clone()).build(), + &user, + ) + .await? + .into_iter() + .map(|resource| ResourceTarget::Builder(resource.id)), ); targets.extend( - resource::list_for_user::(Default::default(), &user) - .await? - .into_iter() - .map(|resource| ResourceTarget::Server(resource.id)), + resource::list_for_user::( + ResourceQuery::builder().tags(tags.clone()).build(), + &user, + ) + .await? + .into_iter() + .map(|resource| ResourceTarget::Server(resource.id)), ); targets.extend( resource::list_for_user::( - Default::default(), + ResourceQuery::builder().tags(tags.clone()).build(), &user, ) .await? @@ -73,26 +82,35 @@ impl Resolve for State { .map(|resource| ResourceTarget::Deployment(resource.id)), ); targets.extend( - resource::list_for_user::(Default::default(), &user) - .await? - .into_iter() - .map(|resource| ResourceTarget::Build(resource.id)), + resource::list_for_user::( + ResourceQuery::builder().tags(tags.clone()).build(), + &user, + ) + .await? + .into_iter() + .map(|resource| ResourceTarget::Build(resource.id)), ); targets.extend( - resource::list_for_user::(Default::default(), &user) - .await? - .into_iter() - .map(|resource| ResourceTarget::Repo(resource.id)), + resource::list_for_user::( + ResourceQuery::builder().tags(tags.clone()).build(), + &user, + ) + .await? + .into_iter() + .map(|resource| ResourceTarget::Repo(resource.id)), ); targets.extend( - resource::list_for_user::(Default::default(), &user) - .await? - .into_iter() - .map(|resource| ResourceTarget::Procedure(resource.id)), + resource::list_for_user::( + ResourceQuery::builder().tags(tags.clone()).build(), + &user, + ) + .await? + .into_iter() + .map(|resource| ResourceTarget::Procedure(resource.id)), ); targets.extend( resource::list_for_user::( - Default::default(), + ResourceQuery::builder().tags(tags).build(), &user, ) .await? diff --git a/client/core/rs/src/api/read/toml.rs b/client/core/rs/src/api/read/toml.rs index 93dde6692..10fe2a8f3 100644 --- a/client/core/rs/src/api/read/toml.rs +++ b/client/core/rs/src/api/read/toml.rs @@ -25,7 +25,11 @@ pub struct TomlResponse { )] #[empty_traits(MonitorReadRequest)] #[response(ExportAllResourcesToTomlResponse)] -pub struct ExportAllResourcesToToml {} +pub struct ExportAllResourcesToToml { + /// Tag name or id. Empty array will not filter by tag. + #[serde(default)] + pub tags: Vec, +} #[typeshare] pub type ExportAllResourcesToTomlResponse = TomlResponse; diff --git a/client/core/ts/src/types.ts b/client/core/ts/src/types.ts index bb316549e..b20444450 100644 --- a/client/core/ts/src/types.ts +++ b/client/core/ts/src/types.ts @@ -698,7 +698,7 @@ export interface ProcedureStage { /** Whether the stage should be run as part of the procedure. */ enabled: boolean; /** The executions in the stage */ - executions: EnabledExecution[]; + executions?: EnabledExecution[]; } /** Config for the [Procedure] */ @@ -2513,6 +2513,8 @@ export interface ListTags { * Response: [TomlResponse]. */ export interface ExportAllResourcesToToml { + /** Tag name or id. Empty array will not filter by tag. */ + tags?: string[]; } /** diff --git a/frontend/src/components/export.tsx b/frontend/src/components/export.tsx index a132c88c1..3b6999e59 100644 --- a/frontend/src/components/export.tsx +++ b/frontend/src/components/export.tsx @@ -15,9 +15,11 @@ import { CopyButton } from "./util"; export const ExportButton = ({ target, user_group, + tags, }: { target?: Types.ResourceTarget; user_group?: string; + tags?: string[]; }) => { const [open, setOpen] = useState(false); return ( @@ -35,7 +37,7 @@ export const ExportButton = ({ {target || user_group ? ( ) : ( - + )} @@ -56,8 +58,8 @@ const ExportTargetLoader = ({ return ; }; -const ExportAllLoader = () => { - const { data, isPending } = useRead("ExportAllResourcesToToml", {}); +const ExportAllLoader = ({ tags }: { tags?: string[] }) => { + const { data, isPending } = useRead("ExportAllResourcesToToml", { tags }); return ; }; diff --git a/frontend/src/lib/hooks.ts b/frontend/src/lib/hooks.ts index 386e30261..58e5e6f00 100644 --- a/frontend/src/lib/hooks.ts +++ b/frontend/src/lib/hooks.ts @@ -241,7 +241,7 @@ export const atomWithStorage = (key: string, init: T) => { export const tagsAtom = atomWithStorage("tags-v0", []); export const useTagsFilter = () => { - const [tags] = useAtom(tagsAtom); + const [tags] = useAtom(tagsAtom); return tags; }; diff --git a/frontend/src/pages/home/all_resources.tsx b/frontend/src/pages/home/all_resources.tsx index d65178033..528742f40 100644 --- a/frontend/src/pages/home/all_resources.tsx +++ b/frontend/src/pages/home/all_resources.tsx @@ -10,6 +10,7 @@ import { useState } from "react"; export const AllResources = () => { const [search, setSearch] = useState(""); + const tags = useTagsFilter(); return ( { placeholder="search..." className="w-[200px] lg:w-[300px]" /> - + diff --git a/frontend/src/pages/home/tree.tsx b/frontend/src/pages/home/tree.tsx index e803c6f6e..8d65d6432 100644 --- a/frontend/src/pages/home/tree.tsx +++ b/frontend/src/pages/home/tree.tsx @@ -30,7 +30,7 @@ export const Tree = () => { placeholder="search..." className="w-[200px] lg:w-[300px]" /> - +