diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 2a5d1a214d..4a1dd430b1 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -10697,6 +10697,7 @@ paths: - $ref: "#/components/parameters/RunnableTypeQuery" - $ref: "#/components/parameters/Page" - $ref: "#/components/parameters/PerPage" + - $ref: "#/components/parameters/ArgsFilter" - name: include_preview in: query schema: diff --git a/backend/windmill-api/src/inputs.rs b/backend/windmill-api/src/inputs.rs index ec200b4464..4e769bbc92 100644 --- a/backend/windmill-api/src/inputs.rs +++ b/backend/windmill-api/src/inputs.rs @@ -118,6 +118,7 @@ pub struct CompletedJobMini { #[derive(Deserialize)] struct GetInputHistory { include_preview: Option, + args: Option, } async fn get_input_history( @@ -132,11 +133,18 @@ async fn get_input_history( let mut tx = user_db.begin(&authed).await?; + let args_query = if let Some(args) = &g.args { + format!("and args @> '{}'", args) + } else { + "".to_string() + }; + let sql = &format!( "select id, v2_job.created_at, created_by, 'null'::jsonb as args, status = 'success' as success from v2_job JOIN v2_job_completed USING (id) \ - where {} = $1 and kind = any($2) and v2_job.workspace_id = $3 AND v2_job_completed.status != 'skipped' \ + where {} = $1 and kind = any($2) {args_query} and v2_job.workspace_id = $3 AND v2_job_completed.status != 'skipped' \ order by v2_job.created_at desc limit $4 offset $5", - r.runnable_type.column_name() + r.runnable_type.column_name(), + ); let query = sqlx::query_as::<_, CompletedJobMini>(sql); diff --git a/frontend/src/lib/components/HistoricInputs.svelte b/frontend/src/lib/components/HistoricInputs.svelte index 0218dc284b..83574a2d61 100644 --- a/frontend/src/lib/components/HistoricInputs.svelte +++ b/frontend/src/lib/components/HistoricInputs.svelte @@ -14,6 +14,7 @@ export let showAuthor = false export let placement: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' = 'top-end' export let limitPayloadSize = false + export let searchArgs: Record | undefined = undefined let historicList: HistoricList | undefined = undefined const dispatch = createEventDispatcher() @@ -93,7 +94,7 @@ concurrencyKey={null} tag={null} success="running" - argFilter={undefined} + argFilter={searchArgs ? JSON.stringify(searchArgs) : undefined} bind:loading syncQueuedRunsCount={false} refreshRate={10000} @@ -146,6 +147,7 @@ {showAuthor} {placement} {limitPayloadSize} + {searchArgs} /> diff --git a/frontend/src/lib/components/HistoricList.svelte b/frontend/src/lib/components/HistoricList.svelte index 598fc20353..2814806487 100644 --- a/frontend/src/lib/components/HistoricList.svelte +++ b/frontend/src/lib/components/HistoricList.svelte @@ -11,6 +11,7 @@ export let showAuthor = false export let placement: 'bottom-start' | 'top-start' | 'bottom-end' | 'top-end' = 'bottom-start' export let limitPayloadSize = false + export let searchArgs: Record | undefined = undefined let infiniteList: InfiniteList | undefined = undefined let loadInputsPageFn: ((page: number, perPage: number) => Promise) | undefined = undefined @@ -37,7 +38,8 @@ runnableType, page, perPage, - includePreview: true + includePreview: true, + args: searchArgs ? JSON.stringify(searchArgs) : undefined }) const inputsWithPayload = await Promise.all( diff --git a/frontend/src/lib/components/SavedInputsV2.svelte b/frontend/src/lib/components/SavedInputsV2.svelte index 5896f2776b..6ef125850d 100644 --- a/frontend/src/lib/components/SavedInputsV2.svelte +++ b/frontend/src/lib/components/SavedInputsV2.svelte @@ -1,13 +1,16 @@
@@ -92,17 +108,92 @@
- +
+ { + e.stopPropagation() + }} + floatingConfig={{ placement: 'top-end' }} + > + + + + + + diff --git a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte index d4c6e6e87c..9d79526f3f 100644 --- a/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte +++ b/frontend/src/lib/components/multiselect/MultiSelectWrapper.svelte @@ -8,13 +8,17 @@ import MultiSelect from '$lib/components/multiselect/MultiSelect.svelte' import DarkModeObserver from '../DarkModeObserver.svelte' + export let items: any[] + export let value: string[] | undefined = [] as string[] + export let placeholder: string | undefined = undefined + export let target: string | HTMLElement | undefined = undefined + export let topPlacement = false const [floatingRef, floatingContent] = createFloatingActions({ strategy: 'absolute', + placement: topPlacement ? 'top-start' : 'bottom-start', middleware: [offset(5), flip(), shift()] }) - export let items: any[] - export let value: string[] | undefined = [] as string[] let outerDiv: HTMLDivElement | undefined = undefined let portalRef: HTMLDivElement | undefined = undefined @@ -56,6 +60,7 @@ --sms-selected-bg={darkMode ? '#c7d2fe' : '#e0e7ff'} --sms-selected-text-color={darkMode ? '#312e81' : '#3730a3'} bind:selected={value} + {placeholder} options={items} on:close={() => { open = false @@ -80,7 +85,7 @@
- +