Compare commits
1 Commits
main
...
feature/XL
| Author | SHA1 | Date |
|---|---|---|
|
|
8bdd79e8f1 |
|
|
@ -32,7 +32,7 @@ class File_DocumentLoaders implements INode {
|
||||||
this.type = 'Document'
|
this.type = 'Document'
|
||||||
this.icon = 'file.svg'
|
this.icon = 'file.svg'
|
||||||
this.category = 'Document Loaders'
|
this.category = 'Document Loaders'
|
||||||
this.description = `A generic file loader that can load txt, json, csv, docx, pdf, and other files`
|
this.description = `A generic file loader that can load different file types`
|
||||||
this.baseClasses = [this.type]
|
this.baseClasses = [this.type]
|
||||||
this.inputs = [
|
this.inputs = [
|
||||||
{
|
{
|
||||||
|
|
@ -214,6 +214,11 @@ class File_DocumentLoaders implements INode {
|
||||||
json: (blob) => new JSONLoader(blob),
|
json: (blob) => new JSONLoader(blob),
|
||||||
jsonl: (blob) => new JSONLinesLoader(blob, '/' + pointerName.trim()),
|
jsonl: (blob) => new JSONLinesLoader(blob, '/' + pointerName.trim()),
|
||||||
txt: (blob) => new TextLoader(blob),
|
txt: (blob) => new TextLoader(blob),
|
||||||
|
html: (blob) => new TextLoader(blob),
|
||||||
|
css: (blob) => new TextLoader(blob),
|
||||||
|
js: (blob) => new TextLoader(blob),
|
||||||
|
xml: (blob) => new TextLoader(blob),
|
||||||
|
md: (blob) => new TextLoader(blob),
|
||||||
csv: (blob) => new CSVLoader(blob),
|
csv: (blob) => new CSVLoader(blob),
|
||||||
xls: (blob) => new LoadOfSheet(blob),
|
xls: (blob) => new LoadOfSheet(blob),
|
||||||
xlsx: (blob) => new LoadOfSheet(blob),
|
xlsx: (blob) => new LoadOfSheet(blob),
|
||||||
|
|
@ -301,6 +306,8 @@ const getOverrideFileInputs = (nodeData: INodeData) => {
|
||||||
const jsonlinesFileBase64 = nodeData.inputs?.jsonlinesFile as string
|
const jsonlinesFileBase64 = nodeData.inputs?.jsonlinesFile as string
|
||||||
const docxFileBase64 = nodeData.inputs?.docxFile as string
|
const docxFileBase64 = nodeData.inputs?.docxFile as string
|
||||||
const yamlFileBase64 = nodeData.inputs?.yamlFile as string
|
const yamlFileBase64 = nodeData.inputs?.yamlFile as string
|
||||||
|
const excelFileBase64 = nodeData.inputs?.excelFile as string
|
||||||
|
const powerpointFileBase64 = nodeData.inputs?.powerpointFile as string
|
||||||
|
|
||||||
const removePrefix = (storageFile: string): string[] => {
|
const removePrefix = (storageFile: string): string[] => {
|
||||||
const fileName = storageFile.replace('FILE-STORAGE::', '')
|
const fileName = storageFile.replace('FILE-STORAGE::', '')
|
||||||
|
|
@ -333,6 +340,12 @@ const getOverrideFileInputs = (nodeData: INodeData) => {
|
||||||
if (yamlFileBase64) {
|
if (yamlFileBase64) {
|
||||||
files.push(...removePrefix(yamlFileBase64))
|
files.push(...removePrefix(yamlFileBase64))
|
||||||
}
|
}
|
||||||
|
if (excelFileBase64) {
|
||||||
|
files.push(...removePrefix(excelFileBase64))
|
||||||
|
}
|
||||||
|
if (powerpointFileBase64) {
|
||||||
|
files.push(...removePrefix(powerpointFileBase64))
|
||||||
|
}
|
||||||
|
|
||||||
return files.length ? `FILE-STORAGE::${JSON.stringify(files)}` : ''
|
return files.length ? `FILE-STORAGE::${JSON.stringify(files)}` : ''
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1070,7 +1070,17 @@ export const mapMimeTypeToInputField = (mimeType: string) => {
|
||||||
case 'text/jsonl':
|
case 'text/jsonl':
|
||||||
return 'jsonlinesFile'
|
return 'jsonlinesFile'
|
||||||
case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
|
case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
|
||||||
|
case 'application/msword': {
|
||||||
return 'docxFile'
|
return 'docxFile'
|
||||||
|
}
|
||||||
|
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
|
||||||
|
case 'application/vnd.ms-excel': {
|
||||||
|
return 'excelFile'
|
||||||
|
}
|
||||||
|
case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
|
||||||
|
case 'application/vnd.ms-powerpoint': {
|
||||||
|
return 'powerpointFile'
|
||||||
|
}
|
||||||
case 'application/vnd.yaml':
|
case 'application/vnd.yaml':
|
||||||
case 'application/x-yaml':
|
case 'application/x-yaml':
|
||||||
case 'text/vnd.yaml':
|
case 'text/vnd.yaml':
|
||||||
|
|
@ -1091,6 +1101,19 @@ export const mapMimeTypeToExt = (mimeType: string) => {
|
||||||
switch (mimeType) {
|
switch (mimeType) {
|
||||||
case 'text/plain':
|
case 'text/plain':
|
||||||
return 'txt'
|
return 'txt'
|
||||||
|
case 'text/html':
|
||||||
|
return 'html'
|
||||||
|
case 'text/css':
|
||||||
|
return 'css'
|
||||||
|
case 'text/javascript':
|
||||||
|
case 'application/javascript':
|
||||||
|
return 'js'
|
||||||
|
case 'text/xml':
|
||||||
|
case 'application/xml':
|
||||||
|
return 'xml'
|
||||||
|
case 'text/markdown':
|
||||||
|
case 'text/x-markdown':
|
||||||
|
return 'md'
|
||||||
case 'application/pdf':
|
case 'application/pdf':
|
||||||
return 'pdf'
|
return 'pdf'
|
||||||
case 'application/json':
|
case 'application/json':
|
||||||
|
|
@ -1109,6 +1132,10 @@ export const mapMimeTypeToExt = (mimeType: string) => {
|
||||||
return 'xls'
|
return 'xls'
|
||||||
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
|
case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
|
||||||
return 'xlsx'
|
return 'xlsx'
|
||||||
|
case 'application/vnd.ms-powerpoint':
|
||||||
|
return 'ppt'
|
||||||
|
case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
|
||||||
|
return 'pptx'
|
||||||
default:
|
default:
|
||||||
return ''
|
return ''
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ export const createFileAttachment = async (req: Request) => {
|
||||||
content
|
content
|
||||||
})
|
})
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new Error(`Failed operation: createFileAttachment - ${getErrorMessage(error)}`)
|
throw new Error(`Failed createFileAttachment: ${file.originalname} (${file.mimetype} - ${getErrorMessage(error)}`)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,18 +23,20 @@ const message = `Uploaded files will be parsed as strings and sent to the LLM. I
|
||||||
Refer <a href='https://docs.flowiseai.com/using-flowise/uploads#files' target='_blank'>docs</a> for more details.`
|
Refer <a href='https://docs.flowiseai.com/using-flowise/uploads#files' target='_blank'>docs</a> for more details.`
|
||||||
|
|
||||||
const availableFileTypes = [
|
const availableFileTypes = [
|
||||||
{ name: 'CSS', ext: 'text/css' },
|
{ name: 'CSS', ext: 'text/css', extension: '.css' },
|
||||||
{ name: 'CSV', ext: 'text/csv' },
|
{ name: 'CSV', ext: 'text/csv', extension: '.csv' },
|
||||||
{ name: 'HTML', ext: 'text/html' },
|
{ name: 'HTML', ext: 'text/html', extension: '.html' },
|
||||||
{ name: 'JSON', ext: 'application/json' },
|
{ name: 'JSON', ext: 'application/json', extension: '.json' },
|
||||||
{ name: 'YAML', ext: 'application/x-yaml' },
|
{ name: 'Markdown', ext: 'text/markdown', extension: '.md' },
|
||||||
{ name: 'Markdown', ext: 'text/markdown' },
|
{ name: 'YAML', ext: 'application/x-yaml', extension: '.yaml' },
|
||||||
{ name: 'PDF', ext: 'application/pdf' },
|
{ name: 'PDF', ext: 'application/pdf', extension: '.pdf' },
|
||||||
{ name: 'SQL', ext: 'application/sql' },
|
{ name: 'SQL', ext: 'application/sql', extension: '.sql' },
|
||||||
{ name: 'Text File', ext: 'text/plain' },
|
{ name: 'Text File', ext: 'text/plain', extension: '.txt' },
|
||||||
{ name: 'XML', ext: 'application/xml' },
|
{ name: 'XML', ext: 'application/xml', extension: '.xml' },
|
||||||
{ name: 'DOC', ext: 'application/msword' },
|
{ name: 'DOC', ext: 'application/msword', extension: '.doc' },
|
||||||
{ name: 'DOCX', ext: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' }
|
{ name: 'DOCX', ext: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', extension: '.docx' },
|
||||||
|
{ name: 'XLSX', ext: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', extension: '.xlsx' },
|
||||||
|
{ name: 'PPTX', ext: 'application/vnd.openxmlformats-officedocument.presentationml.presentation', extension: '.pptx' }
|
||||||
]
|
]
|
||||||
|
|
||||||
const FileUpload = ({ dialogProps }) => {
|
const FileUpload = ({ dialogProps }) => {
|
||||||
|
|
@ -222,30 +224,45 @@ const FileUpload = ({ dialogProps }) => {
|
||||||
onChange={handleAllowedFileTypesChange}
|
onChange={handleAllowedFileTypesChange}
|
||||||
/>
|
/>
|
||||||
<label htmlFor={fileType.ext} style={{ marginLeft: 10 }}>
|
<label htmlFor={fileType.ext} style={{ marginLeft: 10 }}>
|
||||||
{fileType.name} ({fileType.ext})
|
{fileType.name} ({fileType.extension})
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Box sx={{ marginBottom: 3 }}>
|
{allowedFileTypes.includes('application/pdf') && fullFileUpload && (
|
||||||
<Typography sx={{ fontSize: 14, fontWeight: 500, marginBottom: 1 }}>PDF Usage</Typography>
|
<Box
|
||||||
<FormControl disabled={!fullFileUpload}>
|
sx={{
|
||||||
<RadioGroup name='pdf-usage' value={pdfUsage} onChange={handlePdfUsageChange}>
|
borderRadius: 2,
|
||||||
<FormControlLabel value='perPage' control={<Radio />} label='One document per page' />
|
border: '1px solid #e0e0e0',
|
||||||
<FormControlLabel value='perFile' control={<Radio />} label='One document per file' />
|
backgroundColor: '#fafafa',
|
||||||
</RadioGroup>
|
padding: 3,
|
||||||
</FormControl>
|
marginBottom: 3,
|
||||||
</Box>
|
marginTop: 2
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Typography sx={{ fontSize: 16, fontWeight: 600, marginBottom: 2, color: '#424242' }}>PDF Configuration</Typography>
|
||||||
|
|
||||||
<Box sx={{ marginBottom: 3 }}>
|
<Box>
|
||||||
<SwitchInput
|
<Typography sx={{ fontSize: 14, fontWeight: 500, marginBottom: 1 }}>PDF Usage</Typography>
|
||||||
label='Use Legacy Build (for PDF compatibility issues)'
|
<FormControl disabled={!fullFileUpload}>
|
||||||
onChange={handleLegacyBuildChange}
|
<RadioGroup name='pdf-usage' value={pdfUsage} onChange={handlePdfUsageChange}>
|
||||||
value={pdfLegacyBuild}
|
<FormControlLabel value='perPage' control={<Radio />} label='One document per page' />
|
||||||
disabled={!fullFileUpload}
|
<FormControlLabel value='perFile' control={<Radio />} label='One document per file' />
|
||||||
/>
|
</RadioGroup>
|
||||||
</Box>
|
</FormControl>
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<Box>
|
||||||
|
<SwitchInput
|
||||||
|
label='Use Legacy Build (for PDF compatibility issues)'
|
||||||
|
onChange={handleLegacyBuildChange}
|
||||||
|
value={pdfLegacyBuild}
|
||||||
|
disabled={!fullFileUpload}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
)}
|
||||||
|
|
||||||
<StyledButton style={{ marginBottom: 10, marginTop: 20 }} variant='contained' onClick={onSave}>
|
<StyledButton style={{ marginBottom: 10, marginTop: 20 }} variant='contained' onClick={onSave}>
|
||||||
Save
|
Save
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue