Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
6c8465d
workflow 수동 실행 가능하도록
ga111o Aug 3, 2025
4ab0a84
Merge pull request #17 from easy-cloud-Knet/dev
game240 Aug 26, 2025
a2539ff
Merge pull request #18 from easy-cloud-Knet/dev
game240 Aug 26, 2025
892805c
Merge pull request #19 from easy-cloud-Knet/dev
game240 Sep 1, 2025
43cb935
Merge branch 'dev'
game240 Oct 22, 2025
0af50ac
feat: /vm/status 호출 추가
game240 Oct 26, 2025
7fac17f
test: console.log 추가
game240 Oct 26, 2025
6b5ab5e
feat: VMCreate fetch data 적용
game240 Oct 26, 2025
a44efc2
feat: OS 이름과 버전 분리
game240 Oct 26, 2025
3302a01
feat: OS 이름 및 version parsing 알고리즘 변경
game240 Oct 26, 2025
87c3181
feat: VMInfo API 반영
game240 Oct 26, 2025
5ed9be2
feat: 기본 route Landing으로 수정
game240 Oct 26, 2025
f4b0e45
feat: Landing routing 반영
game240 Oct 28, 2025
1323340
chore: 서버 url 변경
game240 Oct 28, 2025
baeaabe
Update API base URL in axios client
charlie3965 Oct 28, 2025
227e598
feat: VMManage 문구 변경
game240 Nov 2, 2025
d157478
feat: debian 이미지 추가
game240 Nov 2, 2025
19f75a4
design: 아이콘 크기 변경
game240 Nov 2, 2025
9e9313f
fix: 로그인 중 새로고침했을 때 로그인 화면 넘어가는 문제
game240 Nov 3, 2025
e175f72
fix: lint warning 제거
game240 Nov 3, 2025
722bb16
feat: GET /vm/{vm_id}/status API 연결
game240 Nov 4, 2025
c1b9052
add: MS Clarity
ga111o Nov 4, 2025
2d1d452
Merge pull request #20 from easy-cloud-Knet/feat/clarity
ga111o Nov 4, 2025
966b40b
feat: status kor mapping 추가
game240 Nov 11, 2025
ab89340
feat: VMManageModal API UI 반영
game240 Nov 11, 2025
903c512
refactor: VMManageModal vmId만 넘기도록 수정
game240 Nov 11, 2025
989197f
feat: VMManage status mapping 수정
game240 Nov 11, 2025
297fa09
fix: vm status mapping 수정
game240 Nov 11, 2025
7a21ed0
design: VMManageModal 상단 디자인 변경
game240 Nov 11, 2025
1fc09d1
feat: vm status mapping 수정
game240 Nov 17, 2025
7f2923e
design: vm status design 수정
game240 Nov 17, 2025
994e22f
feat: VM 상태 변경 API 연결 및 디바운싱 추가
game240 Nov 17, 2025
7d61589
fix: API 필드 변경
game240 Nov 17, 2025
3a2199a
feat: skipNextPatchRef false로 init
game240 Nov 17, 2025
09a2e4a
feat: VM status button init 설정
game240 Nov 17, 2025
ba5c4e5
feat: 버튼 함수 호출
game240 Nov 17, 2025
e850c3e
feat: vm status type 관련 수정
game240 Nov 17, 2025
1912466
feat: 연결 버튼 API 연결
game240 Nov 17, 2025
3cd6312
feat: VM 연결 href 추가
game240 Nov 17, 2025
2fb79cf
feat: vm 이름 변경 api 연결
game240 Nov 17, 2025
25a5e3b
feat: vm 이름 변경 hot update 추가
game240 Nov 17, 2025
3563fea
feat: VMManageModal editedName fetch 설정
game240 Nov 17, 2025
7d3822c
feat: 네비게이션 바 UI 및 기능 구현
game240 Nov 25, 2025
c879572
refactor: remove deprecated styles
game240 Jan 15, 2026
4535cc5
seohyeon
seooo-h Jan 26, 2026
8b36bb2
Merge pull request #22 from easy-cloud-Knet/seohyeon
seooo-h Jan 26, 2026
41eb020
빌드 오류 수정
seooo-h Jan 27, 2026
ba31223
fix: VMCreate css 수정
seooo-h Jan 29, 2026
d3179ce
fix: VMCreate css 수정
seooo-h Jan 29, 2026
d54227a
fix: VMCreate css 수정
seooo-h Jan 29, 2026
7ef5618
fix: css수정
seooo-h Jan 29, 2026
82cc3aa
fix: css 수정
seooo-h Jan 29, 2026
629d386
fix: VMCreate css 수정
seooo-h Jan 29, 2026
5dd46c6
feat: landinpage변경
seooo-h Jan 30, 2026
357cffc
feat,fix: Ladingpage변경 & 연결 버튼 새탭
seooo-h Feb 2, 2026
dd5cf59
fix: landingpage 수정
seooo-h Feb 2, 2026
21f989c
fix: landingpage수정
seooo-h Feb 2, 2026
8f44d9f
fix: img수정
seooo-h Feb 2, 2026
a210720
fix: 갱신 비활성화
seooo-h Feb 5, 2026
99b286a
fix: 드롭다운 가려짐
seooo-h Feb 5, 2026
faef00a
fix: 버전 선택
seooo-h Feb 5, 2026
097b004
fix: 갱신버튼 비활성화
seooo-h Feb 5, 2026
e79048c
fix: debian로고 변경
seooo-h Feb 5, 2026
d2b7564
fix: 버전선택 수정
seooo-h Feb 5, 2026
6a94526
fix: marginbottom 수정
seooo-h Feb 5, 2026
4779e1f
fix: 버전 선택 오류 수정
seooo-h Feb 7, 2026
074b7ff
fix: 버전선택 margin 추가
seooo-h Feb 7, 2026
7c2b62d
fix: 버전선택 오류수정
seooo-h Feb 7, 2026
422ac8f
fix: os카드 여백 수정
seooo-h Feb 7, 2026
c98eba3
test: 유저관리 비활성화
seooo-h Feb 8, 2026
657c4a7
fix: 더미데이터 Dialog 안뜨게 수정
seooo-h Feb 8, 2026
b7b4215
test: 유저관리 비활성화
seooo-h Feb 8, 2026
72f6ad6
test: 유저비활성화
seooo-h Feb 8, 2026
c01f7a3
fix: 토글스위치 끄면 연결버튼 비활성화
seooo-h Feb 8, 2026
b309e6c
fix: 버전선택 드롭다운 수정
seooo-h Feb 8, 2026
b872520
fix: 어드민 글자 정렬
seooo-h Feb 8, 2026
3045f8d
fix: landing 페이지 정렬 수정
seooo-h Feb 8, 2026
da93eb6
fix: landing페이지 중앙정렬
seooo-h Feb 8, 2026
2b4dee6
fix: 문의 페이지 placeholder 변경
seooo-h Feb 8, 2026
4f98274
test: 갱신문제 수정 테스트
seooo-h Feb 9, 2026
14ea4b3
fix: 도들 연락처 변경
seooo-h Feb 10, 2026
4037189
fix: 메일 수정
seooo-h Feb 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/docker-image.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
push:
branches:
- main
workflow_dispatch:

