From f5dff0c751148e7e8bb5b092719b0dd3ea734fa0 Mon Sep 17 00:00:00 2001 From: Inhyuk Oh <49269218+ohinhyuk@users.noreply.github.com> Date: Thu, 2 Nov 2023 07:15:19 +0900 Subject: [PATCH] =?UTF-8?q?FEATURE=20/=20STYLE=20:=20=EB=A7=88=EC=9D=BC?= =?UTF-8?q?=EB=A6=AC=EC=A7=80=20=EC=9E=A5=ED=95=99=EA=B8=88=20=EC=8B=A0?= =?UTF-8?q?=EC=B2=AD=20=EA=B8=B0=EA=B0=84=20=EA=B4=80=EB=A6=AC=20(?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20/=20=EC=88=98=EC=A0=95=20/=20=EB=A7=88?= =?UTF-8?q?=EA=B0=90=20=EA=B0=80=EB=8A=A5)(#75)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Feat: 마일리지 선정 결과 enum 설정(#4) * Feat: 마일리지 선정결과 인터페이스 + 데이터 생성함수(#4) * Fix: 마일리지 선정 결과에서 register num을 삭제하였음(#4) * Feat: 마일리지 선정결과 테이블 헤더 설정(#4) * Feat: 마일리지 선정결과 완료(#4) * Chore: 빌드 시 esLint를 무시할 수 있도록 next.config.js를 수정해주었음 * Feat: 마일리지 카테고리 모달관련 reducers를 만듬 (open , close) (#7) * Feat: 마일리지 카테고리 관련 모달을 열고 닫는 액션 export(#7) * Fix: 문법에 맞게 reducers return 값 수정(#7) * Feat: mUI 모달 컴포넌트 생성(#7) * Feat: root Reducer에 modal Reducer를 연결하고 모달의 useState를 selector와 dispatch로 대체함으로 써 모달을 컴포넌트에 연결 시킴 * Feat: 카테고리 관련 모달 이름 data파일에 정의(#7) * Fix: 모달 관련 state를 재사용 하기로 결정하여 state의 갯수를 줄임(#7) * Feat: icon Converter를 통해 어떤 타입의 모달이냐에 따라 다른 아이콘을 부여(#7) * Feat: title Converter를 두어 모달의 제목을 모달의 타입에 따라 융통성있게 가져감(#7) * Fix: 모달이 type을 인식하지 못하는 이슈로 인해 modalType을 reducer에서 관리(#7) * Feat: formik , yup 설치 및 활용을 통한 모달 속 폼 제작(#7) * Feat: 마일리지 카테고리 추가 기능 폼 구현 완료(#7) * Style: mui템플릿 Theme기본 설정을 변경 시켜서 텍스트 필드의 스타일을 변경시킴(#7) * Feat: 관리를 눌렀을 때 초기값을 전달하여 세팅하는 것 까지 연결 (#7) * Feat: 마일리지 카테고리 모달 완성 + 컴포넌트 분리(#7) * Refactor: 모달 제목 , 모달 열기 버튼 리펙터링(#7) * Feat: 테이블에 타입 지정하고 타입을 활용해서 제목 변경(#7) * Feat: 타입 컨버터를 통해 각 모달의 기능에 맞춰줌(#7) * Feat: 카테고리 항목 모달 폼 제작(#7) * Feat: 카테고리 항목 모달에 토글 추가(#7) * Feat: 영어를 한글로 UI를 보여주는 함수 구현(#7) * Feat: 마일리지 항목 모달 리펙터링(#7) * Feat: 마일리지 카테고리, 마일리지 항목 모달 연결(#7) * Feat: 게시판 데이터에 마일리지 글로벌 항목 추가(#12) * Feat: 각각의 컴포넌트에 type을 지정해주어 각 컴포넌트에 맞는 테이블의 제목을 나타나게 한다.(#12) * Feat: 마일리지 글로벌 항목 관련 테이블 생성(#12) * Fix: 마일리지 항목 -\> 마일리지 학기별 항목으로 수정(#12) * Feat: 자동완성 state연결(#15) * Feat: 카테고리 filter 관련 Reducer 생성 (#15) * Feat: 카테고리 필터링 완료(#15) * Feat: 마일리지 글로벌 항목 리스트 상태를 리덕스로 관리(#15) * Feat: 마일리지 학기별 항목 리스트도 리덕스로 관리 (#15) * Feat: 학기 필터링 상태 Reducer에 추가(#15) * Feat: 학기 필터링 드롭다운 컴포넌트(#15) * Feat: 학기 필터링 적용 완료(#15) * Feat: 보이기 필터링 드롭다운 컴포넌트 생성 , reducer 생성(#15) * Feat: 보이기 필터링 연결(#15) * Feat: 항목명 필터링 컴포넌트, 상태 생성(#15) * Fix: 마일리지 학기별 항목의 보이기 값이 boolean임에 맞춰 데이터를 true/false로 변경(#15) * Feat: 카테고리 CRUD API apitest 페이지에서 연결테스트(#16) * Refactor: pages 폴더 내에서만 서버사이드 렌더링이 작동하기 때문에 header와 drawer를 main layout으로 리펙터링 한다(#15)) * Fix: 테이블 리스트 컴포넌트들을 페이지로 이동 시키기 이전에 현재 페이지 상태에 대한 상태를 reducer로 관리(#15) * Fix: 컴포넌트 리턴 함수를 drawer컴포넌트에서 메인 페이지로 꺼내옴 * Refactor: 서버 사이드 렌더링을 위하여 board 컴포넌트를 페이지로 리펙터링(#15) * Feat: 마일리지 카테고리 서버사이드 fetching API 연결(#15) * Feat: 카테고리 추가 API 연결 완료(#15) * Feat: 카테고리 수정 API 연결 (#15) * Feat: 삭제 API를 여러개 동시에 하기 위해 선택 된 것을 삭제할 수 있도록 선택된 id들전역상태로 관리(#16) * Feat: 선택된 번호들을 다른 페이지로 갔을 시 초기화 되도록 설정(#16) * Feat: 카테고리 다중 삭제 API 연결 완료(#16) * Feat: 글로벌 세부항목 가져오기 API 연결(#18) * Refactor: 글로벌 카테고리 모달 버튼 리펙터링(#18) * Feat: 메뉴바 state가redux persist로 유지되도록 함(#18) * Feat: 학기별 세부항목 조회를 위한 interface 생성(#20) * Feat: 마일리지 학기별 항목 READ 연결(#20) * Feat: 세부항목 모달+ CREATE API 연결(#20) * Feature: 글로벌 세부항목 API을 연결 함으로써 데이터베이스에 글로벌 세부항목 CRUD을 할 수 있다. (#19) * style : 헤더 컴포넌트 완성 * style : sidebar(drawer) 완성 * feat : Drawer와 상태를 연결 * feat : 커스텀 테이블 생성 * refactor : 커스텀 테이블의 pagination을 refactoring함 * Refactor(custom): 테이블 관련 데이터 파일 분리 * 커밋 컨밴션을 위한 cz-commitizen 설정 * Docs: pR 문서 템플릿 작성 * Refactor: 테이블 컴포넌트를 다양한 데이터를 넣을 수 있도록 Row 부분을 리펙토링 하여 정의한이터에 따라 값이 유연하게 들어갈 수 있게 함(#4) * Feat: 테이블 관련 필드를 field 파일에 모아둠 (#4) * Refactor: boardList정의 + 사이드바 블럭 리펙터링 * Refactor: milleageHeader를 컴포넌트로 꺼내면서 로직을 포함하고 있는 함수들과 UI를 리펙터링함 * Feat: 마일리지 카테고리 리스트에 필요한 리스트들을 enum을 이용하여 정리 * Refactor: 마일리지 카테고리 게시판 리펙터링 완료 (#4) * Feat: 마일리지 항목 게시판 enum 설정 (#4) * Feat: 마일리지 항목 데이터 인터페이스 설정(#4) * Feat: 마일리지 항목 관련 데이터 생성 함수(#4) * Feat: 마일리지 항목 관련 테이블 헤더(#4) * Feat: 마일리지 항목 row값 설정 * Feat: 마일리지 조회 게시판 enum 설정(#4) * Feat: 마일리지 조회 데이터 인터페이스 설정(#4) * Feat: 마일리지 조회 데이터 생성 함수(#4) * Feat: 마일리지 조회 데이터 생성 함수(#4) * Feat: 마일리지 조회 데이터 추가(#4) * Feat: 마일리지 등록 enum 설계(#4) * Feat: 마일리지 조회 데이터 인터페이스 + 데이터 생성 함수(#4) * Feat: 마일리지 등록 테이블 헤더(#4) * Feat: 마일리지 등록 더미데이터 입력(#4) * Fix: semester을 number -\> string으로 타입 수정 , 테이블 데이터들이 모두 select 되지 않는 버그 수정(#4) * Style: mediaQuery와 styled-component를 이용하여 테이블의 반응형 구축(#4) * Feat: 신청자 관리 데이터 인터페이스(4) * Feat: 신청자 관리 enum (#4) * Feat: 신청자 관리 데이터 생성함수 (#4) * Fix: 신청자 관리 카테고리를 제외 시킴(#4) * Feat: 신청자 관리 헤더 내용 정리(#4) * Feat: 신청자 관리 더미데이터(#4) * Feat: 학생 관리 테이블 완성(#4) * Feat: 사용자 관리 테이블 enum 설정(#4) * Feat: 사용자 관리 데이터 인터페이스 설정(#4) * Feat: 사용자 관리 데이터 생성함수(#4) * Feat: 사용자 관리 테이블 studentName -\> name으로 필드 이름 변경 * Feat: 사용자관리 테이블 데이터생성함수(#4) * Feat: 사용자 관리 테이블 완료(#4) * Feat: 마일리지 선정 결과 enum 설정(#4) * Feat: 마일리지 선정결과 인터페이스 + 데이터 생성함수(#4) * Fix: 마일리지 선정 결과에서 register num을 삭제하였음(#4) * Feat: 마일리지 선정결과 테이블 헤더 설정(#4) * Feat: 마일리지 선정결과 완료(#4) * Chore: 빌드 시 esLint를 무시할 수 있도록 next.config.js를 수정해주었음 * Feat: 마일리지 카테고리 모달관련 reducers를 만듬 (open , close) (#7) * Feat: 마일리지 카테고리 관련 모달을 열고 닫는 액션 export(#7) * Fix: 문법에 맞게 reducers return 값 수정(#7) * Feat: mUI 모달 컴포넌트 생성(#7) * Feat: root Reducer에 modal Reducer를 연결하고 모달의 useState를 selector와 dispatch로 대체함으로 써 모달을 컴포넌트에 연결 시킴 * Feat: 카테고리 관련 모달 이름 data파일에 정의(#7) * Fix: 모달 관련 state를 재사용 하기로 결정하여 state의 갯수를 줄임(#7) * Feat: icon Converter를 통해 어떤 타입의 모달이냐에 따라 다른 아이콘을 부여(#7) * Feat: title Converter를 두어 모달의 제목을 모달의 타입에 따라 융통성있게 가져감(#7) * Fix: 모달이 type을 인식하지 못하는 이슈로 인해 modalType을 reducer에서 관리(#7) * Feat: formik , yup 설치 및 활용을 통한 모달 속 폼 제작(#7) * Feat: 마일리지 카테고리 추가 기능 폼 구현 완료(#7) * Style: mui템플릿 Theme기본 설정을 변경 시켜서 텍스트 필드의 스타일을 변경시킴(#7) * Feat: 관리를 눌렀을 때 초기값을 전달하여 세팅하는 것 까지 연결 (#7) * Feat: 마일리지 카테고리 모달 완성 + 컴포넌트 분리(#7) * Refactor: 모달 제목 , 모달 열기 버튼 리펙터링(#7) * Feat: 테이블에 타입 지정하고 타입을 활용해서 제목 변경(#7) * Feat: 타입 컨버터를 통해 각 모달의 기능에 맞춰줌(#7) * Feat: 카테고리 항목 모달 폼 제작(#7) * Feat: 카테고리 항목 모달에 토글 추가(#7) * Feat: 영어를 한글로 UI를 보여주는 함수 구현(#7) * Feat: 마일리지 항목 모달 리펙터링(#7) * Feat: 마일리지 카테고리, 마일리지 항목 모달 연결(#7) * Feat: 게시판 데이터에 마일리지 글로벌 항목 추가(#12) * Feat: 각각의 컴포넌트에 type을 지정해주어 각 컴포넌트에 맞는 테이블의 제목을 나타나게 한다.(#12) * Feat: 마일리지 글로벌 항목 관련 테이블 생성(#12) * Fix: 마일리지 항목 -\> 마일리지 학기별 항목으로 수정(#12) * Feat: 자동완성 state연결(#15) * Feat: 카테고리 filter 관련 Reducer 생성 (#15) * Feat: 카테고리 필터링 완료(#15) * Feat: 마일리지 글로벌 항목 리스트 상태를 리덕스로 관리(#15) * Feat: 마일리지 학기별 항목 리스트도 리덕스로 관리 (#15) * Feat: 학기 필터링 상태 Reducer에 추가(#15) * Feat: 학기 필터링 드롭다운 컴포넌트(#15) * Feat: 학기 필터링 적용 완료(#15) * Feat: 보이기 필터링 드롭다운 컴포넌트 생성 , reducer 생성(#15) * Feat: 보이기 필터링 연결(#15) * Feat: 항목명 필터링 컴포넌트, 상태 생성(#15) * Fix: 마일리지 학기별 항목의 보이기 값이 boolean임에 맞춰 데이터를 true/false로 변경(#15) * Feat: 카테고리 CRUD API apitest 페이지에서 연결테스트(#16) * Refactor: pages 폴더 내에서만 서버사이드 렌더링이 작동하기 때문에 header와 drawer를 main layout으로 리펙터링 한다(#15)) * Fix: 테이블 리스트 컴포넌트들을 페이지로 이동 시키기 이전에 현재 페이지 상태에 대한 상태를 reducer로 관리(#15) * Fix: 컴포넌트 리턴 함수를 drawer컴포넌트에서 메인 페이지로 꺼내옴 * Refactor: 서버 사이드 렌더링을 위하여 board 컴포넌트를 페이지로 리펙터링(#15) * Feat: 마일리지 카테고리 서버사이드 fetching API 연결(#15) * Feat: 카테고리 추가 API 연결 완료(#15) * Feat: 카테고리 수정 API 연결 (#15) * Feat: 삭제 API를 여러개 동시에 하기 위해 선택 된 것을 삭제할 수 있도록 선택된 id들전역상태로 관리(#16) * Feat: 선택된 번호들을 다른 페이지로 갔을 시 초기화 되도록 설정(#16) * Feat: 카테고리 다중 삭제 API 연결 완료(#16) * Feat: 글로벌 세부항목 가져오기 API 연결(#18) * Refactor: 글로벌 카테고리 모달 버튼 리펙터링(#18) * Feat: 메뉴바 state가redux persist로 유지되도록 함(#18) * Feat: 학생 관리 조회 데이터 관련 인터페이스 생성(#22) * Feat: 학생 데이터를 grade -\> year + semesterCount 로 두개로 분할 시킴(#22) * Feat: 학생 관리 조회 API 연결(#22) * Refactor: 학생관리의 beforeData 상수 사용하도록 리펙터링(#22) * Refactor: 학생 관리의 IStudent를 미리 정의해둔 상수를 사용하도록 리펙터링(#22) * Refactor: 학생 관리 관련 데이터 리펙터링(#22) * Feat: 학생 항목 추가 모달에서 handleSubmit 구현(#22) * Feat: 학생 생성 API 연결(#22) * Feat: 마일리지 등록 READ 연결(#24) * Feat: collapsibleTable 연결(#24) * Feat: 받아온 데이터와 연결(#24) * Feat: 데이터 연결 완료(#24) * Feat: 마일리지 등록 리펙터링 (#24) * Style: 반응형 구축 scroll (#24) * Feat: 마일리지 등록 모달 완성(#24) * Style: 팀원 피드백에 따라 반응형 스크롤로 수정(#24) * Feat: 버튼을 통해 엑셀 다운로드 연결(#26) * Feat: 학생 이름 , 학생 학년 , 학생이 속한 학부 필터링을 위한 state를 reducer에 생성(#15) * Feat: 학생명 필터링 드롭다운 메뉴 생성(#15) * Fix: 필드가 studentName이 더 적절한 것 같아서 name을 studentName으로 수정(#15) * Feat: 학생 이름 드롭다운 메뉴 연결(#15) * Feat: 학년 드롭다운 컴포넌트 생성(#15) * Feat: 학년 필터링 연결(#15) * Fix: grade가 number이었어서 slice가 먹히지 않았다. string으로 변환 후 slice를 사용(#15) * Style: 학부 드롭다운 UI생성 (#15) * Feat: 학부 필터링 연결 완료(#15) * Refactor: 학년 필터링 MenuItem를 map을 사용하여 줄임(#15) * Feat: 학기 필터링 menuItem을 map으로 변환(#15) * Refactor: 보이기 여부 menuItem을 map을 사용하여 변환(#15) * Style: 학기의 필터링의 높이와 넓이 조정(#15) * Style: 카테고리 필터링의 스타일 변경(#15) * Style: 보이기 여부 필터링 스타일조정(#15) * Style: 항목명 필터링 너비와 높이 스타일지정(#15) * Style: 학년 필터링 너비와 높이 지정(#15) * Style: select는 width자동 지정 되므로 width 없애고 autocomplete만 width 지정(#15) * Style: 필터링과 테이블 반응형 구축(#15) * Style: 커스텀 테이블의 반응형 스타일을 스타일드 컴포넌트로 뺴냄(#15) * Style: 2중 테이블 - 마일리지 등록 리스트 반응형 구축(#15) * Feat: 필터링 카테고리에 디비에 존재하는 카테고리를 데이터 연결(#15) * Fix: 마일리지 글로벌 항목 학기 , 마일리지 , 최대 마일리지 삭제(#15) * Fix: 글로벌 항목 리스트 항목명 안보이는 버그 itemName -\> name으로 변경하여 해결(#15) * Fix: 마일리지 학기별 항목 리스트 넘겨주는 값들 수정(#15) * Fix: 마일리지 등록 리스트 카테고리명 추가(#15) * Feat: 필요한 때만 보이도록 현재 테이블의 위치(componentNum)를 통해 설정함(#15) * Refactor: 필터링 전체로 묶고 컴포넌트로 따로 뺌(#15) * Feat: 맨 처음에 필터링을 위해 전역 변수로 카테고리, 학생 , 글로벌항목명들을 가져온다. 그리고 이걸 persist로저장(#15) * Fix: filter와 filterList 구분을 통해서 영속성을 List에만 부여(#15) * Fix: 버그 수정 * Feat: 메인에서 필터링 데이터를 전달 받고 mileage/category페이지로 라우팅(#28) * Style : Drawer mouseHover하면 열리고 mouseOut하면 닫히도록 수정 * Style : 정렬 할때 화살표가 나타나도록 설정(#28) * Fix: 교수님의 요구 사항에 따라 마일리지 등록 부분을 2단 테이블 -\> 단일 테이블로 변경(#28) * Feat: 마일리지 등록 등록된 학생 crud 테이블(#28) * Style : 테이블 수정 * Fix: 카테고리 GET API의 DTO수정에 따라 인터페이스와 보여주는 값 변경(#29) * Fix: 카테고리 수정 / 삭제 폼과 API 연결 수정(#29) * Fix: edit때 사용되는 기존 데이터를 전달하는 beforeData를 전역적으로 관리하여 기존의 전달되지 않던 오류 수정(#29) * Fix: 항목 선택을 위해 id -\> num으로 필드 설정(#29) * Fix: BREAKING CHANGE: 학기별 세부 항목 수정된 결과값에 맞게 수정(#29) * Fix: 학생관리 리스트 수정 된 API 정책에 맞게 연결 및 모달 수정(#29) * Fix : 브랜치 변경을 위한 커밋 * Feat : 차트 인덱스 state redux로 관리(#29) * Style : Tabs 컴포넌트 제작(#30) * Refactor : ReportTabs를 컴포넌트로 이동(#30) * Style: 파이 그래프 , 선 그래프 예시 만들기(#30) * Style: 더 많은 그래프 예시 연결(#30) * Fix : 리포트 텝스 라우트 연결(#30) * Fix : 카테고리 우선 순위 나타나도록 설정 * Feat: 마일리지 학기별 항목 리스트 모달에서 학기를 Select로 변경(#32) * Feat: 마일리지 학기별 항목 리스트 모달에 글로벌 항목 Select 실제 데이터 연결(#32) * Feat: 학부 Select 제작(#32) * Feat: 전공 Select 제작(#32) * Feat: 학년 Select 생성(#32) * Feat: 학기수 Select 생성(#32) * Feat: 학생 등록 모달 폼에 Select (학년 , 학기 수) 추가(#32) * Feat : 학생 목록 가져오기 * Fix : CategoryAutoCompletet undefinded 에러(#28) * Fix: 마일리지 등록 학생 추가 테이블 각 필드 픽셀 수정(#28) * Feat: 학생 추가 리스트와 실제 데이터 연결을 위한 생성함수(#28) * Feat: 마일리지 등록 학생 테이블 실제 데이터 연결(#28) * Fix: 모달을 누르면 모든 모달이 활성화되는 버그 수정 : 모달 상태 redux -\> useState로 관리(#28) * Feat: 클릭한 마일리지 항목에 등록된 학생들만 불러오도록 API 쿼리파라미터 연결(#28) * Feat: 마일리지 등록 학생 Edit , Delete 연결(#28) * Feat: drawer를 pinned 할 수 있도록 pinned를 리덕스로 전역 상태 관리(#32) * Fix: drawer 전역 상태 설정 소문자 setopen 선언 오류 수정(#34) * Feat: drawer pinned가 참일 때는 drawer가 닫히지 않도록 설정(#34) * Fix: 마일리지 등록 학생 추가/수정 구분 안되는 버그 수정(#34) * Feat : 학생 추가 팝업 밖에서도 가능 하도록 만듬(#35) * Fix : 마일리지 등록 페이지 모달 수정(#35) * Chore: 리액트 드래그앤 드랍 + 타입스크립트 라이브러리 설치(#37) * Chore : next Config 설정을 통해 strictMode에서도 드래그 앤드랍 사용할 수 있도록 설정(#37) * Feat: 드래그 앤 드랍 테이블에 적용(#37) * Feat(드래그 앤 드랍 픽셀 깨짐 현상 , 레이아웃 변형 수정(#37)): * Fix: 드래그 앤 드랍 orderIdx 잘 수정되지 않는 버그 수정(#38 * Fix: 드래그 앤 드랍 우선 순위 변경 로직 수정(#38) * Feat : orderIdx로 정렬(#38) * Feat: 마일리지 카테고리에 최근 수정일 추가(#38) * Fix: 데이터 orderIdx 정렬 전에 데이터 타입과 데이터 입력이 잘 되어있는 지 확인하여에러 수정(#42) * Fix: 글로벌 항목 생성 / 수정 시 선택한 카테고리를 실제 id와 연결(#42) * Feat: 글로벌 항목 테이블에서 최근 수정일 추가(#42) * Feat: 마일리지 학기별 항목 테이블에 최근 수정일 추가(#42) * Fix : 학생 관리 , 마일리지 등록 테이블에 최근 수정일 추가(#42) * Fix: 마일리지 등록 학생 리스트에서 반환 리스트가 달라짐에 따라 데이터 파싱 수정(#42) * Fix : 레코드 patch API 연결 안되는 버그 수정(#42) * Feat : 학생의 고유 번호가 아닌 sid와 name을 통해 마일리지 등록을 처리하도록 수정(#42) * Feat : axios Instance에 에러 메세지 출력 로직 추가하여 에러 메세지 보여주기(#45) * Fix: 서버사이드가 아닐때만 에러를 alert로 보이도록 수정(#42) * Feat : 관리자 GET API 연결(#44) * Feat : 관리자 삭제 API 연결(#44) * Feat : 관리자 CRUD 연결(#44) * Fix: 수정 폼에서 beforeData를 가져오지 못하는 버그 수정(#44) * Fix : 권한 수정되지 않는 버그 Select로 UI를 수정하면서 버그 해결(#44) * Feat : 테이블에서 권한이 숫자가 아닌 권한 이름으로 보이도록 설정(#44) * Fix : 마일리지 등록 생성/수정에서 Points 삭제(#49) * Feat : 마일리지 등록 등록수 란 생성(#49) * Feat : 학생 관리 delete API 연결(#49) * Feat : 하위 항목으로 인해 삭제되지 않는 에러 메세지 출력(#49) * Feat : 글로벌 항목 중 하위 항목을 지니고 있다면 삭제 시 에러메세지 출력(#49) * Fix : 모달 redux 대신 useState로 공용 state를 제거(#50) * Feat : 공용 state를 제거함에 따라 모달을 닫는 함수를 redux가 아닌 props로 전달(#50) * Fix : 글로벌 항목 isVisibleDropdown key warning 삭제(#50) * Feat: 툴팁 관련 warning 삭제(#50) * Fix : 드래그앤 드랍 이후 다른 필드들이 저장되지 않고 null이되는 버그 수정(#50) * Fix : 사용자 관리 페이지 명칭 관리자로 수정(#50) * Feat: MultiTap UI 구현 * Fix: 등록된 마일리지 리스트에서 등록된 학생 수를 읽어온다(#56) * Feat: 마일리지 카테고리 리스트에서 카테고리의 타입을 화면에 표시(#57) * Feat: 카테고리 추가/수정 폼에 타입 Select를 만들어 추가시킴(#57) * Style: 학기별 항목 다중 선택 마법사 UI 제작 (전 학기 , 이번 학기 , 다중 선택 리스트 , 제출 취소 버튼)(#59) * Feat: 이전 학기 데이터를 불러와 학기별 항목 마법사에 실제 데이터 연결(#59) * Feat: 다중 입력 API 연결(#59) * Refactor: 학기별 항목 마법사 TransferList 리펙터링(#59) * Style: 마일리지 학기별 항목 다중 이전 마법사 픽셀 및 스타일 조정(#59) * Feat: 학기별 항목, 학생 삭제시 하위 항목 있으면 기록 조회 시켜주는 API 연결(#49) * Fix: 드래그 앤 드랍 마일리지 카테고리에서만 가능하도록 기능 제한 및 커서 변경(#52) * Fix: 드래그앤 드랍 후 업데이트 쿼리에 타입 필드가 없어서 나는 오류 수정(#52) * Feat: 학기별 maxPoints 분포 시각화 자료 bar Chart 생성(#59) * Fix : index 페이지 수정 사항 적용 * Feat: 마일리지 학기별 마법사 붙여 넣을 학기별 항목 불러오기 API 연결(#64) * Style: 학기별 항목 마법사 중복 항목에 대한 스타일 추가(#64) * Feat : 중복은 disabled 처리하여 넘어가지 못하도록 설정(#64) * Fix: 카테고리에 하위 항목의 갯수를 나타내는 필드 추가(#64) * Feat: 마일리지 글로벌 항목에서 하위 학기별 항목 수를 나타내는 필드 추가(#66) * Fix: Semester Select 컴포넌트 학기 하드 코딩 -> 현재 연도 기준 +- 4년 동안의 학기 동적 생성(#65) * Fix : 현재 년도에서 +1 년 -4년까지 학기를 선택할 수 있도록 학기와 관련된 select, dropdown 등을 자동화시킴(#65) * Feat : 엑셀 임포트 API 연결 및 자동화(#55) * Fix: input file type에 선택한 파일이 엑셀 import 파일로 매핑이 잘 되지 않던 버그 수정(#55) * FEATURE : JWT 토큰을 연결하여 유저 로그인을 구현한다. (#72) * Feat: axios Instance에 헤더에 localStroage에서 엑세스 토큰을 꺼내서 매 요청마다 넣어서 요청(#71) * Feat: SSR의 경우 브라우저의 토큰에 접근할 수 없기 때문에 쿠키에 저장 후 getServerSideProps에서 쿠키를 파싱하여 사용(#71) * Refactor: jwt access 토큰을 쿠키에 넣고 다니는 함수 export , axios Instance 브라우저 환경에서만 쿠키사용(#71) * Fix: 엑셀 다운로드 안되던 버그 수정(#71) * Feat: 로그인 연결 및 로그인 후 카테고리 페이지로 이동(#71) * Fix: 쿠키 설정 오류(#73 * Fix: 브라우저에서 쿠키 헤더에 넣는 게 잘 안되던 버그 수정(#75) * Style: 학기 리스트 테이블과 interface(#75) * Fix: 쿠키에 여러 값있을 때 여러 줄이 한 value에 나타나는 버그 수정(#75) * Feat: 설정 페이지 라우팅 , drawer에 추가(#75) * Feat: 신청 기간 수정/마감 로직 구현(#75) * Feat: 버튼 클릭 했을 시 다른 버튼은 모두 수정 중이 아니게 되도록 수정(#75) * Feat: 수정 중일 때 시작일 , 마감일 datetime-local 타입으로 변경되게 하고 state 연결 및 수정 api 연결(#75) * Feat: 신청 가능 일때만 마감 버튼 O , 선정완료일 때는 수정 버튼 X(#75) * Feat: 시간 대를 한국 시간대로 맞추고 형식을 백엔드와 맞춤으로써 수정/마감 API연동을 진행함(#75) --- src/auth/jwtCookie.js | 51 +++++ src/components/common/Drawer/Drawer.tsx | 3 + src/components/common/Table/SemesterTable.tsx | 200 ++++++++++++++++++ src/components/excel/ExcelExport.tsx | 13 +- src/components/modalForm/CategoryForm.tsx | 1 - src/pages/index.js | 8 +- src/pages/manage/setting/index.tsx | 39 ++++ src/pages/manage/student/index.tsx | 4 +- src/pages/manage/user/index.tsx | 5 +- src/pages/mileage/category/index.tsx | 8 +- src/pages/mileage/item/global/index.tsx | 5 +- src/pages/mileage/item/semester/index.tsx | 6 +- src/pages/mileage/register/index.tsx | 6 +- src/pages/mileage/view/index.tsx | 9 + src/sections/auth/AuthLoginForm.js | 21 +- src/utils/axios.js | 15 ++ src/utils/formatTime.js | 31 +++ 17 files changed, 400 insertions(+), 25 deletions(-) create mode 100644 src/auth/jwtCookie.js create mode 100644 src/components/common/Table/SemesterTable.tsx create mode 100644 src/pages/manage/setting/index.tsx diff --git a/src/auth/jwtCookie.js b/src/auth/jwtCookie.js new file mode 100644 index 0000000..94a171b --- /dev/null +++ b/src/auth/jwtCookie.js @@ -0,0 +1,51 @@ +import { accessToken } from 'mapbox-gl'; +import axiosInstance from 'src/utils/axios'; + +export function setCookie(name, value, days) { + let expires = ''; + if (days) { + const date = new Date(); + date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000); + expires = `; expires=${date.toUTCString()}`; + } + document.cookie = `${name}=${value || ''}${expires}; path=/`; +} + +export function setServerSideCookie(context) { + let { cookie } = context.req.headers; + + cookie = getKeyFromPairString(cookie, 'accessToken'); + + if (cookie !== '') { + axiosInstance.defaults.headers.common.Authorization = `Bearer ${cookie}`; + } +} + +export function getKeyFromPairString(pairString, key) { + const pairArr = pairString ? pairString?.split(';').map((pair) => pair.trim()) : []; + + // eslint-disable-next-line no-restricted-syntax + for (const pair of pairArr) { + const [pairKey, pairValue] = pair.split('=').map((c) => c.trim()); + + if (pairKey === key) { + return pairValue; + } + } + + return ''; +} + +export function getCookie(key) { + const cookies = document.cookie.split(';').map((cookie) => cookie.trim()); + console.log(cookies); + // eslint-disable-next-line no-restricted-syntax + for (const cookie of cookies) { + const [cookieKey, cookieValue] = cookie.split('=').map((c) => c.trim()); + if (cookieKey === key) { + console.log(cookieValue); + return cookieValue; + } + } + return null; +} diff --git a/src/components/common/Drawer/Drawer.tsx b/src/components/common/Drawer/Drawer.tsx index 6c1d780..2370a6a 100644 --- a/src/components/common/Drawer/Drawer.tsx +++ b/src/components/common/Drawer/Drawer.tsx @@ -140,8 +140,11 @@ export default function MiniDrawer() { return '/manage/student'; case 7: return '/manage/user'; + case 9: return '/mileage/result'; + case 10: + return '/manage/setting'; case 11: return '/report'; default: diff --git a/src/components/common/Table/SemesterTable.tsx b/src/components/common/Table/SemesterTable.tsx new file mode 100644 index 0000000..0434640 --- /dev/null +++ b/src/components/common/Table/SemesterTable.tsx @@ -0,0 +1,200 @@ +import * as React from 'react'; +import { useState } from 'react'; +import { styled } from '@mui/material/styles'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell, { tableCellClasses } from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Paper from '@mui/material/Paper'; +import { Box, Button, TextField } from '@mui/material'; +import axiosInstance from 'src/utils/axios'; +import { + // formatDateToISOString, + // formatDateToISOStringExceptT, + getCurrentKST, +} from 'src/utils/formatTime'; +import { rowSelectionStateInitializer } from '@mui/x-data-grid/internals'; + +const StyledTableCell = styled(TableCell)(({ theme }) => ({ + [`&.${tableCellClasses.head}`]: { + backgroundColor: 'darkGray', + color: theme.palette.common.white, + }, + [`&.${tableCellClasses.body}`]: { + fontSize: 14, + }, +})); + +const StyledTableRow = styled(TableRow)(({ theme }) => ({ + '&:nth-of-type(odd)': { + backgroundColor: theme.palette.action.hover, + }, + // hide last border + '&:last-child td, &:last-child th': { + border: 0, + }, +})); + +interface IGetAllSemesterWithStatus { + count: number; + list: ISemesterWithStatus[]; +} + +interface IISemesterWithStatus { + id: number; + name: string; + status: string; + applyStart: string; + applyEnd: string; +} + +const FlexBox = styled(Box)({ + display: 'flex', + gap: '10px', + alignItems: 'center', +}); + +const headRow = ['번호', '학기 이름', '시작일', '마감일', '신청 상태', '설정']; + +export default function SemesterTable({ data }: IGetAllSemesterWithStatus) { + const [isModifying, setIsModifying] = React.useState( + new Array(data.list.length).fill(false) + ); + const [startDate, setStartDate] = React.useState(); + const [endDate, setEndDate] = React.useState(); + + const handleModify = (semesterId: number, rowIdx: number) => { + if (isModifying[rowIdx]) { + modifyApply(semesterId); + } + + setStartDate(data.list[rowIdx].applyStart); + setEndDate(data.list[rowIdx].applyEnd); + + let newIsModifying = new Array(data.list.length).fill(false); + newIsModifying[rowIdx] = true; + + setIsModifying(newIsModifying); + }; + + const handleCancel = (rowIdx: number) => { + console.log(data.list.length); + setIsModifying(new Array(data.list.length).fill(false)); + }; + + const modifyApply = async (semesterId: number) => { + const modifyData = { + semesterId: semesterId, + applyStart: startDate, + applyEnd: endDate, + }; + if (window.confirm('정말 수정하시겠습니까??')) { + axiosInstance.patch('/api/mileage/semesters/period', modifyData).then((res) => { + setIsModifying(new Array(data.list.length).fill(false)); + + window.location.reload(); + }); + } + }; + + const handleEnd = (row) => { + // console.log(formatDateToISOStringExceptT(getCurrentKST())); + + if (window.confirm('정말 마감하시겠습니까??')) { + const endData = { + semesterId: row.id, + applyStart: row.applyStart, + applyEnd: getCurrentKST(), + }; + console.log(endData); + + axiosInstance.patch('/api/mileage/semesters/period', endData).then((res) => { + window.location.reload(); + }); + } + }; + return ( + + + + + {headRow.map((elem, index) => ( + + {elem} + + ))} + + + + {data.list.map((row, idx) => ( + + + {idx + 1} + + {row.name} + {isModifying[idx] ? ( + + setStartDate(e.target.value)} + /> + + ) : ( + {row?.applyStart} + )} + {isModifying[idx] ? ( + + setEndDate(e.target.value)} + /> + + ) : ( + {row?.applyEnd} + )} + + {row.status} + + {isModifying[idx] ? ( + + + + + ) : ( + + {row.status !== '선정 완료' && ( + + )} + {row.status === '신청 가능' && ( + + )} + + )} + + + ))} + +
+
+ ); +} diff --git a/src/components/excel/ExcelExport.tsx b/src/components/excel/ExcelExport.tsx index 950e4ee..56c6e26 100644 --- a/src/components/excel/ExcelExport.tsx +++ b/src/components/excel/ExcelExport.tsx @@ -35,11 +35,11 @@ export default function ExcelExport() { const handleExcelExport = (e, endPoint) => { console.log(e.target.id, endPoint); - setMenuButton(0); - // axiosInstance.get(endPoint).then((res) => { - // console.log(res); - // alert(`${e.target.id} 다운로드가 완료되었습니다.`); - // }); + // setMenuButton(0); + axiosInstance.get(endPoint).then((res) => { + console.log(res); + alert(`${e.target.id} 다운로드가 완료되었습니다.`); + }); }; return ( @@ -49,8 +49,9 @@ export default function ExcelExport() { * @brief 엑셀 다운로드 버튼 * @description Link Masking (서버의 링크를 숨긴다.) */ - +