diff --git a/src/lib/common/RemoteSearchInput.svelte b/src/lib/common/RemoteSearchInput.svelte index f02e44de..86a1cbb6 100644 --- a/src/lib/common/RemoteSearchInput.svelte +++ b/src/lib/common/RemoteSearchInput.svelte @@ -11,15 +11,20 @@ /** @type {string} */ export let value; + /** @type {string} */ + export let placeholder = ''; + /** @type {boolean} */ export let disabled = false; - export let placeholder = ''; - /** - * @type {(query: string) => Promise<({id: string; name: string} | string)[]>} - */ - export let onSearch; + /** @type {boolean} */ export let loading = false; + /** @type {(query: string) => Promise} */ + export let onSearch = query => Promise.resolve([]); + + export const clearSearchResults = () => { + searchResults = []; + }; - /** @type {({id: string; name: string} | string)[]} */ + /** @type {string[]} */ let searchResults = []; let isOpen = false; @@ -46,15 +51,13 @@ } /** - * @param { {id: string; name: string} | string } result + * @param { string } result */ function selectResult(result) { - value = typeof result === 'string' ? result : result?.id; + value = result; } - export function clearSearchResults() { - searchResults = []; - } +
@@ -66,17 +69,17 @@ - + {#if loading}
  • {:else} - {#each searchResults as result, index} + {#each searchResults as item, index} selectResult(result)} - title={typeof result === 'string' ? result : result?.name} + active={value === item} + title={item} + on:click={() => selectResult(item)} > - {typeof result === 'string' ? result : result?.name} + {item} {/each} {/if} diff --git a/src/lib/helpers/http.js b/src/lib/helpers/http.js index 319d5545..4a239f00 100644 --- a/src/lib/helpers/http.js +++ b/src/lib/helpers/http.js @@ -90,7 +90,7 @@ function skipLoader(config) { new RegExp('http(s*)://(.*?)/role/(.*?)/details', 'g'), new RegExp('http(s*)://(.*?)/user/(.*?)/details', 'g'), new RegExp('http(s*)://(.*?)/agent/labels', 'g'), - new RegExp('http(s*)://(.*?)/conversation/state-key', 'g'), + new RegExp('http(s*)://(.*?)/conversation/state/keys', 'g'), ]; if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) { diff --git a/src/lib/helpers/types/conversationTypes.js b/src/lib/helpers/types/conversationTypes.js index 6827d371..6bce4176 100644 --- a/src/lib/helpers/types/conversationTypes.js +++ b/src/lib/helpers/types/conversationTypes.js @@ -37,6 +37,14 @@ */ +/** + * @typedef {Object} StateSearchQuery + * @property {string} query - The search query. + * @property {number?} [keyLimit] - The key limit. + * @property {boolean?} [preLoad] - Whether it is preloading or not. + */ + + /** * @interface * @class diff --git a/src/lib/scss/custom/pages/_conversation.scss b/src/lib/scss/custom/pages/_conversation.scss index fccef864..0b4e7314 100644 --- a/src/lib/scss/custom/pages/_conversation.scss +++ b/src/lib/scss/custom/pages/_conversation.scss @@ -7,6 +7,9 @@ .list-title { width: 40%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } .conv-state-search-menu { diff --git a/src/lib/services/api-endpoints.js b/src/lib/services/api-endpoints.js index 77d4ba8f..1d7f62c8 100644 --- a/src/lib/services/api-endpoints.js +++ b/src/lib/services/api-endpoints.js @@ -67,7 +67,7 @@ export const endpoints = { conversationTagsUpdateUrl: `${host}/conversation/{conversationId}/update-tags`, fileUploadUrl: `${host}/agent/{agentId}/conversation/{conversationId}/upload`, pinConversationUrl: `${host}/agent/{agentId}/conversation/{conversationId}/dashboard`, - conversationStateKeyListUrl: `${host}/conversation/state-key`, + conversationStateSearchKeysUrl: `${host}/conversation/state/keys`, // LLM provider llmProvidersUrl: `${host}/llm-providers`, diff --git a/src/lib/services/conversation-service.js b/src/lib/services/conversation-service.js index 1bb4140b..d569c41f 100644 --- a/src/lib/services/conversation-service.js +++ b/src/lib/services/conversation-service.js @@ -290,24 +290,21 @@ export async function getAddressOptions(text) { return response.data; } -/** @type {import('axios').CancelTokenSource | null} */ -let getConversationStatKeyCancelToken = null; +/** @type {AbortController} */ +let controller = new AbortController(); + /** - * get conversation state key list - * @param {string} query - * @returns {Promise<{id: string, name: string}[]>} + * get conversation state search keys + * @param {import('$conversationTypes').StateSearchQuery} request + * @returns {Promise} */ -export async function getConversationStateKey(query) { - let url = endpoints.conversationStateKeyListUrl; - if (getConversationStatKeyCancelToken) { - getConversationStatKeyCancelToken.cancel(); - } - getConversationStatKeyCancelToken = axios.CancelToken.source(); +export async function getConversationStateSearchKeys(request) { + let url = endpoints.conversationStateSearchKeysUrl; const response = await axios.get(url, { params: { - searchKey: query + ...request }, - cancelToken: getConversationStatKeyCancelToken.token + signal: controller.signal }); return response.data; } \ No newline at end of file diff --git a/src/routes/page/conversation/+page.svelte b/src/routes/page/conversation/+page.svelte index ea355fa2..8af13626 100644 --- a/src/routes/page/conversation/+page.svelte +++ b/src/routes/page/conversation/+page.svelte @@ -1,5 +1,8 @@ @@ -355,14 +358,16 @@ -
    -
    {$_('Conversation List')}
    -
    +
    +
    +
    {$_('Conversation List')}
    +
    +
    handleStateSearch(e)} placeholder="Search States" />
    @@ -435,7 +440,7 @@
    - +
    {$_('Title')}