Skip to content

Commit e6724e8

Browse files
authored
1086 file UI component flag current files in datasets (#1103)
* Createda testing space and initial setup, need to figure fetch * Using a new filestructure system * Fetching folers from files also * File selector MVP complete * Cleaned out the UI and code * Extractor now has capability to use Fileselector widget * Cleanup * linting change * Option to only show files in dataset folder * Removing console log
1 parent c6ffa05 commit e6724e8

File tree

3 files changed

+117
-44
lines changed

3 files changed

+117
-44
lines changed

frontend/src/components/listeners/SubmitExtraction.tsx

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,13 @@ const widgets = {
4444
clowderFile: ClowderFileSelector,
4545
};
4646

47-
const uiSchema = {
48-
clowderFile: { "ui:widget": "FileSelector" },
49-
};
50-
5147
export default function SubmitExtraction(props: SubmitExtractionProps) {
5248
const { fileId, datasetId, open, infoOnly, handleClose, selectedExtractor } =
5349
props;
5450
const dispatch = useDispatch();
5551

52+
const uiSchema: any = {};
53+
5654
const submitFileExtraction = (
5755
fileId: string | undefined,
5856
extractorName: string | undefined,
@@ -80,6 +78,27 @@ export default function SubmitExtraction(props: SubmitExtractionProps) {
8078
}
8179
};
8280

81+
// The for loop is used to pass the datasetId to a widget if it is a clowderFile Widget
82+
if (
83+
selectedExtractor &&
84+
selectedExtractor["properties"] &&
85+
selectedExtractor["properties"]["parameters"] &&
86+
selectedExtractor["properties"]["parameters"]["schema"]
87+
) {
88+
const parameters = selectedExtractor["properties"]["parameters"]["schema"];
89+
for (const key in parameters) {
90+
// Check if field "format" present and equals "clowderFile"
91+
if (parameters[key].format && parameters[key].format === "clowderFile") {
92+
uiSchema[key] = {
93+
"ui:widget": "clowderFile",
94+
"ui:options": {
95+
datasetId: datasetId,
96+
},
97+
};
98+
}
99+
}
100+
}
101+
83102
const [activeStep, setActiveStep] = useState(0);
84103
const handleNext = () => {
85104
setActiveStep((prevActiveStep) => prevActiveStep + 1);
@@ -138,6 +157,7 @@ export default function SubmitExtraction(props: SubmitExtractionProps) {
138157
<Container>
139158
<Form
140159
widgets={widgets}
160+
uiSchema={uiSchema}
141161
schema={{
142162
properties: selectedExtractor["properties"][
143163
"parameters"

frontend/src/components/navigation/FileSelector.tsx

Lines changed: 86 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,41 @@ interface FSItem {
4747
content_type?: string;
4848
}
4949

50+
// Function to fetch children of a folder
51+
async function fetchFolderFiles(
52+
datasetid: string,
53+
folderId: string | undefined
54+
) {
55+
try {
56+
const response =
57+
await V2.DatasetsService.getDatasetFoldersAndFilesApiV2DatasetsDatasetIdFoldersAndFilesGet(
58+
datasetid,
59+
folderId,
60+
// TODO: Remove hardcoded values
61+
0,
62+
3000
63+
);
64+
const data = response.data;
65+
const FSItems: FSItem[] =
66+
data !== undefined
67+
? data.map((FSItem: any) => ({
68+
datasetId: datasetid,
69+
id: FSItem.id,
70+
label: FSItem.name,
71+
children: FSItem.object_type === "folder" ? [] : undefined,
72+
type: FSItem.object_type,
73+
content_type:
74+
FSItem.object_type !== "folder"
75+
? FSItem.content_type.main_type
76+
: undefined,
77+
}))
78+
: [];
79+
return FSItems;
80+
} catch (error) {
81+
console.error("Error fetching folders and files", error);
82+
}
83+
}
84+
5085
const RecursiveComponent: React.FC<RecursiveComponentProps> = ({
5186
item,
5287
depth = 0,
@@ -77,41 +112,6 @@ const RecursiveComponent: React.FC<RecursiveComponentProps> = ({
77112
}
78113
};
79114

80-
// Function to fetch children of a folder
81-
async function fetchFolderFiles(
82-
datasetid: string,
83-
folderId: string | undefined
84-
) {
85-
try {
86-
const response =
87-
await V2.DatasetsService.getDatasetFoldersAndFilesApiV2DatasetsDatasetIdFoldersAndFilesGet(
88-
datasetid,
89-
folderId,
90-
// TODO: Remove hardcoded values
91-
0,
92-
3000
93-
);
94-
const data = response.data;
95-
const FSItems: FSItem[] =
96-
data !== undefined
97-
? data.map((FSItem: any) => ({
98-
datasetId: datasetid,
99-
id: FSItem.id,
100-
label: FSItem.name,
101-
children: FSItem.object_type === "folder" ? [] : undefined,
102-
type: FSItem.object_type,
103-
content_type:
104-
FSItem.object_type !== "folder"
105-
? FSItem.content_type.main_type
106-
: undefined,
107-
}))
108-
: [];
109-
return FSItems;
110-
} catch (error) {
111-
console.error("Error fetching folders and files", error);
112-
}
113-
}
114-
115115
// Function to handle selection of folder or file
116116
const onSelect = () => {
117117
if (isFolderOrDataset) {
@@ -232,9 +232,49 @@ const FileSystemViewer: React.FC<{
232232
) : null;
233233
};
234234

235-
const FileSelector: React.FC<{ onChange: (fileId: string) => void }> = ({
236-
onChange,
237-
}) => {
235+
const DatasetFileViewer: React.FC<{
236+
onSelectFile: (fileId: string, fileName: string) => void;
237+
datasetId: string;
238+
}> = ({ onSelectFile, datasetId }) => {
239+
const [FSItems, setFSItems] = useState<FSItem[]>([]);
240+
241+
// Only display contents of the passed dataset
242+
useEffect(() => {
243+
fetchFolderFiles(datasetId, undefined).then((data) => {
244+
setFSItems(data);
245+
});
246+
}, [datasetId]);
247+
248+
return FSItems.length > 0 ? (
249+
<Box
250+
sx={{
251+
width: "100%",
252+
height: 360,
253+
maxWidth: 360,
254+
overflowY: "auto",
255+
overflowX: "auto",
256+
bgcolor: "background.paper",
257+
}}
258+
>
259+
<Typography variant="h6" sx={{ ml: 2, my: 2 }}>
260+
File Selector
261+
</Typography>
262+
{FSItems.map((FSItem) => (
263+
<RecursiveComponent
264+
key={FSItem.id}
265+
item={FSItem}
266+
onSelectFile={onSelectFile}
267+
/>
268+
))}
269+
</Box>
270+
) : null;
271+
};
272+
273+
const FileSelector: React.FC<{
274+
showOnlyDatasetFiles: boolean;
275+
datasetId: string | undefined;
276+
onChange: (fileId: string) => void;
277+
}> = ({ showOnlyDatasetFiles, datasetId, onChange }) => {
238278
const [open, setOpen] = useState(false);
239279
const [selectedFile, setSelectedFile] = useState<FileDetails>({
240280
fileId: "",
@@ -282,7 +322,14 @@ const FileSelector: React.FC<{ onChange: (fileId: string) => void }> = ({
282322
p: 4,
283323
}}
284324
>
285-
<FileSystemViewer onSelectFile={handleFileSelect} />
325+
{showOnlyDatasetFiles ? (
326+
<DatasetFileViewer
327+
onSelectFile={handleFileSelect}
328+
datasetId={datasetId as string}
329+
/>
330+
) : (
331+
<FileSystemViewer onSelectFile={handleFileSelect} />
332+
)}
286333
</Box>
287334
</Modal>
288335
</Box>

frontend/src/components/styledComponents/ClowderFileSelector.jsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@ export const ClowderFileSelector = (item) => {
66
const handleChange = (value) => {
77
item.onChange(value);
88
};
9+
const datasetId = item.options.datasetId;
10+
const showOnlyDatasetFiles = item.schema.showOnlyDatasetFiles ? true : false;
911
return (
1012
<>
1113
<ClowderInputLabel>{item.schema.title}</ClowderInputLabel>
12-
<FileSelectorButton onChange={handleChange} />
14+
<FileSelectorButton
15+
showOnlyDatasetFiles={showOnlyDatasetFiles}
16+
datasetId={datasetId}
17+
onChange={handleChange}
18+
/>
1319
</>
1420
);
1521
};

0 commit comments

Comments
 (0)