diff --git a/src/lib/common/LoadingToComplete.svelte b/src/lib/common/LoadingToComplete.svelte index 40b7f43f..d0d520a8 100644 --- a/src/lib/common/LoadingToComplete.svelte +++ b/src/lib/common/LoadingToComplete.svelte @@ -5,14 +5,20 @@ export let isLoading = false; export let isComplete = false; export let isError = false; + export let spinnerClasses = ''; + export let spinnerStyles = ''; + export let spinnerSize = 50; export let successText = 'Update completed!'; export let errorText = 'Error!'; - export let spinnerSize = 50; {#if isLoading} - + {/if} diff --git a/src/lib/common/shared/GlobalHeader.svelte b/src/lib/common/shared/GlobalHeader.svelte new file mode 100644 index 00000000..d54e0c38 --- /dev/null +++ b/src/lib/common/shared/GlobalHeader.svelte @@ -0,0 +1,29 @@ + \ No newline at end of file diff --git a/src/lib/helpers/http.js b/src/lib/helpers/http.js index 43405900..8e49d548 100644 --- a/src/lib/helpers/http.js +++ b/src/lib/helpers/http.js @@ -31,7 +31,7 @@ const retryQueue = { /** @param {{config: import('axios').InternalAxiosRequestConfig, resolve: (value: any) => void, reject: (reason?: any) => void}} item */ enqueue(item) { this.queue.push(item); - + console.log('queue', this.queue.length); if (!this.isRefreshingToken) { const user = getUserStore(); if (!isTokenExired(user.expires)) { @@ -130,7 +130,7 @@ axios.interceptors.response.use( loaderStore.set(false); const originalRequest = error?.config || {}; const user = getUserStore(); - console.log("renew token count.", user.renew_token_count); + if (!user?.token || user.renew_token_count >= retryQueue.maxRenewTokenCount) { retryQueue.queue = []; redirectToLogin(); @@ -185,7 +185,7 @@ function skipLoader(config) { new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/create', 'g'), new RegExp('http(s*)://(.*?)/knowledge/document/(.*?)/page', 'g'), new RegExp('http(s*)://(.*?)/users', 'g'), - new RegExp('http(s*)://(.*?)/instruct/chat-completion', 'g'), + new RegExp('http(s*)://(.*?)/instruct/(.*?)', 'g'), new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'), new RegExp('http(s*)://(.*?)/agent/(.*?)/code-script/generate', 'g'), new RegExp('http(s*)://(.*?)/renew-token', 'g') @@ -208,24 +208,30 @@ function skipLoader(config) { /** @type {RegExp[]} */ const getRegexes = [ + new RegExp('http(s*)://(.*?)/plugin/menu', 'g'), new RegExp('http(s*)://(.*?)/setting/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/roles', 'g'), + new RegExp('http(s*)://(.*?)/role/options', 'g'), + new RegExp('http(s*)://(.*?)/role/(.*?)/details', 'g'), + new RegExp('http(s*)://(.*?)/user/(.*?)/details', 'g'), new RegExp('http(s*)://(.*?)/user/me', 'g'), - new RegExp('http(s*)://(.*?)/plugin/menu', 'g'), new RegExp('http(s*)://(.*?)/address/options(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/agents', 'g'), + new RegExp('http(s*)://(.*?)/agent/options', 'g'), + new RegExp('http(s*)://(.*?)/agent/labels', 'g'), + new RegExp('http(s*)://(.*?)/agent/tasks', 'g'), + new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g'), + new RegExp('http(s*)://(.*?)/conversation/state/keys', 'g'), new RegExp('http(s*)://(.*?)/conversation/(.*?)/files/(.*?)', 'g'), + new RegExp('http(s*)://(.*?)/llm-configs', 'g'), new RegExp('http(s*)://(.*?)/llm-provider/(.*?)/models', 'g'), new RegExp('http(s*)://(.*?)/knowledge/vector/collections', 'g'), new RegExp('http(s*)://(.*?)/knowledge/vector/(.*?)/exist', 'g'), - new RegExp('http(s*)://(.*?)/role/options', 'g'), - 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/keys', 'g'), + new RegExp('http(s*)://(.*?)/logger/instruction/log', 'g'), new RegExp('http(s*)://(.*?)/logger/instruction/log/keys', 'g'), new RegExp('http(s*)://(.*?)/logger/conversation/(.*?)/content-log', 'g'), new RegExp('http(s*)://(.*?)/logger/conversation/(.*?)/state-log', 'g'), - new RegExp('http(s*)://(.*?)/mcp/server-configs', 'g'), - new RegExp('http(s*)://(.*?)/agent/(.*?)/code-scripts', 'g') + new RegExp('http(s*)://(.*?)/mcp/server-configs', 'g') ]; if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) { @@ -276,7 +282,9 @@ function skipGlobalError(config) { ]; /** @type {RegExp[]} */ - const getRegexes = []; + const getRegexes = [ + new RegExp('http(s*)://(.*?)/agents', 'g') + ]; if (config.method === 'post' && postRegexes.some(regex => regex.test(config.url || ''))) { return true; diff --git a/src/lib/helpers/utils/common.js b/src/lib/helpers/utils/common.js index e6170626..5a348daf 100644 --- a/src/lib/helpers/utils/common.js +++ b/src/lib/helpers/utils/common.js @@ -120,18 +120,19 @@ export function getPagingQueryParams(args, defaults = { defaultPageSize: 12, max /** * @param {URL} url * @param {import('$commonTypes').KeyValuePair[]} pairs - * @param {() => void} [callback] + * @param {(args0: URL) => void} [callback] */ export function setUrlQueryParams(url, pairs, callback) { if (!pairs?.length) { return; } + url.search = ''; pairs?.map(p => { url.searchParams.set(p.key, p.value); }); - callback?.(); + callback?.(url); } /** @@ -175,6 +176,19 @@ export function splitTextByCase(str) { return text; } +/** + * @param {string} url + */ +export function getCleanUrl(url) { + if (!url) return url; + + if (url.startsWith('/')) { + url = url.substring(1); + } + + return url; +} + /** * @param {string} timeRange * @returns {{ startTime: string | null, endTime: string | null }} diff --git a/src/lib/scss/custom/common/_common.scss b/src/lib/scss/custom/common/_common.scss index f23a183f..e4230d5d 100644 --- a/src/lib/scss/custom/common/_common.scss +++ b/src/lib/scss/custom/common/_common.scss @@ -204,3 +204,17 @@ button:focus { text-overflow: ellipsis; } } + +.text-btn { + background: none; + border: none; + padding: 0; + color: inherit; + font-weight: 500; + cursor: pointer; + + &:hover { + text-decoration: none; + background: none; + } +} \ No newline at end of file diff --git a/src/lib/scss/custom/components/_loader.scss b/src/lib/scss/custom/components/_loader.scss index 39c7979d..a095d4ce 100644 --- a/src/lib/scss/custom/components/_loader.scss +++ b/src/lib/scss/custom/components/_loader.scss @@ -1,5 +1,5 @@ .loader { - position: fixed; + position: absolute; z-index: 9999; background-color: rgba(255, 255, 255, 0.8); top: 0; diff --git a/src/lib/scss/custom/pages/_agent.scss b/src/lib/scss/custom/pages/_agent.scss index afa4c72d..6cc4c4b1 100644 --- a/src/lib/scss/custom/pages/_agent.scss +++ b/src/lib/scss/custom/pages/_agent.scss @@ -1,10 +1,37 @@ .agents-header-container { display: flex; + flex-wrap: wrap; justify-content: space-between; + gap: 15px; + align-items: center; + + @media (max-width: 576px) { + flex-direction: column; + justify-content: center; + gap: 12px; + + > div { + width: 100%; + display: flex; + justify-content: center; + } + } .agent-filter { display: flex; - gap: 10px + flex-wrap: wrap; + gap: 10px; + align-items: center; + + @media (max-width: 576px) { + width: 100%; + flex-direction: column; + gap: 8px; + + > * { + width: 100%; + } + } } } diff --git a/src/lib/services/agent-service.js b/src/lib/services/agent-service.js index 4b6d0995..caa9e172 100644 --- a/src/lib/services/agent-service.js +++ b/src/lib/services/agent-service.js @@ -16,9 +16,10 @@ export async function getSettings() { * Get agent list * @param {import('$agentTypes').AgentFilter} filter * @param {boolean} checkAuth + * @param {AbortSignal | null} signal * @returns {Promise>} */ -export async function getAgents(filter, checkAuth = false) { +export async function getAgents(filter, checkAuth = false, signal = null) { let url = endpoints.agentListUrl; const response = await axios.get(url, { params: { @@ -28,7 +29,8 @@ export async function getAgents(filter, checkAuth = false) { paramsSerializer: { dots: true, indexes: null, - } + }, + signal: signal || undefined }); return response.data; } diff --git a/src/lib/services/role-service.js b/src/lib/services/role-service.js index 15f40116..77033144 100644 --- a/src/lib/services/role-service.js +++ b/src/lib/services/role-service.js @@ -1,5 +1,6 @@ import { endpoints } from './api-endpoints.js'; import axios from 'axios'; +import qs from 'qs'; /** * Get role options @@ -17,7 +18,10 @@ export async function getRoleOptions() { * @returns {Promise} */ export async function getRoles(filter = null) { - const response = await axios.post(endpoints.rolesUrl, filter); + const response = await axios.get(endpoints.rolesUrl, { + params: filter, + paramsSerializer: (params) => qs.stringify(params, { encode: false, allowDots: true, arrayFormat: "indices" }) + }); return response.data; } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index e56fb9f1..783b44c7 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,11 +1,6 @@ -{#if isLoading} - -{/if} - - -