From 08a5c96b60c48966113385d275bdbf389e2ec0d0 Mon Sep 17 00:00:00 2001 From: minkyung Date: Thu, 10 Dec 2020 16:05:56 +0900 Subject: [PATCH 01/45] =?UTF-8?q?chore(git):=20gitignore=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..6d0ee45db --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.vscode +.DS_Store \ No newline at end of file From 2edaa1c3999d6fec39021494adc5342f79e78cae Mon Sep 17 00:00:00 2001 From: minkyung Date: Thu, 10 Dec 2020 16:37:23 +0900 Subject: [PATCH 02/45] =?UTF-8?q?docs:=20Readme=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 주어진 요구사항, 참고사항 정리 - 2주차 피드백 정리 - 구현할 화면의 구성에 대한 정리 - 구현할 기능에 대한 정리 --- README.md | 278 ++++++++++++++++++++++++++++++++++++++++++++++++--- images/1.png | Bin 0 -> 275156 bytes 2 files changed, 265 insertions(+), 13 deletions(-) create mode 100644 images/1.png diff --git a/README.md b/README.md index e97a1d649..baf559303 100644 --- a/README.md +++ b/README.md @@ -1,69 +1,157 @@ # 🚇 지하철 노선도 미션 -## 🚀 기능 요구사항 +> 지하철 노선도 미션은 우아한 테크코스 프리코스 3주차 미션입니다. + +지하철 노선도 미션에서는 유저가 지하철 역과 역을 포함하고있는 노선과 노선의 구간을 관리하고, 그에 따라 만들어진 전체 지하철 노선도를 출력해볼 수 있는 화면을 만듭니다. + +## ✔️ 주어진 요구사항 + +- [기능요구사항](#기능-요구사항) +- [프로그래밍 요구사항](#프로그래밍-요구사항) +- [추가된 요구사항](#추가된-요구사항) +- [미션 저장소 및 진행 요구사항](#미션-저장소-및-진행-요구사항) + +## ✔️ 주어진 참고사항 + +- [프로그램 실행 결과](#프로그램-실행-결과) + +## ✔️ 피드백 정리 + +- [2주차 피드백 정리](#2주차-피드백-정리) + +## ✔️ 화면의 구성 + +![화면 구성 - 1, 2](images/1.png) + +## ✔️ 구현할 기능 목록 + +### 0. 전체 화면 + +- 전체 지하철 관리 + +### 1.지하철 역 관리 관련 기능 + +- 유저로부터 지하철 역 이름을 입력받아 등록하는 기능 + + - 🚦**예외 상황** + - 유저가 지하철 역 이름을 1글자만 입력하거나 입력하지 않았을 때 ex) "잠", "" + - 유저가 완성되지 않은 역 이름을 입력했을 때 ex) "잠ㅁ실", "서ㅓㄱ촌" + - 유저가 중복된 지하철 역 이름을 등록하려고 할 때 + +- 저장된 지하철 역 목록을 보여주는 기능 +- 저장된 지하철 역에서 역을 삭제할 수 있는 기능 + - 🚦**예외 상황** + - 노선에 등록된 역은 삭제할 수 없음 + +### 2.지하철 노선 관리 관련 기능 + +- 유저로부터 노선 이름을 입력받아 등록하는 기능 + + - 🚦**예외 상황** + - 유저가 노선 이름을 입력하지 않았을 때 ex) "" + - 유저가 완성되지 않은 노선 이름을 입력했을 때 ex) "경ㅇ의중앙선", "4호선ㄴ" + - 유저가 중복된 노선 이름을 등록하려고 할 때 + +- 저장된 노선 목록을 보여주는 기능 +- 저장된 노선 목록에서 노선을 삭제할 수 있는 기능 + +### 3.지하철 구간 관리 관련 기능 + +- 각 노선 별로 만들어진 버튼을 누르면 해당 노선 관리 컨테이너를 보여주는 기능 +- 역을 선택하고 유저의 입력을 받아 노선의 순서를 정할 수 있는 기능 + + - 하나의 역은 여러 개의 노선에 추가될 수 있음 + - 역과 역 사이에 새로운 역이 추가될 수 있음 + - 🚦**예외 상황** + - 유저가 노선의 순서를 0 또는 음수로 입력했을 때 + - 유저가 노선의 순서를 소수로 입력했을 때 ex) 1.2 + +- 역을 노선에서 삭제할 수 있는 기능 + - 종점을 제거할 경우, 그 다음 역이 종점이 됨 + - 🚦**예외 상황** + - 노선에 포함된 역이 2개 이하일 때 역을 제거할 수 없음 + +### 4.지하철 노선도 출력 관련 기능 + +- 노선 별 저장된 역들을 순서대로 모두 출력하는 기능 + +--- + +## 기능 요구사항 ### 지하철 역 관련 기능 + - 지하철 역을 등록하고 삭제할 수 있다. (단, 노선에 등록된 역은 삭제할 수 없다) - 중복된 지하철 역 이름이 등록될 수 없다. - 지하철 역은 2글자 이상이어야 한다. - 지하철 역의 목록을 조회할 수 있다. ### 지하철 노선 관련 기능 + - 지하철 노선을 등록하고 삭제할 수 있다. - 중복된 지하철 노선 이름이 등록될 수 없다. - 노선 등록 시 상행 종점역과 하행 종점역을 입력받는다. - 지하철 노선의 목록을 조회할 수 있다. ### 지하철 구간 추가 기능 + - 지하철 노선에 구간을 추가하는 기능은 노선에 역을 추가하는 기능이라고도 할 수 있다. - - 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다. + - 역과 역사이를 구간이라 하고 이 구간들의 모음이 노선이다. - 하나의 역은 여러개의 노선에 추가될 수 있다. - 역과 역 사이에 새로운 역이 추가 될 수 있다. - 노선에서 갈래길은 생길 수 없다. - +![지하철 구간 추가 기능](images/section1.png) ### 지하철 구간 삭제 기능 + - 노선에 등록된 역을 제거할 수 있다. - 종점을 제거할 경우 다음 역이 종점이 된다. - 노선에 포함된 역이 두개 이하일 때는 역을 제거할 수 없다. - +![지하철 구간 삭제 기능](images/section2.png) ### 지하철 노선에 등록된 역 조회 기능 + - 노선의 상행 종점부터 하행 종점까지 연결된 순서대로 역 목록을 조회할 수 있다. -
+
-## 💻 프로그램 실행 결과 +## 프로그램 실행 결과 ### 역관리 - + +![프로그램 실행 결과 - 역관리](images/station_manager.gif) ### 노선관리 - + +![프로그램 실행 결과 - 노선관리](images/line_manager.gif) ### 구간관리 - + +![프로그램 실행 결과 - 구간관리](images/section_manager.gif) ### 노선도 출력 - +![프로그램 실행 결과 - 노선도 출력](images/map_print_manager.gif) -## ✅ 프로그래밍 요구사항 +## 프로그래밍 요구사항 ### 메뉴 버튼 + - 역 관리 button 태그는 `#station-manager-button` id값을 가진다. - 노선 관리 button 태그는 `#line-manager-button` id값을 가진다. - 구간 관리 button 태그는 `#section-manager-button` id값을 가진다. - 지하철 노선도 출력 관리 button 태그는 `#map-print-manager-button` id값을 가진다. ### 지하철 역 관련 기능 + - 지하철 역을 입력하는 input 태그는 `#station-name-input` id값을 가진다. - 지하철 역을 추가하는 button 태그는 `#station-add-button` id값을 가진다. - 지하철 역을 삭제하는 button 태그는 `.station-delete-button` class값을 가진다. ### 지하철 노선 관련 기능 + - 지하철 노선의 이름을 입력하는 input 태그는 `#line-name-input` id값을 가진다. - 지하철 노선의 상행 종점을 선택하는 select 태그는 `#line-start-station-selector` id값을 가진다. - 지하철 노선의 하행 종점을 선택하는 select 태그는 `#line-end-station-selector` id값을 가진다. @@ -71,6 +159,7 @@ - 지하철 노선을 삭제하는 button 태그는 `.line-delete-button` class값을 가진다. ### 지하철 구간 추가 기능 + - 지하철 노선을 선택하는 button 태그는 `.section-line-menu-button` class값을 가진다. - 지하철 구간을 설정할 역 select 태그는 `#section-station-selector` id값을 가진다. - 지하철 구간의 순서를 입력하는 input 태그는 `#section-order-input` id값을 가진다. @@ -78,6 +167,7 @@ - 지하철 구간을 제거하는 button 태그는 `.section-delete-button` class값을 가진다. ### 지하철 노선도 출력 기능 + - 지하철 노선도 출력 버튼을 누르면 `
` 태그를 만들고 해당 태그 내부에 노선도를 출력한다. ### 기존 요구사항 @@ -101,14 +191,176 @@ - [https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals](https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Template_literals) ### 추가된 요구사항 -- [data](https://developer.mozilla.org/ko/docs/Learn/HTML/Howto/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%86%8D%EC%84%B1_%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0)속성을 활용하여 html 태그에 역, 노선, 구간의 유일한 데이터 값들을 관리한다. + +- [data](https://developer.mozilla.org/ko/docs/Learn/HTML/Howto/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%86%8D%EC%84%B1_%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0)속성을 활용하여 html 태그에 역, 노선, 구간의 유일한 데이터 값들을 관리한다. - [localStorage](https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage)를 이용하여, 새로고침하더라도 가장 최근에 작업한 정보들을 불러올 수 있도록 한다.
-## 📝 미션 저장소 및 진행 요구사항 +## 미션 저장소 및 진행 요구사항 - 미션은 [https://github.com/woowacourse/javascript-subway-map-precours](https://github.com/woowacourse/javascript-subway-map-precourse) 저장소를 fork/clone해 시작한다. - **기능을 구현하기 전에 javascript-subway-precourse/docs/README.md 파일에 구현할 기능 목록**을 정리해 추가한다. - **git의 commit 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위로 추가**한다. - [프리코스 과제 제출](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 문서 절차를 따라 미션을 제출한다. + +--- + +## 2주차 피드백 정리 + +### 📌기능 목록 구현 + +> 🔫: 1주차 피드백에서도 강조된 부분 + +- 🔫기능 목록 구현을 재검토한다. + + - 기능 목록을 너무 상세히 작성하지 않는다. (언제든 변경될 수 있기 때문) + - 구현해야 할 기능 목록을 정리하는 데 집중한다. + - **예외적인 상황도 기능 목록에 정리한다.** + - 기능을 구현하며 계속해서 추가해 나간다. + - 기능 목록 작성 예시(자동차 경주 게임) + + ```text + - 사용자가 입력한 이름을 쉼표 기준으로 분리해야 한다. + - 사용자 이름이 5자 이하인지 검증해야 한다. + - 자동차는 4이상인 경우 전진한다. + - 자동차는 4미만인 경우 정지한다. + - 0 ~ 9 사이의 임의의 값을 생성한다. + - 여러 대의 자동차 중 최대 위치 값을 구한다. + - 최대 위치 값에 해당하는 자동차 목록을 구한다. + ``` + +### 📌Git + +- git `commit message`에 `#번호`를 추가하지 않는다. + - `#번호`는 `다른 이슈` 또는 `Pull Request`를 참조할 때 사용한다. +- git을 통해 관리할 자원에 대해서도 고려한다. + - `.idea`, `.vscode`, `node_modules` 등과 같은 경우 git으로 관리하지 않아도 된다. + - git에 파일을 추가할 때에는 git을 통해 관리할 필요가 있는 지 여부를 고려해야 한다. +- Pull Request를 보내기 전, 브랜치를 확인한다. + - 새로 만든 브랜치에서 작업한 후, PR을 보닌다. + +### 📌상수, 이름 및 주석 + +- 가능하면 하드코딩되는 값들을 `상수`로 활용한다. +- 서비스, 게임 등에서는 로직이 변경되거나 요구사항이 추가될 수 있기 때문에, 해당하는 값들을 하드코딩하다보면 수정 과정 중에 휴먼 에러가 발생할 수 있기 때문이다. +- 하드코딩 되는 값들의 예시(자동차 경주 게임) + + ```text + - 이동/정지 기준 : 4 + - Random 생성 기준 : 10 + - 여러 에러 메시지들 + ``` + +- 🔫`이름`을 통해 의도를 드러내라. + + - 변수, 함수 이름을 축약하지 말아라. + - 의도를 드러낼 수 있다면 이름이 길어져도 괜찮다. + +- 🔫주석은 꼭 필요한 경우만 남긴다. + - 가능하면 변수 이름, 함수(메소드) 이름을 통해 의도를 드러내고, 의도를 드러내기 힘든 경우 주석을 단다. + +### 📌Coding + +- Boolean을 return하는 경우, 간결히 한다. + + - 좋지 않은 예시 + + ```javascript + const isValidCar = car => { + if (car.hasValidName()) { + return true; + } + return false; + }; + ``` + + - 좋은 예시 (보다 명확하고, 코드가 간결) + + ```javascript + const isValidCar = () => { + return car.hasVAlidName(); + }; + ``` + +- javascript에서 제공하는 api를 적극적으로 활용한다. + + - 메소드를 직접 구현하기 전에, javascript api에서 제공하는 기능인지 검색을 먼저 해본다. + - 제공하지 않는 기능일 경우, 직접 구현한다. + - 자동차 경주 게임의 우승자 출력 예시 + + ```javascript + const winners = ["east", "west", "south"]; + winners + .map(winner => { + return winner; + }) + .join(","); + // "east,west,south" + ``` + +- 불필요한 변수를 줄이기 위해 노력한다. + + - 복잡도와 버그가 발생할 가능성을 높인다. + - 중복이 있는지 확인해 `멤버변수의 수`를 최소화한다. + - 자동차 경주 게임 예시 + + - 좋지 않은 예시 + + ```javascript + function RacingCarGame() { + this.cars; + this.maxDistance; + this.winners; + } + ``` + + - 좋은 예시 + + ```javascript + function RacingCarGame() { + this.cars; + + this.getWinners = () => {...} + this.getMaxDistance = () => {...} + } + ``` + +- 비지니스 로직과 UI 로직을 분리해라. + + - 비지니스 로직과 UI 로직을 한 함수가 담당하지 않도록 한다. + - 단일 책임의 원칙을 지켜야 한다. + - 자동차 경주 게임 예시 + + - 좋지 않은 예시 + + ```javascript + function Car() { + this.position = 0; + + // 자동차 이동 여부를 결정하는 비지니스 로직 + this.move = (randomNumber) => {...} ; + + // UI 로직 + this.render = () => { + $element.innerHTML = template() + }; + } + ``` + +- 함수(메소드) 라인에 대한 기준 + + - 공백 라인도 한 라인에 해당하기 때문에 주석은 가능하면 함수 밖 또는 코드 우측에 추가하는 방식으로 구현한다. + +- 발생할 수 있는 예외 케이스에 대해 고민한다. + + - 정상적인 경우를 구현하는 것보다 예외 상황을 모두 고려해 프로그래밍하는 것이 더 어렵다. + - 예외 상황을 잘 고려해 프로그래밍하는 `습관`을 들여야 한다. + - 그리고 이러한 예외 상황에 대한 처리를 잘 할 수 있어야 한다. + - 자동차 경주 게임의 예외상황 예시 + + ```text + - 만약 진행할 게임의 횟수에 음수를 입력한다면? + - 만약 이름에 빈 값을 넣는다면? + - 만약 쉼표를 이름으로 넣는다면? + ``` diff --git a/images/1.png b/images/1.png new file mode 100644 index 0000000000000000000000000000000000000000..7acaf4667ba57dc604b2b53ee45a8437d019a867 GIT binary patch literal 275156 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 z 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

OF+SioNY+pW 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

R23g7z)>GmL1;1WO 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

@L> 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 literal 0 HcmV?d00001 From 533a9b9705561a0de8762ea7d8b2f696b0594894 Mon Sep 17 00:00:00 2001 From: minkyung Date: Thu, 10 Dec 2020 17:27:00 +0900 Subject: [PATCH 03/45] =?UTF-8?q?docs:=20Readme=EC=9D=98=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=83=81=ED=99=A9=20highlight?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index baf559303..fbff4b3d9 100644 --- a/README.md +++ b/README.md @@ -34,9 +34,9 @@ - 유저로부터 지하철 역 이름을 입력받아 등록하는 기능 - 🚦**예외 상황** - - 유저가 지하철 역 이름을 1글자만 입력하거나 입력하지 않았을 때 ex) "잠", "" - - 유저가 완성되지 않은 역 이름을 입력했을 때 ex) "잠ㅁ실", "서ㅓㄱ촌" - - 유저가 중복된 지하철 역 이름을 등록하려고 할 때 + - 유저가 지하철 역 이름을 1글자만 입력하거나 입력하지 않았을 때 ex) `"잠"`, `""` + - 유저가 완성되지 않은 역 이름을 입력했을 때 ex) `"잠ㅁ실"`, `"서ㅓㄱ촌"` + - 유저가 중복된 지하철 역 이름을 등록하려고 할 때 - 저장된 지하철 역 목록을 보여주는 기능 - 저장된 지하철 역에서 역을 삭제할 수 있는 기능 @@ -48,9 +48,9 @@ - 유저로부터 노선 이름을 입력받아 등록하는 기능 - 🚦**예외 상황** - - 유저가 노선 이름을 입력하지 않았을 때 ex) "" - - 유저가 완성되지 않은 노선 이름을 입력했을 때 ex) "경ㅇ의중앙선", "4호선ㄴ" - - 유저가 중복된 노선 이름을 등록하려고 할 때 + - 유저가 노선 이름을 입력하지 않았을 때 ex) `""` + - 유저가 완성되지 않은 노선 이름을 입력했을 때 ex) `"경ㅇ의중앙선"`, `"4호선ㄴ"` + - 유저가 중복된 노선 이름을 등록하려고 할 때 - 저장된 노선 목록을 보여주는 기능 - 저장된 노선 목록에서 노선을 삭제할 수 있는 기능 @@ -63,13 +63,13 @@ - 하나의 역은 여러 개의 노선에 추가될 수 있음 - 역과 역 사이에 새로운 역이 추가될 수 있음 - 🚦**예외 상황** - - 유저가 노선의 순서를 0 또는 음수로 입력했을 때 - - 유저가 노선의 순서를 소수로 입력했을 때 ex) 1.2 + - 유저가 노선의 순서를 0 또는 음수로 입력했을 때 + - 유저가 노선의 순서를 소수로 입력했을 때 ex) `1.2` - 역을 노선에서 삭제할 수 있는 기능 - 종점을 제거할 경우, 그 다음 역이 종점이 됨 - 🚦**예외 상황** - - 노선에 포함된 역이 2개 이하일 때 역을 제거할 수 없음 + - 노선에 포함된 역이 2개 이하일 때 역을 제거할 수 없음 ### 4.지하철 노선도 출력 관련 기능 @@ -208,10 +208,10 @@ ## 2주차 피드백 정리 -### 📌기능 목록 구현 - > 🔫: 1주차 피드백에서도 강조된 부분 +### 📌기능 목록 구현 + - 🔫기능 목록 구현을 재검토한다. - 기능 목록을 너무 상세히 작성하지 않는다. (언제든 변경될 수 있기 때문) From 7b58deccc9973b3901216ca809017b9ca6453b2d Mon Sep 17 00:00:00 2001 From: minkyung Date: Fri, 11 Dec 2020 14:44:01 +0900 Subject: [PATCH 04/45] =?UTF-8?q?style:=20=EC=B2=AB=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=20=EA=B5=AC=EC=84=B1=20-=20=EB=AA=A8=EB=93=A0=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=B0=BD=20=EC=88=A8=EA=B9=80=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/css/index.css | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/css/index.css diff --git a/src/css/index.css b/src/css/index.css new file mode 100644 index 000000000..f1139ce40 --- /dev/null +++ b/src/css/index.css @@ -0,0 +1,6 @@ +#manage-station, +#manage-lines, +#manage-sections, +#manage-map-print { + display: none; +} From e86d089214206494bb9a8dd280030482b843a6dc Mon Sep 17 00:00:00 2001 From: minkyung Date: Fri, 11 Dec 2020 14:49:54 +0900 Subject: [PATCH 05/45] =?UTF-8?q?chore(markup):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=BC=88?= =?UTF-8?q?=EB=8C=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 역 관리, 노선 관리, 구간 관리, 지하철 노선도 출력을 위한 각각의 div 생성 --- index.html | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index fc99deac2..62d654981 100644 --- a/index.html +++ b/index.html @@ -3,11 +3,23 @@ 지하철 노선도 관리 +
-

🚇 지하철 노선도 관리

+

🚇 지하철 노선도 관리

