diff --git a/frontend/src/app/agents/page.jsx b/frontend/src/app/agents/page.jsx index cf12780..d5269ea 100644 --- a/frontend/src/app/agents/page.jsx +++ b/frontend/src/app/agents/page.jsx @@ -112,30 +112,32 @@ const AgentsPage = () => { topbarTitle="Agents" requiredButtons={["title", "add", "search"]} /> - {isMobile ? ( -
- - {sampleData.map((data, key) => { + +
+ + {isMobile && + sampleData.map((data, key) => { return ; })} -
- ) : ( -
- - - - - - - - + - - - +
+
NameEndpointTypeProxy NameDate Created
+ + + + + + + - - {sampleData.map((org, index) => { + + + + + + {!isMobile && + sampleData.map((org, index) => { return ( { ); })} - -
NameEndpointTypeProxy NameDate Created
-
- )} + + +
diff --git a/frontend/src/app/agents/styles.module.css b/frontend/src/app/agents/styles.module.css index 2c9f896..67caf4b 100644 --- a/frontend/src/app/agents/styles.module.css +++ b/frontend/src/app/agents/styles.module.css @@ -86,7 +86,15 @@ align-items: flex-start; gap: 12px; align-self: stretch; - overflow: auto; + display: none; +} +@media (max-width: 768px) { + .cardContainer { + display: flex; + } + .tableContainer { + display: none; + } } .searchBarContainer { display: flex; @@ -103,7 +111,6 @@ background-color: transparent; border: none; outline: none; - background-color: transparent; color: white; font-family: Inter; font-size: 16px; diff --git a/frontend/src/app/components/icons/hamburger.jsx b/frontend/src/app/components/icons/hamburger.jsx index 8ff361a..67d9c05 100644 --- a/frontend/src/app/components/icons/hamburger.jsx +++ b/frontend/src/app/components/icons/hamburger.jsx @@ -1,6 +1,6 @@ import React from "react"; -const hamburger = () => { +const hamburger = (props) => { return ( { height={24} viewBox="0 0 24 24" fill="none" + {...props} > diff --git a/frontend/src/app/components/navbar/Navbar.jsx b/frontend/src/app/components/navbar/Navbar.jsx index 9008eb9..1961f12 100644 --- a/frontend/src/app/components/navbar/Navbar.jsx +++ b/frontend/src/app/components/navbar/Navbar.jsx @@ -1,19 +1,99 @@ "use client"; -import React from "react"; +import React, { useState } from "react"; import styles from "./styles.module.css"; import NavLeft from "./navleft/Header"; import NavRight from "./navright/Profile"; import HamburgerIcon from "../../components/icons/hamburger"; import useIsMobile from "@/app/hooks/useIsMobile"; +import LogoIcon from "../icons/logo"; +import HomeIcon from "../icons/home"; +import OrganizationIcon from "../icons/organization"; +import ProjectIcon from "../icons/project"; +import UserIcon from "../icons/user"; +import RolesIcon from "../icons/roles"; +import CredentialsIcon from "../icons/credentials"; +import AgentIcon from "../icons/agent"; +import DownloadIcon from "../icons/download"; +import useNavigations from "@/app/hooks/useNagivation"; const Navbar = () => { + const [triggerDropDown, setTriggerDropDown] = useState(false); + const { + navToAgents, + navToCredentials, + navToProject, + navToRoles, + navToHome, + navToOrganization, + navToUsers, + } = useNavigations(); + const isMobile = useIsMobile(); return (
{/* Mobile Hamburger Button */}
- {isMobile && } +
+ setTriggerDropDown(!triggerDropDown)} + className={triggerDropDown ? styles.active : ""} + /> + {triggerDropDown && ( +
+
+
+
+ +
+
+

Internal Developer Platform

+

By Project Moonshot Inc.

+
+
+
+
+
+ +

Home

+
+
+ +

Organization

+
+
+ +

Project

+
+
+ +

Users

+
+
+ +

Roles

+
+
+ +

Credentials

+
+
+ +

Agents

+
+
+
+
+
+

Download ICTL v3

+ +
+
+
+
+ )} +
+
{/* Mobile Menu Button */} diff --git a/frontend/src/app/components/navbar/navleft/styles.module.css b/frontend/src/app/components/navbar/navleft/styles.module.css index a1570a0..09043f0 100644 --- a/frontend/src/app/components/navbar/navleft/styles.module.css +++ b/frontend/src/app/components/navbar/navleft/styles.module.css @@ -91,7 +91,7 @@ background: #2d3143; box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.25); position: absolute; - z-index: 1; + z-index: 4; top: 100%; margin-top: 8px; left: 0; diff --git a/frontend/src/app/components/navbar/navright/Profile.jsx b/frontend/src/app/components/navbar/navright/Profile.jsx index 942998f..b5b9181 100644 --- a/frontend/src/app/components/navbar/navright/Profile.jsx +++ b/frontend/src/app/components/navbar/navright/Profile.jsx @@ -18,35 +18,36 @@ const Profile = () => { {/* Profile Section */}
{/* Profile */} - {!isMobile && ( -
setOpen(!open)}> - {/* Username and Role*/} - {sampleData.map((data, index) => { - return ( -
-

{data.name}

-

{data.role}

-
- ); - })} - {/* User profile*/} -
-
- -
+
setOpen(!open)} + > + {/* Username and Role*/} + {sampleData.map((data, index) => { + return ( +
+

{data.name}

+

{data.role}

+
+ ); + })} + + {/* User profile*/} +
+
+
- )} +
{/* Mobile Ellipsis */} - {isMobile && ( -
setOpen(!open)} - > - -
- )} + +
setOpen(!open)} + > + +
{/* Dropdown */} {open && } diff --git a/frontend/src/app/components/navbar/navright/styles.module.css b/frontend/src/app/components/navbar/navright/styles.module.css index ab949f0..288f9d3 100644 --- a/frontend/src/app/components/navbar/navright/styles.module.css +++ b/frontend/src/app/components/navbar/navright/styles.module.css @@ -7,7 +7,8 @@ cursor: pointer; position: relative; } -.profileBadge { +.profileBadge, +.profileBadgeButton { display: flex; padding: 6px 0 6px 8px; justify-content: flex-end; @@ -153,6 +154,9 @@ .rotated { transform: rotate(90deg); } +.mobileEllipsis { + display: none; +} .mobileEllipsis.active { color: #959aff; } @@ -183,7 +187,9 @@ cursor: pointer; color: #85869b; } - + .profileBadgeButton { + display: none; + } .profileBadge { display: flex; padding: 12px 16px; diff --git a/frontend/src/app/components/navbar/styles.module.css b/frontend/src/app/components/navbar/styles.module.css index a834977..ad94451 100644 --- a/frontend/src/app/components/navbar/styles.module.css +++ b/frontend/src/app/components/navbar/styles.module.css @@ -9,14 +9,154 @@ } /* Mobile */ + +.hamburgerMenu { + display: none; + height: 61px; + padding-left: 16px; + align-items: center; + gap: 10px; + flex-shrink: 0; + cursor: pointer; +} +.active path { + color: #8187ff; +} +.dropDownMenu { + display: flex; + width: 100vw; + flex-direction: column; + align-items: center; + position: absolute; + background: linear-gradient(0deg, #2d3143 0%, #191a24 100%); + left: 0; + z-index: 2; + top: 60px; + animation-name: dropDownAnimation; + animation-duration: 200ms; +} +.headings { + display: flex; + padding: 32px 16px 16px 16px; + flex-direction: column; + align-items: center; + gap: 24px; + align-self: stretch; +} +.headings > div { + display: flex; + padding-right: 6px; + align-items: center; + gap: 8px; + align-self: stretch; +} +.logoContainer { + display: flex; + width: 50px; + height: 50px; + justify-content: center; + align-items: center; + gap: 9px; + aspect-ratio: 1/1; +} + +.info { + display: flex; + flex-direction: column; + justify-content: center; + align-items: flex-start; + gap: 4px; + flex: 1 0 0; +} + +.info p { + color: #85869b; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: normal; + letter-spacing: 0.07px; +} +.info > p:nth-child(1) { + color: #fff; + font-size: 18px; + font-weight: 500; + line-height: 18px; /* 100% */ +} +.navs { + display: flex; + padding: 16px 0; + flex-direction: column; + align-items: flex-start; + align-self: stretch; +} +.nav { + display: flex; + padding: 8px 16px; + align-items: center; + gap: 16px; + align-self: stretch; +} +.nav:hover { + background: rgba(149, 154, 255, 0.05); +} +.nav path { + stroke: #858699; +} +.nav:hover path { + stroke: #d2d3e0; +} +.nav p { + color: #d2d3e1; + font-size: 18px; + font-weight: 400; + line-height: normal; +} +.footer { + display: flex; + padding: 16px; + flex-direction: column; + align-items: flex-start; + gap: 10px; + align-self: stretch; +} +.footer > div { + display: flex; + padding: 12px 16px; + flex-direction: column; + align-items: flex-start; + gap: 24px; + align-self: stretch; + border-radius: 8px; + background: #1d1e2c; +} +.footer > div > div { + display: flex; + height: 24px; + justify-content: space-between; + align-items: center; + align-self: stretch; +} + +@keyframes dropDownAnimation { + 0% { + opacity: 0; + transform: translateY(-5%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} @media (max-width: 768px) { .mobileHamburger { display: flex; height: 61px; - padding-left: 16px; + align-items: center; gap: 10px; flex-shrink: 0; + position: relative; } .mainContainer { @@ -25,4 +165,7 @@ align-items: center; border-bottom: none; } + .hamburgerMenu { + display: flex; + } } diff --git a/frontend/src/app/components/sidebar/Sidebar.jsx b/frontend/src/app/components/sidebar/Sidebar.jsx index b10e182..79b6fc1 100644 --- a/frontend/src/app/components/sidebar/Sidebar.jsx +++ b/frontend/src/app/components/sidebar/Sidebar.jsx @@ -13,31 +13,19 @@ import AgentIcon from "../icons/agent"; import DownloadIcon from "../icons/download"; import LogoIcon from "../icons/logo"; import ArrowDownIcon from "../icons/arrowDown"; +import useNavigations from "@/app/hooks/useNagivation"; const Sidebar = () => { - const router = useRouter(); const [isCollapsed, setIsCollapsed] = useState(false); - const navToHome = () => { - router.push("/home"); - }; - const navToOrganization = () => { - router.push("/organization"); - }; - const navToProject = () => { - router.push("/projects"); - }; - const navToUsers = () => { - router.push("/users"); - }; - const navToRoles = () => { - router.push("/roles"); - }; - const navToCredentials = () => { - router.push("/credentials"); - }; - const navToAgents = () => { - router.push("/agents"); - }; + const { + navToAgents, + navToCredentials, + navToProject, + navToRoles, + navToHome, + navToOrganization, + navToUsers, + } = useNavigations(); const pathname = usePathname(); return ( diff --git a/frontend/src/app/components/topHeader/TopHeader.jsx b/frontend/src/app/components/topHeader/TopHeader.jsx index 3f83cac..2eb3cf9 100644 --- a/frontend/src/app/components/topHeader/TopHeader.jsx +++ b/frontend/src/app/components/topHeader/TopHeader.jsx @@ -171,7 +171,7 @@ const TopHeader = (props) => {
{triggerDropDownMenu && (
-
+
props?.setTriggerLogsModal?.(true)}>

View Logs

diff --git a/frontend/src/app/globals.css b/frontend/src/app/globals.css index 3bf291a..99ad07d 100644 --- a/frontend/src/app/globals.css +++ b/frontend/src/app/globals.css @@ -16,6 +16,7 @@ html, body { max-width: 100vw; overflow-x: hidden; + font-size: 16px; } body { @@ -55,7 +56,7 @@ a { } @media (max-width: 900px) { :root { - --table-font-size: 9px; + --table-font-size: 10px; } } @media (max-width: 500px) { diff --git a/frontend/src/app/hooks/useIsMobile.jsx b/frontend/src/app/hooks/useIsMobile.jsx index 32b0027..c174472 100644 --- a/frontend/src/app/hooks/useIsMobile.jsx +++ b/frontend/src/app/hooks/useIsMobile.jsx @@ -1,7 +1,7 @@ import { useState, useEffect } from "react"; export default function useIsMobile(breakpoint = 768) { - const [isMobile, setIsMobile] = useState(false); + const [isMobile, setIsMobile] = useState(true); useEffect(() => { const checkScreen = () => { diff --git a/frontend/src/app/hooks/useNagivation.jsx b/frontend/src/app/hooks/useNagivation.jsx new file mode 100644 index 0000000..c857141 --- /dev/null +++ b/frontend/src/app/hooks/useNagivation.jsx @@ -0,0 +1,36 @@ +import { useRouter } from "next/navigation"; +const useNavigations = () => { + const router = useRouter(); + const navToHome = () => { + router.push("/home"); + }; + const navToOrganization = () => { + router.push("/organization"); + }; + const navToProject = () => { + router.push("/projects"); + }; + const navToUsers = () => { + router.push("/users"); + }; + const navToRoles = () => { + router.push("/roles"); + }; + const navToCredentials = () => { + router.push("/credentials"); + }; + const navToAgents = () => { + router.push("/agents"); + }; + + return { + navToHome, + navToAgents, + navToCredentials, + navToOrganization, + navToProject, + navToRoles, + navToUsers, + }; +}; +export default useNavigations; diff --git a/frontend/src/app/organization/page.jsx b/frontend/src/app/organization/page.jsx index 8ea1c70..be07122 100644 --- a/frontend/src/app/organization/page.jsx +++ b/frontend/src/app/organization/page.jsx @@ -68,26 +68,26 @@ const OrganizationPage = () => { topbarTitle="Organization" requiredButtons={["title", "add", "search"]} /> - {isMobile ? ( -
- - {sampleData.map((data, key) => ( - - ))} -
- ) : ( -
- - - - - - - - - - {sampleData.map((org, index) => { +
+ + {isMobile && + sampleData.map((data, key) => )} +
+ +
+
Organization NameDate Created
+ + + + + + + + + + {!isMobile && + sampleData.map((org, index) => { return ( @@ -100,10 +100,9 @@ const OrganizationPage = () => { ); })} - -
Organization NameDate Created
{org.organizationName}
-
- )} + + +
diff --git a/frontend/src/app/organization/styles.module.css b/frontend/src/app/organization/styles.module.css index e9672e7..23c8fcd 100644 --- a/frontend/src/app/organization/styles.module.css +++ b/frontend/src/app/organization/styles.module.css @@ -61,4 +61,13 @@ gap: 12px; align-self: stretch; overflow: auto; + display: none; +} +@media (max-width: 768px) { + .cardContainer { + display: flex; + } + .tableContainer { + display: none; + } } diff --git a/frontend/src/app/projects/page.jsx b/frontend/src/app/projects/page.jsx index 02e20d9..5ea212b 100644 --- a/frontend/src/app/projects/page.jsx +++ b/frontend/src/app/projects/page.jsx @@ -181,33 +181,35 @@ const ProjectsPage = () => { topbarTitle="Project" requiredButtons={["title", "add", "search"]} /> - {isMobile ? ( -
- - {sampleData.map((data, key) => ( + +
+ + {isMobile && + sampleData.map((data, key) => ( router.push("/projects/view")} /> ))} -
- ) : ( -
- - - - - - - - - - - - - - {sampleData.map((project, index) => { + + +
+
NameVersionCPU Used/LimitMemory Used/LimitStorage Used/LimitDate Created
+ + + + + + + + + + + + + {!isMobile && + sampleData.map((project, index) => { return ( { ); })} - -
NameVersionCPU Used/LimitMemory Used/LimitStorage Used/LimitDate Created
-
- )} + + +
diff --git a/frontend/src/app/projects/styles.module.css b/frontend/src/app/projects/styles.module.css index e57aab3..c0047e3 100644 --- a/frontend/src/app/projects/styles.module.css +++ b/frontend/src/app/projects/styles.module.css @@ -92,4 +92,13 @@ gap: 12px; align-self: stretch; overflow: auto; + display: none; +} +@media (max-width: 768px) { + .cardContainer { + display: flex; + } + .tableContainer { + display: none; + } } diff --git a/frontend/src/app/projects/view/AddServicesModal/styles.module.css b/frontend/src/app/projects/view/AddServicesModal/styles.module.css index 19262a9..e6946f3 100644 --- a/frontend/src/app/projects/view/AddServicesModal/styles.module.css +++ b/frontend/src/app/projects/view/AddServicesModal/styles.module.css @@ -8,11 +8,13 @@ display: flex; align-items: center; justify-content: center; + padding: 5px; background-color: #00000037; } .modal { display: inline-flex; padding: 24px 24px 32px 24px; + flex-direction: column; align-items: flex-start; gap: 48px; @@ -70,7 +72,7 @@ } .content { display: flex; - width: 545px; + flex-direction: column; align-items: flex-start; gap: 16px; diff --git a/frontend/src/app/projects/view/[servicesId]/LogsModal/logsModas.jsx b/frontend/src/app/projects/view/[servicesId]/LogsModal/logsModas.jsx new file mode 100644 index 0000000..5563cdd --- /dev/null +++ b/frontend/src/app/projects/view/[servicesId]/LogsModal/logsModas.jsx @@ -0,0 +1,74 @@ +import CloseIcon from "@/app/components/icons/close"; +import React from "react"; +import styles from "./styles.module.css"; + +const LogsModal = (props) => { + return ( +
+
+
+
+
+

Server Logs: gateway-api

+
+ + + +

Connected

+
+
+
+ props?.setTriggerLogsModal?.(false)} + /> +
+
+
+
+
+ +

Auto Scroll

+
+
+ + + +

124 Lines

+
+
+
+
+
+ ); +}; + +export default LogsModal; diff --git a/frontend/src/app/projects/view/[servicesId]/LogsModal/styles.module.css b/frontend/src/app/projects/view/[servicesId]/LogsModal/styles.module.css new file mode 100644 index 0000000..4e575f9 --- /dev/null +++ b/frontend/src/app/projects/view/[servicesId]/LogsModal/styles.module.css @@ -0,0 +1,152 @@ +.modalContainer { + width: 100vw; + height: 100vh; + position: absolute; + z-index: 50; + left: 0; + top: 0; + display: flex; + align-items: center; + padding: 10px; + justify-content: center; + background-color: #0000004d; +} +.container { + display: flex; + flex-direction: column; + align-items: flex-start; + width: 100%; + max-width: 1200px; + border-radius: 6px; + background: #21232f; + height: 100%; + animation-name: dropDownAnimation; + animation-duration: 200ms; +} +@keyframes dropDownAnimation { + 0% { + opacity: 0; + transform: translateY(-5%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +.header { + display: flex; + padding: 12px 12px 12px 16px; + justify-content: space-between; + align-items: flex-start; + align-self: stretch; +} +.close { + cursor: pointer; +} +.statusContainer { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + flex: 1 0 0; +} +.statusContainer > div { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 6px; +} +.statusContainer > div > p { + display: flex; + justify-content: center; + align-items: center; + gap: 10px; + color: #d2d3e1; + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: normal; +} + +.statusContainer > div > div { + display: flex; + padding: 1px 6px; + justify-content: center; + align-items: center; + gap: 6px; + border-radius: 100px; + background: rgba(66, 180, 78, 0.1); +} +.statusContainer > div > div > p { + color: #72fd7f; + text-align: center; + font-feature-settings: + "liga" off, + "clig" off; + font-family: Inter; + font-size: 12px; + font-style: normal; + font-weight: 500; + line-height: 22px; /* 183.333% */ +} +.logContentContainer { + width: 100%; + background-color: rebeccapurple; + flex: 1; + overflow-y: auto; +} +.footer { + display: flex; + padding: 12px 16px; + align-items: center; + gap: 48px; + align-self: stretch; +} +.footer > div { + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; + flex: 1 0 0; +} +.autoScroll { + display: flex; + align-items: center; + gap: 12px; +} +.autoScroll input[type="checkbox"] { + accent-color: #5980f1; + height: 16px; + width: 16px; + background: white; +} + +.autoScroll p { + color: #fff; + + /* Base/Medium */ + font-family: Inter; + font-size: 0.9rem; + font-style: normal; + font-weight: 500; + line-height: 24px; /* 150% */ + letter-spacing: 0.08px; +} +.linesCount { + display: flex; + padding: 4px 8px; + justify-content: center; + align-items: center; + gap: 6px; + border-radius: 6px; + background: rgba(0, 101, 244, 0.1); +} +.linesCount p { + color: #fff; + font-family: Inter; + font-size: 0.9rem; + font-style: normal; + font-weight: 500; + line-height: 24px; + letter-spacing: 0.07px; +} diff --git a/frontend/src/app/projects/view/[servicesId]/page.jsx b/frontend/src/app/projects/view/[servicesId]/page.jsx index 0dc3ed6..a6b69b8 100644 --- a/frontend/src/app/projects/view/[servicesId]/page.jsx +++ b/frontend/src/app/projects/view/[servicesId]/page.jsx @@ -12,11 +12,13 @@ import CustomCheckbox from "@/app/components/checkbox/CheckBox"; import DeleteIcon from "@/app/components/icons/delete"; import SelectField from "@/app/components/select/SelectField"; import ActionButton from "@/app/components/actionButton/ActionButton"; +import LogsModal from "./LogsModal/logsModas"; const AddServices = () => { const [triggerVariableDropDown, setTriggerVariableDropDown] = useState(false); const [triggerAddVariable, setTriggerAddVariable] = useState(false); const [triggerAddVolume, setTriggerAddVolume] = useState(false); const [triggeAddConfigMap, setTriggerAddConfigMap] = useState(false); + const [triggerLogsModal, setTriggerLogsModal] = useState(false); const sampleData = [ { id: 1, key: "REQUEST_SERVICE_GRPC", value: "request-service:50053" }, { id: 1, key: "REQUEST_SERVICE_GRPC", value: "request-service:50053" }, @@ -27,6 +29,9 @@ const AddServices = () => { ]; return (
+ {triggerLogsModal && ( + + )} {triggerAddVariable && ( )} @@ -44,6 +49,7 @@ const AddServices = () => { state="view" topbarTitle="View Services" requiredButtons={["back", "title", "edit", "download"]} + setTriggerLogsModal={setTriggerLogsModal} />
diff --git a/frontend/src/app/projects/view/add-from-scratch/page.jsx b/frontend/src/app/projects/view/add-from-scratch/page.jsx index 0c3a0d1..1a4a182 100644 --- a/frontend/src/app/projects/view/add-from-scratch/page.jsx +++ b/frontend/src/app/projects/view/add-from-scratch/page.jsx @@ -3,18 +3,14 @@ import React, { useState } from "react"; import globalStyle from "@/app/globalStyle.module.css"; import TopHeader from "@/app/components/topHeader/TopHeader"; import styles from "./styles.module.css"; -import variableStyles from "./variableStyles.module.css"; -import TextField from "@/app/components/fields/textfield"; import AddVariableModal from "../variableModals/AddVariableModal/AddVariableModal"; import AddVolumeModal from "../variableModals/AddVolumes/AddVolumeModal"; import AddConfigMapModal from "../variableModals/AddConfigMap/AddConfigMapModal"; -import DeleteIcon from "@/app/components/icons/delete"; -import CustomCheckbox from "@/app/components/checkbox/CheckBox"; -import SelectField from "@/app/components/select/SelectField"; import useServicesForm from "@/app/hooks/useServicesForm"; import Alert from "@/app/components/alerts/Alert"; +import ProjectDetails from "./projectDetails"; +import Settings from "./settings"; const AddServices = () => { - const [triggerVariableDropDown, setTriggerVariableDropDown] = useState(false); const [triggerAddVariable, setTriggerAddVariable] = useState(false); const [triggerAddVolume, setTriggerAddVolume] = useState(false); const [triggerAddConfigMap, setTriggerAddConfigMap] = useState(false); @@ -67,456 +63,40 @@ const AddServices = () => { topbarTitle="Create New Services" requiredButtons={["title", "save"]} /> -
-
-
-
-

Project Details

-
-
-
-
-

- Repository (Optional) -

- -
-
-
-
-

Name

- -
-
-

Version

- -
-
-
-
-

- Image (Optional) -

- -
-
-
-
-

Port

- -
-
-
-
-

Ingress

- -
-
-

Ingress

- -
-
-
-
-
-
-

Resource

-
-
-
-
-

CPU Request (MB)

- -
-
-

CPU Limit (MB)

- -
-
-
-
-

Memory Request (MB)

- -
-
-

Memory Limit (MB)

- -
-
-
-
-
-
-
-
-
-

Auto Scaling

- setDisableScaling(!disableScaling)} - /> -
-
-
-
-
-
-

Minimum pods

- - -
-
-

Maximum pods

- -
-
-
-
-
-
-
-
-
-
-

Readiness

- - setDisableReadiness(!disableReadiness) - } - /> -
-
-
-
-
-
-

Readiness Path

- - -
-
-

Readiness Port

- -
-
-
-
-
-
-
-
-
-
-

Liveness

- - setDisableLiveness(!disableLiveness) - } - /> -
-
-
-
-
-
-

Liveness Path

- -
-
-

Liveness Port

- -
-
-
-
-
-
-
-
-
-
-
-
-
- - - - - - - -
-
-
-
- setTriggerVariableDropDown(!triggerVariableDropDown) - } - > - - - - -
- {triggerVariableDropDown && ( -
-
{ - setTriggerAddVariable(true); - setTriggerVariableDropDown( - !triggerVariableDropDown, - ); - }} - > -

Environment Variables

-
-
{ - setTriggerAddVolume(true); - setTriggerVariableDropDown( - !triggerVariableDropDown, - ); - }} - > -

Volumes

-
-
{ - setTriggerAddConfigMap(true); - setTriggerVariableDropDown( - !triggerVariableDropDown, - ); - }} - > -

Config Maps

-
-
- )} -
-
-
-
-
-
-
-
-

Environment Variables

-
-
-
-

Key

-

Value

-
-
-
-
-
-

No Environment Variables added

-
-
- {/*
-

REQUEST_SERVICE_GRPC

-

request-service:50053

- -
*/} -
-
-
-
-
-
-

Volumes

-
-
-
-

Name

-

Path

-

Size/Type

-

Access Mode

-

Storage Class

-
-
-
-
-
-

No volume added

-
-
-
-
-
-
-
-
-

Config maps

-
- -
-
-
-

No config map added

-
-
-
-
-
-
+
+
+
+

Project Details

+

Settings

+
+ + +
diff --git a/frontend/src/app/projects/view/add-from-scratch/projectDetails.jsx b/frontend/src/app/projects/view/add-from-scratch/projectDetails.jsx new file mode 100644 index 0000000..0be6b74 --- /dev/null +++ b/frontend/src/app/projects/view/add-from-scratch/projectDetails.jsx @@ -0,0 +1,295 @@ +"use client"; +import React, { useState } from "react"; +import styles from "./styles.module.css"; +import TextField from "@/app/components/fields/textfield"; +import CustomCheckbox from "@/app/components/checkbox/CheckBox"; +import SelectField from "@/app/components/select/SelectField"; + +const ProjectDetails = ({ + register, + handleSubmit, + errors, + onSubmit, + triggerAlert, + disableScaling, + disableReadiness, + disableLiveness, + setDisableScaling, + setDisableReadiness, + setDisableLiveness, + setTriggerAlert, + minPods, + maxPods, + readinessPath, + readinessPort, + livenessPort, + livenessPath, +}) => { + return ( +
+
+
+
+

Project Details

+
+
+
+
+

+ Repository (Optional) +

+ +
+
+
+
+

Name

+ +
+
+

Version

+ +
+
+
+
+

+ Image (Optional) +

+ +
+
+
+
+

Port

+ +
+
+
+
+

Ingress

+ +
+
+

Ingress

+ +
+
+
+
+
+
+

Resource

+
+
+
+
+

CPU Request (MB)

+ +
+
+

CPU Limit (MB)

+ +
+
+
+
+

Memory Request (MB)

+ +
+
+

Memory Limit (MB)

+ +
+
+
+
+
+
+
+
+
+

Auto Scaling

+ setDisableScaling(!disableScaling)} + /> +
+
+
+
+
+
+

Minimum pods

+ + +
+
+

Maximum pods

+ +
+
+
+
+
+
+
+
+
+
+

Readiness

+ setDisableReadiness(!disableReadiness)} + /> +
+
+
+
+
+
+

Readiness Path

+ + +
+
+

Readiness Port

+ +
+
+
+
+
+
+
+
+
+
+

Liveness

+ setDisableLiveness(!disableLiveness)} + /> +
+
+
+
+
+
+

Liveness Path

+ +
+
+

Liveness Port

+ +
+
+
+
+
+
+
+
+
+ ); +}; + +export default ProjectDetails; diff --git a/frontend/src/app/projects/view/add-from-scratch/settings.jsx b/frontend/src/app/projects/view/add-from-scratch/settings.jsx new file mode 100644 index 0000000..a288f4d --- /dev/null +++ b/frontend/src/app/projects/view/add-from-scratch/settings.jsx @@ -0,0 +1,170 @@ +"use client"; +import React, { useState } from "react"; +import variableStyles from "./variableStyles.module.css"; +const Settings = ({ + setTriggerAddVariable, + setTriggerAddVolume, + setTriggerAddConfigMap, +}) => { + const [triggerVariableDropDown, setTriggerVariableDropDown] = useState(false); + + return ( +
+
+
+
+
+ + + + + + + +
+
+
+
+ setTriggerVariableDropDown(!triggerVariableDropDown) + } + > + + + + +
+ {triggerVariableDropDown && ( +
+
{ + setTriggerAddVariable(true); + setTriggerVariableDropDown(!triggerVariableDropDown); + }} + > +

Environment Variables

+
+
{ + setTriggerAddVolume(true); + setTriggerVariableDropDown(!triggerVariableDropDown); + }} + > +

Volumes

+
+
{ + setTriggerAddConfigMap(true); + setTriggerVariableDropDown(!triggerVariableDropDown); + }} + > +

Config Maps

+
+
+ )} +
+
+
+
+
+
+
+
+

Environment Variables

+
+
+
+

Key

+

Value

+
+
+
+
+
+

No Environment Variables added

+
+
+ {/*
+

REQUEST_SERVICE_GRPC

+

request-service:50053

+ +
*/} +
+
+
+
+
+
+

Volumes

+
+
+
+

Name

+

Path

+

Size/Type

+

Access Mode

+

Storage Class

+
+
+
+
+
+

No volume added

+
+
+
+
+
+
+
+
+

Config maps

+
+ +
+
+
+

No config map added

+
+
+
+
+
+
+
+
+ ); +}; + +export default Settings; diff --git a/frontend/src/app/projects/view/add-from-scratch/styles.module.css b/frontend/src/app/projects/view/add-from-scratch/styles.module.css index 0e062b5..ae940e1 100644 --- a/frontend/src/app/projects/view/add-from-scratch/styles.module.css +++ b/frontend/src/app/projects/view/add-from-scratch/styles.module.css @@ -1,24 +1,68 @@ +.content { + display: flex; + padding: 0 16px; + flex-direction: column; + align-items: flex-start; + height: calc(100vh - 170px); + /* ✅ fills remaining space */ + min-height: 0; + align-self: stretch; +} .contentContainer { display: flex; align-items: flex-start; - flex: 1 0 0; + flex: 1; + background-color: red; align-self: stretch; } + +.heading { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 16px; + padding: 0 16px; + align-self: stretch; + background: #191a24; +} +.heading > div { + display: flex; + align-items: flex-start; + gap: 16px; + align-self: stretch; +} +.heading p { + display: flex; + padding: 24px 4px 16px 4px; + flex-direction: column; + justify-content: center; + align-items: flex-start; + gap: 5px; + color: #85869b; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: normal; + letter-spacing: 0.18px; +} .fieldsContainerCreateNew { display: flex; padding-top: 36px; flex-direction: column; - width: 550px; align-items: flex-start; gap: 36px; background: #191a24; - height: calc(100vh - 175px); + height: 100%; + min-height: 0; + background-color: red; overflow-y: scroll; scrollbar-width: none; } + .projectDetails { display: flex; - padding: 0 36px; + padding: 0 20px; flex-direction: column; align-items: flex-start; gap: 10px; diff --git a/frontend/src/app/projects/view/add-from-scratch/variableStyles.module.css b/frontend/src/app/projects/view/add-from-scratch/variableStyles.module.css index bb0ea1e..e28c2b5 100644 --- a/frontend/src/app/projects/view/add-from-scratch/variableStyles.module.css +++ b/frontend/src/app/projects/view/add-from-scratch/variableStyles.module.css @@ -23,7 +23,7 @@ } .searchContainer > div { display: flex; - width: 310px; + width: 100%; padding: 8px 12px; align-items: center; gap: 9px; diff --git a/frontend/src/app/projects/view/styles.module.css b/frontend/src/app/projects/view/styles.module.css index db6bc8c..da6a197 100644 --- a/frontend/src/app/projects/view/styles.module.css +++ b/frontend/src/app/projects/view/styles.module.css @@ -18,7 +18,7 @@ text-wrap: nowrap; color: #85869b; font-family: Inter; - z-index: 5; + z-index: 3; font-size: var(--table-font-size); font-style: normal; font-weight: 500;