From 96797694f2a03f57dc172024a698acb9c97479cc Mon Sep 17 00:00:00 2001 From: ali asaria <aliasaria@users.noreply.github.com> Date: Fri, 21 Feb 2025 12:36:19 -0500 Subject: [PATCH] change pick a document modal to select form, but now need to edit generate modal --- .../Experiment/Generate/GenerateModal.tsx | 90 ++++++++------- .../Experiment/Rag/PickADocumentMenu.tsx | 104 +++++------------- 2 files changed, 79 insertions(+), 115 deletions(-) diff --git a/src/renderer/components/Experiment/Generate/GenerateModal.tsx b/src/renderer/components/Experiment/Generate/GenerateModal.tsx index 92546792..27158fb9 100644 --- a/src/renderer/components/Experiment/Generate/GenerateModal.tsx +++ b/src/renderer/components/Experiment/Generate/GenerateModal.tsx @@ -78,7 +78,6 @@ export default function GenerateModal({ const [contextInput, setContextInput] = useState(''); const [datasetDisplayMessage, setDatasetDisplayMessage] = useState(''); - // Fetch available datasets from the API const { data: datasets, @@ -116,9 +115,7 @@ export default function GenerateModal({ setSelectedFileNames([]); if (!currentEvalName || currentEvalName === '') { setNameInput(generateFriendlyName()); - - } - else { + } else { setNameInput(''); } } @@ -153,26 +150,31 @@ export default function GenerateModal({ // setHasDocumentsKey(docsKeyExists); // setHasContextKey(contextKeyExists); - if (docsKeyExists && evalConfig.script_parameters.docs.length > 0) { + if ( + docsKeyExists && + evalConfig.script_parameters.docs.length > 0 + ) { // const docstemp = evalConfig.script_parameters.docs.split(',').map((path) => ({ path })); setHasContextKey(false); setHasDocumentsKey(true); const docPaths = evalConfig.script_parameters.docs.split(','); - const docNames = evalConfig.script_parameters.doc_names.split(','); + const docNames = + evalConfig.script_parameters.doc_names.split(','); // const docFiles = docPaths.map((path) => new File([], path)); setSelectedFiles(docPaths); setSelectedFileNames(docNames); delete evalConfig.script_parameters.docs; - setConfig(evalConfig.script_parameters) - - } - else if (contextKeyExists && evalConfig.script_parameters.context.length > 0) { + setConfig(evalConfig.script_parameters); + } else if ( + contextKeyExists && + evalConfig.script_parameters.context.length > 0 + ) { setHasContextKey(true); setHasDocumentsKey(false); const context = evalConfig.script_parameters.context; setContextInput(context); delete evalConfig.script_parameters.context; - setConfig(evalConfig.script_parameters) + setConfig(evalConfig.script_parameters); } if ( evalConfig.script_parameters._dataset_display_message && @@ -183,7 +185,10 @@ export default function GenerateModal({ evalConfig.script_parameters._dataset_display_message ); } - if (hasDatasetKey && evalConfig.script_parameters.dataset_name.length > 0) { + if ( + hasDatasetKey && + evalConfig.script_parameters.dataset_name.length > 0 + ) { setSelectedDataset(evalConfig.script_parameters.dataset_name); } if (!nameInput && evalConfig?.name.length > 0) { @@ -203,7 +208,6 @@ export default function GenerateModal({ } } } else { - if (data) { let parsedData; try { @@ -235,14 +239,24 @@ export default function GenerateModal({ ); if (docsKeyExists) { // Delete the parameter key that includes 'docs' from the config - delete tempconfig[Object.keys(parsedData.parameters).find((key) => key.toLowerCase().includes('tflabcustomui_docs'))]; + delete tempconfig[ + Object.keys(parsedData.parameters).find((key) => + key.toLowerCase().includes('tflabcustomui_docs') + ) + ]; } - const contextKeyExists = Object.keys(parsedData.parameters).some( - (key) => key.toLowerCase().includes('tflabcustomui_context') + const contextKeyExists = Object.keys( + parsedData.parameters + ).some((key) => + key.toLowerCase().includes('tflabcustomui_context') ); if (contextKeyExists) { // Delete the parameter key that includes 'context' from the config - delete tempconfig[Object.keys(parsedData.parameters).find((key) => key.toLowerCase().includes('tflabcustomui_context'))]; + delete tempconfig[ + Object.keys(parsedData.parameters).find((key) => + key.toLowerCase().includes('tflabcustomui_context') + ) + ]; } setHasContextKey(contextKeyExists); setHasDocumentsKey(docsKeyExists); @@ -263,7 +277,6 @@ export default function GenerateModal({ } }, [experimentInfo, pluginId, currentEvalName, nameInput, data]); - if (!experimentInfo?.id) { return 'Select an Experiment'; } @@ -317,7 +330,6 @@ export default function GenerateModal({ } function DocsTab({ experimentInfo }) { - return ( <Stack spacing={2}> <FormControl> @@ -325,27 +337,26 @@ export default function GenerateModal({ <PickADocumentMenu experimentInfo={experimentInfo} showFoldersOnly={false} - setSelectedFiles={setSelectedFiles} - setSelectedFileNames={setSelectedFileNames} + // setSelectedFiles={setSelectedFiles} + // setSelectedFileNames={setSelectedFileNames} /> <FormHelperText>Select documents to upload</FormHelperText> </FormControl> {selectedFileNames.length > 0 && ( - <Stack spacing={1} mt={2}> - <FormLabel>Selected Documents:</FormLabel> - {selectedFileNames.map((file, index) => ( - <Sheet key={index} variant="outlined" p={1}> - {file} - </Sheet> - ))} - </Stack> - )} + <Stack spacing={1} mt={2}> + <FormLabel>Selected Documents:</FormLabel> + {selectedFileNames.map((file, index) => ( + <Sheet key={index} variant="outlined" p={1}> + {file} + </Sheet> + ))} + </Stack> + )} </Stack> ); } - function ContextTab({contextInput, setContextInput}) { - + function ContextTab({ contextInput, setContextInput }) { return ( <Stack spacing={2}> <FormControl> @@ -383,7 +394,7 @@ export default function GenerateModal({ // formJson.generation_type = 'docs'; // } if (hasDocumentsKey && selectedFiles.length > 0) { - formJson.docs = selectedFiles.join(',');; + formJson.docs = selectedFiles.join(','); formJson.doc_names = selectedFileNames.join(','); formJson.generation_type = 'docs'; } @@ -391,14 +402,12 @@ export default function GenerateModal({ else if (hasContextKey && contextInput.length > 0) { formJson.context = contextInput; formJson.generation_type = 'context'; - } - else { + } else { formJson.generation_type = 'scratch'; } console.log('formJson', formJson); - // Run when the currentEvalName is provided if (currentEvalName && currentEvalName !== '') { const result = await chatAPI.EXPERIMENT_EDIT_GENERATION( @@ -495,9 +504,7 @@ export default function GenerateModal({ </TabPanel> {hasDocumentsKey && ( <TabPanel value={3} sx={{ p: 2, overflow: 'auto' }} keepMounted> - <DocsTab - experimentInfo={experimentInfo} - /> + <DocsTab experimentInfo={experimentInfo} /> {/* <PickADocumentMenu experimentInfo={experimentInfo} /> */} @@ -506,7 +513,10 @@ export default function GenerateModal({ )} {hasContextKey && ( <TabPanel value={3} sx={{ p: 2, overflow: 'auto' }} keepMounted> - <ContextTab contextInput={contextInput} setContextInput={setContextInput} /> + <ContextTab + contextInput={contextInput} + setContextInput={setContextInput} + /> </TabPanel> )} {hasDatasetKey && ( diff --git a/src/renderer/components/Experiment/Rag/PickADocumentMenu.tsx b/src/renderer/components/Experiment/Rag/PickADocumentMenu.tsx index 8ffd3ab2..9869263a 100644 --- a/src/renderer/components/Experiment/Rag/PickADocumentMenu.tsx +++ b/src/renderer/components/Experiment/Rag/PickADocumentMenu.tsx @@ -1,88 +1,42 @@ -import React, { useState } from 'react'; -import { Box, Typography } from '@mui/joy'; +import { Option, Select } from '@mui/joy'; +import { useState } from 'react'; import * as chatAPI from '../../../lib/transformerlab-api-sdk'; import useSWR from 'swr'; -import { FolderIcon, Check } from 'lucide-react'; - -const fetcher = (url: string) => fetch(url).then((res) => res.json()); - -interface PickADocumentMenuProps { - experimentInfo: any; - showFoldersOnly?: boolean; - setSelectedFiles: React.Dispatch<React.SetStateAction<string[]>>; - setSelectedFileNames: React.Dispatch<React.SetStateAction<string[]>>; -} +const fetcher = (url) => fetch(url).then((res) => res.json()); export default function PickADocumentMenu({ + name, experimentInfo, showFoldersOnly = false, - setSelectedFiles, - setSelectedFileNames, -}: PickADocumentMenuProps) { - const { data: rows, isLoading } = useSWR( - chatAPI.Endpoints.Documents.List(experimentInfo?.id, ''), - fetcher - ); +}) { + const { + data: rows, + isLoading, + mutate, + } = useSWR(chatAPI.Endpoints.Documents.List(experimentInfo?.id, ''), fetcher); - // State for selected items (by unique id) - const [selectedIds, setSelectedIds] = useState<Set<string>>(new Set()); + const [selected, setSelected] = useState([]); - const toggleSelect = (id: string, filePath: string, fileName: string) => { - const newSelected = new Set(selectedIds); - if (selectedIds.has(id)) { - newSelected.delete(id); - setSelectedFiles((prevFiles) => prevFiles.filter((path) => path !== filePath)); - setSelectedFileNames((prevNames) => prevNames.filter((name) => name !== fileName)); - } else { - newSelected.add(id); - setSelectedFiles((prevFiles) => [...prevFiles, filePath]); - setSelectedFileNames((prevNames) => [...prevNames, fileName]); - } - setSelectedIds(newSelected); - }; + function handleChange(event, newValue) { + console.log(newValue); + setSelected(newValue); + } return ( - <Box sx={{ border: '1px solid', borderColor: 'neutral.outlinedBorder', borderRadius: 'sm', p: 1 }}> - <Typography level="h6" mb={1}> - Pick {showFoldersOnly ? 'Folder' : 'File'} - </Typography> - {isLoading ? ( - <Typography>Loading...</Typography> - ) : ( - rows?.map((row: any, index: number) => { - // Use row.id if available; fallback to index. - const uniqueId = row.name ? row.name.toString() : `index-${index}`; - const isFolder = row?.type === 'folder'; - return ( - <Box key={uniqueId}> - <Box - onClick={() => toggleSelect(uniqueId, row?.path || '', row?.name || '')} - sx={{ - display: 'flex', - alignItems: 'center', - p: 1, - my: 0.5, - borderRadius: 'sm', - cursor: 'pointer', - backgroundColor: selectedIds.has(uniqueId) ? 'primary.softHoverBg' : 'transparent', - '&:hover': { backgroundColor: 'primary.softHoverBg' }, - }} - > - {isFolder && <FolderIcon size="14px" />} - <Typography ml={isFolder ? 1 : 0}> - {row?.name || 'Unnamed'} - </Typography> - {selectedIds.has(uniqueId) && ( - <Check size="16px" style={{ marginLeft: 'auto', color: 'green' }} /> - )} - </Box> - </Box> - ); - }) - )} - {!isLoading && (!rows || rows.length === 0) && ( - <Typography>No documents found</Typography> + <Select multiple onChange={handleChange} value={selected} name={name}> + {rows?.map((row) => + showFoldersOnly ? ( + row?.type === 'folder' && ( + <Option key={row.name} value={row.name}> + {row.name} + </Option> + ) + ) : ( + <Option key={row.name} value={row.name}> + {row.name} + </Option> + ) )} - </Box> + </Select> ); } -- GitLab