Showing
11 changed files
with
274 additions
and
15 deletions
web/src/components/Header/HeaderStyled.tsx
0 → 100644
| 1 | +import styled from 'styled-components'; | ||
| 2 | + | ||
| 3 | +export const Container = styled.div ` | ||
| 4 | + width : 100%; | ||
| 5 | + position : relative; | ||
| 6 | + display : inline-block; | ||
| 7 | + padding : 20px 0; | ||
| 8 | + box-shadow: 0px 0px 10px #a0a0a0; | ||
| 9 | + margin : 0 0 15px 0; | ||
| 10 | + z-index : 50; | ||
| 11 | +`; | ||
| 12 | + | ||
| 13 | +export const HeaderWrapper = styled.div ` | ||
| 14 | + display : flex; | ||
| 15 | + justify-content : center; | ||
| 16 | + align-items : center; | ||
| 17 | +`; | ||
| 18 | + | ||
| 19 | +export const Title = styled.div ` | ||
| 20 | + flex : 1; | ||
| 21 | + text-align : center; | ||
| 22 | + font-size : 17px; | ||
| 23 | + font-weight : 800; | ||
| 24 | +`; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
web/src/components/Header/index.tsx
0 → 100644
| 1 | +import React from 'react'; | ||
| 2 | + | ||
| 3 | +import * as styled from './HeaderStyled'; | ||
| 4 | + | ||
| 5 | + | ||
| 6 | +const Header = () => { | ||
| 7 | + return ( | ||
| 8 | + <styled.Container> | ||
| 9 | + <styled.HeaderWrapper> | ||
| 10 | + <styled.Title>내 손 안의 주치의</styled.Title> | ||
| 11 | + </styled.HeaderWrapper> | ||
| 12 | + </styled.Container> | ||
| 13 | + ) | ||
| 14 | +}; | ||
| 15 | + | ||
| 16 | +export default Header; | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
web/src/components/error/ErrorStyled.tsx
0 → 100644
web/src/components/error/index.tsx
0 → 100644
| 1 | +import React, { useEffect } from 'react'; | ||
| 2 | +import * as recoilUtil from '../../util/recoilUtil'; | ||
| 3 | +import { useRecoilState } from 'recoil'; | ||
| 4 | + | ||
| 5 | +import * as styled from './ErrorStyled'; | ||
| 6 | + | ||
| 7 | + | ||
| 8 | +const ErrorContainer = () => { | ||
| 9 | + | ||
| 10 | + const [error, setError] = useRecoilState(recoilUtil.error); | ||
| 11 | + | ||
| 12 | + useEffect(() => { | ||
| 13 | + console.log(error); | ||
| 14 | + }, [error]); | ||
| 15 | + | ||
| 16 | + return ( | ||
| 17 | + <> | ||
| 18 | + { | ||
| 19 | + error ? | ||
| 20 | + <styled.Container> | ||
| 21 | + {error} | ||
| 22 | + </styled.Container> : null | ||
| 23 | + } | ||
| 24 | + </> | ||
| 25 | + ); | ||
| 26 | +}; | ||
| 27 | + | ||
| 28 | +export default ErrorContainer; |
| ... | @@ -13,4 +13,10 @@ export const userTypeCd = atom({ | ... | @@ -13,4 +13,10 @@ export const userTypeCd = atom({ |
| 13 | key : 'userTypeCd', | 13 | key : 'userTypeCd', |
| 14 | default : 'NORMAL', | 14 | default : 'NORMAL', |
| 15 | effects_UNSTABLE : [persistAtom], | 15 | effects_UNSTABLE : [persistAtom], |
| 16 | -}); | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 16 | +}); | ||
| 17 | + | ||
| 18 | +export const error = atom({ | ||
| 19 | + key : 'error', | ||
| 20 | + default : null, | ||
| 21 | + effects_UNSTABLE : [persistAtom], | ||
| 22 | +}) | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | import React from "react"; | 1 | import React from "react"; |
| 2 | import { BrowserRouter, Route, Switch } from 'react-router-dom'; | 2 | import { BrowserRouter, Route, Switch } from 'react-router-dom'; |
| 3 | 3 | ||
| 4 | +import Error from '../components/error'; | ||
| 5 | +import Header from '../components/Header'; | ||
| 4 | import { LoginContainer } from "./login"; | 6 | import { LoginContainer } from "./login"; |
| 5 | import { MainContainer } from "./main"; | 7 | import { MainContainer } from "./main"; |
| 6 | 8 | ||
| 7 | const Router = () => { | 9 | const Router = () => { |
| 8 | return ( | 10 | return ( |
| 9 | <BrowserRouter> | 11 | <BrowserRouter> |
| 12 | + <Error /> | ||
| 13 | + <Header /> | ||
| 10 | <Switch> | 14 | <Switch> |
| 11 | <Route exact path = '/' component = {MainContainer}/> | 15 | <Route exact path = '/' component = {MainContainer}/> |
| 12 | <Route exact path = '/login' component = {LoginContainer}/> | 16 | <Route exact path = '/login' component = {LoginContainer}/> | ... | ... |
| ... | @@ -19,6 +19,7 @@ const LoginContainer = (props : LoginProps) => { | ... | @@ -19,6 +19,7 @@ const LoginContainer = (props : LoginProps) => { |
| 19 | }); | 19 | }); |
| 20 | const [token, setToken] = useRecoilState(recoilUtil.token); | 20 | const [token, setToken] = useRecoilState(recoilUtil.token); |
| 21 | const [userTypeCd, setUserTypeCd] = useRecoilState(recoilUtil.userTypeCd); | 21 | const [userTypeCd, setUserTypeCd] = useRecoilState(recoilUtil.userTypeCd); |
| 22 | + const [error, setError] = useRecoilState(recoilUtil.error); | ||
| 22 | 23 | ||
| 23 | const onSetUserId = (e : React.ChangeEvent<HTMLInputElement>) => { | 24 | const onSetUserId = (e : React.ChangeEvent<HTMLInputElement>) => { |
| 24 | setLoginForm({ | 25 | setLoginForm({ |
| ... | @@ -43,6 +44,7 @@ const LoginContainer = (props : LoginProps) => { | ... | @@ -43,6 +44,7 @@ const LoginContainer = (props : LoginProps) => { |
| 43 | props.history.push('/'); | 44 | props.history.push('/'); |
| 44 | } | 45 | } |
| 45 | } catch(e) { | 46 | } catch(e) { |
| 47 | + setError('로그인에 실패했습니다.'); | ||
| 46 | console.log(e); | 48 | console.log(e); |
| 47 | } | 49 | } |
| 48 | 50 | ... | ... |
| ... | @@ -36,7 +36,7 @@ const LoginPresenter = (props : LoginProps) => { | ... | @@ -36,7 +36,7 @@ const LoginPresenter = (props : LoginProps) => { |
| 36 | type = 'password' | 36 | type = 'password' |
| 37 | value = {props.loginForm.password} | 37 | value = {props.loginForm.password} |
| 38 | onChange = {props.onSetPassword} | 38 | onChange = {props.onSetPassword} |
| 39 | - placeholder = 'password' | 39 | + placeholder = 'Password' |
| 40 | /> | 40 | /> |
| 41 | </styled.LoginEachInputWrapper> | 41 | </styled.LoginEachInputWrapper> |
| 42 | </styled.LoginInputWrapper> | 42 | </styled.LoginInputWrapper> | ... | ... |
| 1 | import styled from 'styled-components'; | 1 | import styled from 'styled-components'; |
| 2 | 2 | ||
| 3 | export const Container = styled.div ` | 3 | export const Container = styled.div ` |
| 4 | - width : 1180px; | 4 | + width : 100%; |
| 5 | + height : 80vh; | ||
| 6 | + position : absolute; | ||
| 7 | + display : flex; | ||
| 8 | + justify-content : center; | ||
| 9 | + align-items : center; | ||
| 5 | `; | 10 | `; |
| 6 | 11 | ||
| 7 | export const LoginWrapper = styled.div ` | 12 | export const LoginWrapper = styled.div ` |
| 8 | - width : 50%; | 13 | + width : 35%; |
| 9 | - border : 1px solid; | 14 | + border : 1px solid #ddd; |
| 15 | + border-radius : 3px; | ||
| 10 | display : flex; | 16 | display : flex; |
| 11 | flex-direction : column; | 17 | flex-direction : column; |
| 12 | justify-content : center; | 18 | justify-content : center; |
| 13 | align-items : center; | 19 | align-items : center; |
| 14 | - padding : 20px 3px; | 20 | + padding : 30px 3px; |
| 21 | + | ||
| 22 | + box-shadow: 0px 0px 10px #a0a0a0; | ||
| 23 | + | ||
| 15 | `; | 24 | `; |
| 16 | 25 | ||
| 17 | export const LoginInputWrapper = styled.div ` | 26 | export const LoginInputWrapper = styled.div ` |
| 18 | margin : 10px 0; | 27 | margin : 10px 0; |
| 19 | - width : 30%; | 28 | + width : 80%; |
| 20 | `; | 29 | `; |
| 21 | 30 | ||
| 22 | export const LoginEachInputWrapper = styled.div ` | 31 | export const LoginEachInputWrapper = styled.div ` |
| 23 | display : flex; | 32 | display : flex; |
| 24 | flex-direction : column; | 33 | flex-direction : column; |
| 25 | justify-content : center; | 34 | justify-content : center; |
| 26 | - align-items : center; | 35 | + |
| 27 | `; | 36 | `; |
| 28 | 37 | ||
| 29 | export const LoginInputText = styled.div ` | 38 | export const LoginInputText = styled.div ` |
| 30 | - margin : 5px 0; | 39 | + width : 100%; |
| 31 | - | 40 | + margin : 30px 0 10px 0; |
| 32 | - text-align : center; | ||
| 33 | `; | 41 | `; |
| 34 | 42 | ||
| 35 | export const LoginInput = styled.input ` | 43 | export const LoginInput = styled.input ` |
| 36 | - border : 1px solid; | 44 | + border : 1px solid #a0a0a0; |
| 37 | - height : 30px; | 45 | + padding : 10px; |
| 46 | + border-radius : 3px; | ||
| 38 | width : 100%; | 47 | width : 100%; |
| 48 | + align-self : center; | ||
| 39 | `; | 49 | `; |
| 40 | 50 | ||
| 41 | export const LoginButtonWrapper = styled.div ` | 51 | export const LoginButtonWrapper = styled.div ` |
| ... | @@ -47,5 +57,20 @@ export const LoginButtonWrapper = styled.div ` | ... | @@ -47,5 +57,20 @@ export const LoginButtonWrapper = styled.div ` |
| 47 | `; | 57 | `; |
| 48 | 58 | ||
| 49 | export const LoginButton = styled.button ` | 59 | export const LoginButton = styled.button ` |
| 50 | - margin : 5px 0 5px 0; | 60 | + margin : 30px 0 5px 0; |
| 61 | + background-color : #fff; | ||
| 62 | + border : 1px solid #a0a0a0; | ||
| 63 | + border-radius : 5px; | ||
| 64 | + padding : 10px 30px; | ||
| 65 | + | ||
| 66 | + cursor : pointer; | ||
| 67 | + | ||
| 68 | + transition : .25s all; | ||
| 69 | + | ||
| 70 | + color : #343434; | ||
| 71 | + | ||
| 72 | + &:hover { | ||
| 73 | + background-color : #343434; | ||
| 74 | + color : #fff; | ||
| 75 | + } | ||
| 51 | `; | 76 | `; |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -10,7 +10,30 @@ interface MainProps { | ... | @@ -10,7 +10,30 @@ interface MainProps { |
| 10 | const MainPresenter = (props : MainProps) => { | 10 | const MainPresenter = (props : MainProps) => { |
| 11 | return ( | 11 | return ( |
| 12 | <styled.Container> | 12 | <styled.Container> |
| 13 | - This is Main Page for {props.userTypeCd} | 13 | + <styled.InfoAndSearchWrapper> |
| 14 | + <styled.InfoWrapper> | ||
| 15 | + <styled.InfoSquare> | ||
| 16 | + | ||
| 17 | + </styled.InfoSquare> | ||
| 18 | + <styled.NewPatientButton>새 환자 등록</styled.NewPatientButton> | ||
| 19 | + </styled.InfoWrapper> | ||
| 20 | + <styled.SearchAndDetailWrapper> | ||
| 21 | + <styled.SearchBarWrapper> | ||
| 22 | + <styled.SearchBar | ||
| 23 | + placeholder = '환자 이름' | ||
| 24 | + /> | ||
| 25 | + <styled.SearchButton> | ||
| 26 | + 검색 | ||
| 27 | + </styled.SearchButton> | ||
| 28 | + </styled.SearchBarWrapper> | ||
| 29 | + <styled.SearchResultWrapper> | ||
| 30 | + | ||
| 31 | + </styled.SearchResultWrapper> | ||
| 32 | + </styled.SearchAndDetailWrapper> | ||
| 33 | + </styled.InfoAndSearchWrapper> | ||
| 34 | + <styled.BottleListWrapper> | ||
| 35 | + bottleListWrapper | ||
| 36 | + </styled.BottleListWrapper> | ||
| 14 | </styled.Container> | 37 | </styled.Container> |
| 15 | ) | 38 | ) |
| 16 | }; | 39 | }; | ... | ... |
| 1 | import styled from 'styled-components'; | 1 | import styled from 'styled-components'; |
| 2 | 2 | ||
| 3 | export const Container = styled.div ` | 3 | export const Container = styled.div ` |
| 4 | + height : 100vh; | ||
| 5 | + width : 100%; | ||
| 6 | + display : flex; | ||
| 7 | + flex-direction : column; | ||
| 8 | + justify-content : center; | ||
| 9 | +`; | ||
| 4 | 10 | ||
| 11 | +export const InfoAndSearchWrapper = styled.div ` | ||
| 12 | + flex : 3; | ||
| 13 | + display : flex; | ||
| 14 | + flex-direction : row; | ||
| 15 | + | ||
| 16 | + margin : 0 0 30px 0; | ||
| 17 | +`; | ||
| 18 | + | ||
| 19 | +export const InfoWrapper = styled.div ` | ||
| 20 | + flex : 2; | ||
| 21 | + | ||
| 22 | + display : flex; | ||
| 23 | + flex-direction : column; | ||
| 24 | + padding : 10px; | ||
| 25 | +`; | ||
| 26 | + | ||
| 27 | +export const InfoSquare = styled.div ` | ||
| 28 | + border : 1px solid #ddd; | ||
| 29 | + border-radius : 5px; | ||
| 30 | + | ||
| 31 | + background-color : transparent; | ||
| 32 | + flex : 10; | ||
| 33 | + | ||
| 34 | + margin : 0 0 20px 0; | ||
| 35 | + | ||
| 36 | + box-shadow: 0px 0px 5px #a0a0a0; | ||
| 37 | + | ||
| 38 | +`; | ||
| 39 | + | ||
| 40 | +export const NewPatientButton = styled.button ` | ||
| 41 | + flex : 1; | ||
| 42 | + border : 1px solid #ddd; | ||
| 43 | + background-color : transparent; | ||
| 44 | + border-radius : 3px; | ||
| 45 | + | ||
| 46 | + padding : 10px 30px; | ||
| 47 | + | ||
| 48 | + transition : .25s all; | ||
| 49 | + color : #343434; | ||
| 50 | + | ||
| 51 | + cursor : pointer; | ||
| 52 | + | ||
| 53 | + &:hover { | ||
| 54 | + background-color : #343434; | ||
| 55 | + color : #fff; | ||
| 56 | + } | ||
| 57 | +`; | ||
| 58 | + | ||
| 59 | +export const SearchAndDetailWrapper = styled.div ` | ||
| 60 | + flex : 5; | ||
| 61 | + | ||
| 62 | + display : flex; | ||
| 63 | + flex-direction : column; | ||
| 64 | + | ||
| 65 | + padding : 10px; | ||
| 66 | + | ||
| 67 | +`; | ||
| 68 | + | ||
| 69 | +export const SearchBarWrapper = styled.div ` | ||
| 70 | + flex : 1; | ||
| 71 | + border : 1px solid #ddd; | ||
| 72 | + border-radius : 3px; | ||
| 73 | + background-color : transparent; | ||
| 74 | + | ||
| 75 | + display : flex; | ||
| 76 | + flex-direction : row; | ||
| 77 | + | ||
| 78 | + padding : 10px; | ||
| 79 | + | ||
| 80 | + align-items : center; | ||
| 81 | + justify-content : space-between; | ||
| 82 | + | ||
| 83 | + margin : 0 0 10px 0; | ||
| 84 | + | ||
| 85 | +`; | ||
| 86 | + | ||
| 87 | +export const SearchBar = styled.input ` | ||
| 88 | + border : none; | ||
| 89 | + border-bottom : 2px solid #ddd; | ||
| 90 | + width : 80%; | ||
| 91 | + margin : 0 0 0 20px; | ||
| 92 | + padding : 10px 0px; | ||
| 93 | +`; | ||
| 94 | + | ||
| 95 | +export const SearchButton = styled.button ` | ||
| 96 | + border : 1px solid #ddd; | ||
| 97 | + | ||
| 98 | + background-color : transparent; | ||
| 99 | + | ||
| 100 | + height : 50px; | ||
| 101 | + width : 50px; | ||
| 102 | + | ||
| 103 | + transition : .25s all; | ||
| 104 | + | ||
| 105 | + cursor : pointer; | ||
| 106 | + | ||
| 107 | + &:hover { | ||
| 108 | + color : #fff; | ||
| 109 | + background-color : #343434; | ||
| 110 | + } | ||
| 111 | +`; | ||
| 112 | + | ||
| 113 | +export const SearchResultWrapper = styled.div ` | ||
| 114 | + flex : 5; | ||
| 115 | + border : 1px solid #ddd; | ||
| 116 | + border-radius : 3px; | ||
| 117 | + background-color : transparent; | ||
| 118 | + | ||
| 119 | +`; | ||
| 120 | + | ||
| 121 | +export const BottleListWrapper = styled.div ` | ||
| 122 | + flex : 2; | ||
| 123 | + display : flex; | ||
| 124 | + flex-direction : row; | ||
| 125 | + | ||
| 126 | + background-color : #ddd; | ||
| 127 | + margin : 0 0 10px 0; | ||
| 5 | `; | 128 | `; |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
-
Please register or login to post a comment