Skip to content

Commit a8a6437

Browse files
authored
Merge pull request #219 from iceljc/features/refine-chat-window
Features/refine chat window
2 parents 0d9c9c5 + cfd2cfe commit a8a6437

File tree

8 files changed

+208
-33
lines changed

8 files changed

+208
-33
lines changed

src/lib/scss/custom/pages/_knowledgebase.scss

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,22 @@
261261

262262
.load-doc-btn {
263263
font-size: 12px;
264+
display: flex;
265+
justify-content: space-between;
266+
267+
.reset-docs-btn {
268+
color: var(--bs-danger);
269+
270+
i {
271+
font-size: 18px;
272+
border-radius: 3px;
273+
274+
&:hover {
275+
background-color: var(--bs-danger);
276+
color: white;
277+
}
278+
}
279+
}
264280
}
265281

266282
.collection-docs {

src/lib/services/api-endpoints.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export const endpoints = {
7474

7575
knowledgeDocumentUploadUrl: `${host}/knowledge/document/{collection}/upload`,
7676
knowledgeDocumentDeleteUrl: `${host}/knowledge/document/{collection}/delete/{fileId}`,
77+
knowledgeDocumentDeleteAllUrl: `${host}/knowledge/document/{collection}/delete`,
7778
knowledgeDocumentPageListUrl: `${host}/knowledge/document/{collection}/page`,
7879

7980
// chathub

src/lib/services/knowledge-base-service.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,20 @@ export async function deleteKnowledgeDocument(collection, fileId) {
154154
return response.data;
155155
}
156156

157+
/**
158+
* @param {string} collection
159+
* @param {import('$knowledgeTypes').KnowledgeDocRequest} request
160+
* @returns {Promise<boolean>}
161+
*/
162+
export async function deleteAllKnowledgeDocuments(collection, request) {
163+
const url = replaceUrl(endpoints.knowledgeDocumentDeleteAllUrl, {
164+
collection: collection
165+
});
166+
167+
const response = await axios.delete(url, { data: { ...request } });
168+
return response.data;
169+
}
170+
157171

158172
/**
159173
* @param {string} collection

src/routes/page/knowledge-base/common/search/advanced-search.svelte

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
<script>
2-
import { onMount, onDestroy } from 'svelte';
2+
import { onMount, onDestroy, createEventDispatcher } from 'svelte';
33
import { fly } from 'svelte/transition';
44
import { Input, Tooltip } from '@sveltestrap/sveltestrap';
55
import util from "lodash";
6-
76
7+
const svelteDispatch = createEventDispatcher();
8+
89
const maxLength = 50;
910
11+
1012
/** @type {{ key: string, displayName: string }[]} */
1113
export let items;
1214
1315
/** @type {boolean} */
1416
export let disabled = false;
1517
16-
18+
1719
/** @type {boolean} */
1820
let showAdvSearch = false;
1921
20-
/** @type {any[]} */
22+
/** @type {{ key: string, displayName: string, checked: boolean, value: string }[]} */
2123
let innerItems = [];
2224
2325
@@ -66,6 +68,9 @@
6668
innerItems = innerItems.map((x, index) => {
6769
return index === idx ? { ...found } : x;
6870
});
71+
svelteDispatch('changeitems', {
72+
searchItems: buildSearchItems()
73+
});
6974
}
7075
}
7176
@@ -80,23 +85,38 @@
8085
innerItems = innerItems.map((x, index) => {
8186
return index === idx ? { ...found } : x;
8287
});
88+
svelteDispatch('changeitems', {
89+
searchItems: buildSearchItems()
90+
});
8391
}
8492
}
93+
94+
95+
function buildSearchItems() {
96+
return innerItems?.filter(x => x.checked && !!util.trim(x.value))?.map(x => {
97+
return {
98+
key: x.key,
99+
value: x.value
100+
}
101+
}) || [];
102+
}
85103
</script>
86104
87105
88106
<div
89-
class="knowledge-adv-search-container"
107+
class="knowledge-adv-search-container mt-5"
90108
in:fly={{ y: -10, duration: 500 }}
91109
out:fly={{ y: -10, duration: 200 }}
92110
>
93111
<div class="knowledge-adv-search-btn text-primary fw-bold">
94-
<Input
95-
type="switch"
96-
disabled={disabled}
97-
checked={showAdvSearch}
98-
on:change={e => toggleAdvSearch(e)}
99-
/>
112+
<div class="line-align-center">
113+
<Input
114+
type="switch"
115+
disabled={disabled}
116+
checked={showAdvSearch}
117+
on:change={e => toggleAdvSearch(e)}
118+
/>
119+
</div>
100120
<div class="line-align-center">
101121
<div>{'Advance Search'}</div>
102122
</div>

