Skip to content
This repository has been archived by the owner on Mar 29, 2020. It is now read-only.

Commit

Permalink
[MERGE #10] from TheDevLuffy/feature/ZENHUB-3
Browse files Browse the repository at this point in the history
[#3] 장서 관리 페이지 생성
  • Loading branch information
TheDevLuffy authored Feb 9, 2020
2 parents adc1125 + d9701bf commit 19ea5e3
Show file tree
Hide file tree
Showing 14 changed files with 314 additions and 3 deletions.
23 changes: 23 additions & 0 deletions pages/books/[id].tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import * as React from "react";
import AppBarContainer from "../../src/components/organisms/containers/AppBarContainer";
import ContentContainer from "../../src/components/organisms/containers/ContentContainer";
import {Card} from "react-bootstrap";
import {useRouter} from "next/router";

const Index = () => {
const router = useRouter();
const {id} = router.query;

return (
<AppBarContainer isLoggedIn={true}>
<ContentContainer>
<Card>
<Card.Header as="h5">장서 상세 정보</Card.Header>
조회 할 책 id - {id}
</Card>
</ContentContainer>
</AppBarContainer>
);
};

export default Index;
139 changes: 138 additions & 1 deletion pages/books/index.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,149 @@
import * as React from "react";
import {useState} from "react";
import AppBarContainer from "../../src/components/organisms/containers/AppBarContainer";
import ContentContainer from "../../src/components/organisms/containers/ContentContainer";
import {Card} from "react-bootstrap";
import {ILibraryBook} from "../../src/models/interfaces";
import Divider from "../../src/components/atoms/Divider";
import {useRouter} from "next/router";
import LibraryBookCardFooter from "../../src/components/organisms/LibraryBookCardFooter";
import LibraryBookCardBody from "../../src/components/organisms/LibraryBookCardBody";
import LibraryBookCardHeader from "../../src/components/molecules/LibraryBookCardHeader";

const remoteSearchBooks: ILibraryBook[] = [
{
id: 1,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 2,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 3,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 4,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 5,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 6,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 7,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 8,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 9,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
{
id: 10,
title: "개발자의 글쓰기 (변수 네이밍부터 릴리스 노트, 장애 보고서, 기술 블로그까지, 프로그래머의 글쓰기 고민 끝!)",
image: "https://bookthumb-phinf.pstatic.net/cover/155/135/15513595.jpg?type=m1&udate=20191213",
author: "김철수",
publisher: "위키북스",
isbn: "1158391749 9791158391744",
description: "오직 개발자를 위한 글쓰기의 모든 것을 담았습니다!이 책은 개발자의 글쓰기 능력을 종합적으로 향상하기 위한 책이다. 코드 안에서는 함수와 변수... 외주 개발을 하는 개발자를 위해 SI 제안서의 기술 부문을 설득력 있게 쓰는 법도 놓치지 않았다. 블로그를 운영하려는 개발자나 IT기업을 위해 기술 블로그를... ",
hasMany: 1,
},
];

const Index = () => {
const router = useRouter();

const [page, setPage] = useState(1);
const [books, setooks] = useState<ILibraryBook[]>(remoteSearchBooks);

const onPageDown = () => {
if (page !== 1) {
setPage(page - 1);
}
};

const onPageUp = () => {
// TODO: 로직 수정 필요
if (books.length >= 10) {
setPage(page + 1);
}
};

const selectBookClickHandler = (id: number) => () => {
router.push(`/books/${id}`);
};
return (
<AppBarContainer isLoggedIn={true}>
<ContentContainer>
장서 관리
<Card>
<LibraryBookCardHeader/>
<LibraryBookCardBody books={books} onClick={selectBookClickHandler}/>
<Divider/>
<LibraryBookCardFooter page={page} onPageDown={onPageDown} onPageUp={onPageUp}/>
</Card>
</ContentContainer>
</AppBarContainer>
);
Expand Down
7 changes: 7 additions & 0 deletions src/components/atoms/Divider.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import * as React from "react";

const Divider = () => (
<div style={{backgroundColor: '#DFDFDF', height: '1px'}}/>
);

export default Divider;
28 changes: 28 additions & 0 deletions src/components/molecules/LibraryBookCardHeader.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import {useRouter} from "next/router";
import {Button, Card} from "react-bootstrap";
import * as React from "react";

const LibraryBookCardHeader = () => {
const router = useRouter();

const enrollButtonClickHandler = () => {
router.push("/books/create");
};

return (
<Card.Header as="h5">
<div style={{display: 'flex', flexDirection: 'row'}}>
<div style={{flex: 13, display: 'flex', flexDirection: 'column', justifyContent: 'center'}}>
<div style={{width: 'fit-content'}}>
장서 목록
</div>
</div>
<div style={{flex: 1}}>
<Button variant="primary" size="sm" onClick={enrollButtonClickHandler}>새 책 등록</Button>
</div>
</div>
</Card.Header>
);
};

export default LibraryBookCardHeader;
35 changes: 35 additions & 0 deletions src/components/molecules/LibraryBookElement.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import {Image} from "react-bootstrap";
import * as React from "react";
import {ILibraryBook} from "../../models/interfaces";

interface IProps {
libraryBook: ILibraryBook;
}

const Content = ({flex, children}: any) => (
<div style={{flex: `${flex}`, display: 'flex', flexDirection: 'column', justifyContent: 'center', textAlign: 'center'}}>
{children}
</div>
);

const LibraryBookElement = ({libraryBook}: IProps) => (
<div style={{display: 'flex', flexDirection: 'row'}}>
<div style={{flex: 1, display: 'flex', flexDirection: 'row', justifyContent: 'center'}}>
<Image src={libraryBook.image} thumbnail/>
</div>
<Content flex={2}>
{libraryBook.title}
</Content>
<Content flex={1}>
{libraryBook.author}
</Content>
<Content flex={1}>
{libraryBook.publisher}
</Content>
<Content flex={1}>
{libraryBook.hasMany}
</Content>
</div>
);

export default LibraryBookElement;
21 changes: 21 additions & 0 deletions src/components/molecules/LibraryBookPageButtons.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import LibraryBookPageContext from "../../contexts/LibraryBookPageContext";
import {Button, ButtonGroup} from "react-bootstrap";
import * as React from "react";

const LibraryBookPageButtons = () => {
return (
<LibraryBookPageContext.Consumer>
{({page, onPageDown, onPageUp}) => (
<div style={{height: '40px', display: 'flex', flexDirection: 'row', justifyContent: 'center'}}>
<ButtonGroup aria-label="Basic example">
<Button variant="primary" onClick={onPageDown}>이전</Button>
<Button disabled>{page}</Button>
<Button variant="primary" onClick={onPageUp}>다음</Button>
</ButtonGroup>
</div>
)}
</LibraryBookPageContext.Consumer>
)
};

export default LibraryBookPageButtons;
4 changes: 2 additions & 2 deletions src/components/molecules/SearchBookCardHeader.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import {Row} from "react-bootstrap";
import SearchBookCardInput from "../organisms/SearchBookCardInput";
import SearchBookCardButton from "../organisms/SearchBookCardButton";
import SearchBookCardInput from "./SearchBookCardInput";
import SearchBookCardButton from "./SearchBookCardButton";
import * as React from "react";

const SearchBookCardHeader = () => {
Expand Down
20 changes: 20 additions & 0 deletions src/components/organisms/LibraryBookCardBody.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import {ListGroup} from "react-bootstrap";
import {ILibraryBook} from "../../models/interfaces";
import LibraryBookElement from "../molecules/LibraryBookElement";
import * as React from "react";
import "./mouseover.css";

const LibraryBookCardBody = ({books, onClick}) => (
<div style={{overflow: 'scroll'}}>
<ListGroup variant="flush" style={{height: '700px'}}>
{books.map((libraryBook: ILibraryBook, i: number) => (
<ListGroup.Item className="library-book-item"
key={i} style={{height: '150px', cursor: 'pointer'}}
onClick={onClick(libraryBook.id)}>
<LibraryBookElement libraryBook={libraryBook}/>
</ListGroup.Item>))}
</ListGroup>
</div>
);

export default LibraryBookCardBody;
12 changes: 12 additions & 0 deletions src/components/organisms/LibraryBookCardFooter.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import LibraryBookPageContext from "../../contexts/LibraryBookPageContext";
import LibraryBookPageButtons from "../molecules/LibraryBookPageButtons";
import * as React from "react";


const LibraryBookCardFooter = ({page, onPageDown, onPageUp}) => (
<LibraryBookPageContext.Provider value={{page, onPageDown, onPageUp}}>
<LibraryBookPageButtons/>
</LibraryBookPageContext.Provider>
);

export default LibraryBookCardFooter;
4 changes: 4 additions & 0 deletions src/components/organisms/mouseover.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
.library-book-item:hover {
box-shadow: 4px 3px 10px 0 rgba(0, 0, 0, 0.5);
z-index: 10000;
}
13 changes: 13 additions & 0 deletions src/contexts/LibraryBookPageContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import * as React from "react";

const LibraryBookPageContext = React.createContext({
page: 1,
onPageDown: () => {

},
onPageUp: () => {

},
});

export default LibraryBookPageContext;
11 changes: 11 additions & 0 deletions src/models/interfaces/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,14 @@ export interface ISearchBook {
isbn: string;
description: string;
}

export interface ILibraryBook {
id: number;
title: string;
image: string;
author: string;
publisher: string;
isbn: string;
description: string;
hasMany: number;
}

0 comments on commit 19ea5e3

Please sign in to comment.