diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..74f751a93 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,9 @@ +{ + "[typescript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/airavata-research-portal/.env.example b/airavata-research-portal/.env.example index 317e2248b..ea13fd78b 100644 --- a/airavata-research-portal/.env.example +++ b/airavata-research-portal/.env.example @@ -3,3 +3,4 @@ VITE_APP_URL=http://localhost:5173 VITE_API_VERSION=v1 VITE_CLIENT_ID= VITE_OPENID_CONFIG_URL= +VITE_ADMIN_EMAILS= diff --git a/airavata-research-portal/src/App.tsx b/airavata-research-portal/src/App.tsx index 4df295780..b1ae6bde9 100644 --- a/airavata-research-portal/src/App.tsx +++ b/airavata-research-portal/src/App.tsx @@ -1,46 +1,32 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import {useColorMode} from "./components/ui/color-mode"; -import {Route, Routes, useLocation, useNavigate} from "react-router"; +import { useColorMode } from "./components/ui/color-mode"; +import { Route, Routes, useLocation, useNavigate } from "react-router"; import Home from "./components/home"; -import {Models} from "./components/models"; -import {Datasets} from "./components/datasets"; +import { Models } from "./components/models"; +import { Datasets } from "./components/datasets"; import ResourceDetails from "./components/resources/ResourceDetails"; import Notebooks from "./components/notebooks"; import Repositories from "./components/repositories"; -import {Login} from "./components/auth/UserLoginPage"; +import { Login } from "./components/auth/UserLoginPage"; import ProtectedComponent from "./components/auth/ProtectedComponent"; -import {AuthProvider, AuthProviderProps} from "react-oidc-context"; -import {useEffect, useState} from "react"; +import { AuthProvider, AuthProviderProps } from "react-oidc-context"; +import { useEffect, useState } from "react"; import NavBarFooterLayout from "./layouts/NavBarFooterLayout"; -import {CybershuttleLanding} from "./components/home/CybershuttleLanding"; -import {APP_REDIRECT_URI, CLIENT_ID, OPENID_CONFIG_URL,} from "./lib/constants"; -import {WebStorageStateStore} from "oidc-client-ts"; -import {Resources} from "./components/resources"; -import {UserSet} from "./components/auth/UserSet"; -import {Toaster} from "./components/ui/toaster"; -import {Events} from "./components/events"; -import {AddRepoMaster} from "./components/add/AddRepoMaster"; -import {Add} from "./components/add"; -import {AddProjectMaster} from "./components/add/AddProjectMaster"; -import {StarredResourcesPage} from "@/components/resources/StarredResourcesPage.tsx"; +import { CybershuttleLanding } from "./components/home/CybershuttleLanding"; +import { + APP_REDIRECT_URI, + CLIENT_ID, + OPENID_CONFIG_URL, +} from "./lib/constants"; +import { WebStorageStateStore } from "oidc-client-ts"; +import { Resources } from "./components/resources"; +import { UserSet } from "./components/auth/UserSet"; +import { Toaster } from "./components/ui/toaster"; +import { Events } from "./components/events"; +import { AddRepoMaster } from "./components/add/AddRepoMaster"; +import { Add } from "./components/add"; +import { AddProjectMaster } from "./components/add/AddProjectMaster"; +import { StarredResourcesPage } from "@/components/resources/StarredResourcesPage.tsx"; +import { PendingResourcesSection } from "./components/resources/admin/PendingResourcesSection"; function App() { const colorMode = useColorMode(); @@ -74,7 +60,7 @@ function App() { userinfo_endpoint: data.userinfo_endpoint, jwks_uri: data.jwks_uri, }, - userStore: new WebStorageStateStore({store: window.localStorage}), + userStore: new WebStorageStateStore({ store: window.localStorage }), automaticSilentRenew: true, }; @@ -92,42 +78,50 @@ function App() { } return ( - <> - { - navigate(location.search, {replace: true}); - }} - > - - - - {/* Public Route */} - }> - }/> - }/> - }/> - }/> - }/> - }/> - }/> - }/> - }/> - + <> + { + navigate(location.search, { replace: true }); + }} + > + + + + {/* Public Route */} + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + {/* Protected Routes with Layout */} + } + > + } + /> + } /> + } /> + } /> + } /> - {/* Protected Routes with Layout */} } - > - }/> - }/> - }/> - }/> - }/> - - - - + path="/admin/pending-resources" + element={} + /> + + + + ); } diff --git a/airavata-research-portal/src/components/add/ConfirmRepoDetails.tsx b/airavata-research-portal/src/components/add/ConfirmRepoDetails.tsx index 360eda2f9..8ad90c96e 100644 --- a/airavata-research-portal/src/components/add/ConfirmRepoDetails.tsx +++ b/airavata-research-portal/src/components/add/ConfirmRepoDetails.tsx @@ -1,10 +1,11 @@ -import { PrivacyEnum } from "@/interfaces/PrivacyEnum"; -import { CreateResourceRequest } from "@/interfaces/Requests/CreateResourceRequest"; +import {PrivacyEnum} from "@/interfaces/PrivacyEnum"; +import {CreateResourceRequest} from "@/interfaces/Requests/CreateResourceRequest"; import api from "@/lib/api"; -import { CONTROLLER } from "@/lib/controller"; +import {CONTROLLER} from "@/lib/controller"; import { Button, Code, + createListCollection, Field, HStack, Input, @@ -13,11 +14,10 @@ import { Text, Textarea, VStack, - createListCollection, } from "@chakra-ui/react"; -import { toaster } from "../ui/toaster"; -import { useNavigate } from "react-router"; -import { useState } from "react"; +import {toaster} from "../ui/toaster"; +import {useNavigate} from "react-router"; +import {useState} from "react"; const privacyOptions = createListCollection({ items: Object.keys(PrivacyEnum).map((key) => ({ @@ -27,10 +27,10 @@ const privacyOptions = createListCollection({ }); export const ConfirmRepoDetails = ({ - createResourceRequest, - setCreateResourceRequest, - githubUrl, -}: { + createResourceRequest, + setCreateResourceRequest, + githubUrl, + }: { createResourceRequest: CreateResourceRequest; setCreateResourceRequest: (data: CreateResourceRequest) => void; githubUrl: string; @@ -42,8 +42,8 @@ export const ConfirmRepoDetails = ({ try { setLoading(true); await api.post( - `${CONTROLLER.resources}/repository?githubUrl=${githubUrl}`, - createResourceRequest + `${CONTROLLER.resources}/repository?githubUrl=${githubUrl}`, + createResourceRequest ); toaster.create({ @@ -52,7 +52,7 @@ export const ConfirmRepoDetails = ({ type: "success", }); navigate( - "/resources?resourceTypes=REPOSITORY%2CNOTEBOOK%2CDATASET%2CMODEL" + "/resources?resourceTypes=REPOSITORY%2CNOTEBOOK%2CDATASET%2CMODEL" ); } catch (error) { console.error("Error adding repository:", error); @@ -66,87 +66,89 @@ export const ConfirmRepoDetails = ({ } }; + console.log(createResourceRequest); + return ( - <> - - - To make any changes, please modify the cybershuttle.yml{" "} - file in your GitHub repository. - - - Repository Name - - - - Repository URL - - - - Description -