123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <script lang="ts">
- import { getContext, onMount } from 'svelte';
- import { formatFileSize, getLineCount } from '$lib/utils';
- import { WEBUI_API_BASE_URL } from '$lib/constants';
- const i18n = getContext('i18n');
- import Modal from './Modal.svelte';
- import XMark from '../icons/XMark.svelte';
- import Info from '../icons/Info.svelte';
- import Switch from './Switch.svelte';
- import Tooltip from './Tooltip.svelte';
- export let item;
- export let show = false;
- export let edit = false;
- let enableFullContent = false;
- $: isPDF =
- item?.meta?.content_type === 'application/pdf' ||
- (item?.name && item?.name.toLowerCase().endsWith('.pdf'));
- onMount(() => {
- console.log(item);
- if (item?.context === 'full') {
- enableFullContent = true;
- }
- });
- </script>
- <Modal bind:show size="lg">
- <div class="font-primary px-6 py-5 w-full flex flex-col justify-center dark:text-gray-400">
- <div class=" pb-2">
- <div class="flex items-start justify-between">
- <div>
- <div class=" font-medium text-lg dark:text-gray-100">
- <a
- href="#"
- class="hover:underline line-clamp-1"
- on:click|preventDefault={() => {
- if (!isPDF && item.url) {
- window.open(
- item.type === 'file' ? `${item.url}/content` : `${item.url}`,
- '_blank'
- );
- }
- }}
- >
- {item?.name ?? 'File'}
- </a>
- </div>
- </div>
- <div>
- <button
- on:click={() => {
- show = false;
- }}
- >
- <XMark />
- </button>
- </div>
- </div>
- <div>
- <div class="flex flex-col items-center md:flex-row gap-1 justify-between w-full">
- <div class=" flex flex-wrap text-sm gap-1 text-gray-500">
- {#if item.size}
- <div class="capitalize shrink-0">{formatFileSize(item.size)}</div>
- •
- {/if}
- {#if item?.file?.data?.content}
- <div class="capitalize shrink-0">
- {getLineCount(item?.file?.data?.content ?? '')} extracted lines
- </div>
- <div class="flex items-center gap-1 shrink-0">
- <Info />
- Formatting may be inconsistent from source.
- </div>
- {/if}
- </div>
- {#if edit}
- <div>
- <Tooltip
- content={enableFullContent
- ? 'Inject the entire document as context for comprehensive processing, this is recommended for complex queries.'
- : 'Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.'}
- >
- <div class="flex items-center gap-1.5 text-xs">
- {#if enableFullContent}
- Using Entire Document
- {:else}
- Using Focused Retrieval
- {/if}
- <Switch
- bind:state={enableFullContent}
- on:change={(e) => {
- item.context = e.detail ? 'full' : undefined;
- }}
- />
- </div>
- </Tooltip>
- </div>
- {/if}
- </div>
- </div>
- </div>
- <div class="max-h-[75vh] overflow-auto">
- {#if isPDF}
- <iframe
- title={item?.name}
- src={`${WEBUI_API_BASE_URL}/files/${item.id}/content`}
- class="w-full h-[70vh] border-0 rounded-lg mt-4"
- />
- {:else}
- <div class="max-h-96 overflow-scroll scrollbar-hidden text-xs whitespace-pre-wrap">
- {item?.file?.data?.content ?? 'No content'}
- </div>
- {/if}
- </div>
- </div>
- </Modal>
|