diff --git a/packages/client/src/components/navigationDrawer/CreateDatasetDialogButton.tsx b/packages/client/src/components/navigationDrawer/CreateDatasetDialogButton.tsx index 91d16c81..2d31d784 100644 --- a/packages/client/src/components/navigationDrawer/CreateDatasetDialogButton.tsx +++ b/packages/client/src/components/navigationDrawer/CreateDatasetDialogButton.tsx @@ -14,10 +14,11 @@ import { Typography } from "@material-ui/core"; import gql from "graphql-tag"; -import { useApolloClient, useMutation } from "@apollo/client"; -import { TreeItem } from "@material-ui/lab"; +import { useApolloClient, useMutation, useQuery } from "@apollo/client"; +import { Autocomplete, TreeItem } from "@material-ui/lab"; import { makeStyles } from "@material-ui/core/styles"; import { CloudDownload, ControlPoint, Create, RemoveCircleOutline } from "@material-ui/icons"; +import { GetValidLabels } from "./__generated__/GetValidLabels"; const useStyles = makeStyles((theme) => ({ link: { @@ -62,6 +63,12 @@ enum CreateState { Done } +const GET_VALID_LABELS = gql` + query GetValidLabels { + validLabels + } +`; + const CREATE_DATASET_MUTATION = gql` mutation CreateDataset($classes: [String!]!, $maxImages: Int!) { createDataset(classes: $classes, maxImages: $maxImages) { @@ -76,6 +83,7 @@ export default function CreateDatasetDialogButton(): ReactElement { const classes = useStyles(); const [open, setOpen] = React.useState(false); const [keys, setKeys] = React.useState([""]); + const [inputs, setInputs] = React.useState([""]); const [errors, setErrors] = React.useState([false]); const [maxNumber, setMaxNumber] = React.useState(0); const [numberError, setNumberError] = React.useState(false); @@ -84,6 +92,14 @@ export default function CreateDatasetDialogButton(): ReactElement { const [createState, setCreateState] = React.useState(CreateState.Entering); const apolloClient = useApolloClient(); + const { data, loading } = useQuery(GET_VALID_LABELS); + console.log(data); + const labelOptions = data + ? data.validLabels + : loading + ? ["Loading Class Suggestions"] + : ["Error w/ Class Suggestions"]; + const [createDataset] = useMutation(CREATE_DATASET_MUTATION, { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore @@ -102,6 +118,7 @@ export default function CreateDatasetDialogButton(): ReactElement { const handleClose = () => { setKeys([""]); + setInputs([""]); setErrors([false]); setCreateID(""); setMaxNumber(0); @@ -111,6 +128,7 @@ export default function CreateDatasetDialogButton(): ReactElement { }; const handleFailed = () => { setKeys([""]); + setInputs([""]); setErrors([false]); setCreateID(""); setMaxNumber(0); @@ -120,18 +138,30 @@ export default function CreateDatasetDialogButton(): ReactElement { const append = () => { const test: string[] = [...keys]; setKeys(test.concat([""])); + const testInputs: string[] = [...inputs]; + setInputs(testInputs.concat([""])); const testErrors: boolean[] = [...errors]; setErrors(testErrors.concat([false])); }; const update = (index: number, element: string) => { const test: string[] = [...keys]; + console.log(element); test[index] = element; setKeys(test); }; + const updateInputs = (index: number, element: string) => { + const test: string[] = [...inputs]; + console.log(element); + test[index] = element; + setInputs(test); + }; const remove = (index: number) => { const test: string[] = [...keys]; test.splice(index, 1); setKeys(test); + const testInputs: string[] = [...inputs]; + testInputs.splice(index, 1); + setInputs(testInputs); const testErrors: boolean[] = [...errors]; testErrors.splice(index, 1); setErrors(testErrors); @@ -141,7 +171,8 @@ export default function CreateDatasetDialogButton(): ReactElement { let error = false; const testErrors: boolean[] = [...errors]; for (let i = 0; i < keys.length; i++) { - testErrors[i] = keys[i].length === 0; + testErrors[i] = keys[i].length === 0 && inputs[i].length === 0; + console.log(keys[i] + " " + inputs[i]); error = error || testErrors[i]; } setErrors(testErrors); @@ -212,12 +243,27 @@ export default function CreateDatasetDialogButton(): ReactElement { )} - update(index, event.target.value)} - className={classes.textfield} + { + updateInputs(index, newInputValue); + console.log(newInputValue); + }} + onChange={(event, newValue) => { + update(index, newValue as string); + console.log(newValue as string); + }} + renderInput={(params) => ( + + )} /> diff --git a/packages/server/src/datasources/dataset-service.ts b/packages/server/src/datasources/dataset-service.ts index 42729aa9..73dc3e1a 100644 --- a/packages/server/src/datasources/dataset-service.ts +++ b/packages/server/src/datasources/dataset-service.ts @@ -204,6 +204,11 @@ export class DatasetService extends DataSource { fs.createReadStream(savePath).pipe(unzipper.Extract({ path: savePath.replace(".zip", "") })); } + async getValidLabels(): Promise { + const buffer = await fs.promises.readFile("src/assets/valid_labels.json"); + return JSON.parse(buffer.toString()); + } + async reset(): Promise { const datasets = await this.getDatasets(); for (const dataset of datasets) { diff --git a/packages/server/src/resolvers/Query.ts b/packages/server/src/resolvers/Query.ts index 85ab6a4c..09ec3e4f 100644 --- a/packages/server/src/resolvers/Query.ts +++ b/packages/server/src/resolvers/Query.ts @@ -36,5 +36,8 @@ export const Query: QueryResolvers = { }, testjobs: (_, args, { dataSources }) => { return dataSources.projectService.getTestjobs(); + }, + validLabels: (_, args, { dataSources }) => { + return dataSources.datasetService.getValidLabels(); } }; diff --git a/packages/server/src/schema/schema.graphql b/packages/server/src/schema/schema.graphql index b3f328f3..6603d0c1 100644 --- a/packages/server/src/schema/schema.graphql +++ b/packages/server/src/schema/schema.graphql @@ -15,6 +15,7 @@ type Query { testjobs: [Testjob!]! projects: [Project!]! dockerState: DockerState! + validLabels: [String!]! } type Mutation { diff --git a/packages/server/src/store/index.ts b/packages/server/src/store/index.ts index ba040897..d0b3db45 100644 --- a/packages/server/src/store/index.ts +++ b/packages/server/src/store/index.ts @@ -194,6 +194,29 @@ export class Project extends Model }; } +interface DatasetCreatorAttributes { + name: string; +} + +type DatasetCreatorCreationAttributes = Optional; + +export class DatasetCreator extends Model + implements DatasetCreatorAttributes { + name: string; +} + +DatasetCreator.init( + { + name: { + type: new DataTypes.STRING(), + allowNull: false + } + }, + { + sequelize + } +); + Dataset.init( { id: {