+ +
+
+
+
+ From f935221cdd460313714e6ed22a2a0a23b8565f0e Mon Sep 17 00:00:00 2001 From: minkyung Date: Fri, 11 Dec 2020 14:56:40 +0900 Subject: [PATCH 06/45] =?UTF-8?q?feat:=20element=EB=A5=BC=20=EC=88=A8?= =?UTF-8?q?=EA=B8=B0=EA=B3=A0=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/display/hide-elements.js | 4 ++++ src/utils/display/show-elements.js | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/utils/display/hide-elements.js create mode 100644 src/utils/display/show-elements.js diff --git a/src/utils/display/hide-elements.js b/src/utils/display/hide-elements.js new file mode 100644 index 000000000..ff024dd99 --- /dev/null +++ b/src/utils/display/hide-elements.js @@ -0,0 +1,4 @@ +export default function hideElements(element) { + const elementToHide = document.getElementById(element); + elementToHide.style.display = "none"; +} diff --git a/src/utils/display/show-elements.js b/src/utils/display/show-elements.js new file mode 100644 index 000000000..5cdab921c --- /dev/null +++ b/src/utils/display/show-elements.js @@ -0,0 +1,4 @@ +export default function showElements(element) { + const elementToShow = document.getElementById(element); + elementToShow.style.display = "block"; +} From 442c63b72205da2c4f33757c911de1c796ac6c99 Mon Sep 17 00:00:00 2001 From: minkyung Date: Fri, 11 Dec 2020 14:57:17 +0900 Subject: [PATCH 07/45] =?UTF-8?q?feat:=20=ED=99=94=EB=A9=B4=20=EC=83=81?= =?UTF-8?q?=EB=8B=A8=EC=9D=98=20=EA=B4=80=EB=A6=AC=20=EB=B2=84=ED=8A=BC?= =?UTF-8?q?=EC=9D=84=20=EB=88=8C=EB=A0=80=EC=9D=84=20=EB=95=8C,=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EA=B4=80=EB=A6=AC=20=EB=82=B4=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../total-subway-manage-container.js | 18 ++++++++++++++++++ src/constants/global.js | 9 +++++++++ src/index.js | 3 +++ 3 files changed, 30 insertions(+) create mode 100644 src/components/total-subway-manage-container.js create mode 100644 src/constants/global.js diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js new file mode 100644 index 000000000..ca42485d8 --- /dev/null +++ b/src/components/total-subway-manage-container.js @@ -0,0 +1,18 @@ +import { menuIDs, menus, menuIndexArray } from "../constants/global.js"; +import showElements from "../utils/display/show-elements.js"; +import hideElements from "../utils/display/hide-elements.js"; + +export default function totalSubwayManageContainer() { + for (const [index, child] of menus.entries()) { + const elementToHide = menuIndexArray.filter(x => { + return x !== index; + }); + + child.addEventListener("click", () => { + showElements(menuIDs[index]); + elementToHide.forEach(el => { + hideElements(menuIDs[el]); + }); + }); + } +} diff --git a/src/constants/global.js b/src/constants/global.js new file mode 100644 index 000000000..642d62af3 --- /dev/null +++ b/src/constants/global.js @@ -0,0 +1,9 @@ +export const menuIDs = { + 0: "manage-station", + 1: "manage-lines", + 2: "manage-sections", + 3: "manage-map-print" +}; + +export const menus = document.querySelectorAll("#menu > button"); +export const menuIndexArray = [...Array(menus.length).keys()]; diff --git a/src/index.js b/src/index.js index e69de29bb..0fa2064e7 100644 --- a/src/index.js +++ b/src/index.js @@ -0,0 +1,3 @@ +import totalSubwayManageContainer from "./components/total-subway-manage-container.js"; + +new totalSubwayManageContainer(); From 15c1afee3e9213f1757e78779615d4c6e28dda13 Mon Sep 17 00:00:00 2001 From: ddongule Date: Fri, 11 Dec 2020 22:11:35 +0900 Subject: [PATCH 08/45] =?UTF-8?q?docs:=20Readme=20-=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EA=B4=80=EB=A6=AC=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=98=88=EC=99=B8=20=EC=83=81=ED=99=A9?= =?UTF-8?q?=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 유저가 공백으로 시작하거나 끝나는 이름을 입력했을 때 - 유저가 연속적인 공백이 들어간 이름을 입력했을 때 - 유저가 특수문자가 포함된 이름을 입력했을 때 --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fbff4b3d9..843276058 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,10 @@ - 🚦**예외 상황** - 유저가 지하철 역 이름을 1글자만 입력하거나 입력하지 않았을 때 ex) `"잠"`, `""` - 유저가 완성되지 않은 역 이름을 입력했을 때 ex) `"잠ㅁ실"`, `"서ㅓㄱ촌"` - - 유저가 중복된 지하철 역 이름을 등록하려고 할 때 + - 유저가 중복된 지하철 역 이름을 입력했을 때 + - 유저가 공백으로 시작하거나 끝나는 이름을 입력했을 때 + - 유저가 연속적인 공백이 들어간 이름을 입력했을 때 + - 유저가 특수문자가 포함된 이름을 입력했을 때 ex) `"잠실역;;"`, `"*석촌*"` - 저장된 지하철 역 목록을 보여주는 기능 - 저장된 지하철 역에서 역을 삭제할 수 있는 기능 From 9ee2fd86a48be1375c2335dd3d9c7d695639b672 Mon Sep 17 00:00:00 2001 From: ddongule Date: Fri, 11 Dec 2020 22:58:48 +0900 Subject: [PATCH 09/45] =?UTF-8?q?feat:=20Station=20Class=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 생성자를 가진 Station Class의 기본 코드 작성 --- src/domain/station.js | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/domain/station.js diff --git a/src/domain/station.js b/src/domain/station.js new file mode 100644 index 000000000..d44c8c53b --- /dev/null +++ b/src/domain/station.js @@ -0,0 +1,7 @@ +export default class Station { + constructor(stationName) { + this.stationName = stationName; + } +} + +export const allStationArray = []; From 2283f8f59130c932e1e495283c0eef92ed540c04 Mon Sep 17 00:00:00 2001 From: ddongule Date: Fri, 11 Dec 2020 23:05:29 +0900 Subject: [PATCH 10/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EC=97=AD=20=EA=B4=80=EB=A6=AC=20-=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EC=9D=B4=EB=A6=84=EC=9D=98=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 역 이름을 1글자만 입력 - 역 이름을 입력하지 않음 - 완성되지 않은 역 이름 입력 - 공백으로 시작하거나 끝나는 이름 입력 - 연속적인 공백이 들어간 이름 입력 - 특수문자가 포함된 이름 입력 --- src/constants/global.js | 9 --------- src/global/alert-messages.js | 6 ++++++ src/utils/inputs/validator/validator.js | 23 +++++++++++++++++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) delete mode 100644 src/constants/global.js create mode 100644 src/global/alert-messages.js create mode 100644 src/utils/inputs/validator/validator.js diff --git a/src/constants/global.js b/src/constants/global.js deleted file mode 100644 index 642d62af3..000000000 --- a/src/constants/global.js +++ /dev/null @@ -1,9 +0,0 @@ -export const menuIDs = { - 0: "manage-station", - 1: "manage-lines", - 2: "manage-sections", - 3: "manage-map-print" -}; - -export const menus = document.querySelectorAll("#menu > button"); -export const menuIndexArray = [...Array(menus.length).keys()]; diff --git a/src/global/alert-messages.js b/src/global/alert-messages.js new file mode 100644 index 000000000..ce84e7304 --- /dev/null +++ b/src/global/alert-messages.js @@ -0,0 +1,6 @@ +export const ALERT_MESSAGES = { + ERROR_STATION_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", + ERROR_STATION_INPUT_SPECIAL_CHARACTER: "역 이름에는 특수문자가 입력되지 않습니다!", + ERROR_STATION_INPUT_NOT_COMPLETE: "역 이름을 바르게 작성해 주세요!", + ERROR_STATION_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!" +}; diff --git a/src/utils/inputs/validator/validator.js b/src/utils/inputs/validator/validator.js new file mode 100644 index 000000000..c7942abb4 --- /dev/null +++ b/src/utils/inputs/validator/validator.js @@ -0,0 +1,23 @@ +import { ALERT_MESSAGES } from "../../../global/alert-messages.js"; + +const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; +const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; +const checkMultipleSpaces = /\s{2,}/; + +export default function inputStationValidator(stationNameInputValue) { + let isValid = false; + + if (stationNameInputValue.length < 2) { + alert(ALERT_MESSAGES.ERROR_STATION_INPUT_LENGTH_UNDER); + } else if (checkSpecialCharacter.test(stationNameInputValue)) { + alert(ALERT_MESSAGES.ERROR_STATION_INPUT_SPECIAL_CHARACTER); + } else if (checkInvalidKorean.test(stationNameInputValue)) { + alert(ALERT_MESSAGES.ERROR_STATION_INPUT_NOT_COMPLETE); + } else if (checkMultipleSpaces.test(stationNameInputValue)) { + alert(ALERT_MESSAGES.ERROR_STATION_INPUT_MULTIPLE_SPACES); + } else { + isValid = true; + } + + return isValid; +} From abd0a1304cd1e7919099c55f258f67e5d671c6f5 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:21:01 +0900 Subject: [PATCH 11/45] =?UTF-8?q?feat:=20=EC=9E=85=EB=A0=A5=EC=9D=84=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=ED=99=94=ED=95=B4=EC=A3=BC=EB=8A=94=20clear?= =?UTF-8?q?=20input=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/inputs/clear-input.js | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/utils/inputs/clear-input.js diff --git a/src/utils/inputs/clear-input.js b/src/utils/inputs/clear-input.js new file mode 100644 index 000000000..d383a93a5 --- /dev/null +++ b/src/utils/inputs/clear-input.js @@ -0,0 +1,3 @@ +export default function clearInput(elementToClear) { + elementToClear.value = ""; +} From e504751afda2015fd196c1488f621163fa3241e9 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:25:49 +0900 Subject: [PATCH 12/45] =?UTF-8?q?feat:=20HTML=EC=97=90=20=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EA=B0=88=20table=20data=EB=A5=BC=20=EB=A7=8C=EB=93=9C?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 유저가 역을 입력하면 그에 따라 역 이름 table data 생성 - 유저가 입력한 역에 따라 delete 버튼 생성 --- src/utils/display/make-elements.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/utils/display/make-elements.js diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js new file mode 100644 index 000000000..140163b8d --- /dev/null +++ b/src/utils/display/make-elements.js @@ -0,0 +1,17 @@ +export function makeTdElement(elementToMake) { + const tdForText = document.createElement("td"); + + tdForText.append(elementToMake); + + return tdForText; +} + +export function makeTdDeleteBtn() { + const tdForDeleteBtn = document.createElement("td"); + const deleteBtn = document.createElement("button"); + + deleteBtn.innerHTML = "삭제"; + tdForDeleteBtn.append(deleteBtn); + + return tdForDeleteBtn; +} From 03be7ab9fa3a5535ffba192e501092ab3d96f64e Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:28:09 +0900 Subject: [PATCH 13/45] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=84=20=EB=B0=9B=EC=95=84=20table?= =?UTF-8?q?=EC=97=90=20=ED=95=9C=20=ED=96=89=EC=9D=84=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/display/make-elements.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 140163b8d..13b0db5ab 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -15,3 +15,18 @@ export function makeTdDeleteBtn() { return tdForDeleteBtn; } + +export function makeOneRowWithDeleteBtn(objectToMake) { + const tr = document.createElement("tr"); + const tdDeleteBtnHTML = makeTdDeleteBtn().outerHTML; + let tdHTMLString = ""; + + for (const [key, value] of Object.entries(objectToMake)) { + const tdElementHTML = makeTdElement(value).outerHTML; + + tdHTMLString += tdElementHTML; + } + tdHTMLString += tdDeleteBtnHTML; + + return tdHTMLString; +} From ae0410629f226c57daa018bcdc9686986256b7b6 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:37:14 +0900 Subject: [PATCH 14/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EC=97=AD=20=EC=B6=94=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기존의 localstorage에 있는 data를 가져와 table 생성 후 보여주는 기능 - 유저의 입력을 받아 localstorage에 저장하고 table에 data를 생성하는 기능 --- src/components/station-manage-container.js | 46 ++++++++++++++++++++++ src/global/constant.js | 1 + 2 files changed, 47 insertions(+) create mode 100644 src/components/station-manage-container.js create mode 100644 src/global/constant.js diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js new file mode 100644 index 000000000..1cf682b00 --- /dev/null +++ b/src/components/station-manage-container.js @@ -0,0 +1,46 @@ +import inputStationValidator from "../utils/inputs/validator/validator.js"; +import Station from "../domain/station.js"; +import clearInput from "../utils/inputs/clear-input.js"; +import { STATION_ARRAY_KEY } from "../global/constant.js"; +import { makeOneRowWithDeleteBtn } from "../utils/display/make-elements.js"; + +const STATION_TBODY_ID = "stations"; +const addStationBtn = document.getElementById("station-add-button"); +const stationNameInput = document.getElementById("station-name-input"); + +function initStationManagement(state) { + for (const station of state.stationArray) { + showNewRow(STATION_TBODY_ID, station); + } +} + +function showNewRow(parentID, rowToShow) { + const oneRow = makeOneRowWithDeleteBtn(rowToShow); + const locationOfRow = document.getElementById(parentID); + + return locationOfRow.insertAdjacentHTML("beforeend", oneRow); +} + +export default function stationManageContainer(state) { + initStationManagement(state); + + addStationBtn.addEventListener("click", () => { + const stationNameInputValue = stationNameInput.value.trim(); + + if (inputStationValidator(stationNameInputValue)) { + const station = new Station(stationNameInputValue); + state.stationArray.push(station); + + showNewRow(STATION_TBODY_ID, station); + + // TODO - 로컬 스토리지 저장은 마지막에 한 번만 할 수 있도록 하는 것도 좋을 것 같다. + localStorage.setItem( + STATION_ARRAY_KEY, + JSON.stringify(state.stationArray) + ); + clearInput(stationNameInput); + } else { + clearInput(stationNameInput); + } + }); +} diff --git a/src/global/constant.js b/src/global/constant.js new file mode 100644 index 000000000..7b23b14cf --- /dev/null +++ b/src/global/constant.js @@ -0,0 +1 @@ +export const STATION_ARRAY_KEY = "stationArray"; From b6f40f732ab61721cdde0b4e1a41af5a210f68ef Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:43:16 +0900 Subject: [PATCH 15/45] =?UTF-8?q?feat:=20localstorage=EC=97=90=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EA=B0=80?= =?UTF-8?q?=EC=A0=B8=EC=99=80=20state=EC=97=90=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 0fa2064e7..9ecefc6ec 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,17 @@ import totalSubwayManageContainer from "./components/total-subway-manage-container.js"; +import stationManageContainer from "./components/station-manage-container.js"; +import { STATION_ARRAY_KEY } from "./global/constant.js"; -new totalSubwayManageContainer(); +const state = { + stationArray: [], +}; + +function init() { + if (localStorage.getItem(STATION_ARRAY_KEY)) { + state.stationArray = JSON.parse(localStorage.getItem(STATION_ARRAY_KEY)); + } +} + +init(); +totalSubwayManageContainer(); +stationManageContainer(state); From ff734924457072b07f3fd0551df4802a5a7267c4 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:45:23 +0900 Subject: [PATCH 16/45] =?UTF-8?q?refactor:=20=ED=8C=8C=EC=9D=BC=EC=97=90?= =?UTF-8?q?=20=ED=95=84=EC=9A=94=ED=95=9C=20constant=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/total-subway-manage-container.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index ca42485d8..5f98155bf 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -1,16 +1,24 @@ -import { menuIDs, menus, menuIndexArray } from "../constants/global.js"; import showElements from "../utils/display/show-elements.js"; import hideElements from "../utils/display/hide-elements.js"; +const menuIDs = { + 0: "manage-station", + 1: "manage-lines", + 2: "manage-sections", + 3: "manage-map-print", +}; +const menus = document.querySelectorAll("#menu > button"); +const menuIndexArray = [...Array(menus.length).keys()]; + export default function totalSubwayManageContainer() { for (const [index, child] of menus.entries()) { - const elementToHide = menuIndexArray.filter(x => { + const elementToHide = menuIndexArray.filter((x) => { return x !== index; }); child.addEventListener("click", () => { showElements(menuIDs[index]); - elementToHide.forEach(el => { + elementToHide.forEach((el) => { hideElements(menuIDs[el]); }); }); From 20ae86ce9bd0e5b053a86e70d2ebb098cc64ee28 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sat, 12 Dec 2020 22:47:03 +0900 Subject: [PATCH 17/45] =?UTF-8?q?chore(markup):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EC=97=AD=20=EA=B4=80=EB=A6=AC=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EB=BC=88=EB=8C=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 역 이름을 입력하는 html - 역 목록에 대한 표를 출력하는 html --- index.html | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 62d654981..82c175410 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,32 @@

🚇 지하철 노선도 관리

-
+ +
+
+

역 이름

+ + +
+ +
+

🚉 지하철 역 목록

+ + + + + + + + +
역 이름설정
+
+
+
From 8ad8280c85207db7437abbc354ef49662b3ffdef Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 14:34:51 +0900 Subject: [PATCH 18/45] =?UTF-8?q?refactor:=20String=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EB=8D=98=20table=EC=9D=84=20DOM=EC=9D=84=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=B4=20=EB=A7=8C=EB=93=A4=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/display/make-elements.js | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 13b0db5ab..da3fc2013 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -1,32 +1,29 @@ +import { STATION_ARRAY_KEY } from "../../global/constant.js"; + export function makeTdElement(elementToMake) { - const tdForText = document.createElement("td"); + const tdContent = document.createElement("td"); - tdForText.append(elementToMake); + tdContent.append(elementToMake); - return tdForText; + return tdContent; } export function makeTdDeleteBtn() { - const tdForDeleteBtn = document.createElement("td"); + const tdDeleteBtn = document.createElement("td"); const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "삭제"; - tdForDeleteBtn.append(deleteBtn); + tdDeleteBtn.appendChild(deleteBtn); - return tdForDeleteBtn; + return tdDeleteBtn; } -export function makeOneRowWithDeleteBtn(objectToMake) { +export default function makeOneRowWithDeleteBtn(objectToMake) { const tr = document.createElement("tr"); - const tdDeleteBtnHTML = makeTdDeleteBtn().outerHTML; - let tdHTMLString = ""; - - for (const [key, value] of Object.entries(objectToMake)) { - const tdElementHTML = makeTdElement(value).outerHTML; + const deleteBtn = makeTdDeleteBtn(); - tdHTMLString += tdElementHTML; - } - tdHTMLString += tdDeleteBtnHTML; + tr.appendChild(makeTdElement(objectToMake.stationName)); + tr.appendChild(deleteBtn); - return tdHTMLString; + return tr; } From 3458b78e71935ca875e0c4355cb7af00db039400 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 14:43:09 +0900 Subject: [PATCH 19/45] =?UTF-8?q?feat:=20localstorage=EC=97=90=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.js b/src/index.js index 9ecefc6ec..b5bf9af90 100644 --- a/src/index.js +++ b/src/index.js @@ -2,10 +2,14 @@ import totalSubwayManageContainer from "./components/total-subway-manage-contain import stationManageContainer from "./components/station-manage-container.js"; import { STATION_ARRAY_KEY } from "./global/constant.js"; -const state = { +export const state = { stationArray: [], }; +export function saveToLocalStorage(key, value) { + localStorage.setItem(key, value); +} + function init() { if (localStorage.getItem(STATION_ARRAY_KEY)) { state.stationArray = JSON.parse(localStorage.getItem(STATION_ARRAY_KEY)); From 369bbbe3d18f080f3aceb11bb6bfc043b9ee7ea3 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 14:44:01 +0900 Subject: [PATCH 20/45] =?UTF-8?q?feat:=20=EC=97=AD=EC=9D=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=ED=95=98=EA=B3=A0=20localstorage=EC=97=90=20=EC=97=85?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=8A=B8=ED=95=98=EB=8A=94=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Station Class에 id 추가 - Station이 만들어질 때 id 생성하는 기능 추가 - delete 버튼에 Station의 id를 찾아 삭제하는 기능 추가 - initStationManagement -> loadStations 네이밍 변경 --- src/components/station-manage-container.js | 34 ++++++++++++---------- src/domain/station.js | 3 +- src/utils/display/make-elements.js | 16 ++++++++-- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js index 1cf682b00..6ac4b4677 100644 --- a/src/components/station-manage-container.js +++ b/src/components/station-manage-container.js @@ -1,43 +1,47 @@ -import inputStationValidator from "../utils/inputs/validator/validator.js"; import Station from "../domain/station.js"; +import inputStationValidator from "../utils/inputs/validator/validator.js"; import clearInput from "../utils/inputs/clear-input.js"; +import makeOneRowWithDeleteBtn from "../utils/display/make-elements.js"; +import { saveToLocalStorage } from "../index.js"; import { STATION_ARRAY_KEY } from "../global/constant.js"; -import { makeOneRowWithDeleteBtn } from "../utils/display/make-elements.js"; -const STATION_TBODY_ID = "stations"; const addStationBtn = document.getElementById("station-add-button"); const stationNameInput = document.getElementById("station-name-input"); +const STATION_TBODY_ID = "stations"; -function initStationManagement(state) { +function loadStations(state) { for (const station of state.stationArray) { showNewRow(STATION_TBODY_ID, station); } } function showNewRow(parentID, rowToShow) { - const oneRow = makeOneRowWithDeleteBtn(rowToShow); + const oneRowWithDeleteBtn = makeOneRowWithDeleteBtn(rowToShow); const locationOfRow = document.getElementById(parentID); - return locationOfRow.insertAdjacentHTML("beforeend", oneRow); + return locationOfRow.appendChild(oneRowWithDeleteBtn); } export default function stationManageContainer(state) { - initStationManagement(state); + loadStations(state); addStationBtn.addEventListener("click", () => { const stationNameInputValue = stationNameInput.value.trim(); if (inputStationValidator(stationNameInputValue)) { - const station = new Station(stationNameInputValue); - state.stationArray.push(station); + let stationId = 0; - showNewRow(STATION_TBODY_ID, station); + if (state.stationArray.length === 0) { + stationId = 0; + } else { + stationId = state.stationArray[state.stationArray.length - 1].id + 1; + } + + const station = new Station(stationNameInputValue, stationId); - // TODO - 로컬 스토리지 저장은 마지막에 한 번만 할 수 있도록 하는 것도 좋을 것 같다. - localStorage.setItem( - STATION_ARRAY_KEY, - JSON.stringify(state.stationArray) - ); + showNewRow(STATION_TBODY_ID, station); + state.stationArray.push(station); + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); clearInput(stationNameInput); } else { clearInput(stationNameInput); diff --git a/src/domain/station.js b/src/domain/station.js index d44c8c53b..0d41d12f2 100644 --- a/src/domain/station.js +++ b/src/domain/station.js @@ -1,6 +1,7 @@ export default class Station { - constructor(stationName) { + constructor(stationName, id) { this.stationName = stationName; + this.id = id; } } diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index da3fc2013..599b83d24 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -1,3 +1,4 @@ +import { state, saveToLocalStorage } from "../../index.js"; import { STATION_ARRAY_KEY } from "../../global/constant.js"; export function makeTdElement(elementToMake) { @@ -8,21 +9,30 @@ export function makeTdElement(elementToMake) { return tdContent; } -export function makeTdDeleteBtn() { +export function makeTdDeleteBtn(objectToMake, tr) { const tdDeleteBtn = document.createElement("td"); const deleteBtn = document.createElement("button"); deleteBtn.innerHTML = "삭제"; + deleteBtn.addEventListener("click", () => { + const deleteStation = state.stationArray.filter((station) => { + return station.id !== objectToMake.id; + }); + tr.remove(); + state.stationArray = deleteStation; + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); + }); tdDeleteBtn.appendChild(deleteBtn); return tdDeleteBtn; } -export default function makeOneRowWithDeleteBtn(objectToMake) { +export default function makeOneRowWithDeleteBtn(objectToMake, ...args) { const tr = document.createElement("tr"); - const deleteBtn = makeTdDeleteBtn(); + const deleteBtn = makeTdDeleteBtn(objectToMake, tr); tr.appendChild(makeTdElement(objectToMake.stationName)); + tr.id = objectToMake.id; tr.appendChild(deleteBtn); return tr; From 66a8e23e3a44605abcad8e7f03539658e7119b41 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 16:26:55 +0900 Subject: [PATCH 21/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EC=97=AD=20=EC=A4=91=EB=B3=B5=20=ED=99=95=EC=9D=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global/alert-messages.js | 6 ------ src/global/messages.js | 12 +++++++++++ ...validator.js => station-name-validator.js} | 21 ++++++++++++++++--- 3 files changed, 30 insertions(+), 9 deletions(-) delete mode 100644 src/global/alert-messages.js create mode 100644 src/global/messages.js rename src/utils/inputs/validator/{validator.js => station-name-validator.js} (57%) diff --git a/src/global/alert-messages.js b/src/global/alert-messages.js deleted file mode 100644 index ce84e7304..000000000 --- a/src/global/alert-messages.js +++ /dev/null @@ -1,6 +0,0 @@ -export const ALERT_MESSAGES = { - ERROR_STATION_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", - ERROR_STATION_INPUT_SPECIAL_CHARACTER: "역 이름에는 특수문자가 입력되지 않습니다!", - ERROR_STATION_INPUT_NOT_COMPLETE: "역 이름을 바르게 작성해 주세요!", - ERROR_STATION_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!" -}; diff --git a/src/global/messages.js b/src/global/messages.js new file mode 100644 index 000000000..bc9722935 --- /dev/null +++ b/src/global/messages.js @@ -0,0 +1,12 @@ +export const ALERT_MESSAGES = { + ERROR_STATION_INPUT_DUPLICATED: "이미 존재하는 역 이름입니다.", + ERROR_STATION_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", + ERROR_STATION_INPUT_SPECIAL_CHARACTER: + "역 이름에는 특수문자가 입력되지 않습니다!", + ERROR_STATION_INPUT_NOT_COMPLETE: "역 이름을 바르게 작성해 주세요!", + ERROR_STATION_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!", +}; + +export const CONFIRM_MESSAGES = { + CONFIRM_DELETE: "정말로 삭제하시겠습니까?", +}; diff --git a/src/utils/inputs/validator/validator.js b/src/utils/inputs/validator/station-name-validator.js similarity index 57% rename from src/utils/inputs/validator/validator.js rename to src/utils/inputs/validator/station-name-validator.js index c7942abb4..b94a5b1ab 100644 --- a/src/utils/inputs/validator/validator.js +++ b/src/utils/inputs/validator/station-name-validator.js @@ -1,13 +1,28 @@ -import { ALERT_MESSAGES } from "../../../global/alert-messages.js"; +import { ALERT_MESSAGES } from "../../../global/messages.js"; +import { state } from "../../../index.js"; const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; const checkMultipleSpaces = /\s{2,}/; +const STATION_INPUT_MINIMUM_LENGTH = 2; + +export function isDuplicatedStationName(stationName) { + let isDuplicated = false; + + for (const station of state.stationArray) { + if (station.stationName === stationName) { + isDuplicated = true; + } + } + + return isDuplicated; +} export default function inputStationValidator(stationNameInputValue) { let isValid = false; - - if (stationNameInputValue.length < 2) { + if (isDuplicatedStationName(stationNameInputValue)) { + alert(ALERT_MESSAGES.ERROR_STATION_INPUT_DUPLICATED); + } else if (stationNameInputValue.length < STATION_INPUT_MINIMUM_LENGTH) { alert(ALERT_MESSAGES.ERROR_STATION_INPUT_LENGTH_UNDER); } else if (checkSpecialCharacter.test(stationNameInputValue)) { alert(ALERT_MESSAGES.ERROR_STATION_INPUT_SPECIAL_CHARACTER); From a949d49e345d84ce6d69ef7d5aa5d3d1fcd2e475 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 16:27:40 +0900 Subject: [PATCH 22/45] =?UTF-8?q?chore(markup):=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EB=85=B8=EC=84=A0=20=EA=B4=80=EB=A6=AC=EB=A5=BC=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EB=BC=88=EB=8C=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 노선 이름을 입력하는 html - 상행 종점/하행 종점을 선택하는 html - 노선 목록에 대한 표를 출력하는 html --- index.html | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 82c175410..52bebeded 100644 --- a/index.html +++ b/index.html @@ -41,7 +41,39 @@

🚉 지하철 역 목록

-
+
+
+

노선 이름

+ +
+ 상행 종점 + + 하행 종점 + +
+ +
+ +
+

🚉 지하철 역 목록

+ + + + + + + + + + +
노선 이름상행 종점역하행 종점역설정
+
+
+
From c2705a27ae7eb8d985284f6ffbe2485e452e13f8 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 18:16:14 +0900 Subject: [PATCH 23/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EC=97=AD=EC=9D=84=20=EC=82=AD=EC=A0=9C=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=A0=84=20=EA=B2=BD=EA=B3=A0=EC=B0=BD=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/display/make-elements.js | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 599b83d24..845f020f0 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -1,5 +1,6 @@ import { state, saveToLocalStorage } from "../../index.js"; import { STATION_ARRAY_KEY } from "../../global/constant.js"; +import { CONFIRM_MESSAGES } from "../../global/messages.js"; export function makeTdElement(elementToMake) { const tdContent = document.createElement("td"); @@ -12,22 +13,27 @@ export function makeTdElement(elementToMake) { export function makeTdDeleteBtn(objectToMake, tr) { const tdDeleteBtn = document.createElement("td"); const deleteBtn = document.createElement("button"); + const CONFIRM_DELETE = CONFIRM_MESSAGES.CONFIRM_DELETE; deleteBtn.innerHTML = "삭제"; deleteBtn.addEventListener("click", () => { - const deleteStation = state.stationArray.filter((station) => { - return station.id !== objectToMake.id; - }); - tr.remove(); - state.stationArray = deleteStation; - saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); + const confirmDelete = confirm(CONFIRM_DELETE); + + if (confirmDelete) { + const deleteStation = state.stationArray.filter((station) => { + return station.id !== objectToMake.id; + }); + tr.remove(); + state.stationArray = deleteStation; + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); + } }); tdDeleteBtn.appendChild(deleteBtn); return tdDeleteBtn; } -export default function makeOneRowWithDeleteBtn(objectToMake, ...args) { +export default function makeOneRowWithDeleteBtn(objectToMake) { const tr = document.createElement("tr"); const deleteBtn = makeTdDeleteBtn(objectToMake, tr); From e40af75ffbb8af543e2b595335d4517922038de3 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 18:20:31 +0900 Subject: [PATCH 24/45] =?UTF-8?q?refactor:=20show/hide=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=8C=80=EC=8B=A0=20=EB=B2=84=ED=8A=BC=EC=9D=84=20?= =?UTF-8?q?=EB=88=84=EB=A5=BC=20=EB=95=8C=20=EB=8B=A4=EC=8B=9C=20rendering?= =?UTF-8?q?=20=EB=90=A0=20=EC=88=98=20=EC=9E=88=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 63 +---------- src/components/station-manage-container.js | 7 +- .../total-subway-manage-container.js | 104 ++++++++++++++++-- src/css/index.css | 4 +- src/index.js | 5 +- src/utils/display/hide-elements.js | 4 - src/utils/display/show-elements.js | 4 - 7 files changed, 103 insertions(+), 88 deletions(-) delete mode 100644 src/utils/display/hide-elements.js delete mode 100644 src/utils/display/show-elements.js diff --git a/index.html b/index.html index 52bebeded..2c1a08bc8 100644 --- a/index.html +++ b/index.html @@ -15,68 +15,7 @@

🚇 지하철 노선도 관리

- -
-
-

역 이름

- - -
- -
-

🚉 지하철 역 목록

- - - - - - - - -
역 이름설정
-
-
- -
-
-

노선 이름

- -
- 상행 종점 - - 하행 종점 - -
- -
- -
-

🚉 지하철 역 목록

- - - - - - - - - - -
노선 이름상행 종점역하행 종점역설정
-
-
- -
-
- +
diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js index 6ac4b4677..92d0d0877 100644 --- a/src/components/station-manage-container.js +++ b/src/components/station-manage-container.js @@ -1,12 +1,10 @@ import Station from "../domain/station.js"; -import inputStationValidator from "../utils/inputs/validator/validator.js"; +import inputStationValidator from "../utils/inputs/validator/station-name-validator.js"; import clearInput from "../utils/inputs/clear-input.js"; import makeOneRowWithDeleteBtn from "../utils/display/make-elements.js"; import { saveToLocalStorage } from "../index.js"; import { STATION_ARRAY_KEY } from "../global/constant.js"; -const addStationBtn = document.getElementById("station-add-button"); -const stationNameInput = document.getElementById("station-name-input"); const STATION_TBODY_ID = "stations"; function loadStations(state) { @@ -23,6 +21,9 @@ function showNewRow(parentID, rowToShow) { } export default function stationManageContainer(state) { + const addStationBtn = document.getElementById("station-add-button"); + const stationNameInput = document.getElementById("station-name-input"); + loadStations(state); addStationBtn.addEventListener("click", () => { diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index 5f98155bf..23151df46 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -1,26 +1,110 @@ -import showElements from "../utils/display/show-elements.js"; -import hideElements from "../utils/display/hide-elements.js"; +import stationManageContainer from "./station-manage-container.js"; +import sectionManageContainer from "./section-manage-container.js"; +import { state } from "../index.js"; const menuIDs = { - 0: "manage-station", - 1: "manage-lines", - 2: "manage-sections", - 3: "manage-map-print", + 0: { + id: "manage-station", + html: ` +
+
+

역 이름

+ + +
+ +
+

🚉 지하철 역 목록

+ + + + + + + + +
역 이름설정
+
+
`, + }, + 1: { + id: "manage-lines", + html: ` +
+
+

노선 이름

+ +
+ 상행 종점 + + 하행 종점 + +
+ +
+ +
+

🚉 지하철 역 목록

+ + + + + + + + + + +
노선 이름상행 종점역하행 종점역설정
+
+
+ `, + }, + 2: { id: "manage-sections", html: `` }, + 3: { id: "manage-map-print", html: `` }, }; + const menus = document.querySelectorAll("#menu > button"); const menuIndexArray = [...Array(menus.length).keys()]; +function removeAllChild(element) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + +function createDOM(index) { + const html = menuIDs[index].html; + + const createdDOM = new DOMParser().parseFromString(html, "text/html"); + + return createdDOM.body.firstChild; +} + export default function totalSubwayManageContainer() { + const content = document.getElementById("content"); + for (const [index, child] of menus.entries()) { const elementToHide = menuIndexArray.filter((x) => { return x !== index; }); child.addEventListener("click", () => { - showElements(menuIDs[index]); - elementToHide.forEach((el) => { - hideElements(menuIDs[el]); - }); + removeAllChild(content); + content.appendChild(createDOM(index)); + if (index === 0) { + new stationManageContainer(state); + } else if (index === 1) { + new sectionManageContainer(state); + } }); } } diff --git a/src/css/index.css b/src/css/index.css index f1139ce40..1e04bf8ab 100644 --- a/src/css/index.css +++ b/src/css/index.css @@ -1,6 +1,6 @@ -#manage-station, +/* #manage-station, #manage-lines, #manage-sections, #manage-map-print { display: none; -} +} */ diff --git a/src/index.js b/src/index.js index b5bf9af90..021401482 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,4 @@ import totalSubwayManageContainer from "./components/total-subway-manage-container.js"; -import stationManageContainer from "./components/station-manage-container.js"; import { STATION_ARRAY_KEY } from "./global/constant.js"; export const state = { @@ -14,8 +13,8 @@ function init() { if (localStorage.getItem(STATION_ARRAY_KEY)) { state.stationArray = JSON.parse(localStorage.getItem(STATION_ARRAY_KEY)); } + + totalSubwayManageContainer(); } init(); -totalSubwayManageContainer(); -stationManageContainer(state); diff --git a/src/utils/display/hide-elements.js b/src/utils/display/hide-elements.js deleted file mode 100644 index ff024dd99..000000000 --- a/src/utils/display/hide-elements.js +++ /dev/null @@ -1,4 +0,0 @@ -export default function hideElements(element) { - const elementToHide = document.getElementById(element); - elementToHide.style.display = "none"; -} diff --git a/src/utils/display/show-elements.js b/src/utils/display/show-elements.js deleted file mode 100644 index 5cdab921c..000000000 --- a/src/utils/display/show-elements.js +++ /dev/null @@ -1,4 +0,0 @@ -export default function showElements(element) { - const elementToShow = document.getElementById(element); - elementToShow.style.display = "block"; -} From dadc36187ceeb2e31721ac2d3da7a89b1d8ffb59 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 18:21:29 +0900 Subject: [PATCH 25/45] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20Select=20box=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/section-manage-container.js | 14 ++++++++++++++ src/utils/display/make-elements.js | 9 +++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/components/section-manage-container.js diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js new file mode 100644 index 000000000..9aa88343f --- /dev/null +++ b/src/components/section-manage-container.js @@ -0,0 +1,14 @@ +import { makeSelectOptions } from "../utils/display/make-elements.js"; + +export default function sectionManageContainer(state) { + const addLineInput = document.getElementById("line-name-input"); + const selectUpLine = document.getElementById("line-start-station-selector"); + const selectDownLine = document.getElementById("line-end-station-selector"); + + makeSelectOptions(selectUpLine, state.stationArray); + makeSelectOptions(selectDownLine, state.stationArray); + + addLineInput.addEventListener("click", () => { + const lineNameInputValue = addLineInput.value; + }); +} diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 845f020f0..3105397df 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -43,3 +43,12 @@ export default function makeOneRowWithDeleteBtn(objectToMake) { return tr; } + +export function makeSelectOptions(selectBox, optionToMakeArray) { + for (const optionValue of optionToMakeArray) { + const option = document.createElement("option"); + option.value = optionValue.stationName; + option.text = optionValue.stationName; + selectBox.appendChild(option); + } +} From b3dab975b01974999fa781866b35f33e57086118 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 22:54:06 +0900 Subject: [PATCH 26/45] =?UTF-8?q?feat:=20SubwayLine=20Class=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 생성자를 가진 SubwayLine Class의 기본 코드 생성 --- src/domain/subway-line.js | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/domain/subway-line.js diff --git a/src/domain/subway-line.js b/src/domain/subway-line.js new file mode 100644 index 000000000..201922c6c --- /dev/null +++ b/src/domain/subway-line.js @@ -0,0 +1,8 @@ +export default class SubwayLine { + constructor(lineName, upLine, DownLine, id) { + this.lineName = lineName; + this.stations = [upLine, DownLine]; + this.id = id; + this.type = "LINE"; + } +} From d555cf72ce53c29d580a6c248e01e00c34a2313b Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 22:55:31 +0900 Subject: [PATCH 27/45] =?UTF-8?q?refactor:=20=EC=9E=AC=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=83=88=20=ED=96=89=EC=9D=84?= =?UTF-8?q?=20=EB=A7=8C=EB=93=9C=EB=8A=94=20showNewRow=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/station-manage-container.js | 9 +++--- src/domain/station.js | 1 + src/utils/display/make-elements.js | 35 +++++++++++++++------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js index 92d0d0877..f33775941 100644 --- a/src/components/station-manage-container.js +++ b/src/components/station-manage-container.js @@ -9,12 +9,12 @@ const STATION_TBODY_ID = "stations"; function loadStations(state) { for (const station of state.stationArray) { - showNewRow(STATION_TBODY_ID, station); + showNewRow(STATION_TBODY_ID, station, [station.stationName]); } } -function showNewRow(parentID, rowToShow) { - const oneRowWithDeleteBtn = makeOneRowWithDeleteBtn(rowToShow); +export function showNewRow(parentID, rowToShow, [...args]) { + const oneRowWithDeleteBtn = makeOneRowWithDeleteBtn(rowToShow, [...args]); const locationOfRow = document.getElementById(parentID); return locationOfRow.appendChild(oneRowWithDeleteBtn); @@ -37,10 +37,9 @@ export default function stationManageContainer(state) { } else { stationId = state.stationArray[state.stationArray.length - 1].id + 1; } - const station = new Station(stationNameInputValue, stationId); - showNewRow(STATION_TBODY_ID, station); + showNewRow(STATION_TBODY_ID, station, [station.stationName]); state.stationArray.push(station); saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); clearInput(stationNameInput); diff --git a/src/domain/station.js b/src/domain/station.js index 0d41d12f2..1118bcb02 100644 --- a/src/domain/station.js +++ b/src/domain/station.js @@ -2,6 +2,7 @@ export default class Station { constructor(stationName, id) { this.stationName = stationName; this.id = id; + this.type = "STATION"; } } diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 3105397df..53b134240 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -1,5 +1,5 @@ import { state, saveToLocalStorage } from "../../index.js"; -import { STATION_ARRAY_KEY } from "../../global/constant.js"; +import { LINE_ARRAY_KEY, STATION_ARRAY_KEY } from "../../global/constant.js"; import { CONFIRM_MESSAGES } from "../../global/messages.js"; export function makeTdElement(elementToMake) { @@ -20,12 +20,7 @@ export function makeTdDeleteBtn(objectToMake, tr) { const confirmDelete = confirm(CONFIRM_DELETE); if (confirmDelete) { - const deleteStation = state.stationArray.filter((station) => { - return station.id !== objectToMake.id; - }); - tr.remove(); - state.stationArray = deleteStation; - saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); + deleteObject(objectToMake, tr); } }); tdDeleteBtn.appendChild(deleteBtn); @@ -33,12 +28,32 @@ export function makeTdDeleteBtn(objectToMake, tr) { return tdDeleteBtn; } -export default function makeOneRowWithDeleteBtn(objectToMake) { +function deleteObject(object, tr) { + if (object.type === "STATION") { + const deleteStation = state.stationArray.filter((station) => { + return station.id !== object.id; + }); + tr.remove(); + state.stationArray = deleteStation; + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); + } else if (object.type === "LINE") { + const deleteLine = state.subwayLines.filter((line) => { + return line.id !== object.id; + }); + tr.remove(); + state.subwayLines = deleteLine; + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + } +} + +export default function makeOneRowWithDeleteBtn(objectToMake, [...args]) { const tr = document.createElement("tr"); const deleteBtn = makeTdDeleteBtn(objectToMake, tr); - tr.appendChild(makeTdElement(objectToMake.stationName)); - tr.id = objectToMake.id; + for (const arg of [...args]) { + tr.appendChild(makeTdElement(arg)); + tr.id = objectToMake.id; + } tr.appendChild(deleteBtn); return tr; From 67ee16e16f7824306f01628e759b8a4c64b26254 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 23:06:23 +0900 Subject: [PATCH 28/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=EB=8F=84=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/line-manage-container.js | 60 +++++++++++++++++++ .../total-subway-manage-container.js | 14 +++-- src/global/constant.js | 1 + src/index.js | 7 ++- src/utils/global-utils.js | 7 +++ 5 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 src/components/line-manage-container.js create mode 100644 src/utils/global-utils.js diff --git a/src/components/line-manage-container.js b/src/components/line-manage-container.js new file mode 100644 index 000000000..63315d5ea --- /dev/null +++ b/src/components/line-manage-container.js @@ -0,0 +1,60 @@ +import SubwayLine from "../domain/subway-line.js"; +import { makeSelectOptions } from "../utils/display/make-elements.js"; +import { showNewRow } from "../components/station-manage-container.js"; +import { saveToLocalStorage } from "../index.js"; +import clearInput from "../utils/inputs/clear-input.js"; +import { LINE_ARRAY_KEY } from "../global/constant.js"; +import { getStationByName } from "../utils/global-utils.js"; + +const SUBWAY_LINE_TBODY_ID = "lines"; + +function loadLines(state) { + console.log(state.subwayLines, "서브웨이"); + for (const line of state.subwayLines) { + showNewRow(SUBWAY_LINE_TBODY_ID, line, [ + line.lineName, + line.stations[0].stationName, + line.stations[1].stationName, + ]); + } +} + +export default function lineManageContainer(state) { + const addLineInput = document.getElementById("line-name-input"); + const selectUpLine = document.getElementById("line-start-station-selector"); + const selectDownLine = document.getElementById("line-end-station-selector"); + const addLineSubmit = document.getElementById("line-add-button"); + + makeSelectOptions(selectUpLine, state.stationArray); + makeSelectOptions(selectDownLine, state.stationArray); + loadLines(state); + + addLineSubmit.addEventListener("click", () => { + const lineNameInputValue = addLineInput.value; + + let lineId = 0; + + if (state.subwayLines.length === 0) { + lineId = 0; + } else { + lineId = state.subwayLines[state.subwayLines.length - 1].id + 1; + } + + const line = new SubwayLine( + lineNameInputValue, + getStationByName(selectUpLine.value), + getStationByName(selectDownLine.value), + lineId + ); + + showNewRow(SUBWAY_LINE_TBODY_ID, line, [ + line.lineName, + line.stations[0].stationName, + line.stations[1].stationName, + ]); + + state.subwayLines.push(line); + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + clearInput(addLineInput); + }); +} diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index 23151df46..1f5f191da 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -1,5 +1,5 @@ import stationManageContainer from "./station-manage-container.js"; -import sectionManageContainer from "./section-manage-container.js"; +import lineManageContainer from "./line-manage-container.js"; import { state } from "../index.js"; const menuIDs = { @@ -44,7 +44,7 @@ const menuIDs = { />
상행 종점 - +
하행 종점
@@ -68,7 +68,13 @@ const menuIDs = { `, }, - 2: { id: "manage-sections", html: `` }, + 2: { + id: "manage-sections", + html: ` +
+

구간을 수정할 노선을 선택해 주세요.

+
`, + }, 3: { id: "manage-map-print", html: `` }, }; @@ -103,7 +109,7 @@ export default function totalSubwayManageContainer() { if (index === 0) { new stationManageContainer(state); } else if (index === 1) { - new sectionManageContainer(state); + new lineManageContainer(state); } }); } diff --git a/src/global/constant.js b/src/global/constant.js index 7b23b14cf..8fb90586f 100644 --- a/src/global/constant.js +++ b/src/global/constant.js @@ -1 +1,2 @@ export const STATION_ARRAY_KEY = "stationArray"; +export const LINE_ARRAY_KEY = "linesArray"; diff --git a/src/index.js b/src/index.js index 021401482..55561038d 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,9 @@ import totalSubwayManageContainer from "./components/total-subway-manage-container.js"; -import { STATION_ARRAY_KEY } from "./global/constant.js"; +import { STATION_ARRAY_KEY, LINE_ARRAY_KEY } from "./global/constant.js"; export const state = { stationArray: [], + subwayLines: [], }; export function saveToLocalStorage(key, value) { @@ -14,6 +15,10 @@ function init() { state.stationArray = JSON.parse(localStorage.getItem(STATION_ARRAY_KEY)); } + if (localStorage.getItem(LINE_ARRAY_KEY)) { + state.subwayLines = JSON.parse(localStorage.getItem(LINE_ARRAY_KEY)); + } + totalSubwayManageContainer(); } diff --git a/src/utils/global-utils.js b/src/utils/global-utils.js new file mode 100644 index 000000000..3cb9cf860 --- /dev/null +++ b/src/utils/global-utils.js @@ -0,0 +1,7 @@ +import { state } from "../index.js"; + +export function getStationByName(name) { + return state.stationArray.filter( + (station) => station.stationName === name + )[0]; +} From 620c2e86b77db5548697dcafbe7250570f1228b4 Mon Sep 17 00:00:00 2001 From: ddongule Date: Sun, 13 Dec 2020 23:27:23 +0900 Subject: [PATCH 29/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EA=B5=AC=EA=B0=84=20=EA=B4=80=EB=A6=AC=EC=9D=98=20=EB=85=B8?= =?UTF-8?q?=EC=84=A0=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/section-manage-container.js | 22 ++++++++++--------- .../total-subway-manage-container.js | 3 +++ src/utils/display/make-elements.js | 3 +-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js index 9aa88343f..05d8f93bb 100644 --- a/src/components/section-manage-container.js +++ b/src/components/section-manage-container.js @@ -1,14 +1,16 @@ -import { makeSelectOptions } from "../utils/display/make-elements.js"; +import { state } from "../index.js"; -export default function sectionManageContainer(state) { - const addLineInput = document.getElementById("line-name-input"); - const selectUpLine = document.getElementById("line-start-station-selector"); - const selectDownLine = document.getElementById("line-end-station-selector"); +function loadEditSectionLines() { + const parentDiv = document.getElementById("manage-sections"); - makeSelectOptions(selectUpLine, state.stationArray); - makeSelectOptions(selectDownLine, state.stationArray); + for (const line of state.subwayLines) { + const lineManageBtn = document.createElement("button"); + lineManageBtn.innerHTML = line.lineName; + console.log(line.lineName); + parentDiv.append(lineManageBtn); + } +} - addLineInput.addEventListener("click", () => { - const lineNameInputValue = addLineInput.value; - }); +export default function sectionManageContainer() { + console.log(loadEditSectionLines()); } diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index 1f5f191da..746c39e5e 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -1,5 +1,6 @@ import stationManageContainer from "./station-manage-container.js"; import lineManageContainer from "./line-manage-container.js"; +import sectionManageContainer from "./section-manage-container.js"; import { state } from "../index.js"; const menuIDs = { @@ -110,6 +111,8 @@ export default function totalSubwayManageContainer() { new stationManageContainer(state); } else if (index === 1) { new lineManageContainer(state); + } else if (index === 2) { + new sectionManageContainer(); } }); } diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 53b134240..2705df4a6 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -13,11 +13,10 @@ export function makeTdElement(elementToMake) { export function makeTdDeleteBtn(objectToMake, tr) { const tdDeleteBtn = document.createElement("td"); const deleteBtn = document.createElement("button"); - const CONFIRM_DELETE = CONFIRM_MESSAGES.CONFIRM_DELETE; deleteBtn.innerHTML = "삭제"; deleteBtn.addEventListener("click", () => { - const confirmDelete = confirm(CONFIRM_DELETE); + const confirmDelete = confirm(CONFIRM_MESSAGES.CONFIRM_DELETE); if (confirmDelete) { deleteObject(objectToMake, tr); From 85e2ce098f865ceda1e858f4e00c8dd6d6197741 Mon Sep 17 00:00:00 2001 From: ddongule Date: Mon, 14 Dec 2020 01:56:56 +0900 Subject: [PATCH 30/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EA=B5=AC=EA=B0=84=20=EA=B4=80=EB=A6=AC=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/section-manage-container.js | 111 +++++++++++++++++- .../total-subway-manage-container.js | 4 - 2 files changed, 107 insertions(+), 8 deletions(-) diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js index 05d8f93bb..eb4a67732 100644 --- a/src/components/section-manage-container.js +++ b/src/components/section-manage-container.js @@ -1,16 +1,119 @@ import { state } from "../index.js"; +function removeAllChild(element) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } +} + function loadEditSectionLines() { const parentDiv = document.getElementById("manage-sections"); for (const line of state.subwayLines) { - const lineManageBtn = document.createElement("button"); - lineManageBtn.innerHTML = line.lineName; - console.log(line.lineName); + const lineManageBtn = newElementWithInnerHtml("button", line.lineName); + lineManageBtn.id = `manage${line.id}`; + parentDiv.append(lineManageBtn); } } export default function sectionManageContainer() { - console.log(loadEditSectionLines()); + loadEditSectionLines(); + const parentDiv = document.getElementById("manage-sections"); + const lineWrapperDiv = document.createElement("div"); + lineWrapperDiv.id = "manage-wrapper"; + + for (const line of state.subwayLines) { + const manage = document.getElementById(`manage${line.id}`); + + manage.addEventListener("click", () => { + removeAllChild(lineWrapperDiv); + + const manageHTML = ` +
+

${line.lineName} 관리

+
구간 등록
+
+ `; + appendHTML(lineWrapperDiv, manageHTML); + + // select stations + const selectWrapper = document.createElement("select"); + + for (const station of state.stationArray) { + const option = ``; + appendHTML(selectWrapper, option); + } + lineWrapperDiv.append(selectWrapper); + + // input + const sectionInputHTML = ` + + + `; + appendHTML(lineWrapperDiv, sectionInputHTML); + + // table + const sectionTableHTML = ` + + + + + + + + + +
순서이름설정
+ `; + appendHTML(lineWrapperDiv, sectionTableHTML); + + parentDiv.append(lineWrapperDiv); + + // table items + const table = document.getElementById("section-table"); + const tableBody = document.getElementById("section-tbody"); + + for (const [index, station] of Object.entries(line.stations)) { + const tr = document.createElement("tr"); + const tdIndex = newElementWithInnerHtml("td", index); + const tdStationName = newElementWithInnerHtml( + "td", + station.stationName + ); + + const tdDeleteBtn = newElementWithInnerHtml("button", "노선에서 삭제"); + tdDeleteBtn.id = station.id; + + const tdDelete = newTdWithElement(tdDeleteBtn); + + tr.append(...[tdIndex, tdStationName, tdDelete]); + tableBody.append(tr); + } + table.append(tableBody); + lineWrapperDiv.append(table); + }); + } +} + +// TODO - utils로 빼기 +function newElementWithInnerHtml(elementType, innerHTML) { + const element = document.createElement(elementType); + element.innerHTML = innerHTML; + return element; +} + +function newTdWithElement(element) { + const td = document.createElement("td"); + td.append(element); + return td; +} + +function appendHTML(parent, html) { + const htmlDOM = new DOMParser().parseFromString(html, "text/html").body + .childNodes; + + for (const node of htmlDOM) { + parent.append(node); + } } diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index 746c39e5e..beeff63c6 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -100,10 +100,6 @@ export default function totalSubwayManageContainer() { const content = document.getElementById("content"); for (const [index, child] of menus.entries()) { - const elementToHide = menuIndexArray.filter((x) => { - return x !== index; - }); - child.addEventListener("click", () => { removeAllChild(content); content.appendChild(createDOM(index)); From 108ab4d69f7e6fb3a60a8cca92fc18a8e059d862 Mon Sep 17 00:00:00 2001 From: minkyung Date: Mon, 14 Dec 2020 10:15:28 +0900 Subject: [PATCH 31/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EA=B5=AC=EA=B0=84=20=EA=B4=80=EB=A6=AC=EC=9D=98=20'=EB=85=B8?= =?UTF-8?q?=EC=84=A0=EC=97=90=EC=84=9C=20=EC=82=AD=EC=A0=9C'=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/section-manage-container.js | 24 ++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js index eb4a67732..e119ab194 100644 --- a/src/components/section-manage-container.js +++ b/src/components/section-manage-container.js @@ -1,4 +1,5 @@ -import { state } from "../index.js"; +import { state, saveToLocalStorage } from "../index.js"; +import { LINE_ARRAY_KEY } from "../global/constant.js"; function removeAllChild(element) { while (element.firstChild) { @@ -77,18 +78,26 @@ export default function sectionManageContainer() { for (const [index, station] of Object.entries(line.stations)) { const tr = document.createElement("tr"); const tdIndex = newElementWithInnerHtml("td", index); - const tdStationName = newElementWithInnerHtml( - "td", - station.stationName - ); + const tdStationName = newElementWithInnerHtml("td", station.stationName); const tdDeleteBtn = newElementWithInnerHtml("button", "노선에서 삭제"); tdDeleteBtn.id = station.id; - const tdDelete = newTdWithElement(tdDeleteBtn); tr.append(...[tdIndex, tdStationName, tdDelete]); tableBody.append(tr); + + tdDeleteBtn.addEventListener("click", () => { + if (confirm("정말로 삭제하시겠습니까?")) { + const deleteStationFromLine = line.stations.filter(station => { + return parseInt(tdDeleteBtn.id) !== parseInt(station.id); + }); + tr.remove(); + + line.stations = deleteStationFromLine; + } + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + }); } table.append(tableBody); lineWrapperDiv.append(table); @@ -110,8 +119,7 @@ function newTdWithElement(element) { } function appendHTML(parent, html) { - const htmlDOM = new DOMParser().parseFromString(html, "text/html").body - .childNodes; + const htmlDOM = new DOMParser().parseFromString(html, "text/html").body.childNodes; for (const node of htmlDOM) { parent.append(node); From c16125951cf1612ebec7dc129fd6d6402144a1bb Mon Sep 17 00:00:00 2001 From: minkyung Date: Mon, 14 Dec 2020 11:31:57 +0900 Subject: [PATCH 32/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=EB=8F=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/map-print-manage-container.js | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/components/map-print-manage-container.js diff --git a/src/components/map-print-manage-container.js b/src/components/map-print-manage-container.js new file mode 100644 index 000000000..c0dd6e5d1 --- /dev/null +++ b/src/components/map-print-manage-container.js @@ -0,0 +1,19 @@ +import { state } from "../index.js"; + +export default function mapPrintManageContainer() { + const parent = document.getElementById("manage-map-print"); + const div = document.createElement("div"); + + for (const line of state.subwayLines) { + const lineName = document.createElement("h2"); + + lineName.append(line.lineName); + div.append(lineName); + for (const station of line.stations) { + const stationsInLine = document.createElement("li"); + stationsInLine.append(station.stationName); + div.append(stationsInLine); + } + } + parent.append(div); +} From 2f7e3e7dd0de4adb8ef6030fbe1a3583691e0deb Mon Sep 17 00:00:00 2001 From: minkyung Date: Mon, 14 Dec 2020 17:06:20 +0900 Subject: [PATCH 33/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EA=B5=AC=EA=B0=84=20=EA=B4=80=EB=A6=AC=20-=20=EC=97=AD=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C/=EB=93=B1=EB=A1=9D=EC=8B=9C=20=EA=B5=AC?= =?UTF-8?q?=EA=B0=84=20=EB=93=B1=EB=A1=9D=20=ED=91=9C=EC=97=90=20=EB=B0=98?= =?UTF-8?q?=EC=98=81=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/section-manage-container.js | 117 ++++++++++++++++++--- 1 file changed, 101 insertions(+), 16 deletions(-) diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js index e119ab194..030288d42 100644 --- a/src/components/section-manage-container.js +++ b/src/components/section-manage-container.js @@ -1,5 +1,15 @@ import { state, saveToLocalStorage } from "../index.js"; import { LINE_ARRAY_KEY } from "../global/constant.js"; +import { getStationByName } from "../utils/global-utils.js"; + +const SECTION_TAGS = { + PARENT_SECTION_ID: "manage-sections", + LINE_MENU_BUTTON_CLASS: "section-line-menu-button", + STATION_SELECTOR_ID: "section-station-selector", + ORDER_INPUT_ID: "section-order-input", + ADD_BUTTON_ID: "section-add-button", + DELETE_BUTTON_CLASS: "section-delete-button" +}; function removeAllChild(element) { while (element.firstChild) { @@ -8,11 +18,12 @@ function removeAllChild(element) { } function loadEditSectionLines() { - const parentDiv = document.getElementById("manage-sections"); + const parentDiv = document.getElementById(SECTION_TAGS.PARENT_SECTION_ID); for (const line of state.subwayLines) { const lineManageBtn = newElementWithInnerHtml("button", line.lineName); - lineManageBtn.id = `manage${line.id}`; + lineManageBtn.classList.add(SECTION_TAGS.LINE_MENU_BUTTON_CLASS); + lineManageBtn.dataset.id = `manage-${line.id}`; parentDiv.append(lineManageBtn); } @@ -20,13 +31,12 @@ function loadEditSectionLines() { export default function sectionManageContainer() { loadEditSectionLines(); - const parentDiv = document.getElementById("manage-sections"); + const parentDiv = document.getElementById(SECTION_TAGS.PARENT_SECTION_ID); const lineWrapperDiv = document.createElement("div"); lineWrapperDiv.id = "manage-wrapper"; for (const line of state.subwayLines) { - const manage = document.getElementById(`manage${line.id}`); - + const manage = document.querySelector(`[data-id="manage-${line.id}"]`); manage.addEventListener("click", () => { removeAllChild(lineWrapperDiv); @@ -38,8 +48,8 @@ export default function sectionManageContainer() { `; appendHTML(lineWrapperDiv, manageHTML); - // select stations const selectWrapper = document.createElement("select"); + selectWrapper.id = SECTION_TAGS.STATION_SELECTOR_ID; for (const station of state.stationArray) { const option = ``; @@ -47,14 +57,12 @@ export default function sectionManageContainer() { } lineWrapperDiv.append(selectWrapper); - // input const sectionInputHTML = ` - - + + `; appendHTML(lineWrapperDiv, sectionInputHTML); - // table const sectionTableHTML = ` @@ -71,33 +79,108 @@ export default function sectionManageContainer() { parentDiv.append(lineWrapperDiv); - // table items const table = document.getElementById("section-table"); const tableBody = document.getElementById("section-tbody"); + const sectionInputBtn = document.getElementById(SECTION_TAGS.ADD_BUTTON_ID); + const sectionInput = document.getElementById(SECTION_TAGS.ORDER_INPUT_ID); + const selectedOption = document.getElementById(SECTION_TAGS.STATION_SELECTOR_ID); + + sectionInputBtn.addEventListener("click", () => { + const tr = document.createElement("tr"); + tr.dataset.stationId = getStationByName(selectedOption.value).id; + + let indexOfNewElement = line.stations.length; + if (sectionInput.value < line.stations.length) { + indexOfNewElement = sectionInput.value; + } + tr.dataset.trId = indexOfNewElement; + + const tdIndex = newElementWithInnerHtml("td", indexOfNewElement); + const tdStationName = newElementWithInnerHtml( + "td", + getStationByName(selectedOption.value).stationName + ); + line.stations.splice( + parseInt(sectionInput.value), + 0, + getStationByName(selectedOption.value) + ); + + const tdDeleteBtn = newElementWithInnerHtml("button", "노선에서 삭제"); + tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; + tdDeleteBtn.dataset.id = getStationByName(selectedOption.value).id; + + const tdDelete = newTdWithElement(tdDeleteBtn); + + tdDeleteBtn.addEventListener("click", () => { + if (confirm("정말로 삭제하시겠습니까?")) { + const deleteStationFromLine = line.stations.filter(station => { + return parseInt(tdDeleteBtn.dataset.id) !== parseInt(station.id); + }); + tr.remove(); + + line.stations = deleteStationFromLine; + for ( + let index = parseInt(tdIndex.innerHTML); + index < tableBody.children.length; + index++ + ) { + tableBody.children[index].firstChild.innerHTML = + parseInt(tableBody.children[index].firstChild.innerHTML) - 1; + } + } + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + }); + + for (let index = parseInt(indexOfNewElement); index < tableBody.children.length; index++) { + tableBody.children[index].firstChild.innerHTML = + parseInt(tableBody.children[index].firstChild.innerHTML) + 1; + } + + tr.append(...[tdIndex, tdStationName, tdDelete]); + tableBody.insertBefore(tr, tableBody.children[indexOfNewElement]); + + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + }); + for (const [index, station] of Object.entries(line.stations)) { const tr = document.createElement("tr"); + tr.dataset.stationId = station.id; + tr.dataset.trId = index; + const tdIndex = newElementWithInnerHtml("td", index); const tdStationName = newElementWithInnerHtml("td", station.stationName); const tdDeleteBtn = newElementWithInnerHtml("button", "노선에서 삭제"); - tdDeleteBtn.id = station.id; - const tdDelete = newTdWithElement(tdDeleteBtn); + tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; + tdDeleteBtn.dataset.id = station.id; - tr.append(...[tdIndex, tdStationName, tdDelete]); - tableBody.append(tr); + const tdDelete = newTdWithElement(tdDeleteBtn); tdDeleteBtn.addEventListener("click", () => { if (confirm("정말로 삭제하시겠습니까?")) { const deleteStationFromLine = line.stations.filter(station => { - return parseInt(tdDeleteBtn.id) !== parseInt(station.id); + return parseInt(tdDeleteBtn.dataset.id) !== parseInt(station.id); }); tr.remove(); line.stations = deleteStationFromLine; + + for ( + let index = parseInt(tdIndex.innerHTML); + index < tableBody.children.length; + index++ + ) { + tableBody.children[index].firstChild.innerHTML = + parseInt(tableBody.children[index].firstChild.innerHTML) - 1; + } } saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); }); + + tr.append(...[tdIndex, tdStationName, tdDelete]); + tableBody.append(tr); } table.append(tableBody); lineWrapperDiv.append(table); @@ -109,12 +192,14 @@ export default function sectionManageContainer() { function newElementWithInnerHtml(elementType, innerHTML) { const element = document.createElement(elementType); element.innerHTML = innerHTML; + return element; } function newTdWithElement(element) { const td = document.createElement("td"); td.append(element); + return td; } From 2981b6b426f1fd2da6c4dbc9a38a0d6101e71292 Mon Sep 17 00:00:00 2001 From: ddongule Date: Mon, 14 Dec 2020 23:55:07 +0900 Subject: [PATCH 34/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/line-manage-container.js | 48 ++++++++++--------- src/global/messages.js | 11 ++++- .../inputs/validator/line-name-validator.js | 37 ++++++++++++++ .../validator/station-name-validator.js | 13 ++--- 4 files changed, 80 insertions(+), 29 deletions(-) create mode 100644 src/utils/inputs/validator/line-name-validator.js diff --git a/src/components/line-manage-container.js b/src/components/line-manage-container.js index 63315d5ea..93724824f 100644 --- a/src/components/line-manage-container.js +++ b/src/components/line-manage-container.js @@ -5,11 +5,11 @@ import { saveToLocalStorage } from "../index.js"; import clearInput from "../utils/inputs/clear-input.js"; import { LINE_ARRAY_KEY } from "../global/constant.js"; import { getStationByName } from "../utils/global-utils.js"; +import inputLineValidator from "../utils/inputs/validator/line-name-validator.js"; const SUBWAY_LINE_TBODY_ID = "lines"; function loadLines(state) { - console.log(state.subwayLines, "서브웨이"); for (const line of state.subwayLines) { showNewRow(SUBWAY_LINE_TBODY_ID, line, [ line.lineName, @@ -30,31 +30,35 @@ export default function lineManageContainer(state) { loadLines(state); addLineSubmit.addEventListener("click", () => { - const lineNameInputValue = addLineInput.value; + const lineNameInputValue = addLineInput.value.trim(); - let lineId = 0; + if (inputLineValidator(lineNameInputValue)) { + let lineId = 0; - if (state.subwayLines.length === 0) { - lineId = 0; - } else { - lineId = state.subwayLines[state.subwayLines.length - 1].id + 1; - } + if (state.subwayLines.length === 0) { + lineId = 0; + } else { + lineId = state.subwayLines[state.subwayLines.length - 1].id + 1; + } - const line = new SubwayLine( - lineNameInputValue, - getStationByName(selectUpLine.value), - getStationByName(selectDownLine.value), - lineId - ); + const line = new SubwayLine( + lineNameInputValue, + getStationByName(selectUpLine.value), + getStationByName(selectDownLine.value), + lineId + ); - showNewRow(SUBWAY_LINE_TBODY_ID, line, [ - line.lineName, - line.stations[0].stationName, - line.stations[1].stationName, - ]); + showNewRow(SUBWAY_LINE_TBODY_ID, line, [ + line.lineName, + line.stations[0].stationName, + line.stations[1].stationName, + ]); - state.subwayLines.push(line); - saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); - clearInput(addLineInput); + state.subwayLines.push(line); + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + clearInput(addLineInput); + } else { + clearInput(addLineInput); + } }); } diff --git a/src/global/messages.js b/src/global/messages.js index bc9722935..f850fffcd 100644 --- a/src/global/messages.js +++ b/src/global/messages.js @@ -1,4 +1,4 @@ -export const ALERT_MESSAGES = { +export const STATION_ALERT_MESSAGES = { ERROR_STATION_INPUT_DUPLICATED: "이미 존재하는 역 이름입니다.", ERROR_STATION_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", ERROR_STATION_INPUT_SPECIAL_CHARACTER: @@ -7,6 +7,15 @@ export const ALERT_MESSAGES = { ERROR_STATION_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!", }; +export const LINE_ALERT_MESSAGES = { + ERROR_LINE_INPUT_DUPLICATED: "이미 존재하는 노선 이름입니다.", + ERROR_LINE_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", + ERROR_LINE_INPUT_SPECIAL_CHARACTER: + "노선 이름에는 특수문자가 입력되지 않습니다!", + ERROR_LINE_INPUT_NOT_COMPLETE: "노선 이름을 바르게 작성해 주세요!", + ERROR_LINE_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!", +}; + export const CONFIRM_MESSAGES = { CONFIRM_DELETE: "정말로 삭제하시겠습니까?", }; diff --git a/src/utils/inputs/validator/line-name-validator.js b/src/utils/inputs/validator/line-name-validator.js new file mode 100644 index 000000000..1126aa717 --- /dev/null +++ b/src/utils/inputs/validator/line-name-validator.js @@ -0,0 +1,37 @@ +import { LINE_ALERT_MESSAGES } from "../../../global/messages.js"; +import { state } from "../../../index.js"; + +const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; +const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; +const checkMultipleSpaces = /\s{2,}/; +const STATION_INPUT_MINIMUM_LENGTH = 2; + +export function isDuplicatedLineName(lineName) { + let isDuplicated = false; + + for (const line of state.subwayLines) { + if (line.lineName === lineName) { + isDuplicated = true; + } + } + + return isDuplicated; +} + +export default function inputLineValidator(lineNameInputValue) { + let isValid = false; + console.log("?"); + if (isDuplicatedLineName(lineNameInputValue)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_DUPLICATED); + } else if (checkSpecialCharacter.test(lineNameInputValue)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_SPECIAL_CHARACTER); + } else if (checkInvalidKorean.test(lineNameInputValue)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_NOT_COMPLETE); + } else if (checkMultipleSpaces.test(lineNameInputValue)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_MULTIPLE_SPACES); + } else { + isValid = true; + } + + return isValid; +} diff --git a/src/utils/inputs/validator/station-name-validator.js b/src/utils/inputs/validator/station-name-validator.js index b94a5b1ab..da99df22c 100644 --- a/src/utils/inputs/validator/station-name-validator.js +++ b/src/utils/inputs/validator/station-name-validator.js @@ -1,4 +1,4 @@ -import { ALERT_MESSAGES } from "../../../global/messages.js"; +import { STATION_ALERT_MESSAGES } from "../../../global/messages.js"; import { state } from "../../../index.js"; const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; @@ -20,16 +20,17 @@ export function isDuplicatedStationName(stationName) { export default function inputStationValidator(stationNameInputValue) { let isValid = false; + if (isDuplicatedStationName(stationNameInputValue)) { - alert(ALERT_MESSAGES.ERROR_STATION_INPUT_DUPLICATED); + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_DUPLICATED); } else if (stationNameInputValue.length < STATION_INPUT_MINIMUM_LENGTH) { - alert(ALERT_MESSAGES.ERROR_STATION_INPUT_LENGTH_UNDER); + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_LENGTH_UNDER); } else if (checkSpecialCharacter.test(stationNameInputValue)) { - alert(ALERT_MESSAGES.ERROR_STATION_INPUT_SPECIAL_CHARACTER); + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_SPECIAL_CHARACTER); } else if (checkInvalidKorean.test(stationNameInputValue)) { - alert(ALERT_MESSAGES.ERROR_STATION_INPUT_NOT_COMPLETE); + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_NOT_COMPLETE); } else if (checkMultipleSpaces.test(stationNameInputValue)) { - alert(ALERT_MESSAGES.ERROR_STATION_INPUT_MULTIPLE_SPACES); + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_MULTIPLE_SPACES); } else { isValid = true; } From a62d9809fade96358b8712ebb8da788b25589456 Mon Sep 17 00:00:00 2001 From: ddongule Date: Mon, 14 Dec 2020 23:56:27 +0900 Subject: [PATCH 35/45] =?UTF-8?q?feat:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EA=B5=AC=EA=B0=84=20=EA=B4=80=EB=A6=AC=20=EC=88=9C=EC=84=9C=20?= =?UTF-8?q?input=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/global/messages.js | 6 +++ .../validator/section-input-validator.js | 50 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/utils/inputs/validator/section-input-validator.js diff --git a/src/global/messages.js b/src/global/messages.js index f850fffcd..07b4b1869 100644 --- a/src/global/messages.js +++ b/src/global/messages.js @@ -16,6 +16,12 @@ export const LINE_ALERT_MESSAGES = { ERROR_LINE_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!", }; +export const SECTION_ALERT_MESSAGES = { + ERROR_SECTION_INPUT_DUPLICATED: "한 구간에 중복된 역은 등록하실 수 없습니다.", + ERROR_SECTION_INPUT_NUMBER: + "순서에는 정수 형태의 숫자를 입력해 주셔야 합니다.", +}; + export const CONFIRM_MESSAGES = { CONFIRM_DELETE: "정말로 삭제하시겠습니까?", }; diff --git a/src/utils/inputs/validator/section-input-validator.js b/src/utils/inputs/validator/section-input-validator.js new file mode 100644 index 000000000..68e798c34 --- /dev/null +++ b/src/utils/inputs/validator/section-input-validator.js @@ -0,0 +1,50 @@ +import { SECTION_ALERT_MESSAGES } from "../../../global/messages.js"; + +const checkNumber = /^\d+$/; +// const checkZero = /^0\d{1,}$/ +const checkFirstDigitZero = /^0{1,}/; + +export function isDuplicatedStationInSection( + selectedStationName, + stationsInLine +) { + let isDuplicated = false; + + for (const station of stationsInLine) { + if (station.stationName === selectedStationName) { + isDuplicated = true; + } + } + + return isDuplicated; +} + +export function checkStationInputZero(sectionInputValue) { + let deleteZeroInValue = sectionInputValue + .trim() + .replace(checkFirstDigitZero, ""); + if (deleteZeroInValue === "") { + deleteZeroInValue = "0"; + } + return deleteZeroInValue; +} + +export default function sectionInputValidator( + sectionInputValue, + selectedStationName, + stationsInLine +) { + let isValid = false; + + if (!checkNumber.test(sectionInputValue)) { + alert(SECTION_ALERT_MESSAGES.ERROR_SECTION_INPUT_NUMBER); + } else if ( + isDuplicatedStationInSection(selectedStationName, stationsInLine) + ) { + alert(SECTION_ALERT_MESSAGES.ERROR_SECTION_INPUT_DUPLICATED); + } else { + isValid = true; + } + + return isValid; +} From 5dd8b216be70be2115a981a79640cd002a8d6134 Mon Sep 17 00:00:00 2001 From: ddongule Date: Tue, 15 Dec 2020 00:19:35 +0900 Subject: [PATCH 36/45] =?UTF-8?q?refactor:=20sectionManagerContainer=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - appendHTMLToParent 메소드 분리 - section input 유효성 검사 - deleteStationFromLine 메소드 분리 - updateAddedIndex 메소드 분리 - updateDeletedIndex 메소드 분리 - showTableItems 메소드 분리 --- src/components/section-manage-container.js | 288 ++++++++++-------- .../total-subway-manage-container.js | 16 +- src/utils/display/make-elements.js | 18 +- 3 files changed, 181 insertions(+), 141 deletions(-) diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js index 030288d42..cc882003e 100644 --- a/src/components/section-manage-container.js +++ b/src/components/section-manage-container.js @@ -1,6 +1,15 @@ import { state, saveToLocalStorage } from "../index.js"; import { LINE_ARRAY_KEY } from "../global/constant.js"; import { getStationByName } from "../utils/global-utils.js"; +import { + makeNewElementWithInnerHtml, + makeNewTdWithElement, +} from "../utils/display/make-elements.js"; +import sectionInputValidator, { + checkStationInputZero, +} from "../utils/inputs/validator/section-input-validator.js"; +import clearInput from "../utils/inputs/clear-input.js"; +import { CONFIRM_MESSAGES } from "../global/messages.js"; const SECTION_TAGS = { PARENT_SECTION_ID: "manage-sections", @@ -8,7 +17,33 @@ const SECTION_TAGS = { STATION_SELECTOR_ID: "section-station-selector", ORDER_INPUT_ID: "section-order-input", ADD_BUTTON_ID: "section-add-button", - DELETE_BUTTON_CLASS: "section-delete-button" + DELETE_BUTTON_CLASS: "section-delete-button", +}; + +function makeSectionHtml(lineName) { + return ` +
+

${lineName} 관리

+
구간 등록
+
`; +} + +const SECTION_HTML = { + SECTION_INPUT_HTML: ` + + + `, + SECTION_TABLE_HTML: ` +
+ + + + + + + + +
순서이름설정
`, }; function removeAllChild(element) { @@ -21,7 +56,7 @@ function loadEditSectionLines() { const parentDiv = document.getElementById(SECTION_TAGS.PARENT_SECTION_ID); for (const line of state.subwayLines) { - const lineManageBtn = newElementWithInnerHtml("button", line.lineName); + const lineManageBtn = makeNewElementWithInnerHtml("button", line.lineName); lineManageBtn.classList.add(SECTION_TAGS.LINE_MENU_BUTTON_CLASS); lineManageBtn.dataset.id = `manage-${line.id}`; @@ -39,149 +74,82 @@ export default function sectionManageContainer() { const manage = document.querySelector(`[data-id="manage-${line.id}"]`); manage.addEventListener("click", () => { removeAllChild(lineWrapperDiv); - - const manageHTML = ` -
-

${line.lineName} 관리

-
구간 등록
-
- `; - appendHTML(lineWrapperDiv, manageHTML); + appendHtmlToParent(lineWrapperDiv, makeSectionHtml(line.lineName)); const selectWrapper = document.createElement("select"); selectWrapper.id = SECTION_TAGS.STATION_SELECTOR_ID; for (const station of state.stationArray) { const option = ``; - appendHTML(selectWrapper, option); + appendHtmlToParent(selectWrapper, option); } + appendHtmlToParent(lineWrapperDiv, SECTION_HTML.SECTION_TABLE_HTML); lineWrapperDiv.append(selectWrapper); - - const sectionInputHTML = ` - - - `; - appendHTML(lineWrapperDiv, sectionInputHTML); - - const sectionTableHTML = ` - - - - - - - - - -
순서이름설정
- `; - appendHTML(lineWrapperDiv, sectionTableHTML); - + appendHtmlToParent(lineWrapperDiv, SECTION_HTML.SECTION_INPUT_HTML); parentDiv.append(lineWrapperDiv); const table = document.getElementById("section-table"); const tableBody = document.getElementById("section-tbody"); - const sectionInputBtn = document.getElementById(SECTION_TAGS.ADD_BUTTON_ID); const sectionInput = document.getElementById(SECTION_TAGS.ORDER_INPUT_ID); - const selectedOption = document.getElementById(SECTION_TAGS.STATION_SELECTOR_ID); + const selectedOption = document.getElementById( + SECTION_TAGS.STATION_SELECTOR_ID + ); + const addSectionInputBtn = document.getElementById( + SECTION_TAGS.ADD_BUTTON_ID + ); + + addSectionInputBtn.addEventListener("click", () => { + const sectionInputValue = checkStationInputZero(sectionInput.value); + if ( + sectionInputValidator( + sectionInputValue, + selectedOption.value, + line.stations + ) + ) { + const tr = document.createElement("tr"); + const newStation = getStationByName(selectedOption.value); + tr.dataset.stationId = newStation.id; + + let indexOfNewElement = line.stations.length; + if (sectionInputValue < line.stations.length) { + indexOfNewElement = sectionInputValue; + } - sectionInputBtn.addEventListener("click", () => { - const tr = document.createElement("tr"); - tr.dataset.stationId = getStationByName(selectedOption.value).id; + tr.dataset.trId = indexOfNewElement; - let indexOfNewElement = line.stations.length; - if (sectionInput.value < line.stations.length) { - indexOfNewElement = sectionInput.value; - } - tr.dataset.trId = indexOfNewElement; - - const tdIndex = newElementWithInnerHtml("td", indexOfNewElement); - const tdStationName = newElementWithInnerHtml( - "td", - getStationByName(selectedOption.value).stationName - ); - line.stations.splice( - parseInt(sectionInput.value), - 0, - getStationByName(selectedOption.value) - ); - - const tdDeleteBtn = newElementWithInnerHtml("button", "노선에서 삭제"); - tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; - tdDeleteBtn.dataset.id = getStationByName(selectedOption.value).id; - - const tdDelete = newTdWithElement(tdDeleteBtn); - - tdDeleteBtn.addEventListener("click", () => { - if (confirm("정말로 삭제하시겠습니까?")) { - const deleteStationFromLine = line.stations.filter(station => { - return parseInt(tdDeleteBtn.dataset.id) !== parseInt(station.id); - }); - tr.remove(); - - line.stations = deleteStationFromLine; - for ( - let index = parseInt(tdIndex.innerHTML); - index < tableBody.children.length; - index++ - ) { - tableBody.children[index].firstChild.innerHTML = - parseInt(tableBody.children[index].firstChild.innerHTML) - 1; - } - } - saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); - }); + const tdIndex = makeNewElementWithInnerHtml("td", indexOfNewElement); + const tdStationName = makeNewElementWithInnerHtml( + "td", + newStation.stationName + ); + line.stations.splice(parseInt(sectionInputValue), 0, newStation); - for (let index = parseInt(indexOfNewElement); index < tableBody.children.length; index++) { - tableBody.children[index].firstChild.innerHTML = - parseInt(tableBody.children[index].firstChild.innerHTML) + 1; - } + const tdDeleteBtn = makeNewElementWithInnerHtml( + "button", + "노선에서 삭제" + ); + tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; + tdDeleteBtn.dataset.id = newStation.id; - tr.append(...[tdIndex, tdStationName, tdDelete]); - tableBody.insertBefore(tr, tableBody.children[indexOfNewElement]); + const tdDelete = makeNewTdWithElement(tdDeleteBtn); - saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); - }); + tdDeleteBtn.addEventListener("click", () => { + deleteStationFromLine(tr, line, tableBody); + }); - for (const [index, station] of Object.entries(line.stations)) { - const tr = document.createElement("tr"); - tr.dataset.stationId = station.id; - tr.dataset.trId = index; - - const tdIndex = newElementWithInnerHtml("td", index); - const tdStationName = newElementWithInnerHtml("td", station.stationName); - - const tdDeleteBtn = newElementWithInnerHtml("button", "노선에서 삭제"); - tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; - tdDeleteBtn.dataset.id = station.id; - - const tdDelete = newTdWithElement(tdDeleteBtn); - - tdDeleteBtn.addEventListener("click", () => { - if (confirm("정말로 삭제하시겠습니까?")) { - const deleteStationFromLine = line.stations.filter(station => { - return parseInt(tdDeleteBtn.dataset.id) !== parseInt(station.id); - }); - tr.remove(); - - line.stations = deleteStationFromLine; - - for ( - let index = parseInt(tdIndex.innerHTML); - index < tableBody.children.length; - index++ - ) { - tableBody.children[index].firstChild.innerHTML = - parseInt(tableBody.children[index].firstChild.innerHTML) - 1; - } - } + updateAddedIndex(indexOfNewElement, tableBody.children); + tr.append(...[tdIndex, tdStationName, tdDelete]); + tableBody.insertBefore(tr, tableBody.children[indexOfNewElement]); saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); - }); + clearInput(sectionInput); + } else { + clearInput(sectionInput); + } + }); - tr.append(...[tdIndex, tdStationName, tdDelete]); - tableBody.append(tr); - } + showTableItems(line, tableBody); table.append(tableBody); lineWrapperDiv.append(table); }); @@ -189,24 +157,74 @@ export default function sectionManageContainer() { } // TODO - utils로 빼기 -function newElementWithInnerHtml(elementType, innerHTML) { - const element = document.createElement(elementType); - element.innerHTML = innerHTML; - return element; +function appendHtmlToParent(parent, html) { + const htmlDOM = new DOMParser().parseFromString(html, "text/html").body + .childNodes; + + for (const node of htmlDOM) { + parent.append(node); + } +} + +function updateDeletedIndex(currentIndex, trDatas) { + for ( + let index = parseInt(currentIndex.innerHTML); + index < trDatas.length; + index++ + ) { + trDatas[index].firstChild.innerHTML = + parseInt(trDatas[index].firstChild.innerHTML) - 1; + } } -function newTdWithElement(element) { - const td = document.createElement("td"); - td.append(element); +function updateAddedIndex(currentIndex, trDatas) { + for (let index = parseInt(currentIndex); index < trDatas.length; index++) { + trDatas[index].firstChild.innerHTML = + parseInt(trDatas[index].firstChild.innerHTML) + 1; + } +} - return td; +function deletedStationFromLine(currentStations, deleteBtn) { + return currentStations.filter( + (station) => parseInt(deleteBtn.dataset.id) !== parseInt(station.id) + ); } -function appendHTML(parent, html) { - const htmlDOM = new DOMParser().parseFromString(html, "text/html").body.childNodes; +function deleteStationFromLine(tr, line, tableBody) { + if (confirm(CONFIRM_MESSAGES.CONFIRM_DELETE)) { + line.stations = deletedStationFromLine( + line.stations, + tr.childNodes[2].firstChild + ); + tr.remove(); - for (const node of htmlDOM) { - parent.append(node); + updateDeletedIndex(tr.childNodes[0], tableBody.children); + } + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); +} + +function showTableItems(line, tableBody) { + for (const [index, station] of Object.entries(line.stations)) { + const tr = document.createElement("tr"); + tr.dataset.stationId = station.id; + tr.dataset.trId = index; + const tdIndex = makeNewElementWithInnerHtml("td", index); + const tdStationName = makeNewElementWithInnerHtml( + "td", + station.stationName + ); + + const tdDeleteBtn = makeNewElementWithInnerHtml("button", "노선에서 삭제"); + tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; + tdDeleteBtn.dataset.id = station.id; + const tdDelete = makeNewTdWithElement(tdDeleteBtn); + + tr.append(...[tdIndex, tdStationName, tdDelete]); + tableBody.append(tr); + + tdDeleteBtn.addEventListener("click", () => { + deleteStationFromLine(tr, line, tableBody); + }); } } diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index beeff63c6..dff0cb0be 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -2,6 +2,7 @@ import stationManageContainer from "./station-manage-container.js"; import lineManageContainer from "./line-manage-container.js"; import sectionManageContainer from "./section-manage-container.js"; import { state } from "../index.js"; +import mapPrintManageContainer from "./map-print-manage-container.js"; const menuIDs = { 0: { @@ -30,7 +31,7 @@ const menuIDs = { - `, + ` }, 1: { id: "manage-lines", @@ -67,16 +68,21 @@ const menuIDs = { - `, + ` }, 2: { id: "manage-sections", html: `

구간을 수정할 노선을 선택해 주세요.

-
`, + ` }, - 3: { id: "manage-map-print", html: `` }, + 3: { + id: "manage-map-print", + html: ` +
+ ` + } }; const menus = document.querySelectorAll("#menu > button"); @@ -109,6 +115,8 @@ export default function totalSubwayManageContainer() { new lineManageContainer(state); } else if (index === 2) { new sectionManageContainer(); + } else if (index === 3) { + new mapPrintManageContainer(); } }); } diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 2705df4a6..9ce67198a 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -29,14 +29,14 @@ export function makeTdDeleteBtn(objectToMake, tr) { function deleteObject(object, tr) { if (object.type === "STATION") { - const deleteStation = state.stationArray.filter((station) => { + const deleteStation = state.stationArray.filter(station => { return station.id !== object.id; }); tr.remove(); state.stationArray = deleteStation; saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); } else if (object.type === "LINE") { - const deleteLine = state.subwayLines.filter((line) => { + const deleteLine = state.subwayLines.filter(line => { return line.id !== object.id; }); tr.remove(); @@ -66,3 +66,17 @@ export function makeSelectOptions(selectBox, optionToMakeArray) { selectBox.appendChild(option); } } + +export function makeNewElementWithInnerHtml(elementType, innerHTML) { + const element = document.createElement(elementType); + element.innerHTML = innerHTML; + + return element; +} + +export function makeNewTdWithElement(element) { + const td = document.createElement("td"); + td.append(element); + + return td; +} From dc3bb902ea804322895b54fd0ca03bb73a857bfd Mon Sep 17 00:00:00 2001 From: ddongule Date: Tue, 15 Dec 2020 00:22:17 +0900 Subject: [PATCH 37/45] =?UTF-8?q?docs:=20Readme=20-=20=EC=A7=80=ED=95=98?= =?UTF-8?q?=EC=B2=A0=20=EA=B5=AC=EA=B0=84=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=98=20=EC=98=88=EC=99=B8=20=EC=83=81=ED=99=A9=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 숫자 앞에 0이 들어가는 숫자가 입력되었을 때 - 중복된 역을 추가하려고 할 때 --- README.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 843276058..28acf11b7 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,11 @@ - 🚦**예외 상황** - 유저가 지하철 역 이름을 1글자만 입력하거나 입력하지 않았을 때 ex) `"잠"`, `""` - - 유저가 완성되지 않은 역 이름을 입력했을 때 ex) `"잠ㅁ실"`, `"서ㅓㄱ촌"` - - 유저가 중복된 지하철 역 이름을 입력했을 때 - - 유저가 공백으로 시작하거나 끝나는 이름을 입력했을 때 - - 유저가 연속적인 공백이 들어간 이름을 입력했을 때 - - 유저가 특수문자가 포함된 이름을 입력했을 때 ex) `"잠실역;;"`, `"*석촌*"` + - 유저가 완성되지 않은 역 이름을 입력했을 때 ex) `"잠ㅁ실"`, `"서ㅓㄱ촌"` + - 유저가 중복된 지하철 역 이름을 입력했을 때 + - 유저가 공백으로 시작하거나 끝나는 역 이름을 입력했을 때 + - 유저가 연속적인 공백이 들어간 역 이름을 입력했을 때 + - 유저가 특수문자 가 포함된 역 이름을 입력했을 때 ex) `"잠실역;;"`, `"*석촌*"` - 저장된 지하철 역 목록을 보여주는 기능 - 저장된 지하철 역에서 역을 삭제할 수 있는 기능 @@ -53,7 +53,10 @@ - 🚦**예외 상황** - 유저가 노선 이름을 입력하지 않았을 때 ex) `""` - 유저가 완성되지 않은 노선 이름을 입력했을 때 ex) `"경ㅇ의중앙선"`, `"4호선ㄴ"` - - 유저가 중복된 노선 이름을 등록하려고 할 때 + - 유저가 중복된 노선 이름을 입력했을 때 + - 유저가 공백으로 시작하거나 끝나는 노선 이름을 입력했을 때 + - 유저가 연속적인 공백이 들어간 노선 이름을 입력했을 때 + - 유저가 특수문자가 포함된 노선 이름을 입력했을 때 - 저장된 노선 목록을 보여주는 기능 - 저장된 노선 목록에서 노선을 삭제할 수 있는 기능 @@ -270,7 +273,7 @@ - 좋지 않은 예시 ```javascript - const isValidCar = car => { + const isValidCar = (car) => { if (car.hasValidName()) { return true; } @@ -295,7 +298,7 @@ ```javascript const winners = ["east", "west", "south"]; winners - .map(winner => { + .map((winner) => { return winner; }) .join(","); From e5d5acd4a6add34d9f9405023a8dba5a3778cc45 Mon Sep 17 00:00:00 2001 From: minkyung Date: Tue, 15 Dec 2020 09:26:39 +0900 Subject: [PATCH 38/45] =?UTF-8?q?refactor:=20total=20subway=20manage=20con?= =?UTF-8?q?tainer=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - contentToShow 기능 모듈화 --- .../total-subway-manage-container.js | 110 +++--------------- 1 file changed, 17 insertions(+), 93 deletions(-) diff --git a/src/components/total-subway-manage-container.js b/src/components/total-subway-manage-container.js index dff0cb0be..27064a85b 100644 --- a/src/components/total-subway-manage-container.js +++ b/src/components/total-subway-manage-container.js @@ -1,92 +1,12 @@ import stationManageContainer from "./station-manage-container.js"; import lineManageContainer from "./line-manage-container.js"; import sectionManageContainer from "./section-manage-container.js"; -import { state } from "../index.js"; import mapPrintManageContainer from "./map-print-manage-container.js"; -const menuIDs = { - 0: { - id: "manage-station", - html: ` -
-
-

역 이름

- - -
- -
-

🚉 지하철 역 목록

- - - - - - - - -
역 이름설정
-
-
` - }, - 1: { - id: "manage-lines", - html: ` -
-
-

노선 이름

- -
- 상행 종점 -
- 하행 종점 - -
- -
- -
-

🚉 지하철 역 목록

- - - - - - - - - - -
노선 이름상행 종점역하행 종점역설정
-
-
- ` - }, - 2: { - id: "manage-sections", - html: ` -
-

구간을 수정할 노선을 선택해 주세요.

-
` - }, - 3: { - id: "manage-map-print", - html: ` -
- ` - } -}; +import { state } from "../index.js"; +import { menuIDs } from "../global/innerHtml.js"; const menus = document.querySelectorAll("#menu > button"); -const menuIndexArray = [...Array(menus.length).keys()]; function removeAllChild(element) { while (element.firstChild) { @@ -96,28 +16,32 @@ function removeAllChild(element) { function createDOM(index) { const html = menuIDs[index].html; - const createdDOM = new DOMParser().parseFromString(html, "text/html"); return createdDOM.body.firstChild; } +function contentToShow(content, index) { + content.appendChild(createDOM(index)); + + if (index === 0) { + new stationManageContainer(state); + } else if (index === 1) { + new lineManageContainer(state); + } else if (index === 2) { + new sectionManageContainer(); + } else if (index === 3) { + new mapPrintManageContainer(); + } +} + export default function totalSubwayManageContainer() { const content = document.getElementById("content"); for (const [index, child] of menus.entries()) { child.addEventListener("click", () => { removeAllChild(content); - content.appendChild(createDOM(index)); - if (index === 0) { - new stationManageContainer(state); - } else if (index === 1) { - new lineManageContainer(state); - } else if (index === 2) { - new sectionManageContainer(); - } else if (index === 3) { - new mapPrintManageContainer(); - } + contentToShow(content, index); }); } } From c72356b1e8d8a31374ca67b35d14e7f09e99fa46 Mon Sep 17 00:00:00 2001 From: minkyung Date: Tue, 15 Dec 2020 13:25:34 +0900 Subject: [PATCH 39/45] =?UTF-8?q?refactor:=20=EC=A7=80=ED=95=98=EC=B2=A0?= =?UTF-8?q?=20=EB=85=B8=EC=84=A0=EB=8F=84=20=EC=B6=9C=EB=A0=A5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - printAllLineAndStations 기능 분리 - printLineName 기능 분리 - printStation 기능 분리 --- src/components/map-print-manage-container.js | 40 +++++++++++++++----- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/src/components/map-print-manage-container.js b/src/components/map-print-manage-container.js index c0dd6e5d1..a49e07209 100644 --- a/src/components/map-print-manage-container.js +++ b/src/components/map-print-manage-container.js @@ -1,19 +1,39 @@ import { state } from "../index.js"; +function printAllLineAndStations(elementToAppend, subwayLines) { + for (const line of subwayLines) { + printLineName(elementToAppend, line.lineName); + printStation(elementToAppend, line.stations); + } +} + +function printLineName(elementToAppend, lineName) { + const h2 = document.createElement("h2"); + + h2.append(lineName); + elementToAppend.append(h2); +} + +function printStation(elementToAppend, stationArray) { + for (const station of stationArray) { + const stationsInLine = document.createElement("li"); + stationsInLine.append(station.stationName); + elementToAppend.append(stationsInLine); + } +} + export default function mapPrintManageContainer() { const parent = document.getElementById("manage-map-print"); const div = document.createElement("div"); - for (const line of state.subwayLines) { - const lineName = document.createElement("h2"); - - lineName.append(line.lineName); - div.append(lineName); - for (const station of line.stations) { - const stationsInLine = document.createElement("li"); - stationsInLine.append(station.stationName); - div.append(stationsInLine); - } + if (state.subwayLines.length) { + printAllLineAndStations(div, state.subwayLines); + } else { + const title = `

노선에 등록되지 않은 역

`; + const titleElement = new DOMParser().parseFromString(title, "text/html").firstElementChild; + div.append(titleElement); + printStation(div, state.stationArray); } + parent.append(div); } From e1e0d15d31ddb0782c141eed0560e8ac8fbb99c5 Mon Sep 17 00:00:00 2001 From: minkyung Date: Tue, 15 Dec 2020 16:02:41 +0900 Subject: [PATCH 40/45] =?UTF-8?q?refactor:=20=EC=A7=80=ED=95=98=EC=B2=A0?= =?UTF-8?q?=20=EC=97=AD=20=EA=B4=80=EB=A6=AC=EC=99=80=20=EB=85=B8=EC=84=A0?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=EC=97=90=EC=84=9C=20=EC=93=B0=EC=9D=B4?= =?UTF-8?q?=EB=8A=94=20=EC=A4=91=EB=B3=B5=20=EB=AA=A8=EB=93=88=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - showNewRow 안에 중복으로 쓰이는 모듈들을 make-elements.js로 분리 --- src/components/line-manage-container.js | 85 +++++++------- src/components/map-print-manage-container.js | 2 +- src/components/station-manage-container.js | 46 ++++---- src/global/constant.js | 22 ++++ src/global/innerHtml.js | 108 ++++++++++++++++++ src/global/messages.js | 19 ++- src/utils/display/make-elements.js | 100 ++++++++++------ .../inputs/validator/line-name-validator.js | 6 +- 8 files changed, 274 insertions(+), 114 deletions(-) create mode 100644 src/global/innerHtml.js diff --git a/src/components/line-manage-container.js b/src/components/line-manage-container.js index 93724824f..7d096c8f7 100644 --- a/src/components/line-manage-container.js +++ b/src/components/line-manage-container.js @@ -1,11 +1,11 @@ import SubwayLine from "../domain/subway-line.js"; -import { makeSelectOptions } from "../utils/display/make-elements.js"; -import { showNewRow } from "../components/station-manage-container.js"; -import { saveToLocalStorage } from "../index.js"; +import inputLineValidator from "../utils/inputs/validator/line-name-validator.js"; import clearInput from "../utils/inputs/clear-input.js"; -import { LINE_ARRAY_KEY } from "../global/constant.js"; +import { saveToLocalStorage } from "../index.js"; +import { showNewRow, makeSelectOptions } from "../utils/display/make-elements.js"; import { getStationByName } from "../utils/global-utils.js"; -import inputLineValidator from "../utils/inputs/validator/line-name-validator.js"; +import { LINE_ALERT_MESSAGES } from "../global/messages.js"; +import { LINE_ARRAY_KEY, LINE_TAGS } from "../global/constant.js"; const SUBWAY_LINE_TBODY_ID = "lines"; @@ -14,51 +14,58 @@ function loadLines(state) { showNewRow(SUBWAY_LINE_TBODY_ID, line, [ line.lineName, line.stations[0].stationName, - line.stations[1].stationName, + line.stations[line.stations.length - 1].stationName ]); } } -export default function lineManageContainer(state) { - const addLineInput = document.getElementById("line-name-input"); - const selectUpLine = document.getElementById("line-start-station-selector"); - const selectDownLine = document.getElementById("line-end-station-selector"); - const addLineSubmit = document.getElementById("line-add-button"); - - makeSelectOptions(selectUpLine, state.stationArray); - makeSelectOptions(selectDownLine, state.stationArray); - loadLines(state); +function validateLineName(subwayLines, lineName, upLine, downLine, addLineInput) { + if (inputLineValidator(lineName)) { + saveLine(subwayLines, lineName, upLine, downLine); + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(subwayLines)); + clearInput(addLineInput); + } else { + clearInput(addLineInput); + } +} - addLineSubmit.addEventListener("click", () => { - const lineNameInputValue = addLineInput.value.trim(); +function saveLine(subwayLines, lineName, upLine, downLine) { + let lineId = 0; + if (subwayLines.length !== 0) { + lineId = subwayLines[subwayLines.length - 1].id + 1; + } - if (inputLineValidator(lineNameInputValue)) { - let lineId = 0; + const line = new SubwayLine( + lineName, + getStationByName(upLine.value), + getStationByName(downLine.value), + lineId + ); - if (state.subwayLines.length === 0) { - lineId = 0; - } else { - lineId = state.subwayLines[state.subwayLines.length - 1].id + 1; - } + showNewRow(SUBWAY_LINE_TBODY_ID, line, [ + line.lineName, + line.stations[0].stationName, + line.stations[line.stations.length - 1].stationName + ]); - const line = new SubwayLine( - lineNameInputValue, - getStationByName(selectUpLine.value), - getStationByName(selectDownLine.value), - lineId - ); + subwayLines.push(line); +} - showNewRow(SUBWAY_LINE_TBODY_ID, line, [ - line.lineName, - line.stations[0].stationName, - line.stations[1].stationName, - ]); +export default function lineManageContainer(state) { + const addLineInput = document.getElementById(LINE_TAGS.LINE_NAME_INPUT_ID); + const addLineSubmit = document.getElementById(LINE_TAGS.ADD_LINE_ID); + const upLine = document.getElementById(LINE_TAGS.SELECT_UP_LINE_ID); + const downLine = document.getElementById(LINE_TAGS.SELECT_DOWN_LINE_ID); + makeSelectOptions(upLine, state.stationArray); + makeSelectOptions(downLine, state.stationArray); + loadLines(state); - state.subwayLines.push(line); - saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); - clearInput(addLineInput); + addLineSubmit.addEventListener("click", () => { + if (upLine.value !== downLine.value) { + const lineNameInputValue = addLineInput.value.trim(); + validateLineName(state.subwayLines, lineNameInputValue, upLine, downLine, addLineInput); } else { - clearInput(addLineInput); + alert(LINE_ALERT_MESSAGES.ERROR_UPLINE_DOWNLINE_SAME); } }); } diff --git a/src/components/map-print-manage-container.js b/src/components/map-print-manage-container.js index a49e07209..f29fc0652 100644 --- a/src/components/map-print-manage-container.js +++ b/src/components/map-print-manage-container.js @@ -29,7 +29,7 @@ export default function mapPrintManageContainer() { if (state.subwayLines.length) { printAllLineAndStations(div, state.subwayLines); } else { - const title = `

노선에 등록되지 않은 역

`; + const title = `

노선이 없습니다.
노선에 아래의 역들을 등록해 주세요.

`; const titleElement = new DOMParser().parseFromString(title, "text/html").firstElementChild; div.append(titleElement); printStation(div, state.stationArray); diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js index f33775941..77eefbdd5 100644 --- a/src/components/station-manage-container.js +++ b/src/components/station-manage-container.js @@ -1,47 +1,45 @@ import Station from "../domain/station.js"; import inputStationValidator from "../utils/inputs/validator/station-name-validator.js"; import clearInput from "../utils/inputs/clear-input.js"; -import makeOneRowWithDeleteBtn from "../utils/display/make-elements.js"; import { saveToLocalStorage } from "../index.js"; -import { STATION_ARRAY_KEY } from "../global/constant.js"; - -const STATION_TBODY_ID = "stations"; +import { showNewRow } from "../utils/display/make-elements.js"; +import { STATION_ARRAY_KEY, STATION_TAGS } from "../global/constant.js"; function loadStations(state) { for (const station of state.stationArray) { - showNewRow(STATION_TBODY_ID, station, [station.stationName]); + showNewRow(STATION_TAGS.STATION_TBODY_ID, station, [station.stationName]); } } -export function showNewRow(parentID, rowToShow, [...args]) { - const oneRowWithDeleteBtn = makeOneRowWithDeleteBtn(rowToShow, [...args]); - const locationOfRow = document.getElementById(parentID); +function makeStationId(stationArray) { + let stationId = 0; + + if (stationArray.length !== 0) { + stationId = stationArray[stationArray.length - 1].id + 1; + } - return locationOfRow.appendChild(oneRowWithDeleteBtn); + return stationId; +} + +function makeNewStation(stationArray, stationNameInputValue) { + const stationId = makeStationId(stationArray); + const station = new Station(stationNameInputValue, stationId); + + showNewRow(STATION_TAGS.STATION_TBODY_ID, station, [station.stationName]); + stationArray.push(station); + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(stationArray)); } export default function stationManageContainer(state) { - const addStationBtn = document.getElementById("station-add-button"); - const stationNameInput = document.getElementById("station-name-input"); + const addStationBtn = document.getElementById(STATION_TAGS.ADD_BUTTON_ID); + const stationNameInput = document.getElementById(STATION_TAGS.STATION_NAME_INPUT_ID); loadStations(state); - addStationBtn.addEventListener("click", () => { const stationNameInputValue = stationNameInput.value.trim(); if (inputStationValidator(stationNameInputValue)) { - let stationId = 0; - - if (state.stationArray.length === 0) { - stationId = 0; - } else { - stationId = state.stationArray[state.stationArray.length - 1].id + 1; - } - const station = new Station(stationNameInputValue, stationId); - - showNewRow(STATION_TBODY_ID, station, [station.stationName]); - state.stationArray.push(station); - saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); + makeNewStation(state.stationArray, stationNameInputValue); clearInput(stationNameInput); } else { clearInput(stationNameInput); diff --git a/src/global/constant.js b/src/global/constant.js index 8fb90586f..8b7b61d2a 100644 --- a/src/global/constant.js +++ b/src/global/constant.js @@ -1,2 +1,24 @@ export const STATION_ARRAY_KEY = "stationArray"; export const LINE_ARRAY_KEY = "linesArray"; + +export const STATION_TAGS = { + STATION_TBODY_ID: "stations", + ADD_BUTTON_ID: "station-add-button", + STATION_NAME_INPUT_ID: "station-name-input" +}; + +export const LINE_TAGS = { + LINE_NAME_INPUT_ID: "line-name-input", + SELECT_UP_LINE_ID: "line-start-station-selector", + SELECT_DOWN_LINE_ID: "line-end-station-selector", + ADD_LINE_ID: "line-add-button" +}; + +export const SECTION_TAGS = { + PARENT_SECTION_ID: "manage-sections", + LINE_MENU_BUTTON_CLASS: "section-line-menu-button", + STATION_SELECTOR_ID: "section-station-selector", + ORDER_INPUT_ID: "section-order-input", + ADD_BUTTON_ID: "section-add-button", + DELETE_BUTTON_CLASS: "section-delete-button" +}; diff --git a/src/global/innerHtml.js b/src/global/innerHtml.js new file mode 100644 index 000000000..b84e0b16c --- /dev/null +++ b/src/global/innerHtml.js @@ -0,0 +1,108 @@ +import { SECTION_TAGS } from "../global/constant.js"; + +export const menuIDs = { + 0: { + id: "manage-station", + html: ` +
+
+

역 이름

+ + +
+ +
+

🚉 지하철 역 목록

+ + + + + + + + +
역 이름설정
+
+
` + }, + 1: { + id: "manage-lines", + html: ` +
+
+

노선 이름

+ +
+ 상행 종점 +
+ 하행 종점 + +
+ +
+ +
+

🚉 지하철 역 목록

+ + + + + + + + + + +
노선 이름상행 종점역하행 종점역설정
+
+
+ ` + }, + 2: { + id: "manage-sections", + html: ` +
+

구간을 수정할 노선을 선택해 주세요.

+
` + }, + 3: { + id: "manage-map-print", + html: ` +
+ ` + } +}; + +export const SECTION_HTML = { + SECTION_INPUT_HTML: ` + + + `, + SECTION_TABLE_HTML: ` + + + + + + + + + +
순서이름설정
` +}; + +export function makeSectionHtml(lineName) { + return ` +
+

${lineName} 관리

+
구간 등록
+
`; +} diff --git a/src/global/messages.js b/src/global/messages.js index 07b4b1869..47ec22616 100644 --- a/src/global/messages.js +++ b/src/global/messages.js @@ -1,27 +1,26 @@ export const STATION_ALERT_MESSAGES = { ERROR_STATION_INPUT_DUPLICATED: "이미 존재하는 역 이름입니다.", - ERROR_STATION_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", - ERROR_STATION_INPUT_SPECIAL_CHARACTER: - "역 이름에는 특수문자가 입력되지 않습니다!", + ERROR_STATION_INPUT_LENGTH_UNDER: "2글자 이상의 역 이름을 입력하셔야 합니다!", + ERROR_STATION_INPUT_SPECIAL_CHARACTER: "역 이름에는 특수문자가 입력되지 않습니다!", ERROR_STATION_INPUT_NOT_COMPLETE: "역 이름을 바르게 작성해 주세요!", - ERROR_STATION_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!", + ERROR_STATION_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!" }; export const LINE_ALERT_MESSAGES = { ERROR_LINE_INPUT_DUPLICATED: "이미 존재하는 노선 이름입니다.", - ERROR_LINE_INPUT_LENGTH_UNDER: "2글자 이상을 입력하셔야 합니다!", - ERROR_LINE_INPUT_SPECIAL_CHARACTER: - "노선 이름에는 특수문자가 입력되지 않습니다!", + ERROR_LINE_INPUT_LENGTH_UNDER: "1글자 이상의 노선 이름을 입력하셔야 합니다!", + ERROR_LINE_INPUT_SPECIAL_CHARACTER: "노선 이름에는 특수문자가 입력되지 않습니다!", ERROR_LINE_INPUT_NOT_COMPLETE: "노선 이름을 바르게 작성해 주세요!", ERROR_LINE_INPUT_MULTIPLE_SPACES: "1개 이하의 공백만 입력이 가능합니다!", + ERROR_CANNOT_DELETE_STATION_IN_LINE: "노선에 존재하는 역은 삭제하실 수 없습니다.", + ERROR_UPLINE_DOWNLINE_SAME: "상행 종점 역과 하행 종점 역은 서로 달라야 합니다." }; export const SECTION_ALERT_MESSAGES = { ERROR_SECTION_INPUT_DUPLICATED: "한 구간에 중복된 역은 등록하실 수 없습니다.", - ERROR_SECTION_INPUT_NUMBER: - "순서에는 정수 형태의 숫자를 입력해 주셔야 합니다.", + ERROR_SECTION_INPUT_NUMBER: "순서에는 정수 형태의 숫자를 입력해 주셔야 합니다." }; export const CONFIRM_MESSAGES = { - CONFIRM_DELETE: "정말로 삭제하시겠습니까?", + CONFIRM_DELETE: "정말로 삭제하시겠습니까?" }; diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 9ce67198a..e7ffb220a 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -1,66 +1,90 @@ import { state, saveToLocalStorage } from "../../index.js"; -import { LINE_ARRAY_KEY, STATION_ARRAY_KEY } from "../../global/constant.js"; -import { CONFIRM_MESSAGES } from "../../global/messages.js"; +import { STATION_ARRAY_KEY } from "../../global/constant.js"; +import { CONFIRM_MESSAGES, LINE_ALERT_MESSAGES } from "../../global/messages.js"; -export function makeTdElement(elementToMake) { - const tdContent = document.createElement("td"); +function confirmDelete(array, station, tr) { + const confirmDelete = confirm(CONFIRM_MESSAGES.CONFIRM_DELETE); - tdContent.append(elementToMake); - - return tdContent; + if (confirmDelete) { + deleteObject(array, station, tr); + } } -export function makeTdDeleteBtn(objectToMake, tr) { - const tdDeleteBtn = document.createElement("td"); - const deleteBtn = document.createElement("button"); - - deleteBtn.innerHTML = "삭제"; - deleteBtn.addEventListener("click", () => { - const confirmDelete = confirm(CONFIRM_MESSAGES.CONFIRM_DELETE); +function deleteObject(object, stationToDelete, tr) { + const deleteStation = object.filter(station => station.id !== stationToDelete.id); + tr.remove(); + if (stationToDelete.type === "LINE") { + state.subwayLines = deleteStation; + } else if (stationToDelete.type === "STATION") { + state.stationArray = deleteStation; + } + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(deleteStation)); +} - if (confirmDelete) { - deleteObject(objectToMake, tr); - } +function isContainedInLine(station) { + const isContained = state.subwayLines.filter(line => { + let contain = false; + line.stations.filter(stations => { + if (stations.stationName === station.stationName) { + contain = true; + } + }); + return contain; }); - tdDeleteBtn.appendChild(deleteBtn); - return tdDeleteBtn; + return isContained.length; } -function deleteObject(object, tr) { - if (object.type === "STATION") { - const deleteStation = state.stationArray.filter(station => { - return station.id !== object.id; - }); - tr.remove(); - state.stationArray = deleteStation; - saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(state.stationArray)); - } else if (object.type === "LINE") { - const deleteLine = state.subwayLines.filter(line => { - return line.id !== object.id; - }); - tr.remove(); - state.subwayLines = deleteLine; - saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); +function alertContainedStationInLine(station, tr) { + if (isContainedInLine(station) === 0) { + confirmDelete(state.stationArray, station, tr); + } else { + return alert(LINE_ALERT_MESSAGES.ERROR_CANNOT_DELETE_STATION_IN_LINE); } } -export default function makeOneRowWithDeleteBtn(objectToMake, [...args]) { +function makeTdDeleteButton(station, tr) { + const td = document.createElement("td"); + const deleteButtonHtml = ``; + const deleteButton = new DOMParser().parseFromString(deleteButtonHtml, "text/html").childNodes[0] + .lastElementChild.firstElementChild; + + deleteButton.addEventListener("click", () => { + if (station.type === "LINE") { + confirmDelete(state.subwayLines, station, tr); + } else if (station.type === "STATION") { + alertContainedStationInLine(station, tr); + } + }); + td.appendChild(deleteButton); + + return td; +} + +function makeOneRowWithDeleteBtn(object, [...args]) { const tr = document.createElement("tr"); - const deleteBtn = makeTdDeleteBtn(objectToMake, tr); + const deleteBtn = makeTdDeleteButton(object, tr); for (const arg of [...args]) { - tr.appendChild(makeTdElement(arg)); - tr.id = objectToMake.id; + tr.appendChild(makeNewTdWithElement(arg)); + tr.id = object.id; } tr.appendChild(deleteBtn); return tr; } +export function showNewRow(parentID, rowToShow, [...args]) { + const oneRowWithDeleteBtn = makeOneRowWithDeleteBtn(rowToShow, [...args]); + const locationOfRow = document.getElementById(parentID); + + return locationOfRow.appendChild(oneRowWithDeleteBtn); +} + export function makeSelectOptions(selectBox, optionToMakeArray) { for (const optionValue of optionToMakeArray) { const option = document.createElement("option"); + option.value = optionValue.stationName; option.text = optionValue.stationName; selectBox.appendChild(option); diff --git a/src/utils/inputs/validator/line-name-validator.js b/src/utils/inputs/validator/line-name-validator.js index 1126aa717..004fa83dd 100644 --- a/src/utils/inputs/validator/line-name-validator.js +++ b/src/utils/inputs/validator/line-name-validator.js @@ -4,7 +4,7 @@ import { state } from "../../../index.js"; const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; const checkMultipleSpaces = /\s{2,}/; -const STATION_INPUT_MINIMUM_LENGTH = 2; +const STATION_INPUT_MINIMUM_LENGTH = 1; export function isDuplicatedLineName(lineName) { let isDuplicated = false; @@ -20,9 +20,11 @@ export function isDuplicatedLineName(lineName) { export default function inputLineValidator(lineNameInputValue) { let isValid = false; - console.log("?"); + if (isDuplicatedLineName(lineNameInputValue)) { alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_DUPLICATED); + } else if (lineNameInputValue.length < STATION_INPUT_MINIMUM_LENGTH) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_LENGTH_UNDER); } else if (checkSpecialCharacter.test(lineNameInputValue)) { alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_SPECIAL_CHARACTER); } else if (checkInvalidKorean.test(lineNameInputValue)) { From c4bae0ed01b4bd2d5435e4b62008eb114a88ce9a Mon Sep 17 00:00:00 2001 From: minkyung Date: Tue, 15 Dec 2020 17:50:50 +0900 Subject: [PATCH 41/45] =?UTF-8?q?refactor:=20=EC=A7=80=ED=95=98=EC=B2=A0?= =?UTF-8?q?=20=EC=97=AD,=20=EB=85=B8=EC=84=A0=20=EC=9D=B4=EB=A6=84=20input?= =?UTF-8?q?=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - station-name-validator.js와 line-name-validator.js를 name-validator.js로 합침 --- src/components/line-manage-container.js | 5 +- src/components/station-manage-container.js | 6 +- .../inputs/validator/line-name-validator.js | 39 ---------- src/utils/inputs/validator/name-validator.js | 72 +++++++++++++++++++ .../validator/section-input-validator.js | 28 +++----- .../validator/station-name-validator.js | 39 ---------- 6 files changed, 88 insertions(+), 101 deletions(-) delete mode 100644 src/utils/inputs/validator/line-name-validator.js create mode 100644 src/utils/inputs/validator/name-validator.js delete mode 100644 src/utils/inputs/validator/station-name-validator.js diff --git a/src/components/line-manage-container.js b/src/components/line-manage-container.js index 7d096c8f7..05bb02b30 100644 --- a/src/components/line-manage-container.js +++ b/src/components/line-manage-container.js @@ -1,5 +1,5 @@ import SubwayLine from "../domain/subway-line.js"; -import inputLineValidator from "../utils/inputs/validator/line-name-validator.js"; +import inputNameValidator from "../utils/inputs/validator/name-validator.js"; import clearInput from "../utils/inputs/clear-input.js"; import { saveToLocalStorage } from "../index.js"; import { showNewRow, makeSelectOptions } from "../utils/display/make-elements.js"; @@ -8,6 +8,7 @@ import { LINE_ALERT_MESSAGES } from "../global/messages.js"; import { LINE_ARRAY_KEY, LINE_TAGS } from "../global/constant.js"; const SUBWAY_LINE_TBODY_ID = "lines"; +const VALIDATION_TYPE = "LINE"; function loadLines(state) { for (const line of state.subwayLines) { @@ -20,7 +21,7 @@ function loadLines(state) { } function validateLineName(subwayLines, lineName, upLine, downLine, addLineInput) { - if (inputLineValidator(lineName)) { + if (inputNameValidator(VALIDATION_TYPE, lineName)) { saveLine(subwayLines, lineName, upLine, downLine); saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(subwayLines)); clearInput(addLineInput); diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js index 77eefbdd5..590ea85f2 100644 --- a/src/components/station-manage-container.js +++ b/src/components/station-manage-container.js @@ -1,10 +1,12 @@ import Station from "../domain/station.js"; -import inputStationValidator from "../utils/inputs/validator/station-name-validator.js"; +import inputNameValidator from "../utils/inputs/validator/name-validator.js"; import clearInput from "../utils/inputs/clear-input.js"; import { saveToLocalStorage } from "../index.js"; import { showNewRow } from "../utils/display/make-elements.js"; import { STATION_ARRAY_KEY, STATION_TAGS } from "../global/constant.js"; +const VALIDATION_TYPE = "STATION"; + function loadStations(state) { for (const station of state.stationArray) { showNewRow(STATION_TAGS.STATION_TBODY_ID, station, [station.stationName]); @@ -38,7 +40,7 @@ export default function stationManageContainer(state) { addStationBtn.addEventListener("click", () => { const stationNameInputValue = stationNameInput.value.trim(); - if (inputStationValidator(stationNameInputValue)) { + if (inputNameValidator(VALIDATION_TYPE, stationNameInputValue)) { makeNewStation(state.stationArray, stationNameInputValue); clearInput(stationNameInput); } else { diff --git a/src/utils/inputs/validator/line-name-validator.js b/src/utils/inputs/validator/line-name-validator.js deleted file mode 100644 index 004fa83dd..000000000 --- a/src/utils/inputs/validator/line-name-validator.js +++ /dev/null @@ -1,39 +0,0 @@ -import { LINE_ALERT_MESSAGES } from "../../../global/messages.js"; -import { state } from "../../../index.js"; - -const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; -const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; -const checkMultipleSpaces = /\s{2,}/; -const STATION_INPUT_MINIMUM_LENGTH = 1; - -export function isDuplicatedLineName(lineName) { - let isDuplicated = false; - - for (const line of state.subwayLines) { - if (line.lineName === lineName) { - isDuplicated = true; - } - } - - return isDuplicated; -} - -export default function inputLineValidator(lineNameInputValue) { - let isValid = false; - - if (isDuplicatedLineName(lineNameInputValue)) { - alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_DUPLICATED); - } else if (lineNameInputValue.length < STATION_INPUT_MINIMUM_LENGTH) { - alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_LENGTH_UNDER); - } else if (checkSpecialCharacter.test(lineNameInputValue)) { - alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_SPECIAL_CHARACTER); - } else if (checkInvalidKorean.test(lineNameInputValue)) { - alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_NOT_COMPLETE); - } else if (checkMultipleSpaces.test(lineNameInputValue)) { - alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_MULTIPLE_SPACES); - } else { - isValid = true; - } - - return isValid; -} diff --git a/src/utils/inputs/validator/name-validator.js b/src/utils/inputs/validator/name-validator.js new file mode 100644 index 000000000..bb144a71b --- /dev/null +++ b/src/utils/inputs/validator/name-validator.js @@ -0,0 +1,72 @@ +import { STATION_ALERT_MESSAGES, LINE_ALERT_MESSAGES } from "../../../global/messages.js"; +import { state } from "../../../index.js"; + +const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; +const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; +const checkMultipleSpaces = /\s{2,}/; +const STATION_INPUT_MINIMUM_LENGTH = 2; +const LINE_INPUT_MINIMUM_LENGTH = 1; + +function isDuplicatedName(array, name) { + let isDuplicated = false; + + for (const object of array) { + if (object.type === "STATION" && object.stationName === name) { + isDuplicated = true; + } + if (object.type === "LINE" && object.lineName === name) { + isDuplicated = true; + } + } + + return isDuplicated; +} + +function isValidStationName(value) { + let isValid = false; + + if (isDuplicatedName(state.stationArray, value)) { + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_DUPLICATED); + } else if (value.length < STATION_INPUT_MINIMUM_LENGTH) { + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_LENGTH_UNDER); + } else if (checkSpecialCharacter.test(value)) { + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_SPECIAL_CHARACTER); + } else if (checkInvalidKorean.test(value)) { + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_NOT_COMPLETE); + } else if (checkMultipleSpaces.test(value)) { + alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_MULTIPLE_SPACES); + } else { + isValid = true; + } + + return isValid; +} + +function isValidLineName(value) { + let isValid = false; + + if (isDuplicatedName(state.subwayLines, value)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_DUPLICATED); + } else if (value.length < LINE_INPUT_MINIMUM_LENGTH) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_LENGTH_UNDER); + } else if (checkSpecialCharacter.test(value)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_SPECIAL_CHARACTER); + } else if (checkInvalidKorean.test(value)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_NOT_COMPLETE); + } else if (checkMultipleSpaces.test(value)) { + alert(LINE_ALERT_MESSAGES.ERROR_LINE_INPUT_MULTIPLE_SPACES); + } else { + isValid = true; + } + + return isValid; +} + +export default function inputNameValidator(type, value) { + if (type === "STATION") { + return isValidStationName(value); + } + if (type === "LINE") { + return isValidLineName(value); + } +} diff --git a/src/utils/inputs/validator/section-input-validator.js b/src/utils/inputs/validator/section-input-validator.js index 68e798c34..354c74500 100644 --- a/src/utils/inputs/validator/section-input-validator.js +++ b/src/utils/inputs/validator/section-input-validator.js @@ -1,17 +1,13 @@ import { SECTION_ALERT_MESSAGES } from "../../../global/messages.js"; const checkNumber = /^\d+$/; -// const checkZero = /^0\d{1,}$/ const checkFirstDigitZero = /^0{1,}/; -export function isDuplicatedStationInSection( - selectedStationName, - stationsInLine -) { +export function isDuplicatedStationInSection(selectedStation, stationsInLine) { let isDuplicated = false; for (const station of stationsInLine) { - if (station.stationName === selectedStationName) { + if (station.stationName === selectedStation) { isDuplicated = true; } } @@ -19,28 +15,22 @@ export function isDuplicatedStationInSection( return isDuplicated; } -export function checkStationInputZero(sectionInputValue) { - let deleteZeroInValue = sectionInputValue - .trim() - .replace(checkFirstDigitZero, ""); +export function checkStationInputZero(inputValue) { + let deleteZeroInValue = inputValue.trim().replace(checkFirstDigitZero, ""); + if (deleteZeroInValue === "") { deleteZeroInValue = "0"; } + return deleteZeroInValue; } -export default function sectionInputValidator( - sectionInputValue, - selectedStationName, - stationsInLine -) { +export default function sectionInputValidator(inputValue, selectedStation, stationsInLine) { let isValid = false; - if (!checkNumber.test(sectionInputValue)) { + if (!checkNumber.test(inputValue)) { alert(SECTION_ALERT_MESSAGES.ERROR_SECTION_INPUT_NUMBER); - } else if ( - isDuplicatedStationInSection(selectedStationName, stationsInLine) - ) { + } else if (isDuplicatedStationInSection(selectedStation, stationsInLine)) { alert(SECTION_ALERT_MESSAGES.ERROR_SECTION_INPUT_DUPLICATED); } else { isValid = true; diff --git a/src/utils/inputs/validator/station-name-validator.js b/src/utils/inputs/validator/station-name-validator.js deleted file mode 100644 index da99df22c..000000000 --- a/src/utils/inputs/validator/station-name-validator.js +++ /dev/null @@ -1,39 +0,0 @@ -import { STATION_ALERT_MESSAGES } from "../../../global/messages.js"; -import { state } from "../../../index.js"; - -const checkSpecialCharacter = /[\{\}\[\]\/?.,;:|\)*~`!^\-_+₩\<\>@\#$%&\\\=\(\'\"]/; -const checkInvalidKorean = /[|ㄱ-ㅎ|ㅏ-ㅣ]/; -const checkMultipleSpaces = /\s{2,}/; -const STATION_INPUT_MINIMUM_LENGTH = 2; - -export function isDuplicatedStationName(stationName) { - let isDuplicated = false; - - for (const station of state.stationArray) { - if (station.stationName === stationName) { - isDuplicated = true; - } - } - - return isDuplicated; -} - -export default function inputStationValidator(stationNameInputValue) { - let isValid = false; - - if (isDuplicatedStationName(stationNameInputValue)) { - alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_DUPLICATED); - } else if (stationNameInputValue.length < STATION_INPUT_MINIMUM_LENGTH) { - alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_LENGTH_UNDER); - } else if (checkSpecialCharacter.test(stationNameInputValue)) { - alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_SPECIAL_CHARACTER); - } else if (checkInvalidKorean.test(stationNameInputValue)) { - alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_NOT_COMPLETE); - } else if (checkMultipleSpaces.test(stationNameInputValue)) { - alert(STATION_ALERT_MESSAGES.ERROR_STATION_INPUT_MULTIPLE_SPACES); - } else { - isValid = true; - } - - return isValid; -} From 55d8989966be1bbbd6ba987cedf3d3cf2e06968f Mon Sep 17 00:00:00 2001 From: minkyung Date: Tue, 15 Dec 2020 17:56:06 +0900 Subject: [PATCH 42/45] =?UTF-8?q?refactor:=20section-manage-container=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 아래 나열된 기능 분리 - indexOfNewElement - addSectionInput - makeSelectOptions - makeSectionManager - makeTdDeleteButton - makeTrWithDataset - makeOneRow - showTableItems --- src/components/section-manage-container.js | 246 +++++++----------- src/components/station-manage-container.js | 4 +- src/utils/display/make-elements.js | 10 +- .../validator/section-input-validator.js | 2 +- 4 files changed, 108 insertions(+), 154 deletions(-) diff --git a/src/components/section-manage-container.js b/src/components/section-manage-container.js index cc882003e..5392b8d63 100644 --- a/src/components/section-manage-container.js +++ b/src/components/section-manage-container.js @@ -1,50 +1,17 @@ import { state, saveToLocalStorage } from "../index.js"; -import { LINE_ARRAY_KEY } from "../global/constant.js"; +import { LINE_ARRAY_KEY, SECTION_TAGS } from "../global/constant.js"; +import { CONFIRM_MESSAGES } from "../global/messages.js"; +import { SECTION_HTML, makeSectionHtml } from "../global/innerHtml.js"; import { getStationByName } from "../utils/global-utils.js"; import { makeNewElementWithInnerHtml, - makeNewTdWithElement, + makeNewTdWithElement } from "../utils/display/make-elements.js"; import sectionInputValidator, { - checkStationInputZero, + checkZero } from "../utils/inputs/validator/section-input-validator.js"; -import clearInput from "../utils/inputs/clear-input.js"; -import { CONFIRM_MESSAGES } from "../global/messages.js"; -const SECTION_TAGS = { - PARENT_SECTION_ID: "manage-sections", - LINE_MENU_BUTTON_CLASS: "section-line-menu-button", - STATION_SELECTOR_ID: "section-station-selector", - ORDER_INPUT_ID: "section-order-input", - ADD_BUTTON_ID: "section-add-button", - DELETE_BUTTON_CLASS: "section-delete-button", -}; - -function makeSectionHtml(lineName) { - return ` -
-

${lineName} 관리

-
구간 등록
-
`; -} - -const SECTION_HTML = { - SECTION_INPUT_HTML: ` - - - `, - SECTION_TABLE_HTML: ` - - - - - - - - - -
순서이름설정
`, -}; +import clearInput from "../utils/inputs/clear-input.js"; function removeAllChild(element) { while (element.firstChild) { @@ -56,12 +23,57 @@ function loadEditSectionLines() { const parentDiv = document.getElementById(SECTION_TAGS.PARENT_SECTION_ID); for (const line of state.subwayLines) { - const lineManageBtn = makeNewElementWithInnerHtml("button", line.lineName); - lineManageBtn.classList.add(SECTION_TAGS.LINE_MENU_BUTTON_CLASS); - lineManageBtn.dataset.id = `manage-${line.id}`; + const lineManageButton = makeNewElementWithInnerHtml("button", line.lineName); + lineManageButton.classList.add(SECTION_TAGS.LINE_MENU_BUTTON_CLASS); + lineManageButton.dataset.id = `manage-${line.id}`; + + parentDiv.append(lineManageButton); + } +} + +function indexOfNewElement(sectionInput, stationsInLine) { + if (sectionInput < stationsInLine.length) { + return sectionInput; + } + return stationsInLine.length; +} + +function addSectionInput(input, option, line, tableBody) { + const sectionInputValue = checkZero(input.value); + + if (sectionInputValidator(sectionInputValue, option.value, line.stations)) { + const newStation = getStationByName(option.value); + const newIndex = indexOfNewElement(sectionInputValue, line.stations); + const tr = makeOneRow(newStation, newIndex, line, tableBody); + line.stations.splice(parseInt(sectionInputValue), 0, newStation); + + updateAddedIndex(newIndex, tableBody.children); + tableBody.insertBefore(tr, tableBody.children[newIndex]); + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); + clearInput(input); + } else { + clearInput(input); + } +} + +function makeSelectOptions(stationArray) { + const selectWrapper = document.createElement("select"); + selectWrapper.id = SECTION_TAGS.STATION_SELECTOR_ID; - parentDiv.append(lineManageBtn); + for (const station of stationArray) { + const option = ``; + appendHtmlToParent(selectWrapper, option); } + return selectWrapper; +} + +function makeSectionManager(stationArray, wrapper, parent) { + const selectWrapper = makeSelectOptions(stationArray); + + appendHtmlToParent(wrapper, SECTION_HTML.SECTION_TABLE_HTML); + wrapper.append(selectWrapper); + appendHtmlToParent(wrapper, SECTION_HTML.SECTION_INPUT_HTML); + parent.append(wrapper); } export default function sectionManageContainer() { @@ -75,78 +87,17 @@ export default function sectionManageContainer() { manage.addEventListener("click", () => { removeAllChild(lineWrapperDiv); appendHtmlToParent(lineWrapperDiv, makeSectionHtml(line.lineName)); - - const selectWrapper = document.createElement("select"); - selectWrapper.id = SECTION_TAGS.STATION_SELECTOR_ID; - - for (const station of state.stationArray) { - const option = ``; - appendHtmlToParent(selectWrapper, option); - } - appendHtmlToParent(lineWrapperDiv, SECTION_HTML.SECTION_TABLE_HTML); - lineWrapperDiv.append(selectWrapper); - appendHtmlToParent(lineWrapperDiv, SECTION_HTML.SECTION_INPUT_HTML); - parentDiv.append(lineWrapperDiv); + makeSectionManager(state.stationArray, lineWrapperDiv, parentDiv); const table = document.getElementById("section-table"); const tableBody = document.getElementById("section-tbody"); + const selectedOption = document.getElementById(SECTION_TAGS.STATION_SELECTOR_ID); const sectionInput = document.getElementById(SECTION_TAGS.ORDER_INPUT_ID); - const selectedOption = document.getElementById( - SECTION_TAGS.STATION_SELECTOR_ID - ); - const addSectionInputBtn = document.getElementById( - SECTION_TAGS.ADD_BUTTON_ID - ); - - addSectionInputBtn.addEventListener("click", () => { - const sectionInputValue = checkStationInputZero(sectionInput.value); - if ( - sectionInputValidator( - sectionInputValue, - selectedOption.value, - line.stations - ) - ) { - const tr = document.createElement("tr"); - const newStation = getStationByName(selectedOption.value); - tr.dataset.stationId = newStation.id; - - let indexOfNewElement = line.stations.length; - if (sectionInputValue < line.stations.length) { - indexOfNewElement = sectionInputValue; - } - - tr.dataset.trId = indexOfNewElement; - - const tdIndex = makeNewElementWithInnerHtml("td", indexOfNewElement); - const tdStationName = makeNewElementWithInnerHtml( - "td", - newStation.stationName - ); - line.stations.splice(parseInt(sectionInputValue), 0, newStation); - - const tdDeleteBtn = makeNewElementWithInnerHtml( - "button", - "노선에서 삭제" - ); - tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; - tdDeleteBtn.dataset.id = newStation.id; - - const tdDelete = makeNewTdWithElement(tdDeleteBtn); - - tdDeleteBtn.addEventListener("click", () => { - deleteStationFromLine(tr, line, tableBody); - }); - - updateAddedIndex(indexOfNewElement, tableBody.children); - tr.append(...[tdIndex, tdStationName, tdDelete]); - tableBody.insertBefore(tr, tableBody.children[indexOfNewElement]); - saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); - clearInput(sectionInput); - } else { - clearInput(sectionInput); - } + const addSectionInputButton = document.getElementById(SECTION_TAGS.ADD_BUTTON_ID); + + addSectionInputButton.addEventListener("click", () => { + addSectionInput(sectionInput, selectedOption, line, tableBody); }); showTableItems(line, tableBody); @@ -159,8 +110,7 @@ export default function sectionManageContainer() { // TODO - utils로 빼기 function appendHtmlToParent(parent, html) { - const htmlDOM = new DOMParser().parseFromString(html, "text/html").body - .childNodes; + const htmlDOM = new DOMParser().parseFromString(html, "text/html").body.childNodes; for (const node of htmlDOM) { parent.append(node); @@ -168,35 +118,26 @@ function appendHtmlToParent(parent, html) { } function updateDeletedIndex(currentIndex, trDatas) { - for ( - let index = parseInt(currentIndex.innerHTML); - index < trDatas.length; - index++ - ) { - trDatas[index].firstChild.innerHTML = - parseInt(trDatas[index].firstChild.innerHTML) - 1; + for (let index = parseInt(currentIndex.innerHTML); index < trDatas.length; index++) { + trDatas[index].firstChild.innerHTML = parseInt(trDatas[index].firstChild.innerHTML) - 1; } } function updateAddedIndex(currentIndex, trDatas) { for (let index = parseInt(currentIndex); index < trDatas.length; index++) { - trDatas[index].firstChild.innerHTML = - parseInt(trDatas[index].firstChild.innerHTML) + 1; + trDatas[index].firstChild.innerHTML = parseInt(trDatas[index].firstChild.innerHTML) + 1; } } -function deletedStationFromLine(currentStations, deleteBtn) { +function deletedStationFromLine(currentStations, deleteButton) { return currentStations.filter( - (station) => parseInt(deleteBtn.dataset.id) !== parseInt(station.id) + station => parseInt(deleteButton.dataset.id) !== parseInt(station.id) ); } function deleteStationFromLine(tr, line, tableBody) { if (confirm(CONFIRM_MESSAGES.CONFIRM_DELETE)) { - line.stations = deletedStationFromLine( - line.stations, - tr.childNodes[2].firstChild - ); + line.stations = deletedStationFromLine(line.stations, tr.childNodes[2].firstChild); tr.remove(); updateDeletedIndex(tr.childNodes[0], tableBody.children); @@ -204,27 +145,40 @@ function deleteStationFromLine(tr, line, tableBody) { saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(state.subwayLines)); } +function makeTdDeleteButton(station, tr, line, tableBody) { + const tdDeleteButton = makeNewElementWithInnerHtml("button", "노선에서 삭제"); + tdDeleteButton.class = SECTION_TAGS.DELETE_BUTTON_CLASS; + tdDeleteButton.dataset.id = station.id; + + tdDeleteButton.addEventListener("click", () => { + deleteStationFromLine(tr, line, tableBody); + }); + + return tdDeleteButton; +} + +function makeTrWithDataset(station, index) { + const tr = document.createElement("tr"); + tr.dataset.stationId = station.id; + tr.dataset.trId = index; + + return tr; +} + +function makeOneRow(station, index, line, tableBody) { + const tr = makeTrWithDataset(station, index); + const tdIndex = makeNewElementWithInnerHtml("td", index); + const tdStationName = makeNewElementWithInnerHtml("td", station.stationName); + const tdDeleteButton = makeTdDeleteButton(station, tr, line, tableBody); + const tdDelete = makeNewTdWithElement(tdDeleteButton); + tr.append(...[tdIndex, tdStationName, tdDelete]); + + return tr; +} + function showTableItems(line, tableBody) { for (const [index, station] of Object.entries(line.stations)) { - const tr = document.createElement("tr"); - tr.dataset.stationId = station.id; - tr.dataset.trId = index; - const tdIndex = makeNewElementWithInnerHtml("td", index); - const tdStationName = makeNewElementWithInnerHtml( - "td", - station.stationName - ); - - const tdDeleteBtn = makeNewElementWithInnerHtml("button", "노선에서 삭제"); - tdDeleteBtn.class = SECTION_TAGS.DELETE_BUTTON_CLASS; - tdDeleteBtn.dataset.id = station.id; - const tdDelete = makeNewTdWithElement(tdDeleteBtn); - - tr.append(...[tdIndex, tdStationName, tdDelete]); + const tr = makeOneRow(station, index, line, tableBody); tableBody.append(tr); - - tdDeleteBtn.addEventListener("click", () => { - deleteStationFromLine(tr, line, tableBody); - }); } } diff --git a/src/components/station-manage-container.js b/src/components/station-manage-container.js index 590ea85f2..6a90aaabc 100644 --- a/src/components/station-manage-container.js +++ b/src/components/station-manage-container.js @@ -33,11 +33,11 @@ function makeNewStation(stationArray, stationNameInputValue) { } export default function stationManageContainer(state) { - const addStationBtn = document.getElementById(STATION_TAGS.ADD_BUTTON_ID); + const addStationButton = document.getElementById(STATION_TAGS.ADD_BUTTON_ID); const stationNameInput = document.getElementById(STATION_TAGS.STATION_NAME_INPUT_ID); loadStations(state); - addStationBtn.addEventListener("click", () => { + addStationButton.addEventListener("click", () => { const stationNameInputValue = stationNameInput.value.trim(); if (inputNameValidator(VALIDATION_TYPE, stationNameInputValue)) { diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index e7ffb220a..73a86d380 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -61,24 +61,24 @@ function makeTdDeleteButton(station, tr) { return td; } -function makeOneRowWithDeleteBtn(object, [...args]) { +function makeOneRowWithDeleteButton(object, [...args]) { const tr = document.createElement("tr"); - const deleteBtn = makeTdDeleteButton(object, tr); + const deleteButton = makeTdDeleteButton(object, tr); for (const arg of [...args]) { tr.appendChild(makeNewTdWithElement(arg)); tr.id = object.id; } - tr.appendChild(deleteBtn); + tr.appendChild(deleteButton); return tr; } export function showNewRow(parentID, rowToShow, [...args]) { - const oneRowWithDeleteBtn = makeOneRowWithDeleteBtn(rowToShow, [...args]); + const oneRowWithDeleteButton = makeOneRowWithDeleteButton(rowToShow, [...args]); const locationOfRow = document.getElementById(parentID); - return locationOfRow.appendChild(oneRowWithDeleteBtn); + return locationOfRow.appendChild(oneRowWithDeleteButton); } export function makeSelectOptions(selectBox, optionToMakeArray) { diff --git a/src/utils/inputs/validator/section-input-validator.js b/src/utils/inputs/validator/section-input-validator.js index 354c74500..b6e4bade9 100644 --- a/src/utils/inputs/validator/section-input-validator.js +++ b/src/utils/inputs/validator/section-input-validator.js @@ -15,7 +15,7 @@ export function isDuplicatedStationInSection(selectedStation, stationsInLine) { return isDuplicated; } -export function checkStationInputZero(inputValue) { +export function checkZero(inputValue) { let deleteZeroInValue = inputValue.trim().replace(checkFirstDigitZero, ""); if (deleteZeroInValue === "") { From 60d63dd3cea913de1099df1e5417d4be0db6dbb7 Mon Sep 17 00:00:00 2001 From: ddongule Date: Tue, 15 Dec 2020 19:22:25 +0900 Subject: [PATCH 43/45] =?UTF-8?q?chore(css):=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20css=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 1 - src/css/index.css | 6 ------ 2 files changed, 7 deletions(-) delete mode 100644 src/css/index.css diff --git a/index.html b/index.html index 2c1a08bc8..7ce6a0b1e 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,6 @@ 지하철 노선도 관리 -
diff --git a/src/css/index.css b/src/css/index.css deleted file mode 100644 index 1e04bf8ab..000000000 --- a/src/css/index.css +++ /dev/null @@ -1,6 +0,0 @@ -/* #manage-station, -#manage-lines, -#manage-sections, -#manage-map-print { - display: none; -} */ From 4f9e2d671ccfb626f2e8187ac07b21995a46354c Mon Sep 17 00:00:00 2001 From: ddongule Date: Tue, 15 Dec 2020 19:27:28 +0900 Subject: [PATCH 44/45] =?UTF-8?q?fix:=20=EC=A7=80=ED=95=98=EC=B2=A0=20?= =?UTF-8?q?=EB=85=B8=EC=84=A0=20=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/display/make-elements.js | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/utils/display/make-elements.js b/src/utils/display/make-elements.js index 73a86d380..d665f3d83 100644 --- a/src/utils/display/make-elements.js +++ b/src/utils/display/make-elements.js @@ -1,6 +1,9 @@ import { state, saveToLocalStorage } from "../../index.js"; -import { STATION_ARRAY_KEY } from "../../global/constant.js"; -import { CONFIRM_MESSAGES, LINE_ALERT_MESSAGES } from "../../global/messages.js"; +import { LINE_ARRAY_KEY, STATION_ARRAY_KEY } from "../../global/constant.js"; +import { + CONFIRM_MESSAGES, + LINE_ALERT_MESSAGES, +} from "../../global/messages.js"; function confirmDelete(array, station, tr) { const confirmDelete = confirm(CONFIRM_MESSAGES.CONFIRM_DELETE); @@ -11,20 +14,23 @@ function confirmDelete(array, station, tr) { } function deleteObject(object, stationToDelete, tr) { - const deleteStation = object.filter(station => station.id !== stationToDelete.id); + const deleteStation = object.filter( + (station) => station.id !== stationToDelete.id + ); tr.remove(); if (stationToDelete.type === "LINE") { state.subwayLines = deleteStation; + saveToLocalStorage(LINE_ARRAY_KEY, JSON.stringify(deleteStation)); } else if (stationToDelete.type === "STATION") { state.stationArray = deleteStation; + saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(deleteStation)); } - saveToLocalStorage(STATION_ARRAY_KEY, JSON.stringify(deleteStation)); } function isContainedInLine(station) { - const isContained = state.subwayLines.filter(line => { + const isContained = state.subwayLines.filter((line) => { let contain = false; - line.stations.filter(stations => { + line.stations.filter((stations) => { if (stations.stationName === station.stationName) { contain = true; } @@ -46,8 +52,10 @@ function alertContainedStationInLine(station, tr) { function makeTdDeleteButton(station, tr) { const td = document.createElement("td"); const deleteButtonHtml = ``; - const deleteButton = new DOMParser().parseFromString(deleteButtonHtml, "text/html").childNodes[0] - .lastElementChild.firstElementChild; + const deleteButton = new DOMParser().parseFromString( + deleteButtonHtml, + "text/html" + ).childNodes[0].lastElementChild.firstElementChild; deleteButton.addEventListener("click", () => { if (station.type === "LINE") { @@ -75,7 +83,9 @@ function makeOneRowWithDeleteButton(object, [...args]) { } export function showNewRow(parentID, rowToShow, [...args]) { - const oneRowWithDeleteButton = makeOneRowWithDeleteButton(rowToShow, [...args]); + const oneRowWithDeleteButton = makeOneRowWithDeleteButton(rowToShow, [ + ...args, + ]); const locationOfRow = document.getElementById(parentID); return locationOfRow.appendChild(oneRowWithDeleteButton); From 17c2ab210ed45ea3fe0481bcb168ecc0d73f5594 Mon Sep 17 00:00:00 2001 From: ddongule Date: Tue, 15 Dec 2020 23:07:55 +0900 Subject: [PATCH 45/45] =?UTF-8?q?docs:=20README=EC=97=90=20=EC=A7=80?= =?UTF-8?q?=ED=95=98=EC=B2=A0=20=EB=85=B8=EC=84=A0=EB=8F=84=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98(3=EC=A3=BC=EC=B0=A8)=20=ED=9A=8C=EA=B3=A0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 28acf11b7..51ba8acb2 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ - 유저가 공백으로 시작하거나 끝나는 노선 이름을 입력했을 때 - 유저가 연속적인 공백이 들어간 노선 이름을 입력했을 때 - 유저가 특수문자가 포함된 노선 이름을 입력했을 때 + - 유저가 상행 종점역과 하행 종점역을 같게 입력했을 때 - 저장된 노선 목록을 보여주는 기능 - 저장된 노선 목록에서 노선을 삭제할 수 있는 기능 @@ -81,6 +82,18 @@ - 노선 별 저장된 역들을 순서대로 모두 출력하는 기능 +## ✔️ 지하철 노선도 미션 회고 (2020.12.09 ~ 2020.12.15) + +이번 미션도 저번 주 자동차 경주 게임 미션과 마찬가지로 **기능에 따라 모듈을 분리하고, 분리한 모듈을 찾기 쉽게 구조화**하는 데 집중했다. 어떻게 모듈을 분리해야 1개의 모듈에서 1개의 역할만을 하게 만들지 고민했다. 그리고 **data속성을 활용해 유일한 데이터 값들을 관리**할 수 있게 만드는 데 집중했다. 주어진 요구사항을 숙지하고, 매 코드에 적용할 수 있도록 노력했다. + +### 모듈 분리, 구조화 + +1개의 함수가 1개의 기능을 구현할 수 있게 구현하려고 노력했다. 생각보다 다양하고 많은 기능에 조금 헤맨 감이 없지 않아 있지만, 코드의 반복을 줄이고 재사용 할 수 있는 코드를 만들어 모듈을 분리할 수 있는 데 힘썼다. 비록 이번에 구현한 코드에 완벽히 만족하지는 않지만, 앞으로 더 많은 연습을 통해 스스로 만족할 수 있는 코드를 만들어나가고 싶다. + +### 읽기 좋은 코드란 무엇일까? + +이번 주 미션은 생각보다 구현하는 데 시간이 많이 들었다. 예외 상황도 생각하지 못한 곳에서 튀어나왔고, 코드가 길어지면 안된다는 생각에 무작정 모듈화 해 떼낸 적도 있었다. 숫자 야구 게임, 자동차 경주 게임에서는 보다 손쉽게 기능을 구현하고 생각하는대로 메소드 분리도 잘 되었는데, 이번 미션에서는 나름대로(?) 체계적으로 가닥을 잡고 들어갔다고 생각했지만 마음처럼 잘 만들어지지 않은 것 같아 아쉬움이 크다. 프로젝트가 커짐에 따라 쓰이는 변수 명이나 함수 명도 헷갈리기 쉬워 더 명확하고 와닿을 수 있게 만들 수 있도록 고민과 연습을 거듭해야겠다고 생각했다. 기능을 구현하고 나서, 리팩토링하며 내가 구현한 코드의 부족한 점에 대해 여실히 깨달았고, 보다 읽기 쉽고 누구나 쉽게 접근할 수 있는 코드를 만들기 위해 노력할 것이다. + --- ## 기능 요구사항