diff --git a/src/assets/icon/common/uploadImg.svg b/src/assets/icon/common/uploadImg.svg index 37c18ee5..98740532 100644 --- a/src/assets/icon/common/uploadImg.svg +++ b/src/assets/icon/common/uploadImg.svg @@ -1,3 +1,3 @@ - + diff --git a/src/components/common/button/Button.tsx b/src/components/common/button/Button.tsx index 16b8f0c2..5b96b782 100644 --- a/src/components/common/button/Button.tsx +++ b/src/components/common/button/Button.tsx @@ -36,13 +36,13 @@ export default function Button({ const variantClasses = { primary: - "bg-chart-3 text-white hover:opacity-80 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:opacity-50", + "bg-chart-3 text-white hover:bg-[#0e6add] disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:bg-bg-disabled", secondary: - "bg-gray-100 text-brand-900 hover:bg-gray-200 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:opacity-50 disabled:hover:opacity-50", + "bg-gray-100 text-brand-900 hover:bg-gray-200 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:bg-bg-disabled", outline: - "bg-transparent border border-chart-3 text-chart-3 hover:bg-brand-300 disabled:border-gray-300 disabled:text-text-disabled disabled:hover:bg-transparent", + "bg-transparent border border-chart-3 text-chart-3 hover:bg-chart-3/5 disabled:border-gray-300 disabled:text-text-disabled disabled:hover:bg-transparent", danger: - "bg-status-red text-white hover:opacity-80 disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:opacity-50", + "bg-status-red text-white hover:bg-[#d91632] disabled:bg-bg-disabled disabled:text-text-disabled disabled:hover:bg-bg-disabled", dangerSoft: "bg-status-red/10 text-status-red border border-status-red hover:bg-status-red/20 disabled:bg-bg-disabled disabled:text-text-disabled disabled:border-gray-300 disabled:hover:bg-bg-disabled", gradient: diff --git a/src/components/common/dropdownmenu/DropdownMenu.tsx b/src/components/common/dropdownmenu/DropdownMenu.tsx index 896adf9e..e8abf297 100644 --- a/src/components/common/dropdownmenu/DropdownMenu.tsx +++ b/src/components/common/dropdownmenu/DropdownMenu.tsx @@ -57,7 +57,7 @@ export function DropdownMenu({ )} diff --git a/src/components/workspace/WorkspaceCard.tsx b/src/components/workspace/WorkspaceCard.tsx index f13d8854..6269608e 100644 --- a/src/components/workspace/WorkspaceCard.tsx +++ b/src/components/workspace/WorkspaceCard.tsx @@ -4,28 +4,16 @@ import { twMerge } from "tailwind-merge"; import type { TWorkspace } from "@/types/workspace/workspace"; import { ROLE_LABEL_MAP } from "@/constants/workspaceRole"; -import { - DropdownMenu, - type TMenuItem, -} from "@/components/common/dropdownmenu/DropdownMenu"; - import BuildingIcon from "@/assets/icon/common/building.svg?react"; -import VectorIcon from "@/assets/icon/common/more.svg?react"; import { getImageUrl } from "@/lib/getImageUrl"; type TProps = { workspace: TWorkspace; - menuItems: TMenuItem[]; isSelected?: boolean; onClick?: () => void; }; -function WorkspaceCard({ - workspace: w, - menuItems, - isSelected = false, - onClick, -}: TProps) { +function WorkspaceCard({ workspace: w, isSelected = false, onClick }: TProps) { const [imageError, setImageError] = useState(false); useEffect(() => { @@ -36,68 +24,61 @@ function WorkspaceCard({ const showPlaceholder = !imageSrc || imageError; return ( -
  • -
    -
    - {showPlaceholder ? ( -
    - -
    - ) : ( - {`${w.name} { - setImageError(true); - }} - /> - )} -
    - -
    -
    -
    - {w.name} -
    - {isSelected && ( - - 현재 대시보드 기준 - +
  • +
  • ); } diff --git a/src/components/workspace/WorkspaceListLoading.tsx b/src/components/workspace/WorkspaceListLoading.tsx index 9eecf294..4f117add 100644 --- a/src/components/workspace/WorkspaceListLoading.tsx +++ b/src/components/workspace/WorkspaceListLoading.tsx @@ -1,13 +1,33 @@ +import { Skeleton } from "@/components/common/skeleton/Skeleton"; + +function WorkspaceCardSkeleton() { + return ( + <> +
  • +
    + +
    + + + +
    +
    + +
  • + + ); +} + export default function WorkspaceListLoading() { return ( -
    -

    - 워크스페이스 목록을 불러오는 중입니다. -

    -
    + {Array.from({ length: 3 }).map((_, i) => ( + + ))} + ); } diff --git a/src/layout/workspace/WorkspaceManageLayout.tsx b/src/layout/workspace/WorkspaceManageLayout.tsx new file mode 100644 index 00000000..21dfc395 --- /dev/null +++ b/src/layout/workspace/WorkspaceManageLayout.tsx @@ -0,0 +1,33 @@ +import { NavLink, Outlet, useParams } from "react-router-dom"; + +const tabLinkClass = ({ isActive }: { isActive: boolean }) => + `px-4 py-2 font-body1 border-b-2 -mb-px transition-colors ${ + isActive + ? "border-chart-3 text-chart-3" + : "border-transparent text-text-sub hover:text-text-main" + }`; + +export default function WorkspaceManageLayout() { + const { workspaceId } = useParams(); + + return ( +
    + + + +
    + ); +} diff --git a/src/pages/workspace/MemberManagement.tsx b/src/pages/workspace/MemberManagement.tsx index f8b8ed2a..2fefb584 100644 --- a/src/pages/workspace/MemberManagement.tsx +++ b/src/pages/workspace/MemberManagement.tsx @@ -1,5 +1,5 @@ import { useEffect, useMemo, useRef, useState } from "react"; -import { useNavigate, useParams } from "react-router-dom"; +import { useParams } from "react-router-dom"; import { useInfiniteQuery, useMutation, @@ -15,7 +15,6 @@ import { type TWorkspaceMember, } from "@/types/workspace/workspace"; -import PageHeader from "@/components/common/PageHeader"; import DeleteMemberModal from "@/components/workspace/DeleteMemberModal"; import MemberList from "@/components/workspace/MemberList"; import PermissionTable from "@/components/workspace/PermissionTable"; @@ -30,7 +29,6 @@ import { const PAGE_SIZE = 20; export default function MemberManagement() { - const navigate = useNavigate(); const { workspaceId } = useParams<{ workspaceId: string }>(); const orgId = Number(workspaceId); const queryClient = useQueryClient(); @@ -248,23 +246,6 @@ export default function MemberManagement() { return (
    -
    - - -
    -
    [ - { - icon: , - label: "정보 수정하기", - onClick: () => { - void navigate(`/workspace/${id}/settings`); - }, - }, - { - icon: , - label: "멤버 관리", - onClick: () => { - void navigate(`/workspace/${id}/members`); - }, - }, - ]; - const onCloseCreate = () => { setLogoPreview(null); setLogoPreview((prev) => { @@ -181,7 +161,6 @@ export default function WorkspacePage() { { void navigate(`/workspace/${w.orgId}/settings`); @@ -223,26 +202,19 @@ export default function WorkspacePage() { {renderWorkspaceContent()} - -
    -

    + +
    +

    워크스페이스 생성

    -

    - 워크스페이스를 생성한 사용자는 자동으로 관리자 권한을 갖습니다.{" "} -
    로고 이미지와 기본 정보를 입력해 주세요. +

    + 워크스페이스를 생성한 사용자는 자동으로 관리자 권한을 갖습니다. +
    + 로고 이미지와 기본 정보를 입력해 주세요.

    -
    -
    -
    - 로고 이미지 -
    + +
    +
    {logoPreview ? ( - 새 로고 미리 보기 + <> + 새 로고 미리 보기 +
    + + + 사진 변경 + +
    + ) : ( - +
    + + + 이미지 업로드 + +
    )} - -
    -
    + + {/* 입력 폼 */} +
    setNewDesc(e.target.value)} disabled={isCreating} @@ -296,18 +278,19 @@ export default function WorkspacePage() {

    {createErrorMsg}

    )}
    -
    -
    - + +
    + +
    diff --git a/src/pages/workspace/WorkspaceSetting.tsx b/src/pages/workspace/WorkspaceSetting.tsx index 2fbe7d64..67387a17 100644 --- a/src/pages/workspace/WorkspaceSetting.tsx +++ b/src/pages/workspace/WorkspaceSetting.tsx @@ -9,7 +9,6 @@ import Button from "@/components/common/button/Button"; import ControlBox from "@/components/common/controlbox/ControlBox"; import Input from "@/components/common/input/Input"; import Modal from "@/components/common/modal/Modal"; -import PageHeader from "@/components/common/PageHeader"; import TextareaField from "@/components/common/textarea/TextareaField"; import { @@ -177,23 +176,6 @@ export default function WorkspaceSetting() { return (
    -
    - - -
    - {loading && (

    불러오는중..

    @@ -214,10 +196,6 @@ export default function WorkspaceSetting() { {!loading && !errorMsg && ( <>
    -

    기본 정보

    -

    - 워크스페이스의 대표적인 정보를 설정합니다. -

    @@ -297,19 +275,6 @@ export default function WorkspaceSetting() {
    -