perf: Debounce various Database Endpoints for less Database Queries and better Backend performance (#20982)
* Update KnowledgeSelector.svelte * Update KnowledgeSelector.svelte * Update Users.svelte * Update MemberSelector.svelte * Update MemberSelector.svelte * Update Knowledge.svelte * Update Knowledge.svelte * Update Notes.svelte * Update Knowledge.svelte * Update Prompts.svelte * Update Tools.svelte * Update Tools.svelte * Update Prompts.svelte * Update Prompts.svelte * Update Prompts.svelte * Update Functions.svelte * Update UserList.svelte * Update Functions.svelte * Update Prompts.svelte * Update UserList.svelte
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { WEBUI_NAME, config, functions as _functions, models, settings, user } from '$lib/stores';
|
import { WEBUI_NAME, config, functions as _functions, models, settings, user } from '$lib/stores';
|
||||||
import { onMount, getContext, tick } from 'svelte';
|
import { onMount, getContext, tick, onDestroy } from 'svelte';
|
||||||
|
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import {
|
import {
|
||||||
@@ -53,6 +53,7 @@
|
|||||||
let viewOption = '';
|
let viewOption = '';
|
||||||
|
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
let selectedTag = '';
|
let selectedTag = '';
|
||||||
let selectedType = '';
|
let selectedType = '';
|
||||||
|
|
||||||
@@ -70,12 +71,14 @@
|
|||||||
let functions = null;
|
let functions = null;
|
||||||
let filteredItems = [];
|
let filteredItems = [];
|
||||||
|
|
||||||
$: if (
|
$: if (query !== undefined) {
|
||||||
functions &&
|
clearTimeout(searchDebounceTimer);
|
||||||
query !== undefined &&
|
searchDebounceTimer = setTimeout(() => {
|
||||||
selectedType !== undefined &&
|
setFilteredItems();
|
||||||
viewOption !== undefined
|
}, 300);
|
||||||
) {
|
}
|
||||||
|
|
||||||
|
$: if (functions && selectedType !== undefined && viewOption !== undefined) {
|
||||||
setFilteredItems();
|
setFilteredItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -239,6 +242,10 @@
|
|||||||
window.removeEventListener('blur-sm', onBlur);
|
window.removeEventListener('blur-sm', onBlur);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { getContext } from 'svelte';
|
import { getContext, onDestroy } from 'svelte';
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
@@ -30,6 +30,7 @@
|
|||||||
let total = null;
|
let total = null;
|
||||||
|
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
let orderBy = 'created_at'; // default sort key
|
let orderBy = 'created_at'; // default sort key
|
||||||
let direction = 'desc'; // default sort order
|
let direction = 'desc'; // default sort order
|
||||||
|
|
||||||
@@ -79,13 +80,21 @@
|
|||||||
getUserList();
|
getUserList();
|
||||||
};
|
};
|
||||||
|
|
||||||
$: if (page !== null && query !== null && orderBy !== null && direction !== null) {
|
$: if (page !== null && orderBy !== null && direction !== null) {
|
||||||
getUserList();
|
getUserList();
|
||||||
}
|
}
|
||||||
|
|
||||||
$: if (query) {
|
$: if (query !== undefined) {
|
||||||
page = 1;
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
page = 1;
|
||||||
|
getUserList();
|
||||||
|
}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class=" max-h-full h-full w-full flex flex-col overflow-y-hidden">
|
<div class=" max-h-full h-full w-full flex flex-col overflow-y-hidden">
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||||
import { WEBUI_NAME, config, user, showSidebar } from '$lib/stores';
|
import { WEBUI_NAME, config, user, showSidebar } from '$lib/stores';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { onMount, getContext } from 'svelte';
|
import { onMount, getContext, onDestroy } from 'svelte';
|
||||||
|
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import relativeTime from 'dayjs/plugin/relativeTime';
|
import relativeTime from 'dayjs/plugin/relativeTime';
|
||||||
@@ -43,6 +43,7 @@
|
|||||||
let total = null;
|
let total = null;
|
||||||
|
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
let orderBy = 'created_at'; // default sort key
|
let orderBy = 'created_at'; // default sort key
|
||||||
let direction = 'asc'; // default sort order
|
let direction = 'asc'; // default sort order
|
||||||
|
|
||||||
@@ -97,13 +98,21 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$: if (query) {
|
$: if (query !== undefined) {
|
||||||
page = 1;
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
page = 1;
|
||||||
|
getUserList();
|
||||||
|
}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
$: if (query !== null && page !== null && orderBy !== null && direction !== null) {
|
$: if (page !== null && orderBy !== null && direction !== null) {
|
||||||
getUserList();
|
getUserList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<ConfirmDialog
|
<ConfirmDialog
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
|
|
||||||
let selectedIdx = 0;
|
let selectedIdx = 0;
|
||||||
let items = [];
|
let items = [];
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
|
|
||||||
export let filteredItems = [];
|
export let filteredItems = [];
|
||||||
$: filteredItems = [
|
$: filteredItems = [
|
||||||
@@ -69,10 +70,17 @@
|
|||||||
|
|
||||||
$: items = [...folderItems, ...knowledgeItems, ...fileItems];
|
$: items = [...folderItems, ...knowledgeItems, ...fileItems];
|
||||||
|
|
||||||
$: if (query !== null) {
|
$: if (query !== undefined) {
|
||||||
getItems();
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
getItems();
|
||||||
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
|
|
||||||
const getItems = () => {
|
const getItems = () => {
|
||||||
getFolderItems();
|
getFolderItems();
|
||||||
getKnowledgeItems();
|
getKnowledgeItems();
|
||||||
|
|||||||
@@ -11,9 +11,22 @@
|
|||||||
|
|
||||||
let selectedPromptIdx = 0;
|
let selectedPromptIdx = 0;
|
||||||
export let filteredItems = [];
|
export let filteredItems = [];
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
|
let debouncedQuery = '';
|
||||||
|
|
||||||
|
$: if (query !== undefined) {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
debouncedQuery = query;
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
|
|
||||||
$: filteredItems = prompts
|
$: filteredItems = prompts
|
||||||
.filter((p) => p.command.toLowerCase().includes(query.toLowerCase()))
|
.filter((p) => p.command.toLowerCase().includes(debouncedQuery.toLowerCase()))
|
||||||
.sort((a, b) => a.name.localeCompare(b.name));
|
.sort((a, b) => a.name.localeCompare(b.name));
|
||||||
|
|
||||||
$: if (query) {
|
$: if (query) {
|
||||||
|
|||||||
@@ -60,6 +60,7 @@
|
|||||||
let total = null;
|
let total = null;
|
||||||
|
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
|
|
||||||
let sortKey = null;
|
let sortKey = null;
|
||||||
let displayOption = null;
|
let displayOption = null;
|
||||||
@@ -163,9 +164,17 @@
|
|||||||
await getItemsPage();
|
await getItemsPage();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
$: if (query !== undefined) {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
if (loaded) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
$: if (
|
$: if (
|
||||||
loaded &&
|
loaded &&
|
||||||
query !== undefined &&
|
|
||||||
sortKey !== undefined &&
|
sortKey !== undefined &&
|
||||||
permission !== undefined &&
|
permission !== undefined &&
|
||||||
viewOption !== undefined
|
viewOption !== undefined
|
||||||
@@ -283,6 +292,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
onDestroy(() => {
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
console.log('destroy');
|
console.log('destroy');
|
||||||
const dropzoneElement = document.getElementById('notes-container');
|
const dropzoneElement = document.getElementById('notes-container');
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
dayjs.extend(relativeTime);
|
dayjs.extend(relativeTime);
|
||||||
|
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
import { onMount, getContext, tick } from 'svelte';
|
import { onMount, getContext, tick, onDestroy } from 'svelte';
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
import { WEBUI_NAME, knowledge, user } from '$lib/stores';
|
import { WEBUI_NAME, knowledge, user } from '$lib/stores';
|
||||||
@@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
let page = 1;
|
let page = 1;
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
let viewOption = '';
|
let viewOption = '';
|
||||||
|
|
||||||
let items = null;
|
let items = null;
|
||||||
@@ -44,7 +45,20 @@
|
|||||||
let allItemsLoaded = false;
|
let allItemsLoaded = false;
|
||||||
let itemsLoading = false;
|
let itemsLoading = false;
|
||||||
|
|
||||||
$: if (loaded && query !== undefined && viewOption !== undefined) {
|
$: if (query !== undefined) {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
if (loaded) {
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
|
|
||||||
|
$: if (loaded && viewOption !== undefined) {
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { DropdownMenu } from 'bits-ui';
|
import { DropdownMenu } from 'bits-ui';
|
||||||
import { onMount, getContext, createEventDispatcher } from 'svelte';
|
import { onMount, onDestroy, getContext, createEventDispatcher } from 'svelte';
|
||||||
|
|
||||||
import { searchNotes } from '$lib/apis/notes';
|
import { searchNotes } from '$lib/apis/notes';
|
||||||
import { searchKnowledgeBases, searchKnowledgeFiles } from '$lib/apis/knowledge';
|
import { searchKnowledgeBases, searchKnowledgeFiles } from '$lib/apis/knowledge';
|
||||||
|
|
||||||
@@ -26,6 +25,7 @@
|
|||||||
let show = false;
|
let show = false;
|
||||||
|
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
|
|
||||||
let noteItems = [];
|
let noteItems = [];
|
||||||
let knowledgeItems = [];
|
let knowledgeItems = [];
|
||||||
@@ -35,10 +35,17 @@
|
|||||||
|
|
||||||
$: items = [...noteItems, ...knowledgeItems, ...fileItems];
|
$: items = [...noteItems, ...knowledgeItems, ...fileItems];
|
||||||
|
|
||||||
$: if (query !== null) {
|
$: if (query !== undefined) {
|
||||||
getItems();
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
getItems();
|
||||||
|
}, 300);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
|
|
||||||
const getItems = () => {
|
const getItems = () => {
|
||||||
getNoteItems();
|
getNoteItems();
|
||||||
getKnowledgeItems();
|
getKnowledgeItems();
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { onMount, getContext, tick } from 'svelte';
|
import { onMount, getContext, tick, onDestroy } from 'svelte';
|
||||||
import { WEBUI_NAME, config, prompts as _prompts, user } from '$lib/stores';
|
import { WEBUI_NAME, config, prompts as _prompts, user } from '$lib/stores';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
@@ -32,6 +32,7 @@
|
|||||||
import TagSelector from './common/TagSelector.svelte';
|
import TagSelector from './common/TagSelector.svelte';
|
||||||
import Badge from '$lib/components/common/Badge.svelte';
|
import Badge from '$lib/components/common/Badge.svelte';
|
||||||
import Pagination from '../common/Pagination.svelte';
|
import Pagination from '../common/Pagination.svelte';
|
||||||
|
|
||||||
let shiftKey = false;
|
let shiftKey = false;
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
@@ -40,6 +41,7 @@
|
|||||||
|
|
||||||
let importFiles = null;
|
let importFiles = null;
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
|
|
||||||
let prompts = null;
|
let prompts = null;
|
||||||
let tags = [];
|
let tags = [];
|
||||||
@@ -55,7 +57,6 @@
|
|||||||
let copiedId: string | null = null;
|
let copiedId: string | null = null;
|
||||||
|
|
||||||
let page = 1;
|
let page = 1;
|
||||||
let searchDebounceTimer;
|
|
||||||
|
|
||||||
// Debounce only query changes
|
// Debounce only query changes
|
||||||
$: if (query !== undefined) {
|
$: if (query !== undefined) {
|
||||||
@@ -195,11 +196,16 @@
|
|||||||
window.addEventListener('blur', onBlur);
|
window.addEventListener('blur', onBlur);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
window.removeEventListener('keydown', onKeyDown);
|
window.removeEventListener('keydown', onKeyDown);
|
||||||
window.removeEventListener('keyup', onKeyUp);
|
window.removeEventListener('keyup', onKeyUp);
|
||||||
window.removeEventListener('blur', onBlur);
|
window.removeEventListener('blur', onBlur);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { onMount, getContext, tick } from 'svelte';
|
import { onMount, getContext, tick, onDestroy } from 'svelte';
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
import { WEBUI_NAME, config, prompts, tools as _tools, user } from '$lib/stores';
|
import { WEBUI_NAME, config, prompts, tools as _tools, user } from '$lib/stores';
|
||||||
@@ -47,6 +47,7 @@
|
|||||||
|
|
||||||
let showConfirm = false;
|
let showConfirm = false;
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
|
|
||||||
let showManifestModal = false;
|
let showManifestModal = false;
|
||||||
let showValvesModal = false;
|
let showValvesModal = false;
|
||||||
@@ -62,7 +63,14 @@
|
|||||||
|
|
||||||
let showImportModal = false;
|
let showImportModal = false;
|
||||||
|
|
||||||
$: if (tools && query !== undefined && viewOption !== undefined) {
|
$: if (query !== undefined) {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
setFilteredItems();
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
$: if (tools && viewOption !== undefined) {
|
||||||
setFilteredItems();
|
setFilteredItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,11 +187,16 @@
|
|||||||
window.addEventListener('blur-sm', onBlur);
|
window.addEventListener('blur-sm', onBlur);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
window.removeEventListener('keydown', onKeyDown);
|
window.removeEventListener('keydown', onKeyDown);
|
||||||
window.removeEventListener('keyup', onKeyUp);
|
window.removeEventListener('keyup', onKeyUp);
|
||||||
window.removeEventListener('blur-sm', onBlur);
|
window.removeEventListener('blur-sm', onBlur);
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { toast } from 'svelte-sonner';
|
import { toast } from 'svelte-sonner';
|
||||||
import { getContext, onMount } from 'svelte';
|
import { getContext, onMount, onDestroy } from 'svelte';
|
||||||
|
|
||||||
const i18n = getContext('i18n');
|
const i18n = getContext('i18n');
|
||||||
|
|
||||||
@@ -39,6 +39,7 @@
|
|||||||
let total = null;
|
let total = null;
|
||||||
|
|
||||||
let query = '';
|
let query = '';
|
||||||
|
let searchDebounceTimer: ReturnType<typeof setTimeout>;
|
||||||
let orderBy = 'name'; // default sort key
|
let orderBy = 'name'; // default sort key
|
||||||
let direction = 'asc'; // default sort order
|
let direction = 'asc'; // default sort order
|
||||||
|
|
||||||
@@ -60,7 +61,18 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
$: if (page !== null && query !== null && orderBy !== null && direction !== null) {
|
$: if (query !== undefined) {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
searchDebounceTimer = setTimeout(() => {
|
||||||
|
getUserList();
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
clearTimeout(searchDebounceTimer);
|
||||||
|
});
|
||||||
|
|
||||||
|
$: if (page !== null && orderBy !== null && direction !== null) {
|
||||||
getUserList();
|
getUserList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user