jobs:
build-and-deploy:
Expand Down
14 changes: 8 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# React + TypeScript + Vite

SEOHYEON

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:
Expand All @@ -18,11 +20,11 @@ export default tseslint.config({
languageOptions: {
// other options...
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
project: ["./tsconfig.node.json", "./tsconfig.app.json"],
tsconfigRootDir: import.meta.dirname,
},
},
})
});
```

- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked`
Expand All @@ -31,11 +33,11 @@ export default tseslint.config({

```js
// eslint.config.js
import react from 'eslint-plugin-react'
import react from "eslint-plugin-react";

export default tseslint.config({
// Set the react version
settings: { react: { version: '18.3' } },
settings: { react: { version: "18.3" } },
plugins: {
// Add the react plugin
react,
Expand All @@ -44,7 +46,7 @@ export default tseslint.config({
// other rules...
// Enable its recommended rules
...react.configs.recommended.rules,
...react.configs['jsx-runtime'].rules,
...react.configs["jsx-runtime"].rules,
},
})
});
```
19 changes: 15 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
<!doctype html>
<html lang="en">
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<link
rel="icon"
type="image/svg+xml"
href="/src/assets/image/ic_logo.svg"
/>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<title>도들</title>
<script type="text/javascript">
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "u0s53fofcq");
</script>
</head>
<body>
<div id="root"></div>
Expand Down
30 changes: 16 additions & 14 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,21 +26,23 @@ function App() {
<BrowserRouter>
<AuthProvider>
<Routes>
<Route path="/" element={<DefaultLayout />}>
<Route index element={<VMManage />} />
<Route path="create" element={<VMCreate />} />
<Route path="/">
<Route element={<DefaultLayoutV2 />}>
<Route index element={<Landing />} />
<Route path="signin" element={<SignIn />} />
</Route>
<Route element={<DefaultLayout />}>
<Route path="manage" element={<VMManage />} />
<Route path="create" element={<VMCreate />} />

<Route path="signup" element={<SignUpDefault />} />
<Route path="signup/success" element={<SignUpSuccess />} />
<Route path="findpw" element={<FindPw />} />
<Route path="resetpw" element={<ResetPw />} />
<Route path="resetpw/success" element={<ResetPwSuccess />} />

<Route path="signin" element={<SignIn />} />
<Route path="signup" element={<SignUpDefault />} />
<Route path="signup/success" element={<SignUpSuccess />} />
<Route path="findpw" element={<FindPw />} />
<Route path="resetpw" element={<ResetPw />} />
<Route path="resetpw/success" element={<ResetPwSuccess />} />

<Route path="/invitation" element={<Invitation />} />
</Route>
<Route path="/landing" element={<DefaultLayoutV2 />}>
<Route index element={<Landing />} />
<Route path="/invitation" element={<Invitation />} />
</Route>
</Route>
</Routes>
</AuthProvider>
Expand Down
Binary file added src/assets/image/bg_img1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/image/landing/cloud.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/image/landing/icon1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/image/landing/icon2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/image/landing/icon3.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/image/landing/third_page.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/image/navbar/ic_arrow_down.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/image/navbar/ic_arrow_up.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions src/assets/image/navbar/ic_bell.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions src/assets/image/navbar/ic_bell_with_alarm.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/assets/image/new_ic_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions src/assets/image/vmCreate/debian.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/image/vmManage/vmManageModal/copy.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions src/components/LandingInputField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ const LandingInputField = ({
return (
<input
className={twMerge(
"p-[20px] w-full h-[36px] rounded-[6px] bg-[#F2F8FF] text-(--BlueBlack) text-pr-r-16 focus:outline-none focus:border-[1px] focus:border-(--Main_Blue)",
className
"p-[20px] w-full h-[36px] rounded-[6px] bg-[#FFFFFF] text-blue-black typo-pr-r-16 focus:outline-none focus:border-[1px] focus:border-main-blue",
className,
)}
{...props}
></input>
/>
);
};

Expand Down
74 changes: 0 additions & 74 deletions src/components/NavBar.tsx

This file was deleted.

2 changes: 1 addition & 1 deletion src/components/auth/Selector.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const Selector = ({ index = 1 }) => {
}

return (
<div className="d-flex j-content-center">
<div className="flex justify-center">
<img className="selector" src={select} alt="select" />
</div>
);
Expand Down
19 changes: 9 additions & 10 deletions src/components/auth/textField/AuthTextFieldV2.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import React, { useState } from "react";

import remove from "../../../assets/image/input/remove.svg";
import ImageBtn from "../../button/ImageBtn";
import remove from "@/assets/image/input/remove.svg";
import ImageBtn from "@/components/button/ImageBtn";

import CheckMessage from "./bottomMessages/CheckMessage";
import ErrorMessage from "./bottomMessages/ErrorMessage";
import { AuthTextFieldV2Props } from "./types/textField";


import "./AuthTextFieldV2.css";
/**
* 커스텀 TextField component (MUI TextField 기반)
Expand All @@ -20,7 +19,7 @@ import "./AuthTextFieldV2.css";
* @param {boolean} props.errorMessageCondition - errorMessage 표시 여부
* @param {string} props.errorMessageContent - errorMessage 내용
*/
const AuthTextFieldV2: React.FC<AuthTextFieldV2Props> = ({
const AuthTextFieldV2 = ({
label,
style,
onBlur,
Expand All @@ -31,7 +30,7 @@ const AuthTextFieldV2: React.FC<AuthTextFieldV2Props> = ({
errorMessageCondition = false,
errorMessageContent,
...props
}) => {
}: AuthTextFieldV2Props) => {
const [showDeleteBtn, setShowDeleteBtn] = useState(false);

let className = "";
Expand All @@ -49,9 +48,9 @@ const AuthTextFieldV2: React.FC<AuthTextFieldV2Props> = ({
}

return (
<div className="auth-text-field f-dir-column">
<div className="auth-text-field flex flex-col">
{typeof label === "string" && (
<label className="p-16-400" htmlFor={label}>
<label className="typo-pr-r-16" htmlFor={label}>
{label}
</label>
)}
Expand Down Expand Up @@ -101,15 +100,15 @@ const AuthTextFieldV2: React.FC<AuthTextFieldV2Props> = ({

{checkMessageContent || errorMessageContent ? (
checkMessageCondition ? (
<div style={{ marginTop: "8px" }}>
<div className="mt-[8px]">
<CheckMessage>{checkMessageContent}</CheckMessage>
</div>
) : errorMessageCondition ? (
<div style={{ marginTop: "4px" }}>
<div className="mt-[4px]">
<ErrorMessage>{errorMessageContent}</ErrorMessage>
</div>
) : (
<p style={{ height: "28px" }}>&nbsp;</p>
<p className="h-[28px]">&nbsp;</p>
)
) : null}
</div>
Expand Down
16 changes: 11 additions & 5 deletions src/components/auth/textField/AuthTimerSideBtnTextField.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Button, InputAdornment } from "@mui/material";
import { useEffect, useState } from "react";
import { twJoin } from "tailwind-merge";

import AuthTextField from "./AuthTextField";
import { AuthSideBtnTextFieldProps } from "./types/textField";
Expand All @@ -25,7 +26,7 @@ type AuthTimerSideBtnTextFieldProps = AuthSideBtnTextFieldProps & {
* @param {() => void} props.sideBtnOnClick - onClick
* @param {boolean} props.sideBtnDisabled - disabled
*/
const AuthTimerSideBtnTextField: React.FC<AuthTimerSideBtnTextFieldProps> = ({
const AuthTimerSideBtnTextField = ({
className = "",
sideBtnText = "",
sideBtnOnClick,
Expand All @@ -35,7 +36,7 @@ const AuthTimerSideBtnTextField: React.FC<AuthTimerSideBtnTextFieldProps> = ({
timerReset,
setTimerValue,
...props
}) => {
}: AuthTimerSideBtnTextFieldProps) => {
const [timerId, setTimerId] = useState<NodeJS.Timeout | number>(0);
const [timeLeft, setTimeLeft] = useState(300); // 300초 = 5분
const [timerVisible, setTimerVisible] = useState(false);
Expand Down Expand Up @@ -84,17 +85,22 @@ const AuthTimerSideBtnTextField: React.FC<AuthTimerSideBtnTextFieldProps> = ({

return (
<AuthTextField
className={"__timer-text-field " + className}
className={twJoin("__timer-text-field", className)}
slotProps={{
input: {
endAdornment: (
<InputAdornment position="end">
{timerStart ? (
<p className={"timer p-medium-medium c-blue" + (timerVisible ? "" : " c-white")}>
<p
className={twJoin(
"timer typo-pr-m-16 text-main-blue",
timerVisible ? "" : " text-white"
)}
>
{timerVisible ? formatTime(timeLeft) : "\u00A0"}
</p>
) : (
<p className="timer p-medium-medium c-white">&nbsp;</p>
<p className="timer typo-pr-m-16 text-white">&nbsp;</p>
)}
<Button variant="contained" onClick={sideBtnOnClick} disabled={sideBtnDisabled}>
{sideBtnText}
Expand Down
10 changes: 6 additions & 4 deletions src/components/auth/textField/bottomMessages/CheckMessage.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import valid from "./../../../../assets/image/input/valid.svg";
import { PropsWithChildren } from "react";

const CheckMessage = ({ children }: { children: React.ReactNode }) => {
import valid from "@/assets/image/input/valid.svg";

const CheckMessage = ({ children }: PropsWithChildren) => {
return (
<div className="a-items-center" style={{ gap: "5px", paddingLeft: "3px", marginBottom: "4px" }}>
<div className="flex items-center gap-[5px] pl-[3px] mb-[4px]">
<img src={valid} alt="" />
<p className="p-12-400 c-green">{children}</p>
<p className="typo-pr-r-12 text-sub-green1">{children}</p>
</div>
);
};
Expand Down
10 changes: 6 additions & 4 deletions src/components/auth/textField/bottomMessages/ErrorMessage.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import invalid from "../../../../assets/image/input/invalid.svg";
import { PropsWithChildren } from "react";

const ErrorMessage = ({ children }: { children: React.ReactNode }) => {
import invalid from "@/assets/image/input/invalid.svg";

const ErrorMessage = ({ children }: PropsWithChildren) => {
return (
<div className="a-items-center">
<div className="flex items-center">
<img src={invalid} alt="" />
<p className="p-12-400 c-red">{children}</p>
<p className="typo-pr-r-12 text-red">{children}</p>
</div>
);
};
Expand Down
Loading