src/routes/page/knowledge-base/common/vector-table/vector-item.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
/** @type {boolean} */
2121
export let open = false;
2222
23+
/** @type {boolean} */
24+
export let disabled = false;
25+
2326
$: isQuestionAnswerCollection = collectionType === KnowledgeCollectionType.QuestionAnswer;
2427
$: isDocumentCollection = collectionType === KnowledgeCollectionType.Document;
2528
$: {
@@ -94,6 +97,7 @@
9497
<li data-bs-toggle="tooltip" data-bs-placement="top" title="Edit">
9598
<Button
9699
class="btn btn-sm btn-soft-warning"
100+
disabled={disabled}
97101
on:click={() => editKnowledge()}
98102
>
99103
<i class="bx bxs-edit" />
@@ -102,6 +106,7 @@
102106
<li data-bs-toggle="tooltip" data-bs-placement="top" title="Delete">
103107
<Button
104108
class="btn btn-sm btn-soft-danger"
109+
disabled={disabled}
105110
on:click={() => deleteKnowledge(item?.id)}
106111
>
107112
<i class="mdi mdi-delete-outline" />

src/routes/page/knowledge-base/documents/+page.svelte

Lines changed: 79 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@
8181
/** @type {string} */
8282
let editModalTitle = "Edit knowledge";
8383
84+
/** @type {import('$commonTypes').KeyValuePair[]} */
85+
let searchItems = [];
86+
8487
/** @type {boolean} */
8588
let showDemo = true;
8689
let isSearching = false;
@@ -93,6 +96,7 @@
9396
let isOpenEditKnowledge = false;
9497
let isOpenCreateCollection = false;
9598
let textSearch = false;
99+
let disableSearchBtn = false;
96100
97101
/** @type {any} */
98102
let docUploadrCmp;
@@ -113,7 +117,17 @@
113117
useSearhPair: false
114118
};
115119
116-
$: disabled = isLoading || isLoadingMore;
120+
$: disabled = isLoading || isLoadingMore || isSearching;
121+
$: {
122+
disableSearchBtn = false;
123+
if (isSearching || isLoadingMore) {
124+
disableSearchBtn = true;
125+
} else if (textSearch && searchItems.length > 0) {
126+
disableSearchBtn = false;
127+
} else if (!text || util.trim(text).length === 0) {
128+
disableSearchBtn = true;
129+
}
130+
}
117131
118132
onMount(() => {
119133
initData();
@@ -138,6 +152,13 @@
138152
showDemo = !showDemo;
139153
}
140154
155+
function toggleTextSearch() {
156+
textSearch = !textSearch;
157+
if (!textSearch) {
158+
searchItems = [];
159+
}
160+
}
161+
141162
function search() {
142163
items = [];
143164
isSearching = true;
@@ -273,14 +294,24 @@
273294
useSearhPair: false
274295
}) {
275296
return new Promise((resolve, reject) => {
297+
/** @type {import('$commonTypes').KeyValuePair[]} */
298+
let searchPairs = [];
299+
if (params.useSearhPair) {
300+
if (!!text) {
301+
searchPairs = [ ...searchPairs, { key: KnowledgePayloadName.Text, value: text } ];
302+
}
303+
304+
if (textSearch && searchItems.length > 0) {
305+
searchPairs = [ ...searchPairs, ...searchItems ];
306+
}
307+
}
308+
276309
const filter = {
277310
size: pageSize,
278311
start_id: params.startId,
279312
with_vector: enableVector,
280313
included_payloads: includedPayloads,
281-
search_pairs: params.useSearhPair ? [
282-
{ key: KnowledgePayloadName.Text, value: text }
283-
] : []
314+
search_pairs: searchPairs
284315
};
285316
286317
getVectorKnowledgePageList(
@@ -630,7 +661,7 @@
630661
reset();
631662
const success = e.detail.success;
632663
if (success) {
633-
successText = "Knowledg document has been deleted!";
664+
successText = "Knowledge document has been deleted!";
634665
isComplete = true;
635666
setTimeout(() => {
636667
isComplete = false;
@@ -643,6 +674,30 @@
643674
}, duration);
644675
}
645676
}
677+
678+
/** @param {any} e */
679+
function onDocsReset(e) {
680+
reset();
681+
const success = e.detail.success;
682+
if (success) {
683+
successText = "Knowledge document has been reset!";
684+
isComplete = true;
685+
setTimeout(() => {
686+
isComplete = false;
687+
}, duration);
688+
} else {
689+
errorText = "Failed to reset knowledge documents."
690+
isError = true;
691+
setTimeout(() => {
692+
isError = false;
693+
}, duration);
694+
}
695+
}
696+
697+
/** @param {any} e */
698+
function onSearchItemsChanged(e) {
699+
searchItems = e.detail.searchItems || [];
700+
}
646701
</script>
647702
648703
<HeadTitle title="{$_('Document Knowledge')}" />
@@ -767,7 +822,8 @@
767822
<div class="line-align-center input-text search-toggle">
768823
<Input
769824
type="switch"
770-
bind:checked={textSearch}
825+
checked={textSearch}
826+
on:change={e => toggleTextSearch()}
771827
/>
772828
</div>
773829
<div class="line-align-center input-text fw-bold">
@@ -777,13 +833,24 @@
777833
<div class="line-align-center">
778834
<Button
779835
color="primary"
780-
disabled={!text || util.trim(text).length === 0 || isSearching}
836+
disabled={disableSearchBtn}
781837
on:click={() => search()}
782838
>
783839
{'Search'}
784840
</Button>
785841
</div>
786842
</div>
843+
844+
{#if textSearch}
845+
<AdvancedSearch
846+
on:changeitems={e => onSearchItemsChanged(e)}
847+
disabled={disabled}
848+
items={[
849+
{ key: KnowledgePayloadName.FileName, displayName: "File name" },
850+
{ key: KnowledgePayloadName.FileSource, displayName: "File source" }
851+
]}
852+
/>
853+
{/if}
787854
788855
{#if isSearching}
789856
<div class="knowledge-loader mt-5">
@@ -795,16 +862,6 @@
795862
</div>
796863
{/if}
797864
</div>
798-
799-
{#if textSearch}
800-
<AdvancedSearch
801-
disabled={disabled}
802-
items={[
803-
{ key: KnowledgePayloadName.FileName, displayName: "File name" },
804-
{ key: KnowledgePayloadName.FileSource, displayName: "File source" }
805-
]}
806-
/>
807-
{/if}
808865
</div>
809866
{/if}
810867
@@ -815,6 +872,7 @@
815872
bind:this={docUploadrCmp}
816873
on:docuploaded={(e) => onDocUploaded(e)}
817874
on:docdeleted={(e) => onDocDelected(e)}
875+
on:resetdocs={(e) => onDocsReset(e)}
818876
/>
819877
{/if}
820878
@@ -857,7 +915,10 @@
857915
</div>
858916
<div class="collection-dropdown-container">
859917
<div class="line-align-center collection-dropdown">
860-
<Input type="select" on:change={(e) => changeCollection(e)}>
918+
<Input
919+
type="select"
920+
on:change={(e) => changeCollection(e)}
921+
>
861922
{#each collections as option, idx (idx)}
862923
<option value={option} selected={option === selectedCollection}>{option}</option>
863924
{/each}

0 commit comments

Comments
 (0)