diff --git a/.github/workflows/update-sqlx.yaml b/.github/workflows/git-commands.yaml similarity index 55% rename from .github/workflows/update-sqlx.yaml rename to .github/workflows/git-commands.yaml index 7632a9b705..c12b102c46 100644 --- a/.github/workflows/update-sqlx.yaml +++ b/.github/workflows/git-commands.yaml @@ -1,4 +1,4 @@ -name: Update SQLx +name: Git commands on: issue_comment: @@ -103,3 +103,73 @@ jobs: repo: context.repo.repo, body: 'Successfully ran sqlx update' }) + + update-ee-ref: + if: github.event.issue.pull_request && startsWith(github.event.comment.body, '/eeref') + runs-on: ubicloud-standard-2 + permissions: + contents: write + pull-requests: write + issues: write + steps: + - name: Comment on PR - Starting + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Starting ee ref update...' + }) + + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.issue.pull_request.head.ref }} + fetch-depth: 0 + + - name: Checkout windmill-ee-private + uses: actions/checkout@v3 + with: + repository: windmill-labs/windmill-ee-private + path: windmill-ee-private + token: ${{ secrets.WINDMILL_EE_PRIVATE_ACCESS }} + + - name: Get last commit hash of private-repo + id: get-commit-hash + run: | + cd windmill-ee-private + COMMIT_HASH=$(git rev-parse HEAD) + echo "commit_hash=$COMMIT_HASH" >> $GITHUB_OUTPUT + echo "Latest commit hash: $COMMIT_HASH" + + - name: Update ee-repo-ref.txt + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + echo "${{ steps.get-commit-hash.outputs.commit_hash }}" > backend/ee-repo-ref.txt + echo "Updated backend/ee-repo-ref.txt with commit hash: ${{ steps.get-commit-hash.outputs.commit_hash }}" + # commit and push the changes + PR_NUMBER=${{ github.event.issue.number }} + BRANCH_NAME=$(gh pr view $PR_NUMBER --json headRefName --jq .headRefName) + echo "Checking out PR branch: $BRANCH_NAME" + git checkout $BRANCH_NAME + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git add backend/ee-repo-ref.txt + git commit -m "Update ee-repo-ref.txt" || echo "No changes to commit" + git push origin $BRANCH_NAME + + - name: Comment on PR - Completed + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.rest.issues.createComment({ + issue_number: context.issue.number, + owner: context.repo.owner, + repo: context.repo.repo, + body: 'Successfully updated ee-repo-ref.txt' + }) diff --git a/CHANGELOG.md b/CHANGELOG.md index c63db9abf4..dcd4421799 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [1.502.2](https://github.com/windmill-labs/windmill/compare/v1.502.1...v1.502.2) (2025-07-01) + + +### Bug Fixes + +* bad spacing ai chat context elements ([#6111](https://github.com/windmill-labs/windmill/issues/6111)) ([2fb912b](https://github.com/windmill-labs/windmill/commit/2fb912b78c90d9e70d3db4b0c3c473831161c8b4)) +* **frontend:** improve step job load ([#6109](https://github.com/windmill-labs/windmill/issues/6109)) ([0afe3f9](https://github.com/windmill-labs/windmill/commit/0afe3f9691d93f837b10b29a0cf125eaa175589d)) +* **frontend:** only show test button for script modules ([#6107](https://github.com/windmill-labs/windmill/issues/6107)) ([7042a6f](https://github.com/windmill-labs/windmill/commit/7042a6f52db823d6b9b5ad14fa83af36880bd2d5)) + ## [1.502.1](https://github.com/windmill-labs/windmill/compare/v1.502.0...v1.502.1) (2025-07-01) diff --git a/backend/Cargo.lock b/backend/Cargo.lock index 806bee4c68..8e28c420e6 100644 --- a/backend/Cargo.lock +++ b/backend/Cargo.lock @@ -635,7 +635,7 @@ dependencies = [ "bytes", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "serde-aux", "serde_json", @@ -746,9 +746,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455e9fb7743c6f6267eb2830ccc08686fbb3d13c9a689369562fd4d4ef9ea462" +checksum = "c18d005c70d2b9c0c1ea8876c039db0ec7fb71164d25c73ccea21bf41fd02171" dependencies = [ "aws-credential-types", "aws-runtime", @@ -835,9 +835,9 @@ dependencies = [ [[package]] name = "aws-sdk-sqs" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d3cf0d52a50e0ac3fada7e0db27a2172b986f833d061def1df78c7dbe80ae" +checksum = "256b8f7caffe3240a543f60409be9bba23038ceef5933da63e09d89197fc2333" dependencies = [ "aws-credential-types", "aws-runtime", @@ -857,9 +857,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.73.0" +version = "1.74.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ac1674cba7872061a29baaf02209fefe499ff034dfd91bd4cc59e4d7741489" +checksum = "e0a69de9c1b9272da2872af60c7402683e7f45c06267735b4332deacb203239b" dependencies = [ "aws-credential-types", "aws-runtime", @@ -879,9 +879,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.74.0" +version = "1.75.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6a22f077f5fd3e3c0270d4e1a110346cddf6769e9433eb9e6daceb4ca3b149" +checksum = "f0b161d836fac72bdd5ac1a4cd1cdc38ab888c7af26cfd95f661be4409505e63" dependencies = [ "aws-credential-types", "aws-runtime", @@ -901,9 +901,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.75.0" +version = "1.76.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3258fa707f2f585ee3049d9550954b959002abd59176975150a01d5cf38ae3f" +checksum = "cb1cd79a3412751a341a28e2cd0d6fa4345241976da427b075a0c0cd5409f886" dependencies = [ "aws-credential-types", "aws-runtime", @@ -5855,7 +5855,7 @@ dependencies = [ "google-cloud-token", "home", "jsonwebtoken 9.3.1", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "serde_json", "thiserror 1.0.69", @@ -5898,7 +5898,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d901aeb453fd80e51d64df4ee005014f6cf39f2d736dd64f7239c132d9d39a6a" dependencies = [ - "reqwest 0.12.21", + "reqwest 0.12.22", "thiserror 1.0.69", "tokio", ] @@ -6182,7 +6182,7 @@ dependencies = [ "native-tls", "num_cpus", "rand 0.9.0", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "serde_json", "thiserror 2.0.12", @@ -8516,7 +8516,7 @@ dependencies = [ "getrandom 0.2.16", "http 1.3.1", "rand 0.8.5", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "serde_json", "serde_path_to_error", @@ -8565,7 +8565,7 @@ dependencies = [ "percent-encoding", "quick-xml 0.37.5", "rand 0.9.0", - "reqwest 0.12.21", + "reqwest 0.12.22", "ring 0.17.14", "rustls-pemfile 2.2.0", "serde", @@ -10265,9 +10265,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.21" +version = "0.12.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8cea6b35bcceb099f30173754403d2eba0a5dc18cea3630fccd88251909288" +checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" dependencies = [ "async-compression", "base64 0.22.1", @@ -10321,7 +10321,7 @@ dependencies = [ "anyhow", "async-trait", "http 1.3.1", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "thiserror 1.0.69", "tower-service", @@ -10340,7 +10340,7 @@ dependencies = [ "http 1.3.1", "hyper 1.6.0", "parking_lot 0.11.2", - "reqwest 0.12.21", + "reqwest 0.12.22", "reqwest-middleware", "retry-policies", "thiserror 1.0.69", @@ -13627,7 +13627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3beec919fbdf99d719de8eda6adae3281f8a5b71ae40431f44dc7423053d34" dependencies = [ "loki-api", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "serde_json", "snap", @@ -14629,7 +14629,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windmill" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "axum", @@ -14649,7 +14649,7 @@ dependencies = [ "prometheus", "quote", "rand 0.9.0", - "reqwest 0.12.21", + "reqwest 0.12.22", "rustls 0.23.28", "serde", "serde_json", @@ -14681,7 +14681,7 @@ dependencies = [ [[package]] name = "windmill-api" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "argon2", @@ -14741,7 +14741,7 @@ dependencies = [ "rand 0.9.0", "rdkafka", "regex", - "reqwest 0.12.21", + "reqwest 0.12.22", "rmcp", "rsa", "rumqttc", @@ -14792,7 +14792,7 @@ dependencies = [ [[package]] name = "windmill-api-client" -version = "1.502.1" +version = "1.502.2" dependencies = [ "base64 0.22.1", "chrono", @@ -14807,7 +14807,7 @@ dependencies = [ [[package]] name = "windmill-audit" -version = "1.502.1" +version = "1.502.2" dependencies = [ "chrono", "serde", @@ -14820,7 +14820,7 @@ dependencies = [ [[package]] name = "windmill-autoscaling" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "serde", @@ -14834,7 +14834,7 @@ dependencies = [ [[package]] name = "windmill-common" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "async-stream", @@ -14876,7 +14876,7 @@ dependencies = [ "quick_cache", "rand 0.9.0", "regex", - "reqwest 0.12.21", + "reqwest 0.12.22", "reqwest-middleware", "reqwest-retry", "semver 1.0.26", @@ -14911,7 +14911,7 @@ dependencies = [ [[package]] name = "windmill-git-sync" -version = "1.502.1" +version = "1.502.2" dependencies = [ "regex", "serde", @@ -14925,7 +14925,7 @@ dependencies = [ [[package]] name = "windmill-indexer" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "bytes", @@ -14948,7 +14948,7 @@ dependencies = [ [[package]] name = "windmill-macros" -version = "1.502.1" +version = "1.502.2" dependencies = [ "itertools 0.14.0", "lazy_static", @@ -14960,7 +14960,7 @@ dependencies = [ [[package]] name = "windmill-parser" -version = "1.502.1" +version = "1.502.2" dependencies = [ "convert_case 0.6.0", "serde", @@ -14969,7 +14969,7 @@ dependencies = [ [[package]] name = "windmill-parser-bash" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "lazy_static", @@ -14981,7 +14981,7 @@ dependencies = [ [[package]] name = "windmill-parser-csharp" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "serde_json", @@ -14993,7 +14993,7 @@ dependencies = [ [[package]] name = "windmill-parser-go" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "gosyn", @@ -15005,7 +15005,7 @@ dependencies = [ [[package]] name = "windmill-parser-graphql" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "lazy_static", @@ -15017,7 +15017,7 @@ dependencies = [ [[package]] name = "windmill-parser-java" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "serde_json", @@ -15029,7 +15029,7 @@ dependencies = [ [[package]] name = "windmill-parser-nu" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "nu-parser", @@ -15040,7 +15040,7 @@ dependencies = [ [[package]] name = "windmill-parser-php" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15051,7 +15051,7 @@ dependencies = [ [[package]] name = "windmill-parser-py" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "itertools 0.14.0", @@ -15062,7 +15062,7 @@ dependencies = [ [[package]] name = "windmill-parser-py-imports" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "async-recursion", @@ -15085,7 +15085,7 @@ dependencies = [ [[package]] name = "windmill-parser-rust" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "convert_case 0.6.0", @@ -15102,7 +15102,7 @@ dependencies = [ [[package]] name = "windmill-parser-sql" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "lazy_static", @@ -15115,7 +15115,7 @@ dependencies = [ [[package]] name = "windmill-parser-ts" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "lazy_static", @@ -15133,7 +15133,7 @@ dependencies = [ [[package]] name = "windmill-parser-wasm" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "getrandom 0.2.16", @@ -15157,7 +15157,7 @@ dependencies = [ [[package]] name = "windmill-parser-yaml" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "serde_json", @@ -15167,7 +15167,7 @@ dependencies = [ [[package]] name = "windmill-queue" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "async-recursion", @@ -15184,7 +15184,7 @@ dependencies = [ "lazy_static", "prometheus", "regex", - "reqwest 0.12.21", + "reqwest 0.12.22", "serde", "serde_json", "serde_urlencoded", @@ -15200,7 +15200,7 @@ dependencies = [ [[package]] name = "windmill-sql-datatype-parser-wasm" -version = "1.502.1" +version = "1.502.2" dependencies = [ "wasm-bindgen", "wasm-bindgen-test", @@ -15210,7 +15210,7 @@ dependencies = [ [[package]] name = "windmill-worker" -version = "1.502.1" +version = "1.502.2" dependencies = [ "anyhow", "async-recursion", @@ -15262,7 +15262,7 @@ dependencies = [ "prometheus", "rand 0.9.0", "regex", - "reqwest 0.12.21", + "reqwest 0.12.22", "reqwest-middleware", "rust_decimal", "serde", diff --git a/backend/Cargo.toml b/backend/Cargo.toml index b39255beda..86a0e3c71a 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "windmill" -version = "1.502.1" +version = "1.502.2" authors.workspace = true edition.workspace = true @@ -32,7 +32,7 @@ members = [ ] [workspace.package] -version = "1.502.1" +version = "1.502.2" authors = ["Ruben Fiszel "] edition = "2021" diff --git a/backend/tests/worker.rs b/backend/tests/worker.rs index 8792b2eb1d..184bb9daa6 100644 --- a/backend/tests/worker.rs +++ b/backend/tests/worker.rs @@ -2089,6 +2089,89 @@ def main(): assert_eq!(result, serde_json::json!("hello world")); } +#[cfg(feature = "python")] +#[sqlx::test(fixtures("base"))] +async fn test_python_global_site_packages(db: Pool) { + use windmill_common::{cache::concatcp, worker::ROOT_CACHE_DIR}; + + initialize_tracing().await; + let server = ApiServer::start(db.clone()).await; + let port = server.addr.port(); + + // Shared for all 3.12.* + let path = concatcp!(ROOT_CACHE_DIR, "python_3_12/global-site-packages").to_owned(); + std::fs::create_dir_all(&path).unwrap(); + std::fs::write(path + "/my_global_site_package_3_12_any.py", "").unwrap(); + + // 3.12 + { + let content = r#"# py: ==3.12 +#requirements: +# + +import my_global_site_package_3_12_any + +def main(): + return "hello world" + "# + .to_owned(); + + let job = JobPayload::Code(RawCode { + hash: None, + content, + path: None, + language: ScriptLang::Python3, + lock: None, + custom_concurrency_key: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + }); + + let result = run_job_in_new_worker_until_complete(&db, job, port) + .await + .json_result() + .unwrap(); + + assert_eq!(result, serde_json::json!("hello world")); + } + + // 3.12.1 + { + let content = r#"# py: ==3.12.1 +#requirements: +# + +import my_global_site_package_3_12_any + +def main(): + return "hello world" + "# + .to_owned(); + + let job = JobPayload::Code(RawCode { + hash: None, + content, + path: None, + language: ScriptLang::Python3, + lock: None, + custom_concurrency_key: None, + concurrent_limit: None, + concurrency_time_window_s: None, + cache_ttl: None, + dedicated_worker: None, + }); + + let result = run_job_in_new_worker_until_complete(&db, job, port) + .await + .json_result() + .unwrap(); + + assert_eq!(result, serde_json::json!("hello world")); + } +} + #[cfg(feature = "python")] #[sqlx::test(fixtures("base"))] async fn test_python_job_heavy_dep(db: Pool) { diff --git a/backend/windmill-api/openapi.yaml b/backend/windmill-api/openapi.yaml index 6f483696c1..bf83bdfd1d 100644 --- a/backend/windmill-api/openapi.yaml +++ b/backend/windmill-api/openapi.yaml @@ -1,7 +1,7 @@ openapi: "3.0.3" info: - version: 1.502.1 + version: 1.502.2 title: Windmill API contact: diff --git a/backend/windmill-worker/src/graphql_executor.rs b/backend/windmill-worker/src/graphql_executor.rs index d9117adb53..b5a3aadc3d 100644 --- a/backend/windmill-worker/src/graphql_executor.rs +++ b/backend/windmill-worker/src/graphql_executor.rs @@ -10,9 +10,9 @@ use windmill_queue::{CanceledBy, MiniPulledJob}; use serde::Deserialize; +use crate::common::build_args_map; use crate::common::{build_http_client, resolve_job_timeout, OccupancyMetrics}; use crate::handle_child::run_future_with_polling_update_job_poller; -use crate::common::build_args_map; use windmill_common::client::AuthedClient; #[derive(Deserialize)] @@ -107,6 +107,20 @@ pub async fn do_graphql( .await .map_err(|e| Error::ExecutionErr(e.to_string()))?; + // Check HTTP status before processing response + if !response.status().is_success() { + let status = response.status(); + let error_body = response + .text() + .await + .unwrap_or_else(|_| "Failed to read error response".to_string()); + return Err(Error::ExecutionErr(format!( + "GraphQL request failed with HTTP {}: {}", + status.as_u16(), + error_body + ))); + } + let result_stream = response.bytes_stream(); let mut i = 0; diff --git a/benchmarks/lib.ts b/benchmarks/lib.ts index 73df730b80..5fea1bed65 100644 --- a/benchmarks/lib.ts +++ b/benchmarks/lib.ts @@ -2,7 +2,7 @@ import { sleep } from "https://deno.land/x/sleep@v1.2.1/mod.ts"; import * as windmill from "https://deno.land/x/windmill@v1.174.0/mod.ts"; import * as api from "https://deno.land/x/windmill@v1.174.0/windmill-api/index.ts"; -export const VERSION = "v1.502.1"; +export const VERSION = "v1.502.2"; export async function login(email: string, password: string): Promise { return await windmill.UserService.login({ diff --git a/cli/main.ts b/cli/main.ts index 79ab60c490..6094153360 100644 --- a/cli/main.ts +++ b/cli/main.ts @@ -63,7 +63,7 @@ export { // } // }); -export const VERSION = "1.502.1"; +export const VERSION = "1.502.2"; const command = new Command() .name("wmill") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 40ec124482..e33a53c091 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "windmill-components", - "version": "1.502.1", + "version": "1.502.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "windmill-components", - "version": "1.502.1", + "version": "1.502.2", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { diff --git a/frontend/package.json b/frontend/package.json index d8dfc8056c..12778fc663 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "windmill-components", - "version": "1.502.1", + "version": "1.502.2", "scripts": { "dev": "vite dev", "build": "vite build", diff --git a/frontend/src/lib/components/EditorBar.svelte b/frontend/src/lib/components/EditorBar.svelte index b5e5281665..7c19646d59 100644 --- a/frontend/src/lib/components/EditorBar.svelte +++ b/frontend/src/lib/components/EditorBar.svelte @@ -762,7 +762,7 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS {/if} {#if customUi?.assistants != false} - {#if lang == 'deno' || lang == 'python3' || lang == 'go' || lang == 'bash' || lang == 'nu'} + {#if lang == 'deno' || lang == 'python3' || lang == 'go' || lang == 'bash'} {/if} - {#if message.role === 'user' && message.snapshot} -
- Saved a flow snapshot - -
- {/if} {/each} {#if aiChatManager.loading && !aiChatManager.currentReply}
diff --git a/frontend/src/lib/components/copilot/chat/ContextTextarea.svelte b/frontend/src/lib/components/copilot/chat/ContextTextarea.svelte index 83621b5ecc..cfec386ba3 100644 --- a/frontend/src/lib/components/copilot/chat/ContextTextarea.svelte +++ b/frontend/src/lib/components/copilot/chat/ContextTextarea.svelte @@ -4,6 +4,8 @@ import type { ContextElement } from './context' import AvailableContextList from './AvailableContextList.svelte' import { aiChatManager } from './AIChatManager.svelte' + import Portal from '$lib/components/Portal.svelte' + import { zIndexes } from '$lib/zIndexes' interface Props { availableContext: ContextElement[] @@ -361,22 +363,24 @@
{#if showContextTooltip} -
- { - handleContextSelection(element) - }} - showAllAvailable={true} - stringSearch={contextTooltipWord.slice(1)} - selectedIndex={selectedSuggestionIndex} - /> -
+ +
+ { + handleContextSelection(element) + }} + showAllAvailable={true} + stringSearch={contextTooltipWord.slice(1)} + selectedIndex={selectedSuggestionIndex} + /> +
+
{/if}