diff --git a/src/actions/dataset.js b/src/actions/dataset.js index 97297d0..6894e55 100644 --- a/src/actions/dataset.js +++ b/src/actions/dataset.js @@ -69,7 +69,7 @@ export function receiveDatasets(type, json) { }; } -export function fetchDatasets(when, date, limit = "5") { +export function fetchDatasets(when, date, limit = 5) { let url = `${config.hostname}/clowder/api/datasets?superAdmin=true&limit=${limit}`; if (date) url = `${url}&date=${date}`; if (when) url = `${url}&when=${when}`; diff --git a/src/actions/file.js b/src/actions/file.js index f3efef6..62bf995 100644 --- a/src/actions/file.js +++ b/src/actions/file.js @@ -3,7 +3,8 @@ import {getHeader} from "../utils/common"; export const RECEIVE_FILE_METADATA = "RECEIVE_FILE_METADATA"; -export function receiveFileMetadata(type, json){ + +export function receiveFileMetadata(type, json) { return (dispatch) => { dispatch({ type: type, @@ -12,6 +13,7 @@ export function receiveFileMetadata(type, json){ }); }; } + export function fetchFileMetadata(id) { let url = `${config.hostname}/clowder/api/files/${id}/metadata?superAdmin=true`; return (dispatch) => { diff --git a/src/app.config.js b/src/app.config.ts similarity index 60% rename from src/app.config.js rename to src/app.config.ts index 0c4e97f..1123b00 100644 --- a/src/app.config.js +++ b/src/app.config.ts @@ -1,10 +1,16 @@ -let config = {}; +interface Config{ + hostname: string; + apikey: string; +} + +let config:Config = {}; + let hostname = process.env.CLOWDER_REMOTE_HOSTNAME || ""; // TODO when add auth piece remove this env let apikey = process.env.APIKEY; config["hostname"] = hostname; -config["apikey"] = apikey; +config["apikey"] = apikey ?? ""; export default config; diff --git a/src/components/Dashbard.jsx b/src/components/Dashbard.tsx similarity index 93% rename from src/components/Dashbard.jsx rename to src/components/Dashbard.tsx index 90061f3..9a24b61 100644 --- a/src/components/Dashbard.jsx +++ b/src/components/Dashbard.tsx @@ -7,16 +7,16 @@ import DeleteOutlineIcon from "@material-ui/icons/DeleteOutline"; import StarBorderIcon from "@material-ui/icons/StarBorder"; import CloudDownloadOutlinedIcon from "@material-ui/icons/CloudDownloadOutlined"; -import CreateDataset from "./childComponents/CreateDataset"; +import CreateDataset from "./datasets/CreateDataset"; import {downloadDataset} from "../utils/dataset"; import {useDispatch, useSelector} from "react-redux"; import {deleteDataset as deleteDatasetAction, fetchDatasets} from "../actions/dataset"; import {downloadThumbnail} from "../utils/thumbnail"; -import TopBar from "./childComponents/TopBar"; -import Breadcrumbs from "./childComponents/BreadCrumb"; +import TopBar from "./navigation/TopBar"; +import {BreadCrumb} from "./navigation/BreadCrumb"; -const useStyles = makeStyles((theme) => ({ +const useStyles = makeStyles(() => ({ appBar: { background: "#FFFFFF", boxShadow: "none", @@ -63,18 +63,18 @@ const useStyles = makeStyles((theme) => ({ } })); -export default function Dashboard(props) { +export default function Dashboard() { const classes = useStyles(); const dispatch = useDispatch(); - const deleteDataset = (datasetId) => dispatch(deleteDatasetAction(datasetId)); - const listDatasets = (when, date, limit) => dispatch(fetchDatasets(when, date, limit)); + const deleteDataset = (datasetId:string) => dispatch(deleteDatasetAction(datasetId)); + const listDatasets = (when:string|null, date:string|null, limit:number|undefined) => dispatch(fetchDatasets(when, date, limit)); const datasets = useSelector((state) => state.dataset.datasets); const [lastDataset, setLastDataset] = useState([]); const [firstDataset, setFirstDataset] = useState([]); - const [limit, setLimit] = useState(5); + const [limit, _] = useState(5); const [selectedTabIndex, setSelectedTabIndex] = useState(0); const [open, setOpen] = React.useState(false); const [datasetThumbnailList, setDatasetThumbnailList] = useState([]); @@ -116,7 +116,7 @@ export default function Dashboard(props) { if (date) listDatasets("a", date.toISOString(), limit); } - const handleTabChange = (event, newTabIndex) => { + const handleTabChange = (event, newTabIndex:number) => { setSelectedTabIndex(newTabIndex); }; @@ -131,7 +131,7 @@ export default function Dashboard(props) { <>
- +
@@ -258,7 +258,7 @@ function TabPanel(props) { ); } -function a11yProps(index) { +function a11yProps(index:number) { return { id: `dashboard-tab-${index}`, "aria-controls": `dashboard-tabpanel-${index}`, diff --git a/src/components/childComponents/ActionCard.jsx b/src/components/childComponents/ActionCard.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/childComponents/BreadCrumb.jsx b/src/components/childComponents/BreadCrumb.jsx deleted file mode 100644 index 1c1e504..0000000 --- a/src/components/childComponents/BreadCrumb.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react'; -import MuiBreadcrumbs from "@mui/material/Breadcrumbs"; -import {Button} from "@mui/material"; -import {makeStyles} from "@material-ui/core/styles"; -import {useNavigate} from "react-router"; - -const useStyles = makeStyles((theme) => ({ - breadCrumb: { - padding: "28px" - }, - breadCrumbText: { - fontStyle: "normal", - fontWeight: "600", - fontSize: "24px", - color: "#343A40" - }, - breadCrumbLink: { - fontStyle: "normal", - fontWeight: "600", - fontSize: "24px", - color: "#6C757D", - } -})); - -export default function Breadcrumbs(props) { - const classes = useStyles(); - const history = useNavigate(); - - const {paths} = props; - return ( -
- - { - paths.map((path, index) => { - if (index !== paths.length -1){ - return (); - } - else{ - return (); - } - }) - } - -
- ); -} diff --git a/src/components/childComponents/Followers.jsx b/src/components/childComponents/Followers.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/childComponents/Following.jsx b/src/components/childComponents/Following.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/childComponents/MySelections.jsx b/src/components/childComponents/MySelections.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/childComponents/UserInfoCard.jsx b/src/components/childComponents/UserInfoCard.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/src/components/childComponents/CreateDataset.jsx b/src/components/datasets/CreateDataset.tsx similarity index 56% rename from src/components/childComponents/CreateDataset.jsx rename to src/components/datasets/CreateDataset.tsx index 26c5309..791d6a6 100644 --- a/src/components/childComponents/CreateDataset.jsx +++ b/src/components/datasets/CreateDataset.tsx @@ -1,26 +1,29 @@ import React, {useState} from "react"; -import {Box, Button, Container} from "@material-ui/core"; - -import {makeStyles} from "@material-ui/core/styles"; +import {Box, Container} from "@material-ui/core"; import Form from "@rjsf/material-ui"; import datasetSchema from "../../schema/datasetSchema.json"; import {createDataset} from "../../utils/dataset"; import LoadingOverlay from "react-loading-overlay-ts"; import {useNavigate} from "react-router"; +import {FormProps} from "@rjsf/core"; +import {ClowderButton} from "../styledComponents/ClowderButton"; + -const useStyles = makeStyles(); +type Props = { + setOpen: any +} -export default function CreateDataset(props) { - const {setOpen, ...other} = props; +export default function CreateDataset(props: Props) { + const {setOpen} = props; const history = useNavigate(); - const [disabled, setDisabled] = useState(true); + // const [disabled, setDisabled] = useState(true); const [loading, setLoading] = useState(false); - const onSave = async (formData) => { + const onSave = async (formData:FormData) => { setLoading(true); const response = await createDataset(formData); @@ -40,10 +43,10 @@ export default function CreateDataset(props) { spinner text="Saving..." > -
{onSave(formData);}}> + ["schema"]} uiSchema={datasetSchema["uiSchema"]} // widgets={widgets} + onSubmit={({formData}, _) => {onSave(formData);}}> - + Create
diff --git a/src/components/Dataset.jsx b/src/components/datasets/Dataset.tsx similarity index 91% rename from src/components/Dataset.jsx rename to src/components/datasets/Dataset.tsx index 2b1e0ec..670365a 100644 --- a/src/components/Dataset.jsx +++ b/src/components/datasets/Dataset.tsx @@ -16,20 +16,20 @@ import { } from "@material-ui/core"; import DescriptionIcon from "@material-ui/icons/Description"; import ArrowDropDownIcon from "@material-ui/icons/ArrowDropDown"; -import UploadFile from "./childComponents/UploadFile"; +import UploadFile from "../files/UploadFile"; import DeleteOutlineIcon from "@material-ui/icons/DeleteOutline"; import StarBorderIcon from "@material-ui/icons/StarBorder"; import CloudDownloadOutlinedIcon from "@material-ui/icons/CloudDownloadOutlined"; -import {downloadDataset} from "../utils/dataset"; -import {downloadFile, fetchFileMetadata} from "../utils/file"; +import {downloadDataset} from "../../utils/dataset"; +import {downloadFile, fetchFileMetadata} from "../../utils/file"; import {useDispatch, useSelector} from "react-redux"; -import {deleteFile as deleteFileAction} from "../actions/file"; -import {deleteDataset as deleteDatasetAction, fetchDatasetAbout, fetchFilesInDataset} from "../actions/dataset"; +import {deleteFile as deleteFileAction} from "../../actions/file"; +import {deleteDataset as deleteDatasetAction, fetchDatasetAbout, fetchFilesInDataset} from "../../actions/dataset"; import {useNavigate, useParams} from "react-router"; -import {downloadThumbnail} from "../utils/thumbnail"; +import {downloadThumbnail} from "../../utils/thumbnail"; import {Link as RouterLink} from "react-router-dom"; -import TopBar from "./childComponents/TopBar"; -import Breadcrumbs from "./childComponents/BreadCrumb"; +import TopBar from "../navigation/TopBar"; +import {BreadCrumb} from "../navigation/BreadCrumb"; const useStyles = makeStyles((theme) => ({ appBar: { @@ -103,10 +103,10 @@ export default function Dataset() { const {datasetId} = useParams(); const dispatch = useDispatch(); - const listFilesInDataset = (datasetId) => dispatch(fetchFilesInDataset(datasetId)); - const listDatasetAbout = (datasetId) => dispatch(fetchDatasetAbout(datasetId)); - const deleteFile = (fileId) => dispatch(deleteFileAction(fileId)); - const deleteDataset = (datasetId) => dispatch(deleteDatasetAction(datasetId)); + const listFilesInDataset = (datasetId:string|undefined) => dispatch(fetchFilesInDataset(datasetId)); + const listDatasetAbout = (datasetId:string|undefined) => dispatch(fetchDatasetAbout(datasetId)); + const deleteFile = (fileId:string|undefined) => dispatch(deleteFileAction(fileId)); + const deleteDataset = (datasetId:string|undefined|null) => dispatch(deleteDatasetAction(datasetId)); const filesInDataset = useSelector((state) => state.dataset.files); const datasetAbout = useSelector((state) => state.dataset.about); @@ -142,11 +142,11 @@ export default function Dataset() { })(); }, [filesInDataset]) - const handleTabChange = (event, newTabIndex) => { + const handleTabChange = (_event: any, newTabIndex:number) => { setSelectedTabIndex(newTabIndex); }; - const handleOptionClick = (event) => { + const handleOptionClick = (event: { currentTarget: React.SetStateAction; }) => { setAnchorEl(event.currentTarget); }; @@ -169,7 +169,7 @@ export default function Dataset() { <>
- +
@@ -332,7 +332,7 @@ export default function Dataset() { ); } -function TabPanel(props) { +function TabPanel(props:any) { const {children, value, index, ...other} = props; return ( @@ -352,7 +352,7 @@ function TabPanel(props) { ); } -function a11yProps(index) { +function a11yProps(index:number) { return { id: `dataset-tab-${index}`, "aria-controls": `dataset-tabpanel-${index}`, diff --git a/src/components/File.jsx b/src/components/files/File.tsx similarity index 89% rename from src/components/File.jsx rename to src/components/files/File.tsx index 052a90e..99dc523 100644 --- a/src/components/File.jsx +++ b/src/components/files/File.tsx @@ -1,18 +1,18 @@ import React, {useEffect, useState} from "react"; -import config from "../app.config"; +import config from "../../app.config"; import {AppBar, Box, Grid, Tab, Tabs, Typography} from "@material-ui/core" import {makeStyles} from "@material-ui/core/styles"; -import Audio from "./previewers/Audio"; -import Video from "./previewers/Video"; -import {downloadResource} from "../utils/common"; -import Thumbnail from "./previewers/Thumbnail"; -import Html from "./previewers/Html"; +import Audio from "../previewers/Audio"; +import Video from "../previewers/Video"; +import {downloadResource} from "../../utils/common"; +import Thumbnail from "../previewers/Thumbnail"; +import Html from "../previewers/Html"; import {useDispatch, useSelector} from "react-redux"; import {useParams} from "react-router"; -import {fetchFileMetadata, fetchFileMetadataJsonld, fetchFilePreviews} from "../actions/file"; -import TopBar from "./childComponents/TopBar"; -import Breadcrumbs from "./childComponents/BreadCrumb"; -import {fetchDatasetAbout} from "../actions/dataset"; +import {fetchFileMetadata, fetchFileMetadataJsonld, fetchFilePreviews} from "../../actions/file"; +import TopBar from "../navigation/TopBar"; +import {BreadCrumb} from "../navigation/BreadCrumb"; +import {fetchDatasetAbout} from "../../actions/dataset"; import {useSearchParams} from "react-router-dom"; const useStyles = makeStyles(() => ({ @@ -35,14 +35,14 @@ export default function File() { // path parameter const {fileId} = useParams(); // search parameters - let [searchParams, setSearchParams] = useSearchParams(); + let [searchParams, _] = useSearchParams(); const datasetId = searchParams.get("datasetId"); const dispatch = useDispatch(); - const listFileMetadata = (fileId) => dispatch((fetchFileMetadata(fileId))); - const listFileMetadataJsonld = (fileId) => dispatch((fetchFileMetadataJsonld(fileId))); - const listFilePreviews = (fileId) => dispatch((fetchFilePreviews(fileId))); - const listDatasetAbout = (datasetId) => dispatch(fetchDatasetAbout(datasetId)); + const listFileMetadata = (fileId:string|undefined) => dispatch((fetchFileMetadata(fileId))); + const listFileMetadataJsonld = (fileId:string|undefined) => dispatch((fetchFileMetadataJsonld(fileId))); + const listFilePreviews = (fileId:string|undefined) => dispatch((fetchFilePreviews(fileId))); + const listDatasetAbout = (datasetId:string|undefined) => dispatch(fetchDatasetAbout(datasetId)); const fileMetadata = useSelector((state) => state.file.metadata); const fileMetadataJsonld = useSelector((state) => state.file.metadataJsonld); @@ -113,7 +113,7 @@ export default function File() { <>
- +
diff --git a/src/components/childComponents/UploadFile.jsx b/src/components/files/UploadFile.tsx similarity index 66% rename from src/components/childComponents/UploadFile.jsx rename to src/components/files/UploadFile.tsx index 4257723..77242aa 100644 --- a/src/components/childComponents/UploadFile.jsx +++ b/src/components/files/UploadFile.tsx @@ -1,21 +1,24 @@ import React, {useState} from "react"; -import {Box, Button, Container} from "@material-ui/core"; +import {Box, Container} from "@material-ui/core"; import LoadingOverlay from "react-loading-overlay-ts"; -import {makeStyles} from "@material-ui/core/styles"; import Form from "@rjsf/material-ui"; import {uploadFile} from "../../utils/file.js"; import fileSchema from "../../schema/fileSchema.json"; import {useNavigate} from "react-router"; +import {FormProps} from "@rjsf/core"; +import {ClowderButton} from "../styledComponents/ClowderButton"; -const useStyles = makeStyles(); +type Props = { + selectedDatasetId: string, + setOpen: any +} -export default function UploadFile(props) { +export default function UploadFile(props:Props) { const {selectedDatasetId, setOpen} = props; - const classes = useStyles(); // use history hook to redirect/navigate between routes const history = useNavigate(); @@ -23,7 +26,7 @@ export default function UploadFile(props) { const [loading, setLoading] = useState(false); - const onSave = async (formData) => { + const onSave = async (formData:FormData) => { setLoading(true); const response = await uploadFile(formData, selectedDatasetId); setLoading(false); @@ -44,10 +47,10 @@ export default function UploadFile(props) { spinner text="Saving..." > -
{onSave(formData);}}> + ["schema"]} uiSchema={fileSchema["uiSchema"]} + onSubmit={({formData}, _) => {onSave(formData);}}> - + Upload
diff --git a/src/components/navigation/BreadCrumb.tsx b/src/components/navigation/BreadCrumb.tsx new file mode 100644 index 0000000..3c4c3d7 --- /dev/null +++ b/src/components/navigation/BreadCrumb.tsx @@ -0,0 +1,28 @@ +import React from "react"; +import MuiBreadcrumbs from "@mui/material/Breadcrumbs"; +import {Button} from "@mui/material"; +import {useNavigate} from "react-router-dom"; + +type BreadCrumbProps = { + paths: any +} +export const BreadCrumb: React.FC = (props:BreadCrumbProps) => { + const { paths } = props; + const history = useNavigate(); + + return ( + + { + paths.map((path:any, index:number) => { + if (index !== paths.length -1){ + return (); + } + else{ + return (); + } + }) + } + + ); +}; diff --git a/src/components/childComponents/TopBar.jsx b/src/components/navigation/TopBar.tsx similarity index 84% rename from src/components/childComponents/TopBar.jsx rename to src/components/navigation/TopBar.tsx index eab8609..ab0ce69 100644 --- a/src/components/childComponents/TopBar.jsx +++ b/src/components/navigation/TopBar.tsx @@ -1,6 +1,6 @@ -import React from 'react'; -import {makeStyles} from '@material-ui/core/styles'; -import {AppBar, Link, Toolbar, Typography,} from '@material-ui/core'; +import React from "react"; +import {makeStyles} from "@material-ui/core/styles"; +import {AppBar, Link, Toolbar, Typography,} from "@material-ui/core"; const useStyles = makeStyles((theme) => ({ root: { @@ -39,7 +39,7 @@ export default function TopBar() {
- clowder-logo-sm + clowder-logo-sm Home diff --git a/src/components/previewers/Audio.jsx b/src/components/previewers/Audio.jsx deleted file mode 100644 index 19b052a..0000000 --- a/src/components/previewers/Audio.jsx +++ /dev/null @@ -1,6 +0,0 @@ -import React from "react"; - -export default function Audio(props) { - const {fileId, audioSrc, ...other} = props; - return -} diff --git a/src/components/previewers/Audio.tsx b/src/components/previewers/Audio.tsx new file mode 100644 index 0000000..0dbf171 --- /dev/null +++ b/src/components/previewers/Audio.tsx @@ -0,0 +1,11 @@ +import React from "react"; + +type Props = { + fileId: string, + audioSrc: string +} + +export default function Audio(props: Props) { + const {fileId, audioSrc} = props; + return +} diff --git a/src/components/previewers/Html.jsx b/src/components/previewers/Html.jsx deleted file mode 100644 index 92190bc..0000000 --- a/src/components/previewers/Html.jsx +++ /dev/null @@ -1,7 +0,0 @@ -import React from "react"; -import Link from "@material-ui/core/Link"; - -export default function Html(props) { - const {fileId, htmlSrc, ...other} = props; - return