From 39023581731013949c95be48443f2a581e0f2f99 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Thu, 3 Apr 2025 13:36:11 +0200 Subject: [PATCH 01/10] WIP --- .../common/http_api/configuration.ts | 4 ++ .../hooks/use_index_name_autocomplete.ts | 35 +++++++++++ .../public/integration/configuration.tsx | 61 ++++++++++++++----- .../server/routes/configuration.ts | 41 ++++++++++++- 4 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts diff --git a/x-pack/solutions/chat/plugins/wci-index-source/common/http_api/configuration.ts b/x-pack/solutions/chat/plugins/wci-index-source/common/http_api/configuration.ts index 02e53ff34690b..d987fefcf407c 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/common/http_api/configuration.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/common/http_api/configuration.ts @@ -10,3 +10,7 @@ import type { IndexSourceDefinition } from '@kbn/wci-common'; export interface GenerateConfigurationResponse { definition: IndexSourceDefinition; } + +export interface SearchIndicesResponse { + indexNames: string[]; +} diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts new file mode 100644 index 0000000000000..90d20f4aa7084 --- /dev/null +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from '@tanstack/react-query'; +import type { CoreStart } from '@kbn/core/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import type { SearchIndicesResponse } from '../../common/http_api/configuration'; + +export const useIndexNameAutocomplete = () => { + const { + services: { http, notifications }, + } = useKibana(); + + const { isLoading, data } = useQuery({ + queryKey: ["index-name-autocomplete"], + queryFn: () => async ({ indexName }: { indexName: string }) => { + const response = await http.get( + `/internal/wci-index-source/indices-autocomplete/${indexName}` + ); + return response.indexNames; + }, + onError: (err: any) => { + notifications.toasts.addError(err, { title: 'Error fetching indices' }); + }, + }); + + return { + isLoading, + data: data, + }; +}; diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index b2af236828620..c7fd618b7a4e3 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -5,10 +5,12 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; +import { useQuery } from '@tanstack/react-query'; import { useFieldArray, Controller } from 'react-hook-form'; import { EuiTextArea, + EuiComboBox, EuiFormRow, EuiDescribedFormGroup, EuiFieldText, @@ -26,6 +28,8 @@ import type { IndexSourceDefinition } from '@kbn/wci-common'; import { IntegrationConfigurationFormProps } from '@kbn/wci-browser'; import type { WCIIndexSourceFilterField, WCIIndexSourceContextField } from '../../common/types'; import { useGenerateSchema } from '../hooks/use_generate_schema'; +import type { SearchIndicesResponse } from '../../common/http_api/configuration'; +import { useIndexNameAutocomplete } from '../hooks/use_index_name_autocomplete'; export const IndexSourceConfigurationForm: React.FC = ({ form, @@ -35,6 +39,12 @@ export const IndexSourceConfigurationForm: React.FC(); + const [options, setOptions] = useState([] as string[]); + + let searchTimeout; const contextFieldsArray = useFieldArray({ control, @@ -50,6 +60,32 @@ export const IndexSourceConfigurationForm: React.FC { + setSelected(selectedOption); + }; + + const onSearchChange = (searchValue: string) => { + console.log(`onSearchChange with ${searchValue}`); + let result: string[] = []; + setOptions(result); + + if (data) { + data({ indexName: searchValue}).then( + (indexNames: string[]) => { + console.log("Got response"); + if (indexNames) { + console.log("Setting index names"); + console.log(indexNames); + setOptions(indexNames); + } + } + ) + } + }; const onSchemaGenerated = useCallback( (definition: IndexSourceDefinition) => { @@ -116,21 +152,14 @@ export const IndexSourceConfigurationForm: React.FC ( - { - generateSchema({ indexName: field.value }, { onSuccess: onSchemaGenerated }); - }} - > - Generate configuration - - } + ({ label: option, key: option }))} + onChange={onChange} + onSearchChange={onSearchChange} /> )} /> diff --git a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts index 442737b344ce7..2a9929c082909 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts @@ -9,7 +9,7 @@ import { schema } from '@kbn/config-schema'; import { apiCapabilities } from '@kbn/workchat-app/common/features'; import { buildSchema } from '@kbn/wc-index-schema-builder'; import { getConnectorList, getDefaultConnector } from '@kbn/wc-genai-utils'; -import type { GenerateConfigurationResponse } from '../../common/http_api/configuration'; +import type { GenerateConfigurationResponse, SearchIndicesResponse } from '../../common/http_api/configuration'; import type { RouteDependencies } from './types'; export const registerConfigurationRoutes = ({ router, core, logger }: RouteDependencies) => { @@ -61,4 +61,43 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen } } ); + + router.get( + { + path: '/internal/wci-index-source/indices-autocomplete/{query}', + security: { + authz: { + requiredPrivileges: [apiCapabilities.manageWorkchat], + }, + }, + validate: { + params: schema.object({ + query: schema.maybe(schema.string()) + }) + } + }, + async (ctx, request, res) => { + try { + const { elasticsearch } = await ctx.core; + const pattern = request.params.query; + + const esClient = elasticsearch.client.asCurrentUser + + const response = await esClient.cat.indices({ + index: [`${pattern}*`], + h: 'index', + format: 'json' + }); + + return res.ok({ + body: { + indexNames: response.map(indexRecord => indexRecord.index).filter(index => !!index) as string[] + }, + }); + } catch (e) { + logger.error(e); + throw e; + } + } + ) }; From 5e364e282bfa73d0baf094fe74f5a1c6e00b8160 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Fri, 4 Apr 2025 14:19:37 +0200 Subject: [PATCH 02/10] Brush up the code --- .../hooks/use_index_name_autocomplete.ts | 9 +++- .../public/integration/configuration.tsx | 53 ++++++++++++------- .../server/routes/configuration.ts | 9 ++-- 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts index 90d20f4aa7084..7292354cfd1f9 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts @@ -19,7 +19,12 @@ export const useIndexNameAutocomplete = () => { queryKey: ["index-name-autocomplete"], queryFn: () => async ({ indexName }: { indexName: string }) => { const response = await http.get( - `/internal/wci-index-source/indices-autocomplete/${indexName}` + `/internal/wci-index-source/indices-autocomplete`, + { + query: { + index: indexName + } + } ); return response.indexNames; }, @@ -30,6 +35,6 @@ export const useIndexNameAutocomplete = () => { return { isLoading, - data: data, + autocompleteQuery: data, }; }; diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index c7fd618b7a4e3..84e75afbf1ddc 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -6,7 +6,7 @@ */ import React, { useCallback, useState } from 'react'; -import { useQuery } from '@tanstack/react-query'; +import useDebounce from 'react-use/lib/useDebounce'; import { useFieldArray, Controller } from 'react-hook-form'; import { EuiTextArea, @@ -23,12 +23,12 @@ import { EuiFlexItem, EuiCallOut, EuiButtonEmpty, + EuiComboBoxOptionOption, } from '@elastic/eui'; import type { IndexSourceDefinition } from '@kbn/wci-common'; import { IntegrationConfigurationFormProps } from '@kbn/wci-browser'; import type { WCIIndexSourceFilterField, WCIIndexSourceContextField } from '../../common/types'; import { useGenerateSchema } from '../hooks/use_generate_schema'; -import type { SearchIndicesResponse } from '../../common/http_api/configuration'; import { useIndexNameAutocomplete } from '../hooks/use_index_name_autocomplete'; export const IndexSourceConfigurationForm: React.FC = ({ @@ -39,9 +39,7 @@ export const IndexSourceConfigurationForm: React.FC(); + const [query, setQuery] = useState(""); const [options, setOptions] = useState([] as string[]); let searchTimeout; @@ -60,32 +58,35 @@ export const IndexSourceConfigurationForm: React.FC { - setSelected(selectedOption); + const onChange = (selectedOptions) => { + setSelected(selectedOptions); }; - const onSearchChange = (searchValue: string) => { - console.log(`onSearchChange with ${searchValue}`); - let result: string[] = []; + useDebounce(() => {let result: string[] = []; setOptions(result); - if (data) { - data({ indexName: searchValue}).then( + if (autocompleteQuery) { + autocompleteQuery({ indexName: query}).then( (indexNames: string[]) => { - console.log("Got response"); if (indexNames) { - console.log("Setting index names"); - console.log(indexNames); setOptions(indexNames); } } ) } - }; + }, + 250, + [query] + ); + + const onSearchChange = (searchValue: string) => { + setQuery(searchValue); + console.log(`onSearchChange with ${searchValue}`); + } const onSchemaGenerated = useCallback( (definition: IndexSourceDefinition) => { @@ -155,11 +156,25 @@ export const IndexSourceConfigurationForm: React.FC ({ label: option, key: option }))} onChange={onChange} onSearchChange={onSearchChange} + append={ + { + if (selectedOptions.length == 0) return; + if (!selectedOptions[0].key) return; + + generateSchema({ indexName: selectedOptions[0].key }, { onSuccess: onSchemaGenerated }); + }} + > + Generate configuration + + } /> )} /> diff --git a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts index 2a9929c082909..09545b40ba750 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts @@ -64,28 +64,29 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen router.get( { - path: '/internal/wci-index-source/indices-autocomplete/{query}', + path: '/internal/wci-index-source/indices-autocomplete', security: { authz: { requiredPrivileges: [apiCapabilities.manageWorkchat], }, }, validate: { - params: schema.object({ - query: schema.maybe(schema.string()) + query: schema.object({ + index: schema.maybe(schema.string()) }) } }, async (ctx, request, res) => { try { const { elasticsearch } = await ctx.core; - const pattern = request.params.query; + const pattern = request.query.index || ""; const esClient = elasticsearch.client.asCurrentUser const response = await esClient.cat.indices({ index: [`${pattern}*`], h: 'index', + expand_wildcards: "open", format: 'json' }); From d597ee3a6b9b809e3006b7bb71f9a421d40c06e3 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Fri, 4 Apr 2025 18:37:05 +0200 Subject: [PATCH 03/10] Lost data-test-subj --- .../wci-index-source/public/integration/configuration.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index 84e75afbf1ddc..5abe54a8ceccf 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -154,6 +154,7 @@ export const IndexSourceConfigurationForm: React.FC ( Date: Fri, 4 Apr 2025 17:07:06 +0000 Subject: [PATCH 04/10] [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' --- .../hooks/use_index_name_autocomplete.ts | 24 +++++++------- .../public/integration/configuration.tsx | 31 ++++++++++--------- .../server/routes/configuration.ts | 25 +++++++++------ 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts index 7292354cfd1f9..4c1602c9a744c 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts @@ -16,18 +16,20 @@ export const useIndexNameAutocomplete = () => { } = useKibana(); const { isLoading, data } = useQuery({ - queryKey: ["index-name-autocomplete"], - queryFn: () => async ({ indexName }: { indexName: string }) => { - const response = await http.get( - `/internal/wci-index-source/indices-autocomplete`, - { + queryKey: ['index-name-autocomplete'], + queryFn: + () => + async ({ indexName }: { indexName: string }) => { + const response = await http.get( + `/internal/wci-index-source/indices-autocomplete`, + { query: { - index: indexName - } - } - ); - return response.indexNames; - }, + index: indexName, + }, + } + ); + return response.indexNames; + }, onError: (err: any) => { notifications.toasts.addError(err, { title: 'Error fetching indices' }); }, diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index 5abe54a8ceccf..a50f8953b931f 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -39,9 +39,9 @@ export const IndexSourceConfigurationForm: React.FC {let result: string[] = []; - setOptions(result); + useDebounce( + () => { + const result: string[] = []; + setOptions(result); - if (autocompleteQuery) { - autocompleteQuery({ indexName: query}).then( - (indexNames: string[]) => { - if (indexNames) { + if (autocompleteQuery) { + autocompleteQuery({ indexName: query }).then((indexNames: string[]) => { + if (indexNames) { setOptions(indexNames); } - } - ) - } + }); + } }, 250, [query] - ); + ); const onSearchChange = (searchValue: string) => { setQuery(searchValue); console.log(`onSearchChange with ${searchValue}`); - } + }; const onSchemaGenerated = useCallback( (definition: IndexSourceDefinition) => { @@ -170,7 +170,10 @@ export const IndexSourceConfigurationForm: React.FC Generate configuration diff --git a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts index 09545b40ba750..b2b6a169f3f5b 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts @@ -9,7 +9,10 @@ import { schema } from '@kbn/config-schema'; import { apiCapabilities } from '@kbn/workchat-app/common/features'; import { buildSchema } from '@kbn/wc-index-schema-builder'; import { getConnectorList, getDefaultConnector } from '@kbn/wc-genai-utils'; -import type { GenerateConfigurationResponse, SearchIndicesResponse } from '../../common/http_api/configuration'; +import type { + GenerateConfigurationResponse, + SearchIndicesResponse, +} from '../../common/http_api/configuration'; import type { RouteDependencies } from './types'; export const registerConfigurationRoutes = ({ router, core, logger }: RouteDependencies) => { @@ -72,27 +75,29 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen }, validate: { query: schema.object({ - index: schema.maybe(schema.string()) - }) - } + index: schema.maybe(schema.string()), + }), + }, }, async (ctx, request, res) => { try { const { elasticsearch } = await ctx.core; - const pattern = request.query.index || ""; + const pattern = request.query.index || ''; - const esClient = elasticsearch.client.asCurrentUser + const esClient = elasticsearch.client.asCurrentUser; const response = await esClient.cat.indices({ index: [`${pattern}*`], h: 'index', - expand_wildcards: "open", - format: 'json' + expand_wildcards: 'open', + format: 'json', }); return res.ok({ body: { - indexNames: response.map(indexRecord => indexRecord.index).filter(index => !!index) as string[] + indexNames: response + .map((indexRecord) => indexRecord.index) + .filter((index) => !!index) as string[], }, }); } catch (e) { @@ -100,5 +105,5 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen throw e; } } - ) + ); }; From 29e8970a551b5db58f0adcc632f7f359b83b54e5 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Tue, 8 Apr 2025 17:09:18 +0200 Subject: [PATCH 05/10] One step forward --- .../hooks/use_index_name_autocomplete.ts | 43 ++++++++++++------- .../public/integration/configuration.tsx | 26 +++++------ .../server/routes/configuration.ts | 8 +++- 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts index 4c1602c9a744c..a539f01e7c78e 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts @@ -6,30 +6,41 @@ */ import { useQuery } from '@tanstack/react-query'; +import { useState } from 'react'; +import useDebounce from 'react-use/lib/useDebounce'; import type { CoreStart } from '@kbn/core/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { SearchIndicesResponse } from '../../common/http_api/configuration'; -export const useIndexNameAutocomplete = () => { +export const useIndexNameAutocomplete = ({ query }: { query: string }) => { const { services: { http, notifications }, } = useKibana(); + const [debouncedQuery, setDebounceQuery] = useState(query); + + useDebounce( + () => { + setDebounceQuery(query); + }, + 250, + [query] + ); + const { isLoading, data } = useQuery({ - queryKey: ['index-name-autocomplete'], - queryFn: - () => - async ({ indexName }: { indexName: string }) => { - const response = await http.get( - `/internal/wci-index-source/indices-autocomplete`, - { - query: { - index: indexName, - }, - } - ); - return response.indexNames; - }, + queryKey: ['index-name-autocomplete', debouncedQuery], + queryFn: async () => { + const response = await http.get( + `/internal/wci-index-source/indices-autocomplete`, + { + query: { + index: query, + }, + } + ); + return response.indexNames; + }, + initialData: [], onError: (err: any) => { notifications.toasts.addError(err, { title: 'Error fetching indices' }); }, @@ -37,6 +48,6 @@ export const useIndexNameAutocomplete = () => { return { isLoading, - autocompleteQuery: data, + data, }; }; diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index a50f8953b931f..deac22f96c296 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -6,7 +6,6 @@ */ import React, { useCallback, useState } from 'react'; -import useDebounce from 'react-use/lib/useDebounce'; import { useFieldArray, Controller } from 'react-hook-form'; import { EuiTextArea, @@ -42,8 +41,6 @@ export const IndexSourceConfigurationForm: React.FC([]); - const onChange = (selectedOptions) => { - setSelected(selectedOptions); + const onChange = (onChangeSelectedOptions: EuiComboBoxOptionOption[]) => { + setSelected(onChangeSelectedOptions); }; +<<<<<<< HEAD useDebounce( () => { const result: string[] = []; @@ -86,6 +83,10 @@ export const IndexSourceConfigurationForm: React.FC { setQuery(searchValue); console.log(`onSearchChange with ${searchValue}`); +======= + const onSearchChange = (searchValue: string) => { + setQuery(searchValue); +>>>>>>> 136806faabc (One step forward) }; const onSchemaGenerated = useCallback( @@ -159,15 +160,16 @@ export const IndexSourceConfigurationForm: React.FC ({ label: option, key: option }))} + options={data.map((option) => ({ label: option, key: option }))} onChange={onChange} + fullWidth={true} onSearchChange={onSearchChange} append={ { - if (selectedOptions.length == 0) return; + if (selectedOptions.length === 0) return; if (!selectedOptions[0].key) return; generateSchema( @@ -228,7 +230,7 @@ export const IndexSourceConfigurationForm: React.FC ) : ( filterFieldsArray.fields.map((filterField, index) => ( - + @@ -323,7 +325,7 @@ export const IndexSourceConfigurationForm: React.FC ) : ( contextFieldsArray.fields.map((contextField, index) => ( - + diff --git a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts index b2b6a169f3f5b..50781eaa7a59e 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts @@ -82,12 +82,16 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen async (ctx, request, res) => { try { const { elasticsearch } = await ctx.core; - const pattern = request.query.index || ''; + let pattern = request.query.index || ''; + + if (pattern.length >= 3) { + pattern = `${pattern}*`; + } const esClient = elasticsearch.client.asCurrentUser; const response = await esClient.cat.indices({ - index: [`${pattern}*`], + index: [pattern], h: 'index', expand_wildcards: 'open', format: 'json', From 55ba1d26f80adb2d5b339725cde6a01a57c3f7d4 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Thu, 10 Apr 2025 12:45:51 +0200 Subject: [PATCH 06/10] Sigh --- .../public/integration/configuration.tsx | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index deac22f96c296..049abc724999f 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -62,31 +62,8 @@ export const IndexSourceConfigurationForm: React.FC { - const result: string[] = []; - setOptions(result); - - if (autocompleteQuery) { - autocompleteQuery({ indexName: query }).then((indexNames: string[]) => { - if (indexNames) { - setOptions(indexNames); - } - }); - } - }, - 250, - [query] - ); - - const onSearchChange = (searchValue: string) => { - setQuery(searchValue); - console.log(`onSearchChange with ${searchValue}`); -======= const onSearchChange = (searchValue: string) => { setQuery(searchValue); ->>>>>>> 136806faabc (One step forward) }; const onSchemaGenerated = useCallback( From 723b745a256d6dfe2460ee6097fdc52d76b5f989 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Thu, 10 Apr 2025 13:00:59 +0200 Subject: [PATCH 07/10] A bit better try/catch --- .../server/routes/configuration.ts | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts index 50781eaa7a59e..ea8ca67b74fe1 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/server/routes/configuration.ts @@ -80,16 +80,16 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen }, }, async (ctx, request, res) => { - try { - const { elasticsearch } = await ctx.core; - let pattern = request.query.index || ''; + const { elasticsearch } = await ctx.core; + let pattern = request.query.index || ''; - if (pattern.length >= 3) { - pattern = `${pattern}*`; - } + if (pattern.length >= 3) { + pattern = `${pattern}*`; + } - const esClient = elasticsearch.client.asCurrentUser; + const esClient = elasticsearch.client.asCurrentUser; + try { const response = await esClient.cat.indices({ index: [pattern], h: 'index', @@ -105,7 +105,14 @@ export const registerConfigurationRoutes = ({ router, core, logger }: RouteDepen }, }); } catch (e) { - logger.error(e); + // TODO: sigh, is there a better way? + if (e?.meta?.body?.error?.type === 'index_not_found_exception') { + return res.ok({ + body: { + indexNames: [], + }, + }); + } throw e; } } From 0620d01c06d70a9b64eabf8d1e16e21d0bef1ee3 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Thu, 10 Apr 2025 14:11:27 +0200 Subject: [PATCH 08/10] Drop unused vars --- .../wci-index-source/public/integration/configuration.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index 049abc724999f..290d773bc429a 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -39,7 +39,6 @@ export const IndexSourceConfigurationForm: React.FC Date: Thu, 10 Apr 2025 15:16:36 +0200 Subject: [PATCH 09/10] onChange fix --- .../wci-index-source/public/integration/configuration.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx index 290d773bc429a..85b600df6268f 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/integration/configuration.tsx @@ -57,7 +57,7 @@ export const IndexSourceConfigurationForm: React.FC([]); - const onChange = (onChangeSelectedOptions: EuiComboBoxOptionOption[]) => { + const onIndexNameChange = (onChangeSelectedOptions: EuiComboBoxOptionOption[]) => { setSelected(onChangeSelectedOptions); }; @@ -137,7 +137,7 @@ export const IndexSourceConfigurationForm: React.FC ({ label: option, key: option }))} - onChange={onChange} + onChange={onIndexNameChange} fullWidth={true} onSearchChange={onSearchChange} append={ From 152818c93ca70c582ba8415ccc5591616beec436 Mon Sep 17 00:00:00 2001 From: Artem Shelkovnikov Date: Fri, 11 Apr 2025 14:10:51 +0200 Subject: [PATCH 10/10] Adjust implementation a bit --- .../public/hooks/use_index_name_autocomplete.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts index a539f01e7c78e..5a979529f3677 100644 --- a/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts +++ b/x-pack/solutions/chat/plugins/wci-index-source/public/hooks/use_index_name_autocomplete.ts @@ -30,6 +30,9 @@ export const useIndexNameAutocomplete = ({ query }: { query: string }) => { const { isLoading, data } = useQuery({ queryKey: ['index-name-autocomplete', debouncedQuery], queryFn: async () => { + if (query.length < 3) { + return []; + } const response = await http.get( `/internal/wci-index-source/indices-autocomplete`, {