From 6afed402316e031a9e112d8cbbaa41a90a2cd1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Wed, 9 Dec 2020 18:08:48 +0900 Subject: [PATCH 01/82] =?UTF-8?q?docs:=20./docs/README.md=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..e69de29bb From cfb9c8a5bb72b03a17b1431ab61d2a16810f94e0 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Wed, 9 Dec 2020 18:15:29 +0900 Subject: [PATCH 02/82] =?UTF-8?q?docs:=20./docs/README.md=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=95=98=EB=8A=94=20=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index e97a1d649..0d9fa37df 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # ๐Ÿš‡ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜ +[/docs/README.md๋กœ ์ด๋™ํ•˜๊ธฐ](./docs/README.md) + ## ๐Ÿš€ ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ### ์ง€ํ•˜์ฒ  ์—ญ ๊ด€๋ จ ๊ธฐ๋Šฅ From cfa2949bb2a025de1cd3831f75ab65c16a9ca7a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Wed, 9 Dec 2020 18:42:22 +0900 Subject: [PATCH 03/82] =?UTF-8?q?chore:=20eslint=20=EB=B0=8F=20prettier=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 949 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 29 ++ 2 files changed, 978 insertions(+) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..7852da13d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,949 @@ +{ + "name": "javascript-subway-map-precourse", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@eslint/eslintrc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.15.0.tgz", + "integrity": "sha512-Vr64xFDT8w30wFll643e7cGrIkPEU50yIiI36OdSIDoSGguIeaLzBo0vpGvzo9RECUqq7htURfwEtKqwytkqzA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.2", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^6.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true + }, + "eslint-config-prettier": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.0.0.tgz", + "integrity": "sha512-8Y8lGLVPPZdaNA7JXqnvETVC7IiVRgAP6afQu9gOQRn90YY3otMNh+x7Vr2vMePQntF+5erdSUBqSzCmU/AxaQ==", + "dev": true + }, + "eslint-plugin-prettier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.2.0.tgz", + "integrity": "sha512-kOUSJnFjAUFKwVxuzy6sA5yyMx6+o9ino4gCdShzBNx4eyFRudWRYKCFolKjoM40PEiuU6Cn7wBLfq3WsGg7qg==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esquery": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "file-entry-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.0.tgz", + "integrity": "sha512-fqoO76jZ3ZnYrXLDRxBR1YvOvc0k844kcOg40bgsPrE25LAb/PDqTY+ho64Xh2c8ZXgIKldchCFHczG2UVRcWA==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", + "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "requires": { + "type-fest": "^0.8.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "import-fresh": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", + "integrity": "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "uri-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "v8-compile-cache": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz", + "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..ea4dfb7c7 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "javascript-subway-map-precourse", + "version": "1.0.0", + "description": "- ์ง€ํ•˜์ฒ  ์—ญ์„ ๋“ฑ๋กํ•˜๊ณ  ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. (๋‹จ, ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค)\r - ์ค‘๋ณต๋œ ์ง€ํ•˜์ฒ  ์—ญ ์ด๋ฆ„์ด ๋“ฑ๋ก๋  ์ˆ˜ ์—†๋‹ค.\r - ์ง€ํ•˜์ฒ  ์—ญ์€ 2๊ธ€์ž ์ด์ƒ์ด์–ด์•ผ ํ•œ๋‹ค.\r - ์ง€ํ•˜์ฒ  ์—ญ์˜ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.", + "main": "index.js", + "directories": { + "doc": "docs" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/0307kwon/javascript-subway-map-precourse.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/0307kwon/javascript-subway-map-precourse/issues" + }, + "homepage": "https://github.com/0307kwon/javascript-subway-map-precourse#readme", + "devDependencies": { + "eslint": "^7.15.0", + "eslint-config-google": "^0.14.0", + "eslint-config-prettier": "^7.0.0", + "eslint-plugin-prettier": "^3.2.0", + "prettier": "^2.2.1" + } +} From 0a8641d393a54a99ccbe9dc7b1abece67dd124f6 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Thu, 10 Dec 2020 16:56:59 +0900 Subject: [PATCH 04/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=EA=B3=BC=20=EA=B3=A0?= =?UTF-8?q?=EB=AF=BC=ED=95=B4=EC=95=BC=ED=95=A0=20=EC=82=AC=ED=95=AD?= =?UTF-8?q?=EB=93=A4=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 --- docs/README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb..83a438100 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,22 @@ +# ๐Ÿš‡ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜ + +## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก +- ์›น ์‹คํ–‰ ์ดˆ๊ธฐ ์„ธํŒ…์„ ๋‹ด๋‹นํ•˜๋Š” index.js ์ƒ์„ฑ + +- HtmlUiManager.js: Html๊ณผ์˜ IO๋ฅผ ์ด๊ด„ + - NavigationBarUi.js: ์ƒ๋‹จ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๊ด€๋ฆฌ + - 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด HtmlUiManager.js์™€ ํ†ต์‹ , bodyUi๋ฅผ ์ˆ˜์ •ํ•จ + - ๋ณ€์ˆ˜ bodyUi: 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ Ui ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Œ + 1. ์—ญ๊ด€๋ฆฌ: ManageStationUi.js + 2. ๋…ธ์„ ๊ด€๋ฆฌ: ManageLineUi.js + 3. ๊ตฌ๊ฐ„๊ด€๋ฆฌ: ManageSectionUi.js + 4. ๋…ธ์„ ๋„ ์ถœ๋ ฅ: PrintLineInfoUi.js +- ์ง€ํ•˜์ฒ  ๋ชจ๋“  ์—ญ์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” AllStationInfoManager.js ์ƒ์„ฑ + - ํ˜ธ์„  ๋ณ„๋กœ ์ง€ํ•˜์ฒ  ์—ญ๋“ค์„ ๊ด€๋ฆฌ + - ํ•„์š”ํ•  ๋•Œ bodyUi์™€ ํ†ต์‹ ํ•˜๋ฉฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ + +## ๐Ÿ˜ต ๊ณ ๋ฏผํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค + +- ํ™”๋ฉด ์ „ํ™˜์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€ +- ํด๋ž˜์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด์•ผ ํ• ๊นŒ +- IO๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์ด๊ด„ํ•˜๋„๋ก ํ•  ๊ฒƒ์ธ๊ฐ€ ๋‚˜๋ˆŒ ๊ฒƒ์ธ๊ฐ€ From ede1eaecf79e12c1cb3d354d968c9fbb2b24cb14 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Thu, 10 Dec 2020 17:03:44 +0900 Subject: [PATCH 05/82] =?UTF-8?q?docs:=20=EB=AC=B8=EC=84=9C=EC=9D=98=20?= =?UTF-8?q?=EC=9E=98=EB=AA=BB=EB=90=9C=20=ED=91=9C=EA=B8=B0=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit js ํŒŒ์ผ ์ด๋ฆ„๋“ค์˜ ์ฒซ๋ฌธ์ž๋ฅผ ์†Œ๋ฌธ์ž๋กœ ์ˆ˜์ •ํ•จ --- docs/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/README.md b/docs/README.md index 83a438100..5ead7a18f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,15 +3,15 @@ ## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก - ์›น ์‹คํ–‰ ์ดˆ๊ธฐ ์„ธํŒ…์„ ๋‹ด๋‹นํ•˜๋Š” index.js ์ƒ์„ฑ -- HtmlUiManager.js: Html๊ณผ์˜ IO๋ฅผ ์ด๊ด„ - - NavigationBarUi.js: ์ƒ๋‹จ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๊ด€๋ฆฌ - - 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด HtmlUiManager.js์™€ ํ†ต์‹ , bodyUi๋ฅผ ์ˆ˜์ •ํ•จ +- htmlUiManager.js: Html๊ณผ์˜ IO๋ฅผ ์ด๊ด„ + - navigationBarUi.js: ์ƒ๋‹จ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๊ด€๋ฆฌ + - 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด htmlUiManager.js์™€ ํ†ต์‹ , bodyUi๋ฅผ ์ˆ˜์ •ํ•จ - ๋ณ€์ˆ˜ bodyUi: 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ Ui ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Œ - 1. ์—ญ๊ด€๋ฆฌ: ManageStationUi.js - 2. ๋…ธ์„ ๊ด€๋ฆฌ: ManageLineUi.js - 3. ๊ตฌ๊ฐ„๊ด€๋ฆฌ: ManageSectionUi.js - 4. ๋…ธ์„ ๋„ ์ถœ๋ ฅ: PrintLineInfoUi.js -- ์ง€ํ•˜์ฒ  ๋ชจ๋“  ์—ญ์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” AllStationInfoManager.js ์ƒ์„ฑ + 1. ์—ญ๊ด€๋ฆฌ: manageStationUi.js + 2. ๋…ธ์„ ๊ด€๋ฆฌ: manageLineUi.js + 3. ๊ตฌ๊ฐ„๊ด€๋ฆฌ: manageSectionUi.js + 4. ๋…ธ์„ ๋„ ์ถœ๋ ฅ: printLineInfoUi.js +- ์ง€ํ•˜์ฒ  ๋ชจ๋“  ์—ญ์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” allStationInfoManager.js ์ƒ์„ฑ - ํ˜ธ์„  ๋ณ„๋กœ ์ง€ํ•˜์ฒ  ์—ญ๋“ค์„ ๊ด€๋ฆฌ - ํ•„์š”ํ•  ๋•Œ bodyUi์™€ ํ†ต์‹ ํ•˜๋ฉฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ From 60862c2536a03a66b955c7ef119ce4871d68525d Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Thu, 10 Dec 2020 17:34:59 +0900 Subject: [PATCH 06/82] =?UTF-8?q?docs:=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=93=B1=20=EA=B0=80=EB=B3=80=EC=A0=81?= =?UTF-8?q?=EC=9D=B8=20=EC=9A=94=EC=86=8C=EB=A5=BC=20=EB=B9=BC=EA=B3=A0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=ED=95=B4=EC=95=BC=ED=95=A0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=97=90=20=EC=A7=91=EC=A4=91=20=EC=84=9C=EC=88=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5ead7a18f..a05088520 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,19 +1,17 @@ # ๐Ÿš‡ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜ ## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก -- ์›น ์‹คํ–‰ ์ดˆ๊ธฐ ์„ธํŒ…์„ ๋‹ด๋‹นํ•˜๋Š” index.js ์ƒ์„ฑ -- htmlUiManager.js: Html๊ณผ์˜ IO๋ฅผ ์ด๊ด„ - - navigationBarUi.js: ์ƒ๋‹จ์˜ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐ”๋ฅผ ๊ด€๋ฆฌ - - 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด htmlUiManager.js์™€ ํ†ต์‹ , bodyUi๋ฅผ ์ˆ˜์ •ํ•จ - - ๋ณ€์ˆ˜ bodyUi: 4๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ Ui ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์Œ - 1. ์—ญ๊ด€๋ฆฌ: manageStationUi.js - 2. ๋…ธ์„ ๊ด€๋ฆฌ: manageLineUi.js - 3. ๊ตฌ๊ฐ„๊ด€๋ฆฌ: manageSectionUi.js - 4. ๋…ธ์„ ๋„ ์ถœ๋ ฅ: printLineInfoUi.js -- ์ง€ํ•˜์ฒ  ๋ชจ๋“  ์—ญ์˜ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” allStationInfoManager.js ์ƒ์„ฑ - - ํ˜ธ์„  ๋ณ„๋กœ ์ง€ํ•˜์ฒ  ์—ญ๋“ค์„ ๊ด€๋ฆฌ - - ํ•„์š”ํ•  ๋•Œ bodyUi์™€ ํ†ต์‹ ํ•˜๋ฉฐ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ค„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ +- 4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ Navigation ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ  ํŽ˜์ด์ง€ ์ „ํ™˜ ํ™•์ธํ•˜๊ธฐ +- ์—ญ ๊ด€๋ฆฌ, ๋…ธ์„  ๊ด€๋ฆฌ, ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ๋…ธ์„ ๋„ ์ถœ๋ ฅ html string ์ž‘์„ฑ +- ์—ญ ๊ด€๋ฆฌ, ์—ญ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ์—ญ ๊ด€๋ฆฌ, ์—ญ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๋…ธ์„  ๊ด€๋ฆฌ, ๋…ธ์„  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๋…ธ์„  ๊ด€๋ฆฌ, ๋…ธ์„  ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ์ˆ˜์ • ๊ตฌ๊ฐ„ ์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ๊ตฌ๊ฐ„ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ๋…ธ์„  ์ œ๊ฑฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ## ๐Ÿ˜ต ๊ณ ๋ฏผํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค From 4b670bf3285be7523ff913220535deb40de96d27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 13:51:18 +0900 Subject: [PATCH 07/82] =?UTF-8?q?feat:=204=EA=B0=80=EC=A7=80=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EB=A5=BC=20=EC=A0=84=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EB=89=B4=20=EB=B2=84=ED=8A=BC=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 --- index.html | 5 +++ src/html-manager.js | 41 +++++++++++++++++ src/index.js | 7 +++ src/station-info-manager.js | 0 src/ui/contents-ui/line-manager-ui.js | 14 ++++++ src/ui/contents-ui/map-print-manager-ui.js | 14 ++++++ src/ui/contents-ui/section-manager-ui.js | 14 ++++++ src/ui/contents-ui/station-manager-ui.js | 14 ++++++ src/ui/menubar-ui.js | 52 ++++++++++++++++++++++ 9 files changed, 161 insertions(+) create mode 100644 src/html-manager.js create mode 100644 src/station-info-manager.js create mode 100644 src/ui/contents-ui/line-manager-ui.js create mode 100644 src/ui/contents-ui/map-print-manager-ui.js create mode 100644 src/ui/contents-ui/section-manager-ui.js create mode 100644 src/ui/contents-ui/station-manager-ui.js create mode 100644 src/ui/menubar-ui.js diff --git a/index.html b/index.html index fc99deac2..84953915d 100644 --- a/index.html +++ b/index.html @@ -7,6 +7,11 @@

๐Ÿš‡ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๊ด€๋ฆฌ

+ +

+
+
diff --git a/src/html-manager.js b/src/html-manager.js new file mode 100644 index 000000000..2d8b869d2 --- /dev/null +++ b/src/html-manager.js @@ -0,0 +1,41 @@ +import MenubarUI from "./ui/menubar-ui.js"; +import StationManagerUI from "./ui/contents-ui/station-manager-ui.js"; +import SectionManagerUI from "./ui/contents-ui/section-manager-ui.js"; +import LineManagerUI from "./ui/contents-ui/line-manager-ui.js"; +import MapPrintManagerUI from "./ui/contents-ui/map-print-manager-ui.js"; + +export default class HTMLManager { + constructor({ htmlOfBody }) { + this.htmlOfBody = htmlOfBody; + + this.menubarUI_ = new MenubarUI({ + htmlManager: this, + menubarContainer: htmlOfBody.querySelector("#" + MENUBAR_ID), + }); + this.setContentsUIOnStationUI(); + } + + setContentsUIOnStationUI() { + this.contentsUI_ = new StationManagerUI({ + contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + }); + } + setContentsUIOnSectionUI() { + this.contentsUI_ = new SectionManagerUI({ + contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + }); + } + setContentsUIOnLineUI() { + this.contentsUI_ = new LineManagerUI({ + contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + }); + } + setContentsUIOnMapPrintUI() { + this.contentsUI_ = new MapPrintManagerUI({ + contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + }); + } +} + +const MENUBAR_ID = "menubar"; +const CONTENTS_ID = "contents"; diff --git a/src/index.js b/src/index.js index e69de29bb..a6f5b49c6 100644 --- a/src/index.js +++ b/src/index.js @@ -0,0 +1,7 @@ +import HTMLManager from "./html-manager.js"; + +const BODY_ID = "app"; + +new HTMLManager({ + htmlOfBody: document.querySelector("#" + BODY_ID), +}); diff --git a/src/station-info-manager.js b/src/station-info-manager.js new file mode 100644 index 000000000..e69de29bb diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js new file mode 100644 index 000000000..d04ef5633 --- /dev/null +++ b/src/ui/contents-ui/line-manager-ui.js @@ -0,0 +1,14 @@ +export default class LineManagerUI { + constructor({ contentsContainer }) { + this.contentsContainer_ = contentsContainer; + this.setHTML(); + } + + setHTML() { + this.contentsContainer_.innerHTML = TEMPLATE; + } +} + +const TEMPLATE = ` +line Template ์ž…๋‹ˆ๋‹ค. +`; diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js new file mode 100644 index 000000000..c1ad4f4ff --- /dev/null +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -0,0 +1,14 @@ +export default class MapPrintManager { + constructor({ contentsContainer }) { + this.contentsContainer_ = contentsContainer; + this.setHTML(); + } + + setHTML() { + this.contentsContainer_.innerHTML = TEMPLATE; + } +} + +const TEMPLATE = ` +mapPrintManager Template ์ž…๋‹ˆ๋‹ค. +`; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js new file mode 100644 index 000000000..94031ed76 --- /dev/null +++ b/src/ui/contents-ui/section-manager-ui.js @@ -0,0 +1,14 @@ +export default class SectionManagerUI { + constructor({ contentsContainer }) { + this.contentsContainer_ = contentsContainer; + this.setHTML(); + } + + setHTML() { + this.contentsContainer_.innerHTML = TEMPLATE; + } +} + +const TEMPLATE = ` +section Template ์ž…๋‹ˆ๋‹ค. +`; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js new file mode 100644 index 000000000..c54a6f7dc --- /dev/null +++ b/src/ui/contents-ui/station-manager-ui.js @@ -0,0 +1,14 @@ +export default class StationManagerUI { + constructor({ contentsContainer }) { + this.contentsContainer_ = contentsContainer; + this.setHTML(); + } + + setHTML() { + this.contentsContainer_.innerHTML = TEMPLATE; + } +} + +const TEMPLATE = ` +station Template ์ž…๋‹ˆ๋‹ค. +`; diff --git a/src/ui/menubar-ui.js b/src/ui/menubar-ui.js new file mode 100644 index 000000000..88b286483 --- /dev/null +++ b/src/ui/menubar-ui.js @@ -0,0 +1,52 @@ +export default class MenubarUI { + constructor({ htmlManager, menubarContainer }) { + this.htmlManager_ = htmlManager; + this.menubarContainer_ = menubarContainer; + this.setMenubar(); + } + + setMenubar() { + this.menubarContainer_.innerHTML = MENU_TEMPLATE; + this.addEventToStationButton_(); + this.addEventToLineButton_(); + this.addEventToSectionButton_(); + this.addEventToMapPrintButton_(); + } + + addEventToStationButton_() { + const button_ = this.menubarContainer_.querySelector("#" + STATION_ID); + button_.addEventListener("click", () => { + this.htmlManager_.setContentsUIOnStationUI(); + }); + } + addEventToLineButton_() { + const button_ = this.menubarContainer_.querySelector("#" + LINE_ID); + button_.addEventListener("click", () => { + this.htmlManager_.setContentsUIOnSectionUI(); + }); + } + addEventToSectionButton_() { + const button_ = this.menubarContainer_.querySelector("#" + SECTION_ID); + button_.addEventListener("click", () => { + this.htmlManager_.setContentsUIOnLineUI(); + }); + } + addEventToMapPrintButton_() { + const button_ = this.menubarContainer_.querySelector("#" + MAP_PRINT_ID); + button_.addEventListener("click", () => { + this.htmlManager_.setContentsUIOnMapPrintUI(); + }); + } +} + +const STATION_ID = "station-manager-button"; +const LINE_ID = "line-manager-button"; +const SECTION_ID = "section-manager-button"; +const MAP_PRINT_ID = "map-print-manager-button"; + +const MENU_TEMPLATE = ` + + + + +`; From e9dae10909d7211663e0fe7b472fdf9d14ace899 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 13:57:05 +0900 Subject: [PATCH 08/82] =?UTF-8?q?docs:=20=EA=B0=80=EB=8F=85=EC=84=B1=20?= =?UTF-8?q?=EC=A2=8B=EA=B2=8C=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 --- docs/README.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index a05088520..c07b54f0f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,16 +2,23 @@ ## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก -- 4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ Navigation ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ณ  ํŽ˜์ด์ง€ ์ „ํ™˜ ํ™•์ธํ•˜๊ธฐ -- ์—ญ ๊ด€๋ฆฌ, ๋…ธ์„  ๊ด€๋ฆฌ, ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ๋…ธ์„ ๋„ ์ถœ๋ ฅ html string ์ž‘์„ฑ -- ์—ญ ๊ด€๋ฆฌ, ์—ญ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ์—ญ ๊ด€๋ฆฌ, ์—ญ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ๋…ธ์„  ๊ด€๋ฆฌ, ๋…ธ์„  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ๋…ธ์„  ๊ด€๋ฆฌ, ๋…ธ์„  ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ์ˆ˜์ • ๊ตฌ๊ฐ„ ์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ๊ตฌ๊ฐ„ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ, ๋…ธ์„  ์ œ๊ฑฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ -- ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- 4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ ๊ตฌํ˜„ +- ์—ญ ๊ด€๋ฆฌ + - html string ์ž‘์„ฑ + - ์—ญ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - ์—ญ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๋…ธ์„  ๊ด€๋ฆฌ + - html string ์ž‘์„ฑ + - ๋…ธ์„  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - ๋…ธ์„  ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ + - html string ์ž‘์„ฑ + - ์ˆ˜์ • ๊ตฌ๊ฐ„ ์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - ๊ตฌ๊ฐ„ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - ๋…ธ์„  ์ œ๊ฑฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ +- ๋…ธ์„ ๋„ ์ถœ๋ ฅ + - html string ์ž‘์„ฑ + - ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ## ๐Ÿ˜ต ๊ณ ๋ฏผํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค From acf43b8c4dbb396734cd633e2f57e6efac4b7e9e Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 14:37:15 +0900 Subject: [PATCH 09/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=EC=B2=B4?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index c07b54f0f..af02ab702 100644 --- a/docs/README.md +++ b/docs/README.md @@ -5,8 +5,13 @@ - 4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ ๊ตฌํ˜„ - ์—ญ ๊ด€๋ฆฌ - html string ์ž‘์„ฑ - - ์—ญ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - ์—ญ ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - 2๊ธ€์ž ๋ฏธ๋งŒ ์—ญ ์ด๋ฆ„ ์ œํ•œ + - ์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ + - ์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ + - ์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ + - ์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ + - ์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) + - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ - html string ์ž‘์„ฑ - ๋…ธ์„  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ From 359c81721e04d146b6bad2b314c103d9f9bce5f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 14:43:20 +0900 Subject: [PATCH 10/82] =?UTF-8?q?feat:=20=EC=97=AD=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?html=20string=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/station-manager-ui.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index c54a6f7dc..09d2c98ab 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -10,5 +10,16 @@ export default class StationManagerUI { } const TEMPLATE = ` -station Template ์ž…๋‹ˆ๋‹ค. +์—ญ ์ด๋ฆ„
+ + +

๐Ÿš‰ ์ง€ํ•˜์ฒ  ์—ญ ๋ชฉ๋ก

+ + + + + + + +
์—ญ ์ด๋ฆ„์„ค์ •
์ฒซ๋ฒˆ์งธ ์นธ๋‘๋ฒˆ์งธ ์นธ
`; From bf4a662bae0a8739aa9c828281e380b0a4c3053c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 15:19:41 +0900 Subject: [PATCH 11/82] =?UTF-8?q?feat:=20=C2=96=EC=97=AD=EC=9D=98=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html-manager.js | 3 ++- src/index.js | 4 ++++ src/station-info-manager.js | 13 +++++++++++++ src/ui/contents-ui/station-manager-ui.js | 12 ++++++++---- src/ui/menubar-ui.js | 12 ++++++------ 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/src/html-manager.js b/src/html-manager.js index 2d8b869d2..da1f2a248 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -5,8 +5,9 @@ import LineManagerUI from "./ui/contents-ui/line-manager-ui.js"; import MapPrintManagerUI from "./ui/contents-ui/map-print-manager-ui.js"; export default class HTMLManager { - constructor({ htmlOfBody }) { + constructor({ htmlOfBody, stationINFOManager }) { this.htmlOfBody = htmlOfBody; + this.stationINFOManager = stationINFOManager; this.menubarUI_ = new MenubarUI({ htmlManager: this, diff --git a/src/index.js b/src/index.js index a6f5b49c6..0c74210fd 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,11 @@ import HTMLManager from "./html-manager.js"; +import StationINFOManager from "./station-info-manager.js"; const BODY_ID = "app"; +const stationINFOManager = new StationINFOManager(); + new HTMLManager({ htmlOfBody: document.querySelector("#" + BODY_ID), + stationINFOManager: stationINFOManager, }); diff --git a/src/station-info-manager.js b/src/station-info-manager.js index e69de29bb..5fd0a374a 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -0,0 +1,13 @@ +export default class StationINFOManager { + constructor() { + this.stations_ = []; + } + + addNewStation({ name }) { + const newStation = { + name: name, + lineNumber: null, + }; + this.stations_.push(newStation); + } +} diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 09d2c98ab..52dc3e023 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -8,18 +8,22 @@ export default class StationManagerUI { this.contentsContainer_.innerHTML = TEMPLATE; } } - +const STATION_NAME_INPUT_ID = "station-name-input"; +const STATION_ADD_BUTTON_ID = "station-add-button"; +const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; const TEMPLATE = ` ์—ญ ์ด๋ฆ„
- - + +

๐Ÿš‰ ์ง€ํ•˜์ฒ  ์—ญ ๋ชฉ๋ก

- +
์—ญ ์ด๋ฆ„ ์„ค์ •
์ฒซ๋ฒˆ์งธ ์นธ๋‘๋ฒˆ์งธ ์นธ + +
`; diff --git a/src/ui/menubar-ui.js b/src/ui/menubar-ui.js index 88b286483..483170f76 100644 --- a/src/ui/menubar-ui.js +++ b/src/ui/menubar-ui.js @@ -14,20 +14,20 @@ export default class MenubarUI { } addEventToStationButton_() { - const button_ = this.menubarContainer_.querySelector("#" + STATION_ID); - button_.addEventListener("click", () => { + const button = this.menubarContainer_.querySelector("#" + STATION_ID); + button.addEventListener("click", () => { this.htmlManager_.setContentsUIOnStationUI(); }); } addEventToLineButton_() { - const button_ = this.menubarContainer_.querySelector("#" + LINE_ID); - button_.addEventListener("click", () => { + const button = this.menubarContainer_.querySelector("#" + LINE_ID); + button.addEventListener("click", () => { this.htmlManager_.setContentsUIOnSectionUI(); }); } addEventToSectionButton_() { - const button_ = this.menubarContainer_.querySelector("#" + SECTION_ID); - button_.addEventListener("click", () => { + const button = this.menubarContainer_.querySelector("#" + SECTION_ID); + button.addEventListener("click", () => { this.htmlManager_.setContentsUIOnLineUI(); }); } From 7a4141016e147ccfa60cf01c4bcb34bdacf501a7 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 15:20:50 +0900 Subject: [PATCH 12/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=EB=93=A4=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index af02ab702..3e6ddd47c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -4,9 +4,9 @@ - 4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ ๊ตฌํ˜„ - ์—ญ ๊ด€๋ฆฌ - - html string ์ž‘์„ฑ + - (์™„๋ฃŒ)html string ์ž‘์„ฑ + - (์™„๋ฃŒ)์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ - 2๊ธ€์ž ๋ฏธ๋งŒ ์—ญ ์ด๋ฆ„ ์ œํ•œ - - ์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ - ์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ - ์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ - ์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ From 578739c1fa46f15df9d42b5f364b9a0d93edd344 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 16:05:38 +0900 Subject: [PATCH 13/82] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=9D=B4=202=EA=B8=80=EC=9E=90=20=EB=AF=B8?= =?UTF-8?q?=EB=A7=8C=EC=9D=B4=EB=A9=B4=20=EC=97=90=EB=9F=AC=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html-manager.js | 1 + src/ui/contents-ui/station-manager-ui.js | 21 ++++++++++++++++++++- src/utility/string-check-utility.js | 10 ++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 src/utility/string-check-utility.js diff --git a/src/html-manager.js b/src/html-manager.js index da1f2a248..c130c56c6 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -19,6 +19,7 @@ export default class HTMLManager { setContentsUIOnStationUI() { this.contentsUI_ = new StationManagerUI({ contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + stationINFOManager: this.stationINFOManager, }); } setContentsUIOnSectionUI() { diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 52dc3e023..4e97cf9c9 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,12 +1,31 @@ +import { getMessageToCheckStationName } from "../../utility/string-check-utility.js"; + export default class StationManagerUI { - constructor({ contentsContainer }) { + constructor({ contentsContainer, stationINFOManager }) { this.contentsContainer_ = contentsContainer; + this.stationINFOManager_ = stationINFOManager; this.setHTML(); + this.addEventToNameInputButton(); } setHTML() { this.contentsContainer_.innerHTML = TEMPLATE; } + addEventToNameInputButton() { + const button = this.contentsContainer_.querySelector( + "#" + STATION_ADD_BUTTON_ID + ); + const nameInput = this.contentsContainer_.querySelector( + "#" + STATION_NAME_INPUT_ID + ); + button.addEventListener("click", () => { + const name = nameInput.value; + const message = getMessageToCheckStationName(name); + if (message !== "์„ฑ๊ณต") { + alert(message); + } + }); + } } const STATION_NAME_INPUT_ID = "station-name-input"; const STATION_ADD_BUTTON_ID = "station-add-button"; diff --git a/src/utility/string-check-utility.js b/src/utility/string-check-utility.js new file mode 100644 index 000000000..20f8406e5 --- /dev/null +++ b/src/utility/string-check-utility.js @@ -0,0 +1,10 @@ +export function getMessageToCheckStationName(name) { + const processedName = name.trim(); + if (processedName.length < MINIMUM_LENGTH_OF_NAME) { + return MINIMUM_LENGTH_ERROR_MESSAGE; + } + return "์„ฑ๊ณต"; +} + +const MINIMUM_LENGTH_OF_NAME = 2; +const MINIMUM_LENGTH_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; From 7f913f720e891a92e8c155a1f0af745f617fb861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 16:09:20 +0900 Subject: [PATCH 14/82] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=EC=9D=84=20=EB=88=84=EB=A5=B4=EB=A9=B4=20?= =?UTF-8?q?=EC=97=AD=20=EB=AA=A9=EB=A1=9D=EC=97=90=20=EC=97=AD=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 --- src/ui/contents-ui/station-manager-ui.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 4e97cf9c9..7064fa0c9 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -24,6 +24,10 @@ export default class StationManagerUI { if (message !== "์„ฑ๊ณต") { alert(message); } + this.stationINFOManager_.addNewStation({ + name: name, + }); + console.log(this.stationINFOManager_.stations_); }); } } From dcd7d081cae3aef994b5d0c12b2d04dfa1742af7 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 16:16:01 +0900 Subject: [PATCH 15/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3e6ddd47c..01d237199 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,8 +6,8 @@ - ์—ญ ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - (์™„๋ฃŒ)์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ - - 2๊ธ€์ž ๋ฏธ๋งŒ ์—ญ ์ด๋ฆ„ ์ œํ•œ - - ์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ + - (์™„๋ฃŒ)์—ญ ์ด๋ฆ„ ์ž…๋ ฅ์ด 2๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ - ์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ - ์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ - ์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) From b4fbe705c8cd34124a245304cc27057026577a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 17:55:45 +0900 Subject: [PATCH 16/82] =?UTF-8?q?feat:=20=EC=97=AD=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=9D=84=20=ED=91=9C=EB=A1=9C=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 7 ++++ src/ui/contents-ui/station-manager-ui.js | 41 ++++++++++++++++++------ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 5fd0a374a..5f8cdc4e7 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -10,4 +10,11 @@ export default class StationINFOManager { }; this.stations_.push(newStation); } + getStationsNames() { + let stationNames = []; + this.stations_.forEach(({ name }) => { + stationNames.push(name); + }); + return stationNames; + } } diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 7064fa0c9..f48bda027 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -6,6 +6,7 @@ export default class StationManagerUI { this.stationINFOManager_ = stationINFOManager; this.setHTML(); this.addEventToNameInputButton(); + this.updateStationsTable(); } setHTML() { @@ -27,26 +28,46 @@ export default class StationManagerUI { this.stationINFOManager_.addNewStation({ name: name, }); - console.log(this.stationINFOManager_.stations_); + this.updateStationsTable(); }); } + updateStationsTable() { + const stationNames = this.stationINFOManager_.getStationsNames(); + const tableContainer = this.contentsContainer_.querySelector( + "#" + STATION_NAME_TABLE_ID + ); + let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; + console.log(stationNames); + for (let name of stationNames) { + innerHTMLOfTable += this.createNewTableRowHTML(name); + } + tableContainer.innerHTML = innerHTMLOfTable; + } + createNewTableRowHTML(name) { + const newTableRow = ` + + ${name} + + + + + `; + return newTableRow; + } } const STATION_NAME_INPUT_ID = "station-name-input"; const STATION_ADD_BUTTON_ID = "station-add-button"; const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; +const STATION_NAME_TABLE_ID = "station-name-table"; const TEMPLATE = ` ์—ญ ์ด๋ฆ„

๐Ÿš‰ ์ง€ํ•˜์ฒ  ์—ญ ๋ชฉ๋ก

- - - - - - - +
์—ญ ์ด๋ฆ„์„ค์ •
์ฒซ๋ฒˆ์งธ ์นธ - -
`; +const TABLE_HEADER_TEMPLATE = ` +์—ญ ์ด๋ฆ„ +์„ค์ • +`; From f6d8d298794e02f92fe015243fd4f712daa6777f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 17:57:59 +0900 Subject: [PATCH 17/82] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EC=97=AD=20=EC=9D=B4=EB=A6=84=20=EC=9E=85=EB=A0=A5=20=EC=8B=9C?= =?UTF-8?q?=EC=97=90=EB=8F=84=20=EC=97=AD=20=EB=AA=A9=EB=A1=9D=EC=97=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=90=98=EB=8A=94=20=ED=98=84=EC=83=81=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/station-manager-ui.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index f48bda027..ba78f247c 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -24,6 +24,7 @@ export default class StationManagerUI { const message = getMessageToCheckStationName(name); if (message !== "์„ฑ๊ณต") { alert(message); + return; } this.stationINFOManager_.addNewStation({ name: name, From ff741c04e76a6e61609082d090dbcab3ef3d7310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 18:09:11 +0900 Subject: [PATCH 18/82] =?UTF-8?q?feat:=20=EC=A4=91=EB=B3=B5=EB=90=9C=20?= =?UTF-8?q?=EC=97=AD=20=EC=9D=B4=EB=A6=84=20=EB=93=B1=EB=A1=9D=20=EC=A0=9C?= =?UTF-8?q?=ED=95=9C,=20=EC=97=90=EB=9F=AC=20=EB=A9=94=EC=84=B8=EC=A7=80?= =?UTF-8?q?=20=EB=9D=84=EC=9B=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 13 +++++++++++++ src/ui/contents-ui/station-manager-ui.js | 1 - 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 5f8cdc4e7..3d5e56cfa 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -8,8 +8,19 @@ export default class StationINFOManager { name: name, lineNumber: null, }; + if (this.isOverlapName(name)) { + alert(OVERLAP_ERROR_MESSAGE); + return; + } this.stations_.push(newStation); } + + isOverlapName(inputName) { + const overlapIndex = this.stations_.findIndex( + ({ name }) => name === inputName + ); + return overlapIndex !== -1; + } getStationsNames() { let stationNames = []; this.stations_.forEach(({ name }) => { @@ -18,3 +29,5 @@ export default class StationINFOManager { return stationNames; } } + +const OVERLAP_ERROR_MESSAGE = "๊ธฐ๋ณธ ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; \ No newline at end of file diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index ba78f247c..14a89baa0 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -38,7 +38,6 @@ export default class StationManagerUI { "#" + STATION_NAME_TABLE_ID ); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - console.log(stationNames); for (let name of stationNames) { innerHTMLOfTable += this.createNewTableRowHTML(name); } From 98c6a57778e3c50e076ae19951cb990e8d704b57 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 18:10:35 +0900 Subject: [PATCH 19/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 01d237199..89ed5e69f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,8 +8,8 @@ - (์™„๋ฃŒ)์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ - (์™„๋ฃŒ)์—ญ ์ด๋ฆ„ ์ž…๋ ฅ์ด 2๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ - - ์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ - - ์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ + - (์™„๋ฃŒ)์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ + - (์™„๋ฃŒ)์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋„์›€ - ์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ From d2ebd88d7fa6f74563d31bd37138da38ed57e019 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 18:16:42 +0900 Subject: [PATCH 20/82] =?UTF-8?q?style:=20private=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EB=84=A4=EC=9E=84=EC=9D=84=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 15 ++++++------ src/ui/contents-ui/station-manager-ui.js | 29 ++++++++++++------------ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 3d5e56cfa..4a092d828 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -8,19 +8,13 @@ export default class StationINFOManager { name: name, lineNumber: null, }; - if (this.isOverlapName(name)) { + if (this.isOverlapName_(name)) { alert(OVERLAP_ERROR_MESSAGE); return; } this.stations_.push(newStation); } - isOverlapName(inputName) { - const overlapIndex = this.stations_.findIndex( - ({ name }) => name === inputName - ); - return overlapIndex !== -1; - } getStationsNames() { let stationNames = []; this.stations_.forEach(({ name }) => { @@ -28,6 +22,13 @@ export default class StationINFOManager { }); return stationNames; } + + isOverlapName_(inputName) { + const overlapIndex = this.stations_.findIndex( + ({ name }) => name === inputName + ); + return overlapIndex !== -1; + } } const OVERLAP_ERROR_MESSAGE = "๊ธฐ๋ณธ ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; \ No newline at end of file diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 14a89baa0..8049d6108 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -5,14 +5,26 @@ export default class StationManagerUI { this.contentsContainer_ = contentsContainer; this.stationINFOManager_ = stationINFOManager; this.setHTML(); - this.addEventToNameInputButton(); this.updateStationsTable(); } setHTML() { this.contentsContainer_.innerHTML = TEMPLATE; + this.addEventToNameInputButton_(); } - addEventToNameInputButton() { + updateStationsTable() { + const stationNames = this.stationINFOManager_.getStationsNames(); + const tableContainer = this.contentsContainer_.querySelector( + "#" + STATION_NAME_TABLE_ID + ); + let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; + for (let name of stationNames) { + innerHTMLOfTable += this.createNewTableRowHTML_(name); + } + tableContainer.innerHTML = innerHTMLOfTable; + } + + addEventToNameInputButton_() { const button = this.contentsContainer_.querySelector( "#" + STATION_ADD_BUTTON_ID ); @@ -32,18 +44,7 @@ export default class StationManagerUI { this.updateStationsTable(); }); } - updateStationsTable() { - const stationNames = this.stationINFOManager_.getStationsNames(); - const tableContainer = this.contentsContainer_.querySelector( - "#" + STATION_NAME_TABLE_ID - ); - let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - for (let name of stationNames) { - innerHTMLOfTable += this.createNewTableRowHTML(name); - } - tableContainer.innerHTML = innerHTMLOfTable; - } - createNewTableRowHTML(name) { + createNewTableRowHTML_(name) { const newTableRow = ` ${name} From 4612f3373fcfbbb62d8555753066493fafc38a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 18:46:29 +0900 Subject: [PATCH 21/82] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20=ED=95=B4?= =?UTF-8?q?=EB=8B=B9=20=EC=97=AD=20=EC=A0=9C=EA=B1=B0(data=20=EC=86=8D?= =?UTF-8?q?=EC=84=B1=20=ED=99=9C=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 14 ++++++++++++-- src/ui/contents-ui/station-manager-ui.js | 14 +++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 4a092d828..30136f87e 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -14,7 +14,6 @@ export default class StationINFOManager { } this.stations_.push(newStation); } - getStationsNames() { let stationNames = []; this.stations_.forEach(({ name }) => { @@ -22,6 +21,16 @@ export default class StationINFOManager { }); return stationNames; } + deleteStation(nameToDelete) { + const stationIndexToDelete = this.stations_.findIndex(({ name }) => { + return nameToDelete === name; + }); + if (stationIndexToDelete === -1) { + alert(NOT_EXIST_NAME_ERROR_MESSAGE); + return; + } + this.stations_.splice(stationIndexToDelete, 1); + } isOverlapName_(inputName) { const overlapIndex = this.stations_.findIndex( @@ -31,4 +40,5 @@ export default class StationINFOManager { } } -const OVERLAP_ERROR_MESSAGE = "๊ธฐ๋ณธ ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; \ No newline at end of file +const OVERLAP_ERROR_MESSAGE = "๊ธฐ๋ณธ ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; +const NOT_EXIST_NAME_ERROR_MESSAGE = "์ œ๊ฑฐํ•  ์—ญ์ด ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 8049d6108..f48709f87 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -22,6 +22,7 @@ export default class StationManagerUI { innerHTMLOfTable += this.createNewTableRowHTML_(name); } tableContainer.innerHTML = innerHTMLOfTable; + this.addEventToAllTableDeleteButton_(); } addEventToNameInputButton_() { @@ -44,12 +45,23 @@ export default class StationManagerUI { this.updateStationsTable(); }); } + addEventToAllTableDeleteButton_() { + const deleteButtons = this.contentsContainer_.querySelectorAll( + "." + STATION_DELETE_BUTTON_CLASS + ); + Array.prototype.forEach.call(deleteButtons, (deleteButton) => { + deleteButton.addEventListener("click", (e) => { + this.stationINFOManager_.deleteStation(e.target.dataset.name); + this.updateStationsTable(); + }); + }); + } createNewTableRowHTML_(name) { const newTableRow = ` ${name} - + `; From 745f0da6d2356ad9635773c1439e9054eb6d5e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 18:49:10 +0900 Subject: [PATCH 22/82] =?UTF-8?q?feat:=20=EC=97=AD=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=20=ED=81=B4=EB=A6=AD=20=EC=8B=9C=20confirm?= =?UTF-8?q?=20=EC=B0=BD=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/station-manager-ui.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index f48709f87..f165547ad 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -51,6 +51,9 @@ export default class StationManagerUI { ); Array.prototype.forEach.call(deleteButtons, (deleteButton) => { deleteButton.addEventListener("click", (e) => { + if (!confirm(DELETE_CONFIRM_MESSAGE)) { + return; + } this.stationINFOManager_.deleteStation(e.target.dataset.name); this.updateStationsTable(); }); @@ -72,6 +75,7 @@ const STATION_NAME_INPUT_ID = "station-name-input"; const STATION_ADD_BUTTON_ID = "station-add-button"; const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; const STATION_NAME_TABLE_ID = "station-name-table"; +const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; const TEMPLATE = ` ์—ญ ์ด๋ฆ„
From c19fcc8416ed67599473b226a4da207c20ea754d Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 18:50:25 +0900 Subject: [PATCH 23/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 89ed5e69f..43ac9e4ee 100644 --- a/docs/README.md +++ b/docs/README.md @@ -10,7 +10,8 @@ - (์™„๋ฃŒ)์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ - (์™„๋ฃŒ)์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ - (์™„๋ฃŒ)์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋„์›€ - - ์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) + - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) + - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ confirm ์ฐฝ ๋„์šฐ๊ธฐ - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ - html string ์ž‘์„ฑ From e5c2df156c1402079b724c7d72a52a729347ea27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 21:40:42 +0900 Subject: [PATCH 24/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20html=20string=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 40 ++++++++++++++++++++++-- src/ui/contents-ui/station-manager-ui.js | 2 +- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 94031ed76..d28a5cf36 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -8,7 +8,43 @@ export default class SectionManagerUI { this.contentsContainer_.innerHTML = TEMPLATE; } } - +const NAME_INPUT_ID = "line-name-input"; +const START_STATION_SELECTOR_ID = "line-start-station-selector"; +const END_STATION_SELECTOR_ID = "line-end-station-selector"; +const ADD_BUTTON_ID = "line-add-button"; +const DELETE_BUTTON_CLASS = "line-delete-button"; +const TABLE_ID = "line-table"; const TEMPLATE = ` -section Template ์ž…๋‹ˆ๋‹ค. +๋…ธ์„  ์ด๋ฆ„
+ +

+์ƒํ–‰ ์ข…์  +
+ํ•˜ํ–‰ ์ข…์  + +

+ +

๐Ÿš‰ ์ง€ํ•˜์ฒ  ๋…ธ์„  ๋ชฉ๋ก

+ + + + + + + + + + + +
๋…ธ์„  ์ด๋ฆ„์ƒํ–‰ ์ข…์ ์—ญํ•˜ํ–‰ ์ข…์ ์—ญ์„ค์ •
123 + +
`; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index f165547ad..c1ef98fba 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -77,7 +77,7 @@ const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; const STATION_NAME_TABLE_ID = "station-name-table"; const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; const TEMPLATE = ` -์—ญ ์ด๋ฆ„
+์—ญ ์ด๋ฆ„

๐Ÿš‰ ์ง€ํ•˜์ฒ  ์—ญ ๋ชฉ๋ก

From 1f01772d1932e4f97754a9904d8fb852428c9000 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Fri, 11 Dec 2020 21:58:40 +0900 Subject: [PATCH 25/82] =?UTF-8?q?docs:=20=EB=85=B8=EC=84=A0=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=9D=98=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=A0=20=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EA=B5=AC=EC=B2=B4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index 43ac9e4ee..5c9548736 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,9 +14,15 @@ - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ confirm ์ฐฝ ๋„์šฐ๊ธฐ - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ - - html string ์ž‘์„ฑ - - ๋…ธ์„  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - ๋…ธ์„  ์‚ญ์ œ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - (์™„๋ฃŒ)html string ์ž‘์„ฑ + - ๋…ธ์„ ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ + - ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ข…์  ์ •๋ณด๋“ค์„ ๋ฐ›์•„ ๋…ธ์„  ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - ๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ + - ๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ + - ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ - html string ์ž‘์„ฑ - ์ˆ˜์ • ๊ตฌ๊ฐ„ ์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ From 40467fa696b0155f1b50e003cb4b854392aa0470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Fri, 11 Dec 2020 23:01:16 +0900 Subject: [PATCH 26/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=9D=98=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=A0=80=EC=9E=A5=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8A=94=20=EC=9E=90=EB=A3=8C=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EB=A5=BC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 42 ++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 30136f87e..f54297cd4 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -1,17 +1,18 @@ export default class StationINFOManager { constructor() { this.stations_ = []; + this.lines_ = []; } addNewStation({ name }) { + if (this.isOverlapName_(this.stations_, name)) { + alert(OVERLAP_STATION_ERROR_MESSAGE); + return; + } const newStation = { name: name, - lineNumber: null, + linesOfStation: new Set(), }; - if (this.isOverlapName_(name)) { - alert(OVERLAP_ERROR_MESSAGE); - return; - } this.stations_.push(newStation); } getStationsNames() { @@ -32,13 +33,38 @@ export default class StationINFOManager { this.stations_.splice(stationIndexToDelete, 1); } - isOverlapName_(inputName) { - const overlapIndex = this.stations_.findIndex( + addNewLine({ lineName, startStationName, endStationName }) { + if (this.isOverlapName_(this.lines_, lineName)) { + alert(OVERLAP_LINE_ERROR_MESSAGE); + return; + } + const startStationPtr = this.getPointerFromStationsArray_(startStationName); + const endStationPtr = this.getPointerFromStationsArray_(endStationName); + const newLine = { + name: lineName, + stationsOfLine: [startStationPtr, endStationPtr], + }; + startStationPtr.linesOfStation.add(lineName); + endStationPtr.linesOfStation.add(lineName); + this.lines_.push(newLine); + console.log(this.stations_); + console.log(this.lines_); + } + + getPointerFromStationsArray_(targetName) { + const targetIndex = this.stations_.findIndex(({ name }) => { + return name === targetName; + }); + return this.stations_[targetIndex]; + } + isOverlapName_(targetToFindOverlap, inputName) { + const overlapIndex = targetToFindOverlap.findIndex( ({ name }) => name === inputName ); return overlapIndex !== -1; } } -const OVERLAP_ERROR_MESSAGE = "๊ธฐ๋ณธ ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; +const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; +const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; const NOT_EXIST_NAME_ERROR_MESSAGE = "์ œ๊ฑฐํ•  ์—ญ์ด ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."; From 60232161acd4e43e7f86f229caa44b08f66deef3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 10:57:18 +0900 Subject: [PATCH 27/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EA=B3=BC=20=EC=A2=85=EC=A0=90=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=93=A4=EC=9D=84=20=EB=B0=9B=EC=95=84=20=EB=85=B8=EC=84=A0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EB=8A=94=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/html-manager.js | 3 ++ src/station-info-manager.js | 1 - src/ui/contents-ui/line-manager-ui.js | 3 +- src/ui/contents-ui/map-print-manager-ui.js | 3 +- src/ui/contents-ui/section-manager-ui.js | 52 +++++++++++++++++++--- 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/html-manager.js b/src/html-manager.js index c130c56c6..bc20a0f21 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -25,16 +25,19 @@ export default class HTMLManager { setContentsUIOnSectionUI() { this.contentsUI_ = new SectionManagerUI({ contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + stationINFOManager: this.stationINFOManager, }); } setContentsUIOnLineUI() { this.contentsUI_ = new LineManagerUI({ contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + stationINFOManager: this.stationINFOManager, }); } setContentsUIOnMapPrintUI() { this.contentsUI_ = new MapPrintManagerUI({ contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), + stationINFOManager: this.stationINFOManager, }); } } diff --git a/src/station-info-manager.js b/src/station-info-manager.js index f54297cd4..d9232e85e 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -32,7 +32,6 @@ export default class StationINFOManager { } this.stations_.splice(stationIndexToDelete, 1); } - addNewLine({ lineName, startStationName, endStationName }) { if (this.isOverlapName_(this.lines_, lineName)) { alert(OVERLAP_LINE_ERROR_MESSAGE); diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index d04ef5633..a99155000 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,6 +1,7 @@ export default class LineManagerUI { - constructor({ contentsContainer }) { + constructor({ contentsContainer, stationINFOManager }) { this.contentsContainer_ = contentsContainer; + this.stationINFOManager_ = stationINFOManager; this.setHTML(); } diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index c1ad4f4ff..a84920b28 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -1,6 +1,7 @@ export default class MapPrintManager { - constructor({ contentsContainer }) { + constructor({ contentsContainer, stationINFOManager }) { this.contentsContainer_ = contentsContainer; + this.stationINFOManager_ = stationINFOManager; this.setHTML(); } diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index d28a5cf36..a57155905 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,11 +1,54 @@ export default class SectionManagerUI { - constructor({ contentsContainer }) { + constructor({ contentsContainer, stationINFOManager }) { this.contentsContainer_ = contentsContainer; + this.stationINFOManager_ = stationINFOManager; this.setHTML(); } setHTML() { this.contentsContainer_.innerHTML = TEMPLATE; + this.setStationSelector_(START_STATION_SELECTOR_ID); + this.setStationSelector_(END_STATION_SELECTOR_ID); + this.addEventToLineAddButton_(); + } + + setStationSelector_(selectorID) { + const selector = this.contentsContainer_.querySelector("#" + selectorID); + selector.innerHTML = this.createSelectorInnerHTML_(); + } + createSelectorInnerHTML_() { + const stationNames = this.stationINFOManager_.getStationsNames(); + let selectorInnerHTML = SELECTOR_TEMPLATE; + stationNames.forEach((name) => { + selectorInnerHTML += this.createNewSelectorOptionHTML_(name); + }); + return selectorInnerHTML; + } + createNewSelectorOptionHTML_(name) { + return ` + + `; + } + addEventToLineAddButton_() { + const button = this.contentsContainer_.querySelector("#" + ADD_BUTTON_ID); + button.addEventListener("click", () => { + this.stationINFOManager_.addNewLine({ + lineName: this.getHTMLElementByID_(NAME_INPUT_ID).value, + startStationName: this.getSelectedOptionInSelector_( + START_STATION_SELECTOR_ID + ), + endStationName: this.getSelectedOptionInSelector_( + END_STATION_SELECTOR_ID + ), + }); + }); + } + getHTMLElementByID_(id) { + return this.contentsContainer_.querySelector("#" + id); + } + getSelectedOptionInSelector_(id) { + const selector = this.getHTMLElementByID_(id); + return selector[selector.selectedIndex].value; } } const NAME_INPUT_ID = "line-name-input"; @@ -14,21 +57,16 @@ const END_STATION_SELECTOR_ID = "line-end-station-selector"; const ADD_BUTTON_ID = "line-add-button"; const DELETE_BUTTON_CLASS = "line-delete-button"; const TABLE_ID = "line-table"; +const SELECTOR_TEMPLATE = ``; const TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„

์ƒํ–‰ ์ข…์ 
ํ•˜ํ–‰ ์ข…์ 

From c9ecb4cbff3228ad46f72dd9a8d0f1265542ff70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 12:19:49 +0900 Subject: [PATCH 28/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=EC=9D=84=20=ED=91=9C=EB=A1=9C=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 13 ++++++- src/ui/contents-ui/section-manager-ui.js | 44 +++++++++++++++++------- src/ui/contents-ui/station-manager-ui.js | 4 +-- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index d9232e85e..e8fb3f650 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -16,12 +16,23 @@ export default class StationINFOManager { this.stations_.push(newStation); } getStationsNames() { - let stationNames = []; + const stationNames = []; this.stations_.forEach(({ name }) => { stationNames.push(name); }); return stationNames; } + getLinesNames() { + const linesINFOs = []; + this.lines_.forEach(({ name, stationsOfLine }) => { + linesINFOs.push({ + name: name, + startStationName: stationsOfLine[0].name, + endStationName: stationsOfLine[stationsOfLine.length - 1].name, + }); + }); + return linesINFOs; + } deleteStation(nameToDelete) { const stationIndexToDelete = this.stations_.findIndex(({ name }) => { return nameToDelete === name; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index a57155905..9cbac2998 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -10,6 +10,7 @@ export default class SectionManagerUI { this.setStationSelector_(START_STATION_SELECTOR_ID); this.setStationSelector_(END_STATION_SELECTOR_ID); this.addEventToLineAddButton_(); + this.updateLinesTable_(); } setStationSelector_(selectorID) { @@ -41,6 +42,7 @@ export default class SectionManagerUI { END_STATION_SELECTOR_ID ), }); + this.updateLinesTable_(); }); } getHTMLElementByID_(id) { @@ -50,6 +52,29 @@ export default class SectionManagerUI { const selector = this.getHTMLElementByID_(id); return selector[selector.selectedIndex].value; } + updateLinesTable_() { + const linesINFOs = this.stationINFOManager_.getLinesNames(); + const tableContainer = this.contentsContainer_.querySelector( + "#" + TABLE_ID + ); + let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; + linesINFOs.forEach((lineINFOs) => { + innerHTMLOfTable += this.createNewTableRowHTML_(lineINFOs); + }); + tableContainer.innerHTML = innerHTMLOfTable; + } + createNewTableRowHTML_({ name, startStationName, endStationName }) { + return ` + + ${name} + ${startStationName} + ${endStationName} + + + + + `; + } } const NAME_INPUT_ID = "line-name-input"; const START_STATION_SELECTOR_ID = "line-start-station-selector"; @@ -57,7 +82,14 @@ const END_STATION_SELECTOR_ID = "line-end-station-selector"; const ADD_BUTTON_ID = "line-add-button"; const DELETE_BUTTON_CLASS = "line-delete-button"; const TABLE_ID = "line-table"; + const SELECTOR_TEMPLATE = ``; +const TABLE_HEADER_TEMPLATE = ` +๋…ธ์„  ์ด๋ฆ„ +์ƒํ–‰ ์ข…์ ์—ญ +ํ•˜ํ–‰ ์ข…์ ์—ญ +์„ค์ • +`; const TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„
@@ -72,17 +104,5 @@ const TEMPLATE = `

๐Ÿš‰ ์ง€ํ•˜์ฒ  ๋…ธ์„  ๋ชฉ๋ก

- - - - - - - - - -
๋…ธ์„  ์ด๋ฆ„์ƒํ–‰ ์ข…์ ์—ญํ•˜ํ–‰ ์ข…์ ์—ญ์„ค์ •
123 - -
`; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index c1ef98fba..d2e89f148 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -13,12 +13,12 @@ export default class StationManagerUI { this.addEventToNameInputButton_(); } updateStationsTable() { - const stationNames = this.stationINFOManager_.getStationsNames(); + const stationsNames = this.stationINFOManager_.getStationsNames(); const tableContainer = this.contentsContainer_.querySelector( "#" + STATION_NAME_TABLE_ID ); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - for (let name of stationNames) { + for (let name of stationsNames) { innerHTMLOfTable += this.createNewTableRowHTML_(name); } tableContainer.innerHTML = innerHTMLOfTable; From aa761960a2b768d331663840bdc80eeae74b70b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 14:04:02 +0900 Subject: [PATCH 29/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=B4=20=ED=95=9C=20=EA=B8=80=EC=9E=90=20=EB=AF=B8?= =?UTF-8?q?=EB=A7=8C=EC=9D=B4=EB=A9=B4=20=EC=97=90=EB=9F=AC=20=EB=A9=94?= =?UTF-8?q?=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 10 +++++++++- src/utility/string-check-utility.js | 18 ++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 9cbac2998..313a9646a 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,3 +1,5 @@ +import { getMessageToCheckLineInput } from "../../utility/string-check-utility.js"; + export default class SectionManagerUI { constructor({ contentsContainer, stationINFOManager }) { this.contentsContainer_ = contentsContainer; @@ -33,8 +35,14 @@ export default class SectionManagerUI { addEventToLineAddButton_() { const button = this.contentsContainer_.querySelector("#" + ADD_BUTTON_ID); button.addEventListener("click", () => { + const lineName = this.getHTMLElementByID_(NAME_INPUT_ID).value; + const message = getMessageToCheckLineInput(lineName); + if (message !== "์„ฑ๊ณต") { + alert(message); + return; + } this.stationINFOManager_.addNewLine({ - lineName: this.getHTMLElementByID_(NAME_INPUT_ID).value, + lineName: lineName, startStationName: this.getSelectedOptionInSelector_( START_STATION_SELECTOR_ID ), diff --git a/src/utility/string-check-utility.js b/src/utility/string-check-utility.js index 20f8406e5..2b143358d 100644 --- a/src/utility/string-check-utility.js +++ b/src/utility/string-check-utility.js @@ -1,10 +1,20 @@ export function getMessageToCheckStationName(name) { const processedName = name.trim(); - if (processedName.length < MINIMUM_LENGTH_OF_NAME) { - return MINIMUM_LENGTH_ERROR_MESSAGE; + if (processedName.length < MINIMUM_LENGTH_OF_STATION_NAME) { + return MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE; } return "์„ฑ๊ณต"; } -const MINIMUM_LENGTH_OF_NAME = 2; -const MINIMUM_LENGTH_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; +export function getMessageToCheckLineInput(name) { + const processedName = name.trim(); + if (processedName.length < MINIMUM_LENGTH_OF_LINE_NAME) { + return MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE; + } + return "์„ฑ๊ณต"; +} + +const MINIMUM_LENGTH_OF_STATION_NAME = 2; +const MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_STATION_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; +const MINIMUM_LENGTH_OF_LINE_NAME = 1; +const MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE = `๋…ธ์„  ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_LINE_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; From a3af93234a12a44730252618b30bebe5bc25c995 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sat, 12 Dec 2020 14:10:02 +0900 Subject: [PATCH 30/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0,=20=EC=83=88=EB=A1=AD=EA=B2=8C=20=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 5c9548736..6ca6d91ff 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,15 +12,17 @@ - (์™„๋ฃŒ)์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋„์›€ - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ confirm ์ฐฝ ๋„์šฐ๊ธฐ + - ์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - - ๋…ธ์„ ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ - - ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ข…์  ์ •๋ณด๋“ค์„ ๋ฐ›์•„ ๋…ธ์„  ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - ๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ + - (์™„๋ฃŒ)๋…ธ์„ ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ + - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„๊ณผ ์ข…์  ์ •๋ณด๋“ค์„ ๋ฐ›์•„ ๋…ธ์„  ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - (์™„๋ฃŒ)๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ + - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - ์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - ๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ @@ -28,6 +30,7 @@ - ์ˆ˜์ • ๊ตฌ๊ฐ„ ์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ - ๊ตฌ๊ฐ„ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ - ๋…ธ์„  ์ œ๊ฑฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - ์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ - html string ์ž‘์„ฑ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ From db7a7f437209bd494ddf694541ef950a156e874f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 15:22:30 +0900 Subject: [PATCH 31/82] =?UTF-8?q?refactor:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EB=86=92=EC=9D=B4=EA=B3=A0=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B0=98=EB=B3=B5=EC=9D=84=20=EC=A4=84=EC=9D=B4=EA=B8=B0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=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 ๊ธฐ์กด์— querySelector๋ฅผ ์“ฐ๋˜ ๊ฒƒ์„ getElementByID๋กœ ๋ฐ”๊พธ๊ณ  document์—์„œ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋ฝ‘์•„๋‚ด๋Š” ๋ฌ˜๋“ˆํŒŒ์ผ์„ ๋”ฐ๋กœ ๋‚˜๋ˆ” --- src/html-manager.js | 38 ++++++++++------------ src/index.js | 5 +-- src/ui/contents-ui/line-manager-ui.js | 10 +++--- src/ui/contents-ui/map-print-manager-ui.js | 10 +++--- src/ui/contents-ui/section-manager-ui.js | 26 +++++++-------- src/ui/contents-ui/station-manager-ui.js | 31 ++++++++---------- src/ui/menubar-ui.js | 14 ++++---- src/utility/handle-document-utility.js | 7 ++++ 8 files changed, 67 insertions(+), 74 deletions(-) create mode 100644 src/utility/handle-document-utility.js diff --git a/src/html-manager.js b/src/html-manager.js index bc20a0f21..052627bef 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -5,40 +5,38 @@ import LineManagerUI from "./ui/contents-ui/line-manager-ui.js"; import MapPrintManagerUI from "./ui/contents-ui/map-print-manager-ui.js"; export default class HTMLManager { - constructor({ htmlOfBody, stationINFOManager }) { - this.htmlOfBody = htmlOfBody; + constructor(stationINFOManager) { this.stationINFOManager = stationINFOManager; - this.menubarUI_ = new MenubarUI({ htmlManager: this, - menubarContainer: htmlOfBody.querySelector("#" + MENUBAR_ID), + menubarID: MENUBAR_ID, }); this.setContentsUIOnStationUI(); } setContentsUIOnStationUI() { - this.contentsUI_ = new StationManagerUI({ - contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), - stationINFOManager: this.stationINFOManager, - }); + this.contentsUI_ = new StationManagerUI( + CONTENTS_ID, + this.stationINFOManager + ); } setContentsUIOnSectionUI() { - this.contentsUI_ = new SectionManagerUI({ - contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), - stationINFOManager: this.stationINFOManager, - }); + this.contentsUI_ = new SectionManagerUI( + CONTENTS_ID, + this.stationINFOManager + ); } setContentsUIOnLineUI() { - this.contentsUI_ = new LineManagerUI({ - contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), - stationINFOManager: this.stationINFOManager, - }); + this.contentsUI_ = new LineManagerUI( + CONTENTS_ID, + this.stationINFOManager + ); } setContentsUIOnMapPrintUI() { - this.contentsUI_ = new MapPrintManagerUI({ - contentsContainer: this.htmlOfBody.querySelector("#" + CONTENTS_ID), - stationINFOManager: this.stationINFOManager, - }); + this.contentsUI_ = new MapPrintManagerUI( + CONTENTS_ID, + this.stationINFOManager + ); } } diff --git a/src/index.js b/src/index.js index 0c74210fd..c43ed45fd 100644 --- a/src/index.js +++ b/src/index.js @@ -5,7 +5,4 @@ const BODY_ID = "app"; const stationINFOManager = new StationINFOManager(); -new HTMLManager({ - htmlOfBody: document.querySelector("#" + BODY_ID), - stationINFOManager: stationINFOManager, -}); +new HTMLManager(stationINFOManager); diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index a99155000..4934a44a1 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,12 +1,12 @@ export default class LineManagerUI { - constructor({ contentsContainer, stationINFOManager }) { - this.contentsContainer_ = contentsContainer; + constructor(contentsID, stationINFOManager) { + this.contentsID_ = contentsID; this.stationINFOManager_ = stationINFOManager; - this.setHTML(); + this.setContentsHTML(); } - setHTML() { - this.contentsContainer_.innerHTML = TEMPLATE; + setContentsHTML() { + document.getElementById(this.contentsID_).innerHTML = TEMPLATE; } } diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index a84920b28..499197670 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -1,12 +1,12 @@ export default class MapPrintManager { - constructor({ contentsContainer, stationINFOManager }) { - this.contentsContainer_ = contentsContainer; + constructor(contentsID, stationINFOManager) { + this.contentsID_ = contentsID; this.stationINFOManager_ = stationINFOManager; - this.setHTML(); + this.setContentsHTML(); } - setHTML() { - this.contentsContainer_.innerHTML = TEMPLATE; + setContentsHTML() { + document.getElementById(this.contentsID_).innerHTML = TEMPLATE; } } diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 313a9646a..3f8da9f7c 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,14 +1,15 @@ import { getMessageToCheckLineInput } from "../../utility/string-check-utility.js"; +import { getInputTextByID } from "../../utility/handle-document-utility.js"; export default class SectionManagerUI { - constructor({ contentsContainer, stationINFOManager }) { - this.contentsContainer_ = contentsContainer; + constructor(contentsID, stationINFOManager) { + this.contentsID_ = contentsID; this.stationINFOManager_ = stationINFOManager; - this.setHTML(); + this.setContentsHTML(); } - setHTML() { - this.contentsContainer_.innerHTML = TEMPLATE; + setContentsHTML() { + document.getElementById(this.contentsID_).innerHTML = TEMPLATE; this.setStationSelector_(START_STATION_SELECTOR_ID); this.setStationSelector_(END_STATION_SELECTOR_ID); this.addEventToLineAddButton_(); @@ -16,7 +17,7 @@ export default class SectionManagerUI { } setStationSelector_(selectorID) { - const selector = this.contentsContainer_.querySelector("#" + selectorID); + const selector = document.getElementById(selectorID); selector.innerHTML = this.createSelectorInnerHTML_(); } createSelectorInnerHTML_() { @@ -33,9 +34,9 @@ export default class SectionManagerUI { `; } addEventToLineAddButton_() { - const button = this.contentsContainer_.querySelector("#" + ADD_BUTTON_ID); + const button = document.getElementById(ADD_BUTTON_ID); button.addEventListener("click", () => { - const lineName = this.getHTMLElementByID_(NAME_INPUT_ID).value; + const lineName = getInputTextByID(NAME_INPUT_ID); const message = getMessageToCheckLineInput(lineName); if (message !== "์„ฑ๊ณต") { alert(message); @@ -53,18 +54,13 @@ export default class SectionManagerUI { this.updateLinesTable_(); }); } - getHTMLElementByID_(id) { - return this.contentsContainer_.querySelector("#" + id); - } getSelectedOptionInSelector_(id) { - const selector = this.getHTMLElementByID_(id); + const selector = document.getElementById(id); return selector[selector.selectedIndex].value; } updateLinesTable_() { const linesINFOs = this.stationINFOManager_.getLinesNames(); - const tableContainer = this.contentsContainer_.querySelector( - "#" + TABLE_ID - ); + const tableContainer = document.getElementById(TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; linesINFOs.forEach((lineINFOs) => { innerHTMLOfTable += this.createNewTableRowHTML_(lineINFOs); diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index d2e89f148..c9374e398 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,22 +1,24 @@ import { getMessageToCheckStationName } from "../../utility/string-check-utility.js"; +import { + getInputTextByID, + getAllElementsByClass, +} from "../../utility/handle-document-utility.js"; export default class StationManagerUI { - constructor({ contentsContainer, stationINFOManager }) { - this.contentsContainer_ = contentsContainer; + constructor(contentsID, stationINFOManager) { + this.contentsID_ = contentsID; this.stationINFOManager_ = stationINFOManager; - this.setHTML(); + this.setContentsHTML(); this.updateStationsTable(); } - setHTML() { - this.contentsContainer_.innerHTML = TEMPLATE; + setContentsHTML() { + document.getElementById(this.contentsID_).innerHTML = TEMPLATE; this.addEventToNameInputButton_(); } updateStationsTable() { const stationsNames = this.stationINFOManager_.getStationsNames(); - const tableContainer = this.contentsContainer_.querySelector( - "#" + STATION_NAME_TABLE_ID - ); + const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; for (let name of stationsNames) { innerHTMLOfTable += this.createNewTableRowHTML_(name); @@ -26,14 +28,9 @@ export default class StationManagerUI { } addEventToNameInputButton_() { - const button = this.contentsContainer_.querySelector( - "#" + STATION_ADD_BUTTON_ID - ); - const nameInput = this.contentsContainer_.querySelector( - "#" + STATION_NAME_INPUT_ID - ); + const button = document.getElementById(STATION_ADD_BUTTON_ID); button.addEventListener("click", () => { - const name = nameInput.value; + const name = getInputTextByID(STATION_NAME_INPUT_ID); const message = getMessageToCheckStationName(name); if (message !== "์„ฑ๊ณต") { alert(message); @@ -46,9 +43,7 @@ export default class StationManagerUI { }); } addEventToAllTableDeleteButton_() { - const deleteButtons = this.contentsContainer_.querySelectorAll( - "." + STATION_DELETE_BUTTON_CLASS - ); + const deleteButtons = getAllElementsByClass(STATION_DELETE_BUTTON_CLASS); Array.prototype.forEach.call(deleteButtons, (deleteButton) => { deleteButton.addEventListener("click", (e) => { if (!confirm(DELETE_CONFIRM_MESSAGE)) { diff --git a/src/ui/menubar-ui.js b/src/ui/menubar-ui.js index 483170f76..33adbb38e 100644 --- a/src/ui/menubar-ui.js +++ b/src/ui/menubar-ui.js @@ -1,12 +1,12 @@ export default class MenubarUI { - constructor({ htmlManager, menubarContainer }) { + constructor({ htmlManager, menubarID }) { this.htmlManager_ = htmlManager; - this.menubarContainer_ = menubarContainer; + this.menubarID_ = menubarID; this.setMenubar(); } setMenubar() { - this.menubarContainer_.innerHTML = MENU_TEMPLATE; + document.getElementById(this.menubarID_).innerHTML = MENU_TEMPLATE; this.addEventToStationButton_(); this.addEventToLineButton_(); this.addEventToSectionButton_(); @@ -14,25 +14,25 @@ export default class MenubarUI { } addEventToStationButton_() { - const button = this.menubarContainer_.querySelector("#" + STATION_ID); + const button = document.getElementById(STATION_ID); button.addEventListener("click", () => { this.htmlManager_.setContentsUIOnStationUI(); }); } addEventToLineButton_() { - const button = this.menubarContainer_.querySelector("#" + LINE_ID); + const button = document.getElementById(LINE_ID); button.addEventListener("click", () => { this.htmlManager_.setContentsUIOnSectionUI(); }); } addEventToSectionButton_() { - const button = this.menubarContainer_.querySelector("#" + SECTION_ID); + const button = document.getElementById(SECTION_ID); button.addEventListener("click", () => { this.htmlManager_.setContentsUIOnLineUI(); }); } addEventToMapPrintButton_() { - const button_ = this.menubarContainer_.querySelector("#" + MAP_PRINT_ID); + const button_ = document.getElementById(MAP_PRINT_ID); button_.addEventListener("click", () => { this.htmlManager_.setContentsUIOnMapPrintUI(); }); diff --git a/src/utility/handle-document-utility.js b/src/utility/handle-document-utility.js new file mode 100644 index 000000000..c4cbf6cd9 --- /dev/null +++ b/src/utility/handle-document-utility.js @@ -0,0 +1,7 @@ +export function getInputTextByID(id) { + return document.getElementById(id).value.trim(); +} + +export function getAllElementsByClass(className) { + return document.querySelectorAll("." + className); +} From fcb160a2d429d1c3fc046fbdbe6c53d59ff6b41d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 15:29:27 +0900 Subject: [PATCH 32/82] =?UTF-8?q?feat:=20=EC=97=AD,=20=EB=85=B8=EC=84=A0?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=EA=B0=92=EC=9D=84=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=EC=97=90=20=EB=8B=B4=EA=B8=B0=20=EC=A0=84=EC=97=90=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EA=B0=92=EC=9D=98=20=EC=95=9E=EB=92=A4=20=EA=B3=B5?= =?UTF-8?q?=EB=B0=B1=EC=9D=84=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utility/handle-document-utility.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/utility/handle-document-utility.js b/src/utility/handle-document-utility.js index c4cbf6cd9..4de24bf97 100644 --- a/src/utility/handle-document-utility.js +++ b/src/utility/handle-document-utility.js @@ -1,7 +1,6 @@ export function getInputTextByID(id) { return document.getElementById(id).value.trim(); } - export function getAllElementsByClass(className) { return document.querySelectorAll("." + className); } From 7aa9cbea42694566763ed82c23c7eecdbe7dd452 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 15:56:20 +0900 Subject: [PATCH 33/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=EC=9D=B4=20=EC=A4=91=EB=B3=B5=EC=9D=B4=EB=A9=B4,=20?= =?UTF-8?q?=EC=83=81=ED=96=89=20=EC=A2=85=EC=A0=90=EA=B3=BC=20=ED=95=98?= =?UTF-8?q?=ED=96=89=20=EC=A2=85=EC=A0=90=EC=9D=B4=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=EC=97=AD=EC=9D=B4=EB=A9=B4=20=EC=97=90=EB=9F=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 40 ++++++++++++++++++------ src/utility/string-check-utility.js | 8 +++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 3f8da9f7c..35a4319f4 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,4 +1,7 @@ -import { getMessageToCheckLineInput } from "../../utility/string-check-utility.js"; +import { + getMessageToCheckLineInput, + getMessageToCheckNotEquality, +} from "../../utility/string-check-utility.js"; import { getInputTextByID } from "../../utility/handle-document-utility.js"; export default class SectionManagerUI { @@ -37,23 +40,40 @@ export default class SectionManagerUI { const button = document.getElementById(ADD_BUTTON_ID); button.addEventListener("click", () => { const lineName = getInputTextByID(NAME_INPUT_ID); - const message = getMessageToCheckLineInput(lineName); - if (message !== "์„ฑ๊ณต") { - alert(message); + const startStationName = this.getSelectedOptionInSelector_( + START_STATION_SELECTOR_ID + ); + const endStationName = this.getSelectedOptionInSelector_( + END_STATION_SELECTOR_ID + ); + if (!this.isLineINFOValid_(lineName, startStationName, endStationName)) { return; } this.stationINFOManager_.addNewLine({ lineName: lineName, - startStationName: this.getSelectedOptionInSelector_( - START_STATION_SELECTOR_ID - ), - endStationName: this.getSelectedOptionInSelector_( - END_STATION_SELECTOR_ID - ), + startStationName: startStationName, + endStationName: endStationName, }); this.updateLinesTable_(); }); } + isLineINFOValid_(lineName, startStationName, endStationName) { + const lineNameCheckMessage = getMessageToCheckLineInput(lineName); + const equalityCheckMessage = getMessageToCheckNotEquality( + startStationName, + endStationName + ); + let ret_bool = true; + if (lineNameCheckMessage !== "์„ฑ๊ณต") { + alert(lineNameCheckMessage); + ret_bool = false; + } + if (equalityCheckMessage !== "์„ฑ๊ณต") { + alert(equalityCheckMessage); + ret_bool = false; + } + return ret_bool; + } getSelectedOptionInSelector_(id) { const selector = document.getElementById(id); return selector[selector.selectedIndex].value; diff --git a/src/utility/string-check-utility.js b/src/utility/string-check-utility.js index 2b143358d..c117d3227 100644 --- a/src/utility/string-check-utility.js +++ b/src/utility/string-check-utility.js @@ -14,7 +14,15 @@ export function getMessageToCheckLineInput(name) { return "์„ฑ๊ณต"; } +export function getMessageToCheckNotEquality(startStationName, endStationName) { + if (startStationName === endStationName) { + return START_NAME_EQUAL_END_NAME_ERROR_MESSAGE; + } + return "์„ฑ๊ณต"; +} + const MINIMUM_LENGTH_OF_STATION_NAME = 2; const MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_STATION_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const MINIMUM_LENGTH_OF_LINE_NAME = 1; const MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE = `๋…ธ์„  ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_LINE_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; +const START_NAME_EQUAL_END_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; From 50533f4f4f816e755f85045576830e9c0bbf6485 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sat, 12 Dec 2020 16:00:29 +0900 Subject: [PATCH 34/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EA=B0=B1=EC=8B=A0,=20=EA=B5=AC=ED=98=84=ED=95=A0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EB=82=B4=EC=9A=A9=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/README.md b/docs/README.md index 6ca6d91ff..9ebf8402a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,7 @@ - (์™„๋ฃŒ)์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋„์›€ - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ confirm ์ฐฝ ๋„์šฐ๊ธฐ - - ์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ + - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ @@ -20,9 +20,8 @@ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„๊ณผ ์ข…์  ์ •๋ณด๋“ค์„ ๋ฐ›์•„ ๋…ธ์„  ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ - (์™„๋ฃŒ)๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - - ๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ + - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด, ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ - ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ From 10b5bdca5c6ac745f96327f07d92e563a16bd110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 16:26:06 +0900 Subject: [PATCH 35/82] =?UTF-8?q?feat:=20=EC=82=AD=EC=A0=9C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=84=20=EB=88=84=EB=A5=B4=EB=A9=B4=20=EB=85=B8?= =?UTF-8?q?=EC=84=A0=EC=9D=B4=20=EC=82=AD=EC=A0=9C=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 21 ++++++++-- src/ui/contents-ui/section-manager-ui.js | 53 ++++++++++++++++-------- 2 files changed, 53 insertions(+), 21 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index e8fb3f650..3ced95eda 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -57,10 +57,25 @@ export default class StationINFOManager { startStationPtr.linesOfStation.add(lineName); endStationPtr.linesOfStation.add(lineName); this.lines_.push(newLine); - console.log(this.stations_); - console.log(this.lines_); + } + deleteLine(nameToDelete) { + const lineIndexToDelete = this.lines_.findIndex(({ name }) => { + return nameToDelete === name; + }); + if (lineIndexToDelete === -1) { + alert(NOT_EXIST_NAME_ERROR_MESSAGE); + return; + } + this.deleteLineINFOInAllStations_(this.lines_[lineIndexToDelete]); + this.lines_.splice(lineIndexToDelete, 1); } + deleteLineINFOInAllStations_(lineToDelete) { + const { name, stationsOfLine } = lineToDelete; + stationsOfLine.forEach((station) => { + station.linesOfStation.delete(name); + }); + } getPointerFromStationsArray_(targetName) { const targetIndex = this.stations_.findIndex(({ name }) => { return name === targetName; @@ -77,4 +92,4 @@ export default class StationINFOManager { const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; -const NOT_EXIST_NAME_ERROR_MESSAGE = "์ œ๊ฑฐํ•  ์—ญ์ด ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."; +const NOT_EXIST_NAME_ERROR_MESSAGE = "์ œ๊ฑฐํ•  ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 35a4319f4..dd52a6559 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -2,7 +2,10 @@ import { getMessageToCheckLineInput, getMessageToCheckNotEquality, } from "../../utility/string-check-utility.js"; -import { getInputTextByID } from "../../utility/handle-document-utility.js"; +import { + getInputTextByID, + getAllElementsByClass, +} from "../../utility/handle-document-utility.js"; export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { @@ -16,7 +19,17 @@ export default class SectionManagerUI { this.setStationSelector_(START_STATION_SELECTOR_ID); this.setStationSelector_(END_STATION_SELECTOR_ID); this.addEventToLineAddButton_(); - this.updateLinesTable_(); + this.updateLinesTable(); + } + updateLinesTable() { + const linesINFOs = this.stationINFOManager_.getLinesNames(); + const tableContainer = document.getElementById(TABLE_ID); + let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; + linesINFOs.forEach((lineINFOs) => { + innerHTMLOfTable += this.createNewTableRowHTML_(lineINFOs); + }); + tableContainer.innerHTML = innerHTMLOfTable; + this.addEventToAllTableDeleteButton_(); } setStationSelector_(selectorID) { @@ -25,7 +38,7 @@ export default class SectionManagerUI { } createSelectorInnerHTML_() { const stationNames = this.stationINFOManager_.getStationsNames(); - let selectorInnerHTML = SELECTOR_TEMPLATE; + let selectorInnerHTML = ""; stationNames.forEach((name) => { selectorInnerHTML += this.createNewSelectorOptionHTML_(name); }); @@ -37,7 +50,7 @@ export default class SectionManagerUI { `; } addEventToLineAddButton_() { - const button = document.getElementById(ADD_BUTTON_ID); + const button = document.getElementById(LINE_ADD_BUTTON_ID); button.addEventListener("click", () => { const lineName = getInputTextByID(NAME_INPUT_ID); const startStationName = this.getSelectedOptionInSelector_( @@ -54,7 +67,7 @@ export default class SectionManagerUI { startStationName: startStationName, endStationName: endStationName, }); - this.updateLinesTable_(); + this.updateLinesTable(); }); } isLineINFOValid_(lineName, startStationName, endStationName) { @@ -78,14 +91,14 @@ export default class SectionManagerUI { const selector = document.getElementById(id); return selector[selector.selectedIndex].value; } - updateLinesTable_() { - const linesINFOs = this.stationINFOManager_.getLinesNames(); - const tableContainer = document.getElementById(TABLE_ID); - let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - linesINFOs.forEach((lineINFOs) => { - innerHTMLOfTable += this.createNewTableRowHTML_(lineINFOs); + addEventToAllTableDeleteButton_() { + const deleteButtons = getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); + Array.prototype.forEach.call(deleteButtons, (deleteButton) => { + deleteButton.addEventListener("click", (e) => { + this.stationINFOManager_.deleteLine(e.target.dataset.name); + this.updateLinesTable(); + }); }); - tableContainer.innerHTML = innerHTMLOfTable; } createNewTableRowHTML_({ name, startStationName, endStationName }) { return ` @@ -94,26 +107,30 @@ export default class SectionManagerUI { ${startStationName} ${endStationName} - + `; } } const NAME_INPUT_ID = "line-name-input"; + const START_STATION_SELECTOR_ID = "line-start-station-selector"; const END_STATION_SELECTOR_ID = "line-end-station-selector"; -const ADD_BUTTON_ID = "line-add-button"; -const DELETE_BUTTON_CLASS = "line-delete-button"; -const TABLE_ID = "line-table"; -const SELECTOR_TEMPLATE = ``; +const LINE_ADD_BUTTON_ID = "line-add-button"; +const LINE_DELETE_BUTTON_CLASS = "line-delete-button"; + +const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; + +const TABLE_ID = "line-table"; const TABLE_HEADER_TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„ ์ƒํ–‰ ์ข…์ ์—ญ ํ•˜ํ–‰ ์ข…์ ์—ญ ์„ค์ • `; + const TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„
@@ -125,7 +142,7 @@ const TEMPLATE = `

- +

๐Ÿš‰ ์ง€ํ•˜์ฒ  ๋…ธ์„  ๋ชฉ๋ก

From b1317cf3edad6c13deb50eaf0d1bd5a2f41747ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 16:28:06 +0900 Subject: [PATCH 36/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=9D=B4=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=EB=90=98=EA=B8=B0=20=EC=9D=B4=EC=A0=84?= =?UTF-8?q?=EC=97=90=20comfirm=20=EC=B0=BD=EC=9D=84=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index dd52a6559..10c18a8c6 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -95,6 +95,9 @@ export default class SectionManagerUI { const deleteButtons = getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); Array.prototype.forEach.call(deleteButtons, (deleteButton) => { deleteButton.addEventListener("click", (e) => { + if (!confirm(DELETE_CONFIRM_MESSAGE)) { + return; + } this.stationINFOManager_.deleteLine(e.target.dataset.name); this.updateLinesTable(); }); From 074b99df5cc6d470fdbc0cd46a2bd77c9f130256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 17:57:53 +0900 Subject: [PATCH 37/82] =?UTF-8?q?refactor:=20=EC=9E=85=EB=A0=A5=EA=B0=92?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=EB=A5=BC=20?= =?UTF-8?q?ui=EC=97=90=EC=84=9C=20=ED=95=9C=EB=B2=88=EC=97=90=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 37 +++++++++-------- src/ui/contents-ui/section-manager-ui.js | 30 +++++--------- src/ui/contents-ui/station-manager-ui.js | 15 +++++-- src/utility/string-check-utility.js | 51 +++++++++++++++++------- 4 files changed, 78 insertions(+), 55 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 3ced95eda..835507264 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -5,10 +5,6 @@ export default class StationINFOManager { } addNewStation({ name }) { - if (this.isOverlapName_(this.stations_, name)) { - alert(OVERLAP_STATION_ERROR_MESSAGE); - return; - } const newStation = { name: name, linesOfStation: new Set(), @@ -38,16 +34,11 @@ export default class StationINFOManager { return nameToDelete === name; }); if (stationIndexToDelete === -1) { - alert(NOT_EXIST_NAME_ERROR_MESSAGE); return; } this.stations_.splice(stationIndexToDelete, 1); } addNewLine({ lineName, startStationName, endStationName }) { - if (this.isOverlapName_(this.lines_, lineName)) { - alert(OVERLAP_LINE_ERROR_MESSAGE); - return; - } const startStationPtr = this.getPointerFromStationsArray_(startStationName); const endStationPtr = this.getPointerFromStationsArray_(endStationName); const newLine = { @@ -63,13 +54,32 @@ export default class StationINFOManager { return nameToDelete === name; }); if (lineIndexToDelete === -1) { - alert(NOT_EXIST_NAME_ERROR_MESSAGE); return; } this.deleteLineINFOInAllStations_(this.lines_[lineIndexToDelete]); this.lines_.splice(lineIndexToDelete, 1); } + isNotOverlapNameInStationsArray(inputName) { + const isValid = this.isNotOverlapName_(this.stations_, inputName); + if (!isValid) { + alert(OVERLAP_STATION_ERROR_MESSAGE); + } + return isValid; + } + isNotOverlapNameInLinesArray(inputName) { + const isValid = this.isNotOverlapName_(this.lines_, inputName); + if (!isValid) { + alert(OVERLAP_LINE_ERROR_MESSAGE); + } + return isValid; + } + isNotOverlapName_(targetToFindOverlap, inputName) { + const overlapIndex = targetToFindOverlap.findIndex( + ({ name }) => name === inputName + ); + return overlapIndex === -1; + } deleteLineINFOInAllStations_(lineToDelete) { const { name, stationsOfLine } = lineToDelete; stationsOfLine.forEach((station) => { @@ -82,14 +92,7 @@ export default class StationINFOManager { }); return this.stations_[targetIndex]; } - isOverlapName_(targetToFindOverlap, inputName) { - const overlapIndex = targetToFindOverlap.findIndex( - ({ name }) => name === inputName - ); - return overlapIndex !== -1; - } } const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; -const NOT_EXIST_NAME_ERROR_MESSAGE = "์ œ๊ฑฐํ•  ์š”์†Œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 10c18a8c6..05a6bf4a6 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,7 +1,4 @@ -import { - getMessageToCheckLineInput, - getMessageToCheckNotEquality, -} from "../../utility/string-check-utility.js"; +import { isValidLine } from "../../utility/string-check-utility.js"; import { getInputTextByID, getAllElementsByClass, @@ -59,7 +56,7 @@ export default class SectionManagerUI { const endStationName = this.getSelectedOptionInSelector_( END_STATION_SELECTOR_ID ); - if (!this.isLineINFOValid_(lineName, startStationName, endStationName)) { + if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { return; } this.stationINFOManager_.addNewLine({ @@ -70,22 +67,15 @@ export default class SectionManagerUI { this.updateLinesTable(); }); } - isLineINFOValid_(lineName, startStationName, endStationName) { - const lineNameCheckMessage = getMessageToCheckLineInput(lineName); - const equalityCheckMessage = getMessageToCheckNotEquality( - startStationName, - endStationName - ); - let ret_bool = true; - if (lineNameCheckMessage !== "์„ฑ๊ณต") { - alert(lineNameCheckMessage); - ret_bool = false; - } - if (equalityCheckMessage !== "์„ฑ๊ณต") { - alert(equalityCheckMessage); - ret_bool = false; + + isValidLineInput_(lineName, startStationName, endStationName) { + const condition1 = isValidLine(lineName, startStationName, endStationName); + const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray(lineName); + let boolToReturn = true; + if (!(condition1 && condition2)) { + boolToReturn = false; } - return ret_bool; + return boolToReturn; } getSelectedOptionInSelector_(id) { const selector = document.getElementById(id); diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index c9374e398..715a16c45 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,4 +1,4 @@ -import { getMessageToCheckStationName } from "../../utility/string-check-utility.js"; +import { isValidStation } from "../../utility/string-check-utility.js"; import { getInputTextByID, getAllElementsByClass, @@ -31,9 +31,7 @@ export default class StationManagerUI { const button = document.getElementById(STATION_ADD_BUTTON_ID); button.addEventListener("click", () => { const name = getInputTextByID(STATION_NAME_INPUT_ID); - const message = getMessageToCheckStationName(name); - if (message !== "์„ฑ๊ณต") { - alert(message); + if (!this.isValidStationInput_(name)) { return; } this.stationINFOManager_.addNewStation({ @@ -54,6 +52,15 @@ export default class StationManagerUI { }); }); } + isValidStationInput_(name) { + const condition1 = isValidStation(name); + const condition2 = this.stationINFOManager_.isNotOverlapNameInStationsArray(name); + let boolToReturn = true; + if (!(condition1 && condition2)) { + boolToReturn = false; + } + return boolToReturn; + } createNewTableRowHTML_(name) { const newTableRow = ` diff --git a/src/utility/string-check-utility.js b/src/utility/string-check-utility.js index c117d3227..a62a5bd6f 100644 --- a/src/utility/string-check-utility.js +++ b/src/utility/string-check-utility.js @@ -1,28 +1,51 @@ -export function getMessageToCheckStationName(name) { - const processedName = name.trim(); - if (processedName.length < MINIMUM_LENGTH_OF_STATION_NAME) { - return MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE; +export function isValidStation(name) { + const condition1 = canSatisfyLengthCondition({ + name: name, + minLength: MINIMUM_LENGTH_OF_STATION_NAME, + errorMessage: MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE, + }); + + if (!condition1) { + return false; } - return "์„ฑ๊ณต"; + return true; } -export function getMessageToCheckLineInput(name) { - const processedName = name.trim(); - if (processedName.length < MINIMUM_LENGTH_OF_LINE_NAME) { - return MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE; +export function isValidLine(name, startStationName, endStationName) { + const condition1 = canSatisfyLengthCondition({ + name: name, + minLength: MINIMUM_LENGTH_OF_LINE_NAME, + errorMessage: MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE, + }); + const condition2 = hasNotEqualName(startStationName, endStationName); + let boolToReturn = true; + + if (!(condition1 && condition2)) { + boolToReturn = false; } - return "์„ฑ๊ณต"; + return boolToReturn; +} +function canSatisfyLengthCondition({ name, minLength, errorMessage }) { + let boolToReturn = true; + if (name.length < minLength) { + alert(errorMessage); + boolToReturn = false; + } + return boolToReturn; } -export function getMessageToCheckNotEquality(startStationName, endStationName) { +function hasNotEqualName(startStationName, endStationName) { + let boolToReturn = true; if (startStationName === endStationName) { - return START_NAME_EQUAL_END_NAME_ERROR_MESSAGE; + alert(HAS_EQUAL_NAME_ERROR_MESSAGE); + boolToReturn = false; } - return "์„ฑ๊ณต"; + return boolToReturn; } const MINIMUM_LENGTH_OF_STATION_NAME = 2; const MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_STATION_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const MINIMUM_LENGTH_OF_LINE_NAME = 1; const MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE = `๋…ธ์„  ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_LINE_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; -const START_NAME_EQUAL_END_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; + +const HAS_EQUAL_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; From 9b2b5354889b514f9d3a4abdacb15f34fce358f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 19:11:18 +0900 Subject: [PATCH 38/82] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=20html=20string=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.js | 2 -- src/ui/contents-ui/line-manager-ui.js | 28 ++++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index c43ed45fd..5bab1ccd1 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,6 @@ import HTMLManager from "./html-manager.js"; import StationINFOManager from "./station-info-manager.js"; -const BODY_ID = "app"; - const stationINFOManager = new StationINFOManager(); new HTMLManager(stationINFOManager); diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 4934a44a1..d6d2839ad 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -11,5 +11,31 @@ export default class LineManagerUI { } const TEMPLATE = ` -line Template ์ž…๋‹ˆ๋‹ค. +

๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

+
+ +
+ +
+

1ํ˜ธ์„  ๊ด€๋ฆฌ

+

๊ตฌ๊ฐ„ ๋“ฑ๋ก

+

+ + + +

+ + + + + + + + +
์ˆœ์„œ์ด๋ฆ„์„ค์ •
12 + +
+ +
`; From 72d4e3b0fa1e889cc3bc15cd7e33128e4e2a81a9 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sat, 12 Dec 2020 19:22:44 +0900 Subject: [PATCH 39/82] =?UTF-8?q?docs:=20=EA=B5=AC=EA=B0=84=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9D=98=20=EA=B5=AC=ED=98=84=ED=95=A0=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EA=B5=AC=EC=B2=B4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9ebf8402a..55027f63e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,18 +18,21 @@ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - (์™„๋ฃŒ)๋…ธ์„ ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„๊ณผ ์ข…์  ์ •๋ณด๋“ค์„ ๋ฐ›์•„ ๋…ธ์„  ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - (์™„๋ฃŒ)๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ - - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ + - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด, ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด, ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ - - ์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ - - ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ + - (์™„๋ฃŒ)์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ + - (์™„๋ฃŒ)๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ - - html string ์ž‘์„ฑ - - ์ˆ˜์ • ๊ตฌ๊ฐ„ ์„ ํƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - ๊ตฌ๊ฐ„ ๋“ฑ๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - ๋…ธ์„  ์ œ๊ฑฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„ - - ์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ + - (์™„๋ฃŒ)html string ์ž‘์„ฑ + - ๊ตฌ๊ฐ„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•˜๋Š” ๋ฒ„ํŠผ ์ƒ์„ฑ + - ๋…ธ์„  ์„ ํƒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„  ๊ด€๋ฆฌ UI๊ฐ€ ์ƒ์„ฑ๋จ + - ์„ ํƒ๋œ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์—ญ๋“ค๋งŒ ์ฝค๋ณด ๋ฐ•์Šค์˜ ์˜ต์…˜์œผ๋กœ ์„ค์ • + - ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅ๋ฐ›์€ ๋…ธ์„ ์˜ ์ˆœ์„œ์— ์—ญ์ด ์ถ”๊ฐ€๋จ + - ์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ + - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ๋“ค์„ ํ‘œ๋กœ ์ถœ๋ ฅ + - ๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ - html string ์ž‘์„ฑ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ From 22344f78b6d67f0793eac5d87363ca201f92ae61 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sat, 12 Dec 2020 19:28:38 +0900 Subject: [PATCH 40/82] =?UTF-8?q?docs:=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 55027f63e..c5ea071a9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -6,10 +6,10 @@ - ์—ญ ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - (์™„๋ฃŒ)์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ - - (์™„๋ฃŒ)์—ญ ์ด๋ฆ„ ์ž…๋ ฅ์ด 2๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)์—ญ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์—ญ ๋ชฉ๋ก์— ์—ญ ์ถ”๊ฐ€ + - (์™„๋ฃŒ)์—ญ ์ด๋ฆ„ ์ž…๋ ฅ์ด 2๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋„์›€ - (์™„๋ฃŒ)์—ญ ๋ชฉ๋ก์„ ํ‘œ๋กœ ์ถœ๋ ฅํ•˜๋„๋ก ๊ตฌํ˜„ - - (์™„๋ฃŒ)์ค‘๋ณต๋œ ์—ญ ์ด๋ฆ„ ๋“ฑ๋ก ์ œํ•œ, ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ๋„์›€ - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ confirm ์ฐฝ ๋„์šฐ๊ธฐ - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ @@ -33,6 +33,7 @@ - ์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ๋“ค์„ ํ‘œ๋กœ ์ถœ๋ ฅ - ๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ + - ๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ - html string ์ž‘์„ฑ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ From 712db974dcc43da64b686b44c474115b13f7e721 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 19:40:23 +0900 Subject: [PATCH 41/82] =?UTF-8?q?fix:=20=EB=92=A4=EB=B0=94=EB=80=8C?= =?UTF-8?q?=EC=96=B4=20=EC=9E=88=EB=8D=98=20ui=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=98=AC=EB=B0=94=EB=A5=B4=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit line-manager-ui.js <-> section-manager-ui.js ํŒŒ์ผ์ด๋ฆ„๊ณผ ํด๋ž˜์Šค์ด๋ฆ„์ด ๋’ค๋ฐ”๋€Œ์–ด ์žˆ๋˜ ํ˜„์ƒ ์ˆ˜์ • --- src/html-manager.js | 8 +- src/station-info-manager.js | 2 +- src/ui/contents-ui/line-manager-ui.js | 155 ++++++++++++++++++---- src/ui/contents-ui/section-manager-ui.js | 158 +++++------------------ 4 files changed, 167 insertions(+), 156 deletions(-) diff --git a/src/html-manager.js b/src/html-manager.js index 052627bef..c0eae1e68 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -1,7 +1,7 @@ import MenubarUI from "./ui/menubar-ui.js"; import StationManagerUI from "./ui/contents-ui/station-manager-ui.js"; -import SectionManagerUI from "./ui/contents-ui/section-manager-ui.js"; import LineManagerUI from "./ui/contents-ui/line-manager-ui.js"; +import SectionManagerUI from "./ui/contents-ui/section-manager-ui.js"; import MapPrintManagerUI from "./ui/contents-ui/map-print-manager-ui.js"; export default class HTMLManager { @@ -21,14 +21,14 @@ export default class HTMLManager { ); } setContentsUIOnSectionUI() { - this.contentsUI_ = new SectionManagerUI( + this.contentsUI_ = new LineManagerUI( CONTENTS_ID, this.stationINFOManager ); } setContentsUIOnLineUI() { - this.contentsUI_ = new LineManagerUI( - CONTENTS_ID, + this.contentsUI_ = new SectionManagerUI( + CONTENTS_ID, this.stationINFOManager ); } diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 835507264..0940ccf2b 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -18,7 +18,7 @@ export default class StationINFOManager { }); return stationNames; } - getLinesNames() { + getLineINFOs() { const linesINFOs = []; this.lines_.forEach(({ name, stationsOfLine }) => { linesINFOs.push({ diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index d6d2839ad..96c5c7427 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,3 +1,9 @@ +import { isValidLine } from "../../utility/string-check-utility.js"; +import { + getInputTextByID, + getAllElementsByClass, +} from "../../utility/handle-document-utility.js"; + export default class LineManagerUI { constructor(contentsID, stationINFOManager) { this.contentsID_ = contentsID; @@ -7,35 +13,130 @@ export default class LineManagerUI { setContentsHTML() { document.getElementById(this.contentsID_).innerHTML = TEMPLATE; + this.setStationSelector_(START_STATION_SELECTOR_ID); + this.setStationSelector_(END_STATION_SELECTOR_ID); + this.addEventToLineAddButton_(); + this.updateLinesTable(); + } + updateLinesTable() { + const linesINFOs = this.stationINFOManager_.getLineINFOs(); + const tableContainer = document.getElementById(TABLE_ID); + let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; + linesINFOs.forEach((lineINFOs) => { + innerHTMLOfTable += this.createNewTableRowHTML_(lineINFOs); + }); + tableContainer.innerHTML = innerHTMLOfTable; + this.addEventToAllTableDeleteButton_(); + } + + setStationSelector_(selectorID) { + const selector = document.getElementById(selectorID); + selector.innerHTML = this.createSelectorInnerHTML_(); + } + createSelectorInnerHTML_() { + const stationNames = this.stationINFOManager_.getStationsNames(); + let selectorInnerHTML = ""; + stationNames.forEach((name) => { + selectorInnerHTML += this.createNewSelectorOptionHTML_(name); + }); + return selectorInnerHTML; + } + createNewSelectorOptionHTML_(name) { + return ` + + `; + } + addEventToLineAddButton_() { + const button = document.getElementById(LINE_ADD_BUTTON_ID); + button.addEventListener("click", () => { + const lineName = getInputTextByID(NAME_INPUT_ID); + const startStationName = this.getSelectedOptionInSelector_( + START_STATION_SELECTOR_ID + ); + const endStationName = this.getSelectedOptionInSelector_( + END_STATION_SELECTOR_ID + ); + if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { + return; + } + this.stationINFOManager_.addNewLine({ + lineName: lineName, + startStationName: startStationName, + endStationName: endStationName, + }); + this.updateLinesTable(); + }); + } + + isValidLineInput_(lineName, startStationName, endStationName) { + const condition1 = isValidLine(lineName, startStationName, endStationName); + const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray(lineName); + let boolToReturn = true; + if (!(condition1 && condition2)) { + boolToReturn = false; + } + return boolToReturn; + } + getSelectedOptionInSelector_(id) { + const selector = document.getElementById(id); + return selector[selector.selectedIndex].value; + } + addEventToAllTableDeleteButton_() { + const deleteButtons = getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); + Array.prototype.forEach.call(deleteButtons, (deleteButton) => { + deleteButton.addEventListener("click", (e) => { + if (!confirm(DELETE_CONFIRM_MESSAGE)) { + return; + } + this.stationINFOManager_.deleteLine(e.target.dataset.name); + this.updateLinesTable(); + }); + }); + } + createNewTableRowHTML_({ name, startStationName, endStationName }) { + return ` + + ${name} + ${startStationName} + ${endStationName} + + + + + `; } } +const NAME_INPUT_ID = "line-name-input"; + +const START_STATION_SELECTOR_ID = "line-start-station-selector"; +const END_STATION_SELECTOR_ID = "line-end-station-selector"; + +const LINE_ADD_BUTTON_ID = "line-add-button"; +const LINE_DELETE_BUTTON_CLASS = "line-delete-button"; + +const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; + +const TABLE_ID = "line-table"; +const TABLE_HEADER_TEMPLATE = ` +๋…ธ์„  ์ด๋ฆ„ +์ƒํ–‰ ์ข…์ ์—ญ +ํ•˜ํ–‰ ์ข…์ ์—ญ +์„ค์ • +`; const TEMPLATE = ` -

๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

-
- -
- -
-

1ํ˜ธ์„  ๊ด€๋ฆฌ

-

๊ตฌ๊ฐ„ ๋“ฑ๋ก

-

- - - -

- - - - - - - - -
์ˆœ์„œ์ด๋ฆ„์„ค์ •
12 - -
- -
+๋…ธ์„  ์ด๋ฆ„
+ +

+์ƒํ–‰ ์ข…์  +
+ํ•˜ํ–‰ ์ข…์  + +

+ +

๐Ÿš‰ ์ง€ํ•˜์ฒ  ๋…ธ์„  ๋ชฉ๋ก

+ +
`; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 05a6bf4a6..c5e3de86a 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,9 +1,3 @@ -import { isValidLine } from "../../utility/string-check-utility.js"; -import { - getInputTextByID, - getAllElementsByClass, -} from "../../utility/handle-document-utility.js"; - export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { this.contentsID_ = contentsID; @@ -13,130 +7,46 @@ export default class SectionManagerUI { setContentsHTML() { document.getElementById(this.contentsID_).innerHTML = TEMPLATE; - this.setStationSelector_(START_STATION_SELECTOR_ID); - this.setStationSelector_(END_STATION_SELECTOR_ID); - this.addEventToLineAddButton_(); - this.updateLinesTable(); - } - updateLinesTable() { - const linesINFOs = this.stationINFOManager_.getLinesNames(); - const tableContainer = document.getElementById(TABLE_ID); - let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - linesINFOs.forEach((lineINFOs) => { - innerHTMLOfTable += this.createNewTableRowHTML_(lineINFOs); - }); - tableContainer.innerHTML = innerHTMLOfTable; - this.addEventToAllTableDeleteButton_(); - } - - setStationSelector_(selectorID) { - const selector = document.getElementById(selectorID); - selector.innerHTML = this.createSelectorInnerHTML_(); - } - createSelectorInnerHTML_() { - const stationNames = this.stationINFOManager_.getStationsNames(); - let selectorInnerHTML = ""; - stationNames.forEach((name) => { - selectorInnerHTML += this.createNewSelectorOptionHTML_(name); - }); - return selectorInnerHTML; - } - createNewSelectorOptionHTML_(name) { - return ` - - `; - } - addEventToLineAddButton_() { - const button = document.getElementById(LINE_ADD_BUTTON_ID); - button.addEventListener("click", () => { - const lineName = getInputTextByID(NAME_INPUT_ID); - const startStationName = this.getSelectedOptionInSelector_( - START_STATION_SELECTOR_ID - ); - const endStationName = this.getSelectedOptionInSelector_( - END_STATION_SELECTOR_ID - ); - if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { - return; - } - this.stationINFOManager_.addNewLine({ - lineName: lineName, - startStationName: startStationName, - endStationName: endStationName, - }); - this.updateLinesTable(); - }); } - isValidLineInput_(lineName, startStationName, endStationName) { - const condition1 = isValidLine(lineName, startStationName, endStationName); - const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray(lineName); - let boolToReturn = true; - if (!(condition1 && condition2)) { - boolToReturn = false; - } - return boolToReturn; - } - getSelectedOptionInSelector_(id) { - const selector = document.getElementById(id); - return selector[selector.selectedIndex].value; - } - addEventToAllTableDeleteButton_() { - const deleteButtons = getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); - Array.prototype.forEach.call(deleteButtons, (deleteButton) => { - deleteButton.addEventListener("click", (e) => { - if (!confirm(DELETE_CONFIRM_MESSAGE)) { - return; - } - this.stationINFOManager_.deleteLine(e.target.dataset.name); - this.updateLinesTable(); - }); + updateLineButtons() { + const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV); + const lineINFOs = this.stationINFOManager_.getLineINFOs(); + let buttonDivInnerHTML = ""; + lineINFOs.forEach(({ name }) => { + //buttonDivInnerHTML += makeNew }); } - createNewTableRowHTML_({ name, startStationName, endStationName }) { - return ` - - ${name} - ${startStationName} - ${endStationName} - - - - - `; - } } -const NAME_INPUT_ID = "line-name-input"; -const START_STATION_SELECTOR_ID = "line-start-station-selector"; -const END_STATION_SELECTOR_ID = "line-end-station-selector"; - -const LINE_ADD_BUTTON_ID = "line-add-button"; -const LINE_DELETE_BUTTON_CLASS = "line-delete-button"; - -const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; - -const TABLE_ID = "line-table"; -const TABLE_HEADER_TEMPLATE = ` -๋…ธ์„  ์ด๋ฆ„ -์ƒํ–‰ ์ข…์ ์—ญ -ํ•˜ํ–‰ ์ข…์ ์—ญ -์„ค์ • -`; +const SECTION_LINE_MENU_DIV = "section-line-menu-div"; const TEMPLATE = ` -๋…ธ์„  ์ด๋ฆ„
- -

-์ƒํ–‰ ์ข…์  -
-ํ•˜ํ–‰ ์ข…์  - -

- -

๐Ÿš‰ ์ง€ํ•˜์ฒ  ๋…ธ์„  ๋ชฉ๋ก

- -
+

๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

+
+ +
+ +
+

1ํ˜ธ์„  ๊ด€๋ฆฌ

+

๊ตฌ๊ฐ„ ๋“ฑ๋ก

+

+ + + +

+ + + + + + + + +
์ˆœ์„œ์ด๋ฆ„์„ค์ •
12 + +
+ +
`; From def123034c5ab7f6e02fbc93ff5c1428a7b033e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 19:53:34 +0900 Subject: [PATCH 42/82] =?UTF-8?q?feat:=20=EA=B5=AC=EA=B0=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=ED=95=A0=20=EB=85=B8=EC=84=A0=EC=9D=84=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=ED=95=98=EB=8A=94=20=EB=B2=84=ED=8A=BC=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 --- src/ui/contents-ui/section-manager-ui.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index c5e3de86a..26b35fb32 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -7,24 +7,31 @@ export default class SectionManagerUI { setContentsHTML() { document.getElementById(this.contentsID_).innerHTML = TEMPLATE; + this.updateLineButtons_(); } - updateLineButtons() { + updateLineButtons_() { const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV); const lineINFOs = this.stationINFOManager_.getLineINFOs(); let buttonDivInnerHTML = ""; lineINFOs.forEach(({ name }) => { - //buttonDivInnerHTML += makeNew + buttonDivInnerHTML += this.makeNewSelectLineButtonHTML_(name); }); + buttonDiv.innerHTML = buttonDivInnerHTML; + } + makeNewSelectLineButtonHTML_(name) { + return ` + + `; } } const SECTION_LINE_MENU_DIV = "section-line-menu-div"; +const SECTION_LINE_MENU_BUTTON = "section-line-menu-button"; const TEMPLATE = `

๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

-
From 8a02904244b65c170f5acc8e112ebb25470d4f97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 20:27:07 +0900 Subject: [PATCH 43/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=20=EB=B2=84=ED=8A=BC=EC=9D=84=20=EB=88=84=EB=A5=B4?= =?UTF-8?q?=EB=A9=B4=20=EB=85=B8=EC=84=A0=20=EA=B4=80=EB=A6=AC=20UI?= =?UTF-8?q?=EA=B0=80=20=EC=83=9D=EC=84=B1=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 49 +++++++++++++++++++----- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 26b35fb32..6bd84df99 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -2,6 +2,7 @@ export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { this.contentsID_ = contentsID; this.stationINFOManager_ = stationINFOManager; + this.sectionRegisterUI = null; this.setContentsHTML(); } @@ -11,31 +12,50 @@ export default class SectionManagerUI { } updateLineButtons_() { - const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV); + const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV_ID); const lineINFOs = this.stationINFOManager_.getLineINFOs(); let buttonDivInnerHTML = ""; lineINFOs.forEach(({ name }) => { buttonDivInnerHTML += this.makeNewSelectLineButtonHTML_(name); }); buttonDiv.innerHTML = buttonDivInnerHTML; + this.addEventToSelectLineButton_(); + } + addEventToSelectLineButton_() { + const buttons = document.querySelectorAll( + "." + SECTION_LINE_MENU_BUTTON_CLASS + ); + Array.prototype.forEach.call(buttons, (button) => { + button.addEventListener("click", (e) => { + this.sectionRegisterUI = new SectionRegisterUI(e.target.dataset.name); + }); + }); } makeNewSelectLineButtonHTML_(name) { return ` - + `; } } -const SECTION_LINE_MENU_DIV = "section-line-menu-div"; -const SECTION_LINE_MENU_BUTTON = "section-line-menu-button"; +class SectionRegisterUI { + constructor(lineName) { + this.lineName = lineName; + this.setContentsHTML(); + } -const TEMPLATE = ` -

๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

-
-
+ setContentsHTML() { + const manageDiv = document.getElementById(SECTION_REGISTER_DIV_ID); + manageDiv.innerHTML = + this.makeTitleHTML(this.lineName) + SECTION_REGISTER_TEMPLATE; + } + makeTitleHTML(name) { + return `

${name} ๊ด€๋ฆฌ

`; + } +} -
-

1ํ˜ธ์„  ๊ด€๋ฆฌ

+const SECTION_REGISTER_DIV_ID = "section-register-div"; +const SECTION_REGISTER_TEMPLATE = `

๊ตฌ๊ฐ„ ๋“ฑ๋ก

+ diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 715a16c45..795083453 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -21,7 +21,7 @@ export default class StationManagerUI { const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; for (let name of stationsNames) { - innerHTMLOfTable += this.createNewTableRowHTML_(name); + innerHTMLOfTable += this.makeNewTableRowHTML_(name); } tableContainer.innerHTML = innerHTMLOfTable; this.addEventToAllTableDeleteButton_(); @@ -61,7 +61,7 @@ export default class StationManagerUI { } return boolToReturn; } - createNewTableRowHTML_(name) { + makeNewTableRowHTML_(name) { const newTableRow = ` ${name} From 219843b13d39db7669088490ff68c79e70acc739 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sat, 12 Dec 2020 21:01:21 +0900 Subject: [PATCH 45/82] =?UTF-8?q?docs:=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=83=81=ED=99=A9=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index c5ea071a9..f37788a1b 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,6 +21,7 @@ - (์™„๋ฃŒ)๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด, ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ + - ์ข…์  ์ •๋ณด๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - (์™„๋ฃŒ)์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ - (์™„๋ฃŒ)๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ @@ -31,6 +32,7 @@ - ์„ ํƒ๋œ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์—ญ๋“ค๋งŒ ์ฝค๋ณด ๋ฐ•์Šค์˜ ์˜ต์…˜์œผ๋กœ ์„ค์ • - ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅ๋ฐ›์€ ๋…ธ์„ ์˜ ์ˆœ์„œ์— ์—ญ์ด ์ถ”๊ฐ€๋จ - ์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ + - ๋…ธ์„ ์— ์ถ”๊ฐ€ํ•  ์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ๋“ค์„ ํ‘œ๋กœ ์ถœ๋ ฅ - ๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ - ๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ From 028bc31ed74c514fb93360c1430ec82591672132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 21:28:12 +0900 Subject: [PATCH 46/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EB=90=9C=20=EC=97=AD=EB=93=A4=EC=9D=84=20?= =?UTF-8?q?=ED=91=9C=EB=A1=9C=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 14 +++++-- src/ui/contents-ui/line-manager-ui.js | 14 +++---- src/ui/contents-ui/section-manager-ui.js | 48 +++++++++++++++++------- 3 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 2f606e3cb..49f4f92d2 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -11,7 +11,7 @@ export default class StationINFOManager { }; this.stations_.push(newStation); } - getStationsByCondition(condition) { + getStationNamesByCondition(condition) { const returnStations = []; this.stations_.forEach((station) => { if (condition(station)) { @@ -32,12 +32,20 @@ export default class StationINFOManager { this.lines_.forEach(({ name, stationsOfLine }) => { linesINFOs.push({ name: name, - startStationName: stationsOfLine[0].name, - endStationName: stationsOfLine[stationsOfLine.length - 1].name, + stationsOfLine: stationsOfLine, }); }); return linesINFOs; } + getLineINFOsByCondition(condition) { + const returnlines = []; + this.lines_.forEach((line) => { + if (condition(line)) { + returnlines.push(line); + } + }); + return returnlines; + } deleteStation(nameToDelete) { const stationIndexToDelete = this.stations_.findIndex(({ name }) => { return nameToDelete === name; diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 3a3c52dbe..d8853efaf 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -79,15 +79,15 @@ export default class LineManagerUI { }); }); } - makeNewTableRowHTML_({ name, startStationName, endStationName }) { + makeNewTableRowHTML_({ name, stationsOfLine }) { return ` - ${name} - ${startStationName} - ${endStationName} - - - + ${name} + ${stationsOfLine[0].name} + ${stationsOfLine[stationsOfLine.length - 1].name} + + + `; } diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index cfc3ab2cc..13219f507 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -53,10 +53,23 @@ class SectionRegisterUI { manageDiv.innerHTML = this.makeTitleHTML_(this.lineName_) + SECTION_REGISTER_TEMPLATE; this.setComboboxOption_(); + this.updateLineStationsTable(); } + updateLineStationsTable() { + const table = document.getElementById(SECTION_REGISTER_TABLE_ID); + const myLine = this.stationINFOManager_.getLineINFOsByCondition((line) => { + return line.name === this.lineName_; + })[0]; + let tableInnerHTML = TABLE_HEADER_TEMPLATE; + myLine.stationsOfLine.forEach((station, index) => { + tableInnerHTML += this.makeNewTableRowHTML(index, station.name); + }); + table.innerHTML = tableInnerHTML; + } + setComboboxOption_() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); - const optionNames = this.stationINFOManager_.getStationsByCondition( + const optionNames = this.stationINFOManager_.getStationNamesByCondition( (station) => { return !station.linesOfStation.has(this.lineName_); } @@ -67,7 +80,6 @@ class SectionRegisterUI { }); seletor.innerHTML = seletorInnerHTML; } - makeNewOptionHTML_(name) { return ` @@ -76,29 +88,37 @@ class SectionRegisterUI { makeTitleHTML_(name) { return `

${name} ๊ด€๋ฆฌ

`; } + makeNewTableRowHTML(index, name) { + return ` + + ${index} + ${name} + + + + + `; + } } const SECTION_REGISTER_DIV_ID = "section-register-div"; const SECTION_STATION_SELECTOR_ID = "section-station-selector"; +const SECTION_REGISTER_TABLE_ID = "section-register-table"; +const SECTION_DELETE_BUTTON_CLASS = "section-delete-button"; +const TABLE_HEADER_TEMPLATE = ` +์ˆœ์„œ +์ด๋ฆ„ +์„ค์ • +`; const SECTION_REGISTER_TEMPLATE = `

๊ตฌ๊ฐ„ ๋“ฑ๋ก

- +

- - - - - - - - - +
์ˆœ์„œ์ด๋ฆ„์„ค์ •
12 - -
`; From e2a40cbdafc423bf4edaab8cddbbc7fda252b576 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sat, 12 Dec 2020 23:15:46 +0900 Subject: [PATCH 47/82] =?UTF-8?q?feat:=20=EB=93=B1=EB=A1=9D=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=84=20=EB=88=84=EB=A5=B4=EB=A9=B4=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EC=9D=80=20=EB=85=B8=EC=84=A0=EC=9D=98=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=EC=97=90=20=EC=97=AD=EC=9D=B4=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 63 +++++++++++++++++------- src/ui/contents-ui/line-manager-ui.js | 17 +++---- src/ui/contents-ui/section-manager-ui.js | 33 +++++++++++-- src/utility/handle-document-utility.js | 4 ++ 4 files changed, 83 insertions(+), 34 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 49f4f92d2..c9417f03a 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -11,14 +11,26 @@ export default class StationINFOManager { }; this.stations_.push(newStation); } - getStationNamesByCondition(condition) { - const returnStations = []; - this.stations_.forEach((station) => { - if (condition(station)) { - returnStations.push(station.name); - } + addNewLine({ lineName, startStationName, endStationName }) { + const startStationPtr = this.getPointerFromStationsArray_(startStationName); + const endStationPtr = this.getPointerFromStationsArray_(endStationName); + const newLine = { + name: lineName, + stationsOfLine: [startStationPtr, endStationPtr], + }; + startStationPtr.linesOfStation.add(lineName); + endStationPtr.linesOfStation.add(lineName); + this.lines_.push(newLine); + } + registerStationToLine(lineName, indexToRegister, stationName) { + const targetLine = this.getOneLineINFOByCondition((line) => { + return line.name === lineName; }); - return returnStations; + const targetStation = this.getOneStationINFOByCondition((station) => { + return station.name === stationName; + }); + targetLine.stationsOfLine.splice(indexToRegister, 0, targetStation); + targetStation.linesOfStation.add(lineName); } getStationsNames() { const stationNames = []; @@ -27,6 +39,23 @@ export default class StationINFOManager { }); return stationNames; } + getOneStationINFOByCondition(condition) { + for (let station of this.stations_) { + if (condition(station)) { + return station; + } + } + return -1; + } + getStationNamesByCondition(condition) { + const returnStations = []; + this.stations_.forEach((station) => { + if (condition(station)) { + returnStations.push(station.name); + } + }); + return returnStations; + } getLineINFOs() { const linesINFOs = []; this.lines_.forEach(({ name, stationsOfLine }) => { @@ -37,6 +66,14 @@ export default class StationINFOManager { }); return linesINFOs; } + getOneLineINFOByCondition(condition) { + for (let line of this.lines_) { + if (condition(line)) { + return line; + } + } + return -1; + } getLineINFOsByCondition(condition) { const returnlines = []; this.lines_.forEach((line) => { @@ -55,17 +92,6 @@ export default class StationINFOManager { } this.stations_.splice(stationIndexToDelete, 1); } - addNewLine({ lineName, startStationName, endStationName }) { - const startStationPtr = this.getPointerFromStationsArray_(startStationName); - const endStationPtr = this.getPointerFromStationsArray_(endStationName); - const newLine = { - name: lineName, - stationsOfLine: [startStationPtr, endStationPtr], - }; - startStationPtr.linesOfStation.add(lineName); - endStationPtr.linesOfStation.add(lineName); - this.lines_.push(newLine); - } deleteLine(nameToDelete) { const lineIndexToDelete = this.lines_.findIndex(({ name }) => { return nameToDelete === name; @@ -91,6 +117,7 @@ export default class StationINFOManager { return isValid; } + //private isNotOverlapName_(targetToFindOverlap, inputName) { const overlapIndex = targetToFindOverlap.findIndex( ({ name }) => name === inputName diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index d8853efaf..70625cba8 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -2,6 +2,7 @@ import { isValidLine } from "../../utility/string-check-utility.js"; import { getInputTextByID, getAllElementsByClass, + getSelectedOptionByID, } from "../../utility/handle-document-utility.js"; export default class LineManagerUI { @@ -37,12 +38,8 @@ export default class LineManagerUI { const button = document.getElementById(LINE_ADD_BUTTON_ID); button.addEventListener("click", () => { const lineName = getInputTextByID(NAME_INPUT_ID); - const startStationName = this.getSelectedOptionInSelector_( - START_STATION_SELECTOR_ID - ); - const endStationName = this.getSelectedOptionInSelector_( - END_STATION_SELECTOR_ID - ); + const startStationName = getSelectedOptionByID(START_STATION_SELECTOR_ID); + const endStationName = getSelectedOptionByID(END_STATION_SELECTOR_ID); if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { return; } @@ -56,17 +53,15 @@ export default class LineManagerUI { } isValidLineInput_(lineName, startStationName, endStationName) { const condition1 = isValidLine(lineName, startStationName, endStationName); - const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray(lineName); + const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray( + lineName + ); let boolToReturn = true; if (!(condition1 && condition2)) { boolToReturn = false; } return boolToReturn; } - getSelectedOptionInSelector_(id) { - const selector = document.getElementById(id); - return selector[selector.selectedIndex].value; - } addEventToAllTableDeleteButton_() { const deleteButtons = getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); Array.prototype.forEach.call(deleteButtons, (deleteButton) => { diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 13219f507..ad99b0eb4 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,3 +1,9 @@ +import { + getInputTextByID, + getAllElementsByClass, + getSelectedOptionByID, +} from "../../utility/handle-document-utility.js"; + export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { this.contentsID_ = contentsID; @@ -22,9 +28,7 @@ export default class SectionManagerUI { this.addEventToSelectLineButton_(); } addEventToSelectLineButton_() { - const buttons = document.querySelectorAll( - "." + SECTION_LINE_MENU_BUTTON_CLASS - ); + const buttons = getAllElementsByClass(SECTION_LINE_MENU_BUTTON_CLASS); Array.prototype.forEach.call(buttons, (button) => { button.addEventListener("click", (e) => { this.sectionRegisterUI = new SectionRegisterUI( @@ -52,6 +56,10 @@ class SectionRegisterUI { const manageDiv = document.getElementById(SECTION_REGISTER_DIV_ID); manageDiv.innerHTML = this.makeTitleHTML_(this.lineName_) + SECTION_REGISTER_TEMPLATE; + this.addEventToSectionAddButton_(); + this.updateAllContents(); + } + updateAllContents() { this.setComboboxOption_(); this.updateLineStationsTable(); } @@ -67,6 +75,19 @@ class SectionRegisterUI { table.innerHTML = tableInnerHTML; } + addEventToSectionAddButton_() { + const button = document.getElementById(SECTION_ADD_BUTTON_ID); + button.addEventListener("click", () => { + const indexToRegister = getInputTextByID(SECTION_ORDER_INPUT_ID); + const stationName = getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); + this.stationINFOManager_.registerStationToLine( + this.lineName_, + indexToRegister, + stationName + ); + this.updateAllContents(); + }); + } setComboboxOption_() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); const optionNames = this.stationINFOManager_.getStationNamesByCondition( @@ -105,6 +126,8 @@ const SECTION_REGISTER_DIV_ID = "section-register-div"; const SECTION_STATION_SELECTOR_ID = "section-station-selector"; const SECTION_REGISTER_TABLE_ID = "section-register-table"; const SECTION_DELETE_BUTTON_CLASS = "section-delete-button"; +const SECTION_ORDER_INPUT_ID = "section-order-input"; +const SECTION_ADD_BUTTON_ID = "section-add-button"; const TABLE_HEADER_TEMPLATE = ` ์ˆœ์„œ ์ด๋ฆ„ @@ -115,8 +138,8 @@ const SECTION_REGISTER_TEMPLATE = `

- - + +

diff --git a/src/utility/handle-document-utility.js b/src/utility/handle-document-utility.js index 4de24bf97..e2d0c4c4d 100644 --- a/src/utility/handle-document-utility.js +++ b/src/utility/handle-document-utility.js @@ -4,3 +4,7 @@ export function getInputTextByID(id) { export function getAllElementsByClass(className) { return document.querySelectorAll("." + className); } +export function getSelectedOptionByID(id) { + const selector = document.getElementById(id); + return selector[selector.selectedIndex].value; +} From 5818d152dadfd098dced2acdb044ec4a1e5bbe57 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sat, 12 Dec 2020 23:17:28 +0900 Subject: [PATCH 48/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=EB=90=9C=20=EA=B8=B0=EB=8A=A5=EC=9D=98=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EC=83=81=ED=83=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index f37788a1b..e470c750c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,13 +27,13 @@ - (์™„๋ฃŒ)๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - - ๊ตฌ๊ฐ„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•˜๋Š” ๋ฒ„ํŠผ ์ƒ์„ฑ - - ๋…ธ์„  ์„ ํƒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„  ๊ด€๋ฆฌ UI๊ฐ€ ์ƒ์„ฑ๋จ - - ์„ ํƒ๋œ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์—ญ๋“ค๋งŒ ์ฝค๋ณด ๋ฐ•์Šค์˜ ์˜ต์…˜์œผ๋กœ ์„ค์ • - - ๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅ๋ฐ›์€ ๋…ธ์„ ์˜ ์ˆœ์„œ์— ์—ญ์ด ์ถ”๊ฐ€๋จ + - (์™„๋ฃŒ)๊ตฌ๊ฐ„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•˜๋Š” ๋ฒ„ํŠผ ์ƒ์„ฑ + - (์™„๋ฃŒ)๋…ธ์„  ์„ ํƒ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„  ๊ด€๋ฆฌ UI๊ฐ€ ์ƒ์„ฑ๋จ + - (์™„๋ฃŒ)์„ ํƒ๋œ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์—ญ๋“ค๋งŒ ์ฝค๋ณด ๋ฐ•์Šค์˜ ์˜ต์…˜์œผ๋กœ ์„ค์ • + - (์™„๋ฃŒ)๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ๋“ค์„ ํ‘œ๋กœ ์ถœ๋ ฅ + - (์™„๋ฃŒ)๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅ๋ฐ›์€ ๋…ธ์„ ์˜ ์ˆœ์„œ์— ์—ญ์ด ์ถ”๊ฐ€๋จ - ์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ - ๋…ธ์„ ์— ์ถ”๊ฐ€ํ•  ์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ๋“ค์„ ํ‘œ๋กœ ์ถœ๋ ฅ - ๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ - ๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ From 48e65cd718b9387ecfa7c9f8886a82cf2db061b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 00:14:56 +0900 Subject: [PATCH 49/82] =?UTF-8?q?feat:=20=EC=88=9C=EC=84=9C=20input=20text?= =?UTF-8?q?=EA=B0=80=200=20=EC=9D=B4=EC=83=81=EC=9D=98=20=EC=88=AB?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=95=84=EB=8B=88=EB=A9=B4=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 4 ++-- src/ui/contents-ui/section-manager-ui.js | 17 +++++++++++------ src/utility/string-check-utility.js | 18 ++++++++++++++++-- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index c9417f03a..26976c3ff 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -22,14 +22,14 @@ export default class StationINFOManager { endStationPtr.linesOfStation.add(lineName); this.lines_.push(newLine); } - registerStationToLine(lineName, indexToRegister, stationName) { + registerStationToLine(lineName, orderToRegister, stationName) { const targetLine = this.getOneLineINFOByCondition((line) => { return line.name === lineName; }); const targetStation = this.getOneStationINFOByCondition((station) => { return station.name === stationName; }); - targetLine.stationsOfLine.splice(indexToRegister, 0, targetStation); + targetLine.stationsOfLine.splice(orderToRegister, 0, targetStation); targetStation.linesOfStation.add(lineName); } getStationsNames() { diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index ad99b0eb4..117b23875 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -3,6 +3,7 @@ import { getAllElementsByClass, getSelectedOptionByID, } from "../../utility/handle-document-utility.js"; +import { isValidOrder } from "../../utility/string-check-utility.js"; export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { @@ -69,20 +70,24 @@ class SectionRegisterUI { return line.name === this.lineName_; })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; - myLine.stationsOfLine.forEach((station, index) => { - tableInnerHTML += this.makeNewTableRowHTML(index, station.name); + myLine.stationsOfLine.forEach((station, order) => { + tableInnerHTML += this.makeNewTableRowHTML(order, station.name); }); table.innerHTML = tableInnerHTML; } + //private addEventToSectionAddButton_() { const button = document.getElementById(SECTION_ADD_BUTTON_ID); button.addEventListener("click", () => { - const indexToRegister = getInputTextByID(SECTION_ORDER_INPUT_ID); + const orderToRegister = getInputTextByID(SECTION_ORDER_INPUT_ID); const stationName = getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); + if (!isValidOrder(orderToRegister)) { + return; + } this.stationINFOManager_.registerStationToLine( this.lineName_, - indexToRegister, + orderToRegister, stationName ); this.updateAllContents(); @@ -109,10 +114,10 @@ class SectionRegisterUI { makeTitleHTML_(name) { return `

${name} ๊ด€๋ฆฌ

`; } - makeNewTableRowHTML(index, name) { + makeNewTableRowHTML(order, name) { return ` - ${index} + ${order} ${name} diff --git a/src/utility/string-check-utility.js b/src/utility/string-check-utility.js index a62a5bd6f..b2c6f7c77 100644 --- a/src/utility/string-check-utility.js +++ b/src/utility/string-check-utility.js @@ -10,7 +10,6 @@ export function isValidStation(name) { } return true; } - export function isValidLine(name, startStationName, endStationName) { const condition1 = canSatisfyLengthCondition({ name: name, @@ -25,6 +24,19 @@ export function isValidLine(name, startStationName, endStationName) { } return boolToReturn; } +export function isValidOrder(order) { + let retBool = true; + if (order === "") { + alert(NOT_TYPE_OF_NUMBER_ERROR_MESSAGE); + retBool = false; + } + if (Number(order) < MINIMUM_VAILD_ORDER) { + alert(LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE); + retBool = false; + } + return retBool; +} + function canSatisfyLengthCondition({ name, minLength, errorMessage }) { let boolToReturn = true; if (name.length < minLength) { @@ -33,7 +45,6 @@ function canSatisfyLengthCondition({ name, minLength, errorMessage }) { } return boolToReturn; } - function hasNotEqualName(startStationName, endStationName) { let boolToReturn = true; if (startStationName === endStationName) { @@ -48,4 +59,7 @@ const MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMU const MINIMUM_LENGTH_OF_LINE_NAME = 1; const MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE = `๋…ธ์„  ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_LINE_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; +const MINIMUM_VAILD_ORDER = 0; +const NOT_TYPE_OF_NUMBER_ERROR_MESSAGE = "์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."; +const LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE = `์ˆœ์„œ๊ฐ’์€ ์ตœ์†Œ ${MINIMUM_VAILD_ORDER} ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const HAS_EQUAL_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; From 60fbb35b49b924fa4e43c4c2899d9792cdbe15a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 00:35:21 +0900 Subject: [PATCH 50/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=A0=20=EC=97=AD=EC=9D=B4=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EB=90=98=EC=A7=80=20=EC=95=8A=EC=95=98=EB=8B=A4?= =?UTF-8?q?=EB=A9=B4=20=EC=97=90=EB=9F=AC=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 7 ++++--- src/utility/share-constant-utility.js | 6 ++++++ src/utility/string-check-utility.js | 11 +++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/utility/share-constant-utility.js diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 117b23875..2cfb21a0c 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -3,7 +3,8 @@ import { getAllElementsByClass, getSelectedOptionByID, } from "../../utility/handle-document-utility.js"; -import { isValidOrder } from "../../utility/string-check-utility.js"; +import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; +import { isValidOrder, isValidOption } from "../../utility/string-check-utility.js"; export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { @@ -82,7 +83,7 @@ class SectionRegisterUI { button.addEventListener("click", () => { const orderToRegister = getInputTextByID(SECTION_ORDER_INPUT_ID); const stationName = getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); - if (!isValidOrder(orderToRegister)) { + if (!(isValidOrder(orderToRegister) && isValidOption(stationName))) { return; } this.stationINFOManager_.registerStationToLine( @@ -100,7 +101,7 @@ class SectionRegisterUI { return !station.linesOfStation.has(this.lineName_); } ); - let seletorInnerHTML = ""; + let seletorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; optionNames.forEach((optionName) => { seletorInnerHTML += this.makeNewOptionHTML_(optionName); }); diff --git a/src/utility/share-constant-utility.js b/src/utility/share-constant-utility.js new file mode 100644 index 000000000..0da19304b --- /dev/null +++ b/src/utility/share-constant-utility.js @@ -0,0 +1,6 @@ +export const SELECTEOR_NONE = "none"; + +export const SELECTOR_DEFAULT_TEMPLATE = ` + +`; + diff --git a/src/utility/string-check-utility.js b/src/utility/string-check-utility.js index b2c6f7c77..e0f8b1c08 100644 --- a/src/utility/string-check-utility.js +++ b/src/utility/string-check-utility.js @@ -1,3 +1,5 @@ +import { SELECTEOR_NONE } from "./share-constant-utility.js"; + export function isValidStation(name) { const condition1 = canSatisfyLengthCondition({ name: name, @@ -36,6 +38,14 @@ export function isValidOrder(order) { } return retBool; } +export function isValidOption(inputOption) { + let retBool = true; + if (inputOption === SELECTEOR_NONE) { + alert(NOT_SELECTED_OPTION_ERROR_MESSAGE); + retBool = false; + } + return retBool; +} function canSatisfyLengthCondition({ name, minLength, errorMessage }) { let boolToReturn = true; @@ -63,3 +73,4 @@ const MINIMUM_VAILD_ORDER = 0; const NOT_TYPE_OF_NUMBER_ERROR_MESSAGE = "์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."; const LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE = `์ˆœ์„œ๊ฐ’์€ ์ตœ์†Œ ${MINIMUM_VAILD_ORDER} ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const HAS_EQUAL_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; +const NOT_SELECTED_OPTION_ERROR_MESSAGE = "์ฝค๋ณด๋ฐ•์Šค์˜ ์˜ต์…˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."; \ No newline at end of file From 57a7d1449d17a28582ba87b27c901c880c4c3aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 00:48:19 +0900 Subject: [PATCH 51/82] =?UTF-8?q?feat:=20=EC=A2=85=EC=A0=90=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EA=B0=80=20=EC=84=A0=ED=83=9D=EB=90=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EC=95=98=EB=8B=A4=EB=A9=B4=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/line-manager-ui.js | 8 +++++--- src/ui/contents-ui/section-manager-ui.js | 17 +++++++++++++++-- src/ui/contents-ui/station-manager-ui.js | 2 +- ...-check-utility.js => input-check-utility.js} | 11 +++++++---- 4 files changed, 28 insertions(+), 10 deletions(-) rename src/utility/{string-check-utility.js => input-check-utility.js} (91%) diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 70625cba8..761a5dd92 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,4 +1,5 @@ -import { isValidLine } from "../../utility/string-check-utility.js"; +import { isValidLine, isValidOption } from "../../utility/input-check-utility.js"; +import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; import { getInputTextByID, getAllElementsByClass, @@ -56,8 +57,9 @@ export default class LineManagerUI { const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray( lineName ); + const condition3 = isValidOption([startStationName, endStationName]); let boolToReturn = true; - if (!(condition1 && condition2)) { + if (!(condition1 && condition2 && condition3)) { boolToReturn = false; } return boolToReturn; @@ -88,7 +90,7 @@ export default class LineManagerUI { } makeSelectorInnerHTML_() { const stationNames = this.stationINFOManager_.getStationsNames(); - let selectorInnerHTML = ""; + let selectorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; stationNames.forEach((name) => { selectorInnerHTML += this.makeNewSelectorOptionHTML_(name); }); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 2cfb21a0c..309352f8b 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -3,8 +3,11 @@ import { getAllElementsByClass, getSelectedOptionByID, } from "../../utility/handle-document-utility.js"; +import { + isValidOrder, + isValidOption, +} from "../../utility/input-check-utility.js"; import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; -import { isValidOrder, isValidOption } from "../../utility/string-check-utility.js"; export default class SectionManagerUI { constructor(contentsID, stationINFOManager) { @@ -83,7 +86,7 @@ class SectionRegisterUI { button.addEventListener("click", () => { const orderToRegister = getInputTextByID(SECTION_ORDER_INPUT_ID); const stationName = getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); - if (!(isValidOrder(orderToRegister) && isValidOption(stationName))) { + if (!this.isValidSectionAddInput_(orderToRegister, stationName)) { return; } this.stationINFOManager_.registerStationToLine( @@ -94,6 +97,16 @@ class SectionRegisterUI { this.updateAllContents(); }); } + isValidSectionAddInput_(orderToRegister, stationName) { + const condition1 = isValidOrder(orderToRegister); + const condition2 = isValidOption([stationName]); + let boolToReturn = true; + if (!(condition1 && condition2)) { + boolToReturn = false; + } + return boolToReturn; + } + setComboboxOption_() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); const optionNames = this.stationINFOManager_.getStationNamesByCondition( diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 795083453..3a5e79564 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,4 +1,4 @@ -import { isValidStation } from "../../utility/string-check-utility.js"; +import { isValidStation } from "../../utility/input-check-utility.js"; import { getInputTextByID, getAllElementsByClass, diff --git a/src/utility/string-check-utility.js b/src/utility/input-check-utility.js similarity index 91% rename from src/utility/string-check-utility.js rename to src/utility/input-check-utility.js index e0f8b1c08..d08145783 100644 --- a/src/utility/string-check-utility.js +++ b/src/utility/input-check-utility.js @@ -38,11 +38,14 @@ export function isValidOrder(order) { } return retBool; } -export function isValidOption(inputOption) { +export function isValidOption(inputOptions) { let retBool = true; - if (inputOption === SELECTEOR_NONE) { - alert(NOT_SELECTED_OPTION_ERROR_MESSAGE); - retBool = false; + for (let inputOption of inputOptions) { + if (inputOption === SELECTEOR_NONE) { + alert(NOT_SELECTED_OPTION_ERROR_MESSAGE); + retBool = false; + break; + } } return retBool; } From a1856fc053f9d16d2d49b42cb569e83d8653e820 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sun, 13 Dec 2020 00:49:38 +0900 Subject: [PATCH 52/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=EB=90=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=99=84=EB=A3=8C=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EB=A1=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index e470c750c..3639593ef 100644 --- a/docs/README.md +++ b/docs/README.md @@ -21,7 +21,7 @@ - (์™„๋ฃŒ)๋…ธ์„  ๋ชฉ๋ก์„ ํ‘œ๋กœ ํ™”๋ฉด์— ์ถœ๋ ฅ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ํ•œ ๊ธ€์ž ๋ฏธ๋งŒ์ด๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)๋…ธ์„  ์ด๋ฆ„์ด ์ค‘๋ณต์ด๋ฉด, ์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ด๋ฉด ์—๋Ÿฌ - - ์ข…์  ์ •๋ณด๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)์ข…์  ์ •๋ณด๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - (์™„๋ฃŒ)์‚ญ์ œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์ด ์‚ญ์ œ๋˜๋„๋ก ๊ตฌํ˜„ - (์™„๋ฃŒ)๋…ธ์„ ์ด ์‚ญ์ œ๋˜๊ธฐ ์ด์ „์— comfirm ์ฐฝ์„ ๋„์šฐ๊ธฐ @@ -32,8 +32,8 @@ - (์™„๋ฃŒ)์„ ํƒ๋œ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ์—ญ๋“ค๋งŒ ์ฝค๋ณด ๋ฐ•์Šค์˜ ์˜ต์…˜์œผ๋กœ ์„ค์ • - (์™„๋ฃŒ)๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ๋“ค์„ ํ‘œ๋กœ ์ถœ๋ ฅ - (์™„๋ฃŒ)๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅ๋ฐ›์€ ๋…ธ์„ ์˜ ์ˆœ์„œ์— ์—ญ์ด ์ถ”๊ฐ€๋จ - - ์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ - - ๋…ธ์„ ์— ์ถ”๊ฐ€ํ•  ์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ + - (์™„๋ฃŒ)์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ + - (์™„๋ฃŒ)๋…ธ์„ ์— ์ถ”๊ฐ€ํ•  ์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - ๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ - ๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ From f820d519b30af00bb538bee423668adadb72fee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 14:53:29 +0900 Subject: [PATCH 53/82] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=9E=AC=ED=99=9C=EC=9A=A9=EC=84=B1=EC=9D=84=20=EB=86=92?= =?UTF-8?q?=EC=9D=B4=EA=B8=B0=20=EC=9C=84=ED=95=B4=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=83=81=EC=86=8D=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 21 ++++++++ src/ui/contents-ui/contents-ui.js | 27 ++++++++++ src/ui/contents-ui/line-manager-ui.js | 35 +++++++------ src/ui/contents-ui/section-manager-ui.js | 65 ++++++++++++++---------- src/ui/contents-ui/station-manager-ui.js | 31 +++++------ src/utility/handle-document-utility.js | 10 ---- src/utility/share-constant-utility.js | 1 - 7 files changed, 120 insertions(+), 70 deletions(-) create mode 100644 src/ui/contents-ui/contents-ui.js delete mode 100644 src/utility/handle-document-utility.js diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 26976c3ff..ddda850da 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -102,6 +102,10 @@ export default class StationINFOManager { this.deleteLineINFOInAllStations_(this.lines_[lineIndexToDelete]); this.lines_.splice(lineIndexToDelete, 1); } + deleteSection(targetStationName, targetLineName) { + this.deleteLineInStation_(targetStationName, targetLineName); + this.deleteStationInLine_(targetStationName, targetLineName); + } isNotOverlapNameInStationsArray(inputName) { const isValid = this.isNotOverlapName_(this.stations_, inputName); if (!isValid) { @@ -124,6 +128,23 @@ export default class StationINFOManager { ); return overlapIndex === -1; } + deleteLineInStation_(targetStationName, targetLineName) { + const targetStation = this.getOneStationINFOByCondition((station) => { + return station.name === targetStationName; + }); + targetStation.linesOfStation.delete(targetLineName); + } + deleteStationInLine_(targetStationName, targetLineName) { + const targetLine = this.getOneLineINFOByCondition((line) => { + return line.name === targetLineName; + }); + const targetStationIndex = targetLine.stationsOfLine.findIndex( + (stationName) => { + return stationName === targetStationName; + } + ); + targetLine.stationsOfLine.splice(targetStationIndex, 1); + } deleteLineINFOInAllStations_(lineToDelete) { const { name, stationsOfLine } = lineToDelete; stationsOfLine.forEach((station) => { diff --git a/src/ui/contents-ui/contents-ui.js b/src/ui/contents-ui/contents-ui.js new file mode 100644 index 000000000..cc39d4656 --- /dev/null +++ b/src/ui/contents-ui/contents-ui.js @@ -0,0 +1,27 @@ +export class contentsUI { + constructor(contentsID, stationINFOManager) { + this.contentsID_ = contentsID; + this.stationINFOManager_ = stationINFOManager; + } + + setContentsHTML(initialTemplate) { + document.getElementById(this.contentsID_).innerHTML = initialTemplate; + } + + getInputTextByID(id) { + return document.getElementById(id).value.trim(); + } + getAllElementsByClass(className) { + return document.querySelectorAll("." + className); + } + getSelectedOptionByID(id) { + const selector = document.getElementById(id); + return selector[selector.selectedIndex].value; + } + addClickEventToAllButtonByClassName(className, callback) { + const button = document.querySelector("." + className); + button.addEventListener("click", (event) => { + callback(event); + }); + } +} diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 761a5dd92..a77230c2e 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,25 +1,24 @@ -import { isValidLine, isValidOption } from "../../utility/input-check-utility.js"; import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; import { - getInputTextByID, - getAllElementsByClass, - getSelectedOptionByID, -} from "../../utility/handle-document-utility.js"; + isValidLine, + isValidOption, +} from "../../utility/input-check-utility.js"; +import { contentsUI } from "./contents-ui.js"; -export default class LineManagerUI { +export default class LineManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { - this.contentsID_ = contentsID; - this.stationINFOManager_ = stationINFOManager; - this.setContentsHTML(); + super(contentsID, stationINFOManager); + this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML() { - document.getElementById(this.contentsID_).innerHTML = TEMPLATE; + setContentsHTML(initialTemplate) { + super.setContentsHTML(initialTemplate); this.setStationSelector_(START_STATION_SELECTOR_ID); this.setStationSelector_(END_STATION_SELECTOR_ID); this.addEventToLineAddButton_(); this.updateLinesTable(); } + updateLinesTable() { const linesINFOs = this.stationINFOManager_.getLineINFOs(); const tableContainer = document.getElementById(TABLE_ID); @@ -38,9 +37,13 @@ export default class LineManagerUI { addEventToLineAddButton_() { const button = document.getElementById(LINE_ADD_BUTTON_ID); button.addEventListener("click", () => { - const lineName = getInputTextByID(NAME_INPUT_ID); - const startStationName = getSelectedOptionByID(START_STATION_SELECTOR_ID); - const endStationName = getSelectedOptionByID(END_STATION_SELECTOR_ID); + const lineName = this.getInputTextByID(NAME_INPUT_ID); + const startStationName = this.getSelectedOptionByID( + START_STATION_SELECTOR_ID + ); + const endStationName = this.getSelectedOptionByID( + END_STATION_SELECTOR_ID + ); if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { return; } @@ -65,7 +68,7 @@ export default class LineManagerUI { return boolToReturn; } addEventToAllTableDeleteButton_() { - const deleteButtons = getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); + const deleteButtons = this.getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); Array.prototype.forEach.call(deleteButtons, (deleteButton) => { deleteButton.addEventListener("click", (e) => { if (!confirm(DELETE_CONFIRM_MESSAGE)) { @@ -120,7 +123,7 @@ const TABLE_HEADER_TEMPLATE = ` ์„ค์ • `; -const TEMPLATE = ` +const INITIAL_TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„

diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 309352f8b..2079d92a4 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,24 +1,20 @@ -import { - getInputTextByID, - getAllElementsByClass, - getSelectedOptionByID, -} from "../../utility/handle-document-utility.js"; import { isValidOrder, isValidOption, } from "../../utility/input-check-utility.js"; import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; +import { contentsUI } from "./contents-ui.js"; -export default class SectionManagerUI { +export default class SectionManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { - this.contentsID_ = contentsID; - this.stationINFOManager_ = stationINFOManager; + super(contentsID, stationINFOManager); + this.sectionRegisterUI = null; - this.setContentsHTML(); + this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML() { - document.getElementById(this.contentsID_).innerHTML = TEMPLATE; + setContentsHTML(initialTemplate) { + super.setContentsHTML(initialTemplate); this.updateLineButtons_(); } @@ -33,12 +29,14 @@ export default class SectionManagerUI { this.addEventToSelectLineButton_(); } addEventToSelectLineButton_() { - const buttons = getAllElementsByClass(SECTION_LINE_MENU_BUTTON_CLASS); + const buttons = this.getAllElementsByClass(SECTION_LINE_MENU_BUTTON_CLASS); Array.prototype.forEach.call(buttons, (button) => { button.addEventListener("click", (e) => { this.sectionRegisterUI = new SectionRegisterUI( - e.target.dataset.name, - this.stationINFOManager_ + SECTION_REGISTER_DIV_ID, + this.stationINFOManager_, + SECTION_REGISTER_TEMPLATE, + e.target.dataset.name ); }); }); @@ -50,20 +48,20 @@ export default class SectionManagerUI { } } -class SectionRegisterUI { - constructor(lineName, stationINFOManager) { +class SectionRegisterUI extends contentsUI { + constructor(contentsID, stationINFOManager, initialTemplate, lineName) { + super(contentsID, stationINFOManager); this.lineName_ = lineName; - this.stationINFOManager_ = stationINFOManager; - this.setContentsHTML(); + this.setContentsHTML(initialTemplate); } - setContentsHTML() { - const manageDiv = document.getElementById(SECTION_REGISTER_DIV_ID); - manageDiv.innerHTML = - this.makeTitleHTML_(this.lineName_) + SECTION_REGISTER_TEMPLATE; + setContentsHTML(initialTemplate) { + initialTemplate = this.makeTitleHTML_(this.lineName_) + initialTemplate; + super.setContentsHTML(initialTemplate); this.addEventToSectionAddButton_(); this.updateAllContents(); } + updateAllContents() { this.setComboboxOption_(); this.updateLineStationsTable(); @@ -75,17 +73,28 @@ class SectionRegisterUI { })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; myLine.stationsOfLine.forEach((station, order) => { - tableInnerHTML += this.makeNewTableRowHTML(order, station.name); + tableInnerHTML += this.makeNewTableRowHTML_(order, station.name); }); table.innerHTML = tableInnerHTML; + this.addClickEventToAllButtonByClassName( + SECTION_DELETE_BUTTON_CLASS, + this.deleteButtonCallback_ + ); } //private + deleteButtonCallback_(event) { + const targetStationName = event.target.dataset.name; + this.stationINFOManager_.deleteSection(targetStationName, this.lineName_); + this.updateAllContents(); + } addEventToSectionAddButton_() { const button = document.getElementById(SECTION_ADD_BUTTON_ID); button.addEventListener("click", () => { - const orderToRegister = getInputTextByID(SECTION_ORDER_INPUT_ID); - const stationName = getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); + const orderToRegister = this.getInputTextByID(SECTION_ORDER_INPUT_ID); + const stationName = this.getSelectedOptionByID( + SECTION_STATION_SELECTOR_ID + ); if (!this.isValidSectionAddInput_(orderToRegister, stationName)) { return; } @@ -106,7 +115,7 @@ class SectionRegisterUI { } return boolToReturn; } - + setComboboxOption_() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); const optionNames = this.stationINFOManager_.getStationNamesByCondition( @@ -128,7 +137,7 @@ class SectionRegisterUI { makeTitleHTML_(name) { return `

${name} ๊ด€๋ฆฌ

`; } - makeNewTableRowHTML(order, name) { + makeNewTableRowHTML_(order, name) { return ` ${order} @@ -166,7 +175,7 @@ const SECTION_REGISTER_TEMPLATE = ` const SECTION_LINE_MENU_DIV_ID = "section-line-menu-div"; const SECTION_LINE_MENU_BUTTON_CLASS = "section-line-menu-button"; -const TEMPLATE = ` +const INITIAL_TEMPLATE = `

๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 3a5e79564..943a2b7a9 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,21 +1,18 @@ import { isValidStation } from "../../utility/input-check-utility.js"; -import { - getInputTextByID, - getAllElementsByClass, -} from "../../utility/handle-document-utility.js"; +import { contentsUI } from "./contents-ui.js"; -export default class StationManagerUI { +export default class StationManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { - this.contentsID_ = contentsID; - this.stationINFOManager_ = stationINFOManager; - this.setContentsHTML(); - this.updateStationsTable(); + super(contentsID, stationINFOManager); + + this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML() { - document.getElementById(this.contentsID_).innerHTML = TEMPLATE; + setContentsHTML(initialTemplate) { + super.setContentsHTML(initialTemplate); this.addEventToNameInputButton_(); } + updateStationsTable() { const stationsNames = this.stationINFOManager_.getStationsNames(); const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); @@ -30,7 +27,7 @@ export default class StationManagerUI { addEventToNameInputButton_() { const button = document.getElementById(STATION_ADD_BUTTON_ID); button.addEventListener("click", () => { - const name = getInputTextByID(STATION_NAME_INPUT_ID); + const name = this.getInputTextByID(STATION_NAME_INPUT_ID); if (!this.isValidStationInput_(name)) { return; } @@ -41,7 +38,9 @@ export default class StationManagerUI { }); } addEventToAllTableDeleteButton_() { - const deleteButtons = getAllElementsByClass(STATION_DELETE_BUTTON_CLASS); + const deleteButtons = this.getAllElementsByClass( + STATION_DELETE_BUTTON_CLASS + ); Array.prototype.forEach.call(deleteButtons, (deleteButton) => { deleteButton.addEventListener("click", (e) => { if (!confirm(DELETE_CONFIRM_MESSAGE)) { @@ -54,7 +53,9 @@ export default class StationManagerUI { } isValidStationInput_(name) { const condition1 = isValidStation(name); - const condition2 = this.stationINFOManager_.isNotOverlapNameInStationsArray(name); + const condition2 = this.stationINFOManager_.isNotOverlapNameInStationsArray( + name + ); let boolToReturn = true; if (!(condition1 && condition2)) { boolToReturn = false; @@ -78,7 +79,7 @@ const STATION_ADD_BUTTON_ID = "station-add-button"; const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; const STATION_NAME_TABLE_ID = "station-name-table"; const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; -const TEMPLATE = ` +const INITIAL_TEMPLATE = ` ์—ญ ์ด๋ฆ„
diff --git a/src/utility/handle-document-utility.js b/src/utility/handle-document-utility.js deleted file mode 100644 index e2d0c4c4d..000000000 --- a/src/utility/handle-document-utility.js +++ /dev/null @@ -1,10 +0,0 @@ -export function getInputTextByID(id) { - return document.getElementById(id).value.trim(); -} -export function getAllElementsByClass(className) { - return document.querySelectorAll("." + className); -} -export function getSelectedOptionByID(id) { - const selector = document.getElementById(id); - return selector[selector.selectedIndex].value; -} diff --git a/src/utility/share-constant-utility.js b/src/utility/share-constant-utility.js index 0da19304b..e4554af66 100644 --- a/src/utility/share-constant-utility.js +++ b/src/utility/share-constant-utility.js @@ -3,4 +3,3 @@ export const SELECTEOR_NONE = "none"; export const SELECTOR_DEFAULT_TEMPLATE = ` `; - From 1dfc4f8f09758b1d86151accfadac3c63f1834b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 15:39:28 +0900 Subject: [PATCH 54/82] =?UTF-8?q?refactor:=20=ED=81=B4=EB=A6=AD=20?= =?UTF-8?q?=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=ED=95=A8?= =?UTF-8?q?=EC=88=98=EC=9D=98=20=EC=9E=AC=ED=99=9C=EC=9A=A9=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EB=86=92=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค ์ค‘๋ณต ์‚ฌ์šฉ๋˜๋˜ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ข€ ๋” ํ™œ์šฉ์„ฑ์„ ๋†’์ธ ํ˜•ํƒœ๋กœ UI ๊ณตํ†ต ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์†Œ๋“œ๋กœ ์ถ”๊ฐ€ํ•จ --- src/ui/contents-ui/contents-ui.js | 14 +++-- src/ui/contents-ui/line-manager-ui.js | 65 +++++++++++++----------- src/ui/contents-ui/section-manager-ui.js | 52 ++++++++++--------- src/ui/contents-ui/station-manager-ui.js | 48 +++++++++-------- 4 files changed, 101 insertions(+), 78 deletions(-) diff --git a/src/ui/contents-ui/contents-ui.js b/src/ui/contents-ui/contents-ui.js index cc39d4656..68ca25327 100644 --- a/src/ui/contents-ui/contents-ui.js +++ b/src/ui/contents-ui/contents-ui.js @@ -19,9 +19,17 @@ export class contentsUI { return selector[selector.selectedIndex].value; } addClickEventToAllButtonByClassName(className, callback) { - const button = document.querySelector("." + className); - button.addEventListener("click", (event) => { - callback(event); + const buttons = document.querySelectorAll("." + className); + Array.prototype.forEach.call(buttons, (button) => { + button.addEventListener("click", (event) => { + callback.call(this, event); + }); + }); + } + addClickEventToButtonByID_(id, callback) { + const button = document.getElementById(id); + button.addEventListener("click", () => { + callback.call(this); }); } } diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index a77230c2e..588f77027 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -30,31 +30,48 @@ export default class LineManagerUI extends contentsUI { this.addEventToAllTableDeleteButton_(); } + //private setStationSelector_(selectorID) { const selector = document.getElementById(selectorID); selector.innerHTML = this.makeSelectorInnerHTML_(); } addEventToLineAddButton_() { - const button = document.getElementById(LINE_ADD_BUTTON_ID); - button.addEventListener("click", () => { - const lineName = this.getInputTextByID(NAME_INPUT_ID); - const startStationName = this.getSelectedOptionByID( - START_STATION_SELECTOR_ID - ); - const endStationName = this.getSelectedOptionByID( - END_STATION_SELECTOR_ID - ); - if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { - return; - } - this.stationINFOManager_.addNewLine({ - lineName: lineName, - startStationName: startStationName, - endStationName: endStationName, - }); - this.updateLinesTable(); + this.addClickEventToButtonByID_( + LINE_ADD_BUTTON_ID, + this.callbackLineAddButton + ); + } + callbackLineAddButton() { + const lineName = this.getInputTextByID(NAME_INPUT_ID); + const startStationName = this.getSelectedOptionByID( + START_STATION_SELECTOR_ID + ); + const endStationName = this.getSelectedOptionByID(END_STATION_SELECTOR_ID); + if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { + return; + } + this.stationINFOManager_.addNewLine({ + lineName: lineName, + startStationName: startStationName, + endStationName: endStationName, }); + this.updateLinesTable(); + } + + addEventToAllTableDeleteButton_() { + this.addClickEventToAllButtonByClassName( + LINE_DELETE_BUTTON_CLASS, + this.callbackOfDeleteButton_ + ); + } + callbackOfDeleteButton_(event) { + if (!confirm(DELETE_CONFIRM_MESSAGE)) { + return; + } + this.stationINFOManager_.deleteLine(event.target.dataset.name); + this.updateLinesTable(); } + isValidLineInput_(lineName, startStationName, endStationName) { const condition1 = isValidLine(lineName, startStationName, endStationName); const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray( @@ -67,18 +84,6 @@ export default class LineManagerUI extends contentsUI { } return boolToReturn; } - addEventToAllTableDeleteButton_() { - const deleteButtons = this.getAllElementsByClass(LINE_DELETE_BUTTON_CLASS); - Array.prototype.forEach.call(deleteButtons, (deleteButton) => { - deleteButton.addEventListener("click", (e) => { - if (!confirm(DELETE_CONFIRM_MESSAGE)) { - return; - } - this.stationINFOManager_.deleteLine(e.target.dataset.name); - this.updateLinesTable(); - }); - }); - } makeNewTableRowHTML_({ name, stationsOfLine }) { return ` diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 2079d92a4..c79d68db8 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -35,7 +35,6 @@ export default class SectionManagerUI extends contentsUI { this.sectionRegisterUI = new SectionRegisterUI( SECTION_REGISTER_DIV_ID, this.stationINFOManager_, - SECTION_REGISTER_TEMPLATE, e.target.dataset.name ); }); @@ -49,10 +48,10 @@ export default class SectionManagerUI extends contentsUI { } class SectionRegisterUI extends contentsUI { - constructor(contentsID, stationINFOManager, initialTemplate, lineName) { + constructor(contentsID, stationINFOManager, lineName) { super(contentsID, stationINFOManager); this.lineName_ = lineName; - this.setContentsHTML(initialTemplate); + this.setContentsHTML(SECTION_REGISTER_TEMPLATE); } setContentsHTML(initialTemplate) { @@ -76,36 +75,42 @@ class SectionRegisterUI extends contentsUI { tableInnerHTML += this.makeNewTableRowHTML_(order, station.name); }); table.innerHTML = tableInnerHTML; + //this.addEventToAllDeleteButtons_(); + } + + //private + addEventToAllDeleteButtons_() { this.addClickEventToAllButtonByClassName( SECTION_DELETE_BUTTON_CLASS, - this.deleteButtonCallback_ + this.callbackOfDeleteButton_ ); } - - //private - deleteButtonCallback_(event) { + callbackOfDeleteButton_(event) { const targetStationName = event.target.dataset.name; this.stationINFOManager_.deleteSection(targetStationName, this.lineName_); this.updateAllContents(); } + addEventToSectionAddButton_() { - const button = document.getElementById(SECTION_ADD_BUTTON_ID); - button.addEventListener("click", () => { - const orderToRegister = this.getInputTextByID(SECTION_ORDER_INPUT_ID); - const stationName = this.getSelectedOptionByID( - SECTION_STATION_SELECTOR_ID - ); - if (!this.isValidSectionAddInput_(orderToRegister, stationName)) { - return; - } - this.stationINFOManager_.registerStationToLine( - this.lineName_, - orderToRegister, - stationName - ); - this.updateAllContents(); - }); + this.addClickEventToButtonByID_( + SECTION_ADD_BUTTON_ID, + this.callbackOfSectionAddButton_ + ); } + callbackOfSectionAddButton_() { + const orderToRegister = this.getInputTextByID(SECTION_ORDER_INPUT_ID); + const stationName = this.getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); + if (!this.isValidSectionAddInput_(orderToRegister, stationName)) { + return; + } + this.stationINFOManager_.registerStationToLine( + this.lineName_, + orderToRegister, + stationName + ); + this.updateAllContents(); + } + isValidSectionAddInput_(orderToRegister, stationName) { const condition1 = isValidOrder(orderToRegister); const condition2 = isValidOption([stationName]); @@ -115,7 +120,6 @@ class SectionRegisterUI extends contentsUI { } return boolToReturn; } - setComboboxOption_() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); const optionNames = this.stationINFOManager_.getStationNamesByCondition( diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 943a2b7a9..9fd8bd3f8 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -11,6 +11,7 @@ export default class StationManagerUI extends contentsUI { setContentsHTML(initialTemplate) { super.setContentsHTML(initialTemplate); this.addEventToNameInputButton_(); + this.updateStationsTable(); } updateStationsTable() { @@ -24,33 +25,38 @@ export default class StationManagerUI extends contentsUI { this.addEventToAllTableDeleteButton_(); } + //private addEventToNameInputButton_() { - const button = document.getElementById(STATION_ADD_BUTTON_ID); - button.addEventListener("click", () => { - const name = this.getInputTextByID(STATION_NAME_INPUT_ID); - if (!this.isValidStationInput_(name)) { - return; - } - this.stationINFOManager_.addNewStation({ - name: name, - }); - this.updateStationsTable(); + this.addClickEventToButtonByID_( + STATION_ADD_BUTTON_ID, + this.callbackOfNameInputButton_ + ); + } + callbackOfNameInputButton_() { + const name = this.getInputTextByID(STATION_NAME_INPUT_ID); + if (!this.isValidStationInput_(name)) { + return; + } + this.stationINFOManager_.addNewStation({ + name: name, }); + this.updateStationsTable(); } + addEventToAllTableDeleteButton_() { - const deleteButtons = this.getAllElementsByClass( - STATION_DELETE_BUTTON_CLASS + this.addClickEventToAllButtonByClassName( + STATION_DELETE_BUTTON_CLASS, + this.callbackOfTableDeleteButton_ ); - Array.prototype.forEach.call(deleteButtons, (deleteButton) => { - deleteButton.addEventListener("click", (e) => { - if (!confirm(DELETE_CONFIRM_MESSAGE)) { - return; - } - this.stationINFOManager_.deleteStation(e.target.dataset.name); - this.updateStationsTable(); - }); - }); } + callbackOfTableDeleteButton_(event) { + if (!confirm(DELETE_CONFIRM_MESSAGE)) { + return; + } + this.stationINFOManager_.deleteStation(event.target.dataset.name); + this.updateStationsTable(); + } + isValidStationInput_(name) { const condition1 = isValidStation(name); const condition2 = this.stationINFOManager_.isNotOverlapNameInStationsArray( From ccf61eb0b75bbea7fab1c512cb0bf104684cf1e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 15:56:55 +0900 Subject: [PATCH 55/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=9C=EA=B1=B0=20=EB=B2=84=ED=8A=BC=EC=9D=84=20?= =?UTF-8?q?=EB=88=84=EB=A5=B4=EB=A9=B4=20=EB=85=B8=EC=84=A0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=97=AD=EC=9D=B4=20=EC=A0=9C=EA=B1=B0=EB=90=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 2 +- src/ui/contents-ui/section-manager-ui.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index ddda850da..f073ba8cc 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -140,7 +140,7 @@ export default class StationINFOManager { }); const targetStationIndex = targetLine.stationsOfLine.findIndex( (stationName) => { - return stationName === targetStationName; + return stationName.name === targetStationName; } ); targetLine.stationsOfLine.splice(targetStationIndex, 1); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index c79d68db8..8d9223fa0 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -75,7 +75,7 @@ class SectionRegisterUI extends contentsUI { tableInnerHTML += this.makeNewTableRowHTML_(order, station.name); }); table.innerHTML = tableInnerHTML; - //this.addEventToAllDeleteButtons_(); + this.addEventToAllDeleteButtons_(); } //private @@ -147,7 +147,7 @@ class SectionRegisterUI extends contentsUI { ${order} ${name} - + `; From 18f14cb8720d5fd8d48e15a3d26946a42e54fe69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 16:05:01 +0900 Subject: [PATCH 56/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=9C=EA=B1=B0=20=EB=8F=99=EC=9E=91=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=ED=96=89=ED=95=98=EA=B8=B0=20=EC=A0=84=EC=97=90=20con?= =?UTF-8?q?firm=20=EC=B0=BD=EC=9D=84=20=EB=9D=84=EC=9A=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/section-manager-ui.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 8d9223fa0..f328cd772 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -86,6 +86,9 @@ class SectionRegisterUI extends contentsUI { ); } callbackOfDeleteButton_(event) { + if (!confirm(DELETE_CONFIRM_MESSAGE)) { + return; + } const targetStationName = event.target.dataset.name; this.stationINFOManager_.deleteSection(targetStationName, this.lineName_); this.updateAllContents(); @@ -160,6 +163,7 @@ const SECTION_REGISTER_TABLE_ID = "section-register-table"; const SECTION_DELETE_BUTTON_CLASS = "section-delete-button"; const SECTION_ORDER_INPUT_ID = "section-order-input"; const SECTION_ADD_BUTTON_ID = "section-add-button"; +const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ๋…ธ์„ ์—์„œ ์ œ๊ฑฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; const TABLE_HEADER_TEMPLATE = ` ์ˆœ์„œ ์ด๋ฆ„ From 4e4b3f286c38d1c0bc5faf080ca908225cd3761f Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sun, 13 Dec 2020 16:06:14 +0900 Subject: [PATCH 57/82] =?UTF-8?q?docs:=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=83=81=ED=99=A9=20=EC=B6=94=EA=B0=80,=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EB=90=9C=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C=20=EC=83=81=ED=83=9C=EB=A1=9C=20=EA=B0=B1?= =?UTF-8?q?=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 3639593ef..3fc049a0f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,7 +34,8 @@ - (์™„๋ฃŒ)๋“ฑ๋ก ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅ๋ฐ›์€ ๋…ธ์„ ์˜ ์ˆœ์„œ์— ์—ญ์ด ์ถ”๊ฐ€๋จ - (์™„๋ฃŒ)์ˆœ์„œ input text๊ฐ€ 0 ์ด์ƒ์˜ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์—๋Ÿฌ๋ฉ”์„ธ์ง€ ์ƒ์„ฑ - (์™„๋ฃŒ)๋…ธ์„ ์— ์ถ”๊ฐ€ํ•  ์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - - ๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ + - (์™„๋ฃŒ)๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ + - (์™„๋ฃŒ)๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— confirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - ๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ - html string ์ž‘์„ฑ From c60093f72a166efc5dfe16f8677d2e9206e5b686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 16:16:14 +0900 Subject: [PATCH 58/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90=20?= =?UTF-8?q?=ED=8F=AC=ED=95=A8=EB=90=9C=20=EC=97=AD=EC=9D=B4=202=EA=B0=9C?= =?UTF-8?q?=20=EC=9D=B4=ED=95=98=EC=9D=BC=20=EB=95=8C=EB=8A=94=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=ED=95=A0=20=EC=88=98=20=EC=97=86=EB=8F=84=EB=A1=9D=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/station-info-manager.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index f073ba8cc..1798aa145 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -103,6 +103,13 @@ export default class StationINFOManager { this.lines_.splice(lineIndexToDelete, 1); } deleteSection(targetStationName, targetLineName) { + const targetLine = this.getOneLineINFOByCondition((line) => { + return line.name === targetLineName; + }); + if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { + alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); + return; + } this.deleteLineInStation_(targetStationName, targetLineName); this.deleteStationInLine_(targetStationName, targetLineName); } @@ -161,3 +168,6 @@ export default class StationINFOManager { const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; + +const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; +const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; From 84070ced4bcd50697412a73a8953b346e2601ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 16:29:17 +0900 Subject: [PATCH 59/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EC=97=90=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=EB=90=9C=20=EC=97=AD=EC=9D=80=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B6=88=EA=B0=80=ED=95=98=EB=8F=84=EB=A1=9D=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/station-info-manager.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 1798aa145..6aa7d6862 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -87,7 +87,11 @@ export default class StationINFOManager { const stationIndexToDelete = this.stations_.findIndex(({ name }) => { return nameToDelete === name; }); - if (stationIndexToDelete === -1) { + if ( + this.stations_[stationIndexToDelete].linesOfStation.size > + MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + ) { + alert(STATION_INCLUDE_IN_LINE_ERROR_MESSAGE); return; } this.stations_.splice(stationIndexToDelete, 1); @@ -171,3 +175,5 @@ const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„ const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; +const MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION = 0; +const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + 1}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; From 2e7dc93e42782398214ccaed0e436df750f2a2f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 16:44:32 +0900 Subject: [PATCH 60/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EB=8F=84=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20html=20string=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/map-print-manager-ui.js | 31 ++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index 499197670..20dfb6ea0 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -1,15 +1,30 @@ -export default class MapPrintManager { +import { contentsUI } from "./contents-ui.js"; + +export default class MapPrintManager extends contentsUI { constructor(contentsID, stationINFOManager) { - this.contentsID_ = contentsID; - this.stationINFOManager_ = stationINFOManager; - this.setContentsHTML(); + super(contentsID, stationINFOManager); + this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML() { - document.getElementById(this.contentsID_).innerHTML = TEMPLATE; + setContentsHTML(initialTemplate) { + super.setContentsHTML(initialTemplate); } } -const TEMPLATE = ` -mapPrintManager Template ์ž…๋‹ˆ๋‹ค. +const INITIAL_TEMPLATE = ` +

1ํ˜ธ์„ 

+
    +
  • ์ธ์ฒœ
  • +
  • ์†Œ์š”์‚ฐ
  • +
+

2ํ˜ธ์„ 

+
    +
  • ์ธ์ฒœ
  • +
  • ์†Œ์š”์‚ฐ
  • +
+

3ํ˜ธ์„ 

+
    +
  • ์ธ์ฒœ
  • +
  • ์†Œ์š”์‚ฐ
  • +
`; From a3b11e2e05f034cde1488b5ed9a32497e9c66c97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 17:07:58 +0900 Subject: [PATCH 61/82] =?UTF-8?q?feat:=20=EB=85=B8=EC=84=A0=EB=8F=84=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=9B=EC=95=84=EC=99=80=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/map-print-manager-ui.js | 44 +++++++++++++--------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index 20dfb6ea0..6a6f25cf6 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -3,28 +3,36 @@ import { contentsUI } from "./contents-ui.js"; export default class MapPrintManager extends contentsUI { constructor(contentsID, stationINFOManager) { super(contentsID, stationINFOManager); - this.setContentsHTML(INITIAL_TEMPLATE); + this.setContentsHTML(""); } setContentsHTML(initialTemplate) { + const lines = this.stationINFOManager_.getLineINFOs(); + lines.forEach((line) => { + initialTemplate += this.makeLineINFOHTML_(line); + }); super.setContentsHTML(initialTemplate); } + + makeLineINFOHTML_(line) { + const stationListHTML = this.makeStationListHTML_(line); + const infoHTML = ` +
+

${line.name}

+
    + ${stationListHTML} +
+
+ `; + return infoHTML; + } + makeStationListHTML_(line) { + let listHTML = ""; + line.stationsOfLine.forEach((station) => { + listHTML += `
  • ${station.name}
  • `; + }); + return listHTML; + } } -const INITIAL_TEMPLATE = ` -

    1ํ˜ธ์„ 

    -
      -
    • ์ธ์ฒœ
    • -
    • ์†Œ์š”์‚ฐ
    • -
    -

    2ํ˜ธ์„ 

    -
      -
    • ์ธ์ฒœ
    • -
    • ์†Œ์š”์‚ฐ
    • -
    -

    3ํ˜ธ์„ 

    -
      -
    • ์ธ์ฒœ
    • -
    • ์†Œ์š”์‚ฐ
    • -
    -`; +const MAP_CLASS = "map"; From 9cd0e7781b653c713f4df36517d2e95592c98e28 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Sun, 13 Dec 2020 17:10:11 +0900 Subject: [PATCH 62/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=99=84=EB=A3=8C=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=EB=A1=9C=20=EA=B0=B1=EC=8B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/README.md b/docs/README.md index 3fc049a0f..a085845ba 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,7 +2,7 @@ ## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก -- 4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ ๊ตฌํ˜„ +- (์™„๋ฃŒ)4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ ๊ตฌํ˜„ - ์—ญ ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - (์™„๋ฃŒ)์—ญ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋ž˜์Šค ์ƒ์„ฑ @@ -13,7 +13,7 @@ - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•ด๋‹น ์—ญ ์ œ๊ฑฐ(data ์†์„ฑ ํ™œ์šฉ) - (์™„๋ฃŒ)์—ญ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ confirm ์ฐฝ ๋„์šฐ๊ธฐ - (์™„๋ฃŒ)์ž…๋ ฅ๊ฐ’์„ ๋ชฉ๋ก์— ๋‹ด๊ธฐ ์ „์— ์ž…๋ ฅ๊ฐ’์˜ ์•ž๋’ค ๊ณต๋ฐฑ์„ ์ œ๊ฑฐ - - ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ + - (์™„๋ฃŒ)๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์€ ์‚ญ์ œ ๋ถˆ๊ฐ€ํ•˜๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„  ๊ด€๋ฆฌ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - (์™„๋ฃŒ)๋…ธ์„ ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ @@ -36,10 +36,10 @@ - (์™„๋ฃŒ)๋…ธ์„ ์— ์ถ”๊ฐ€ํ•  ์—ญ์ด ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์—๋Ÿฌ ๋ฉ”์„ธ์ง€ ์ถœ๋ ฅ - (์™„๋ฃŒ)๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋…ธ์„ ์—์„œ ํ•ด๋‹น ์—ญ์ด ์ œ์™ธ๋จ - (์™„๋ฃŒ)๋…ธ์„ ์—์„œ ์ œ๊ฑฐ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์— confirm ์ฐฝ์„ ๋„์šฐ๊ธฐ - - ๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ + - (์™„๋ฃŒ)๋…ธ์„ ์— ํฌํ•จ๋œ ์—ญ์ด 2๊ฐœ ์ดํ•˜์ผ ๋•Œ๋Š” ์ œ๊ฑฐํ•  ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ - - html string ์ž‘์„ฑ - - ๋…ธ์„ ๋„ ์ถœ๋ ฅ ๊ธฐ๋Šฅ ๊ตฌํ˜„ + - (์™„๋ฃŒ)html string ์ž‘์„ฑ + - (์™„๋ฃŒ)๋…ธ์„ ๋„ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€ ์ถœ๋ ฅํ•จ ## ๐Ÿ˜ต ๊ณ ๋ฏผํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค From f9c16a23c61ed492cb89975a09b980161e29f4f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 19:31:02 +0900 Subject: [PATCH 63/82] =?UTF-8?q?fix:=20html=20=20=ED=83=9C=EA=B7=B8?= =?UTF-8?q?=20=EC=8B=A4=EC=88=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ํƒœ๊ทธ๊ฐ€ ํƒœ๊ทธ๋กœ ๋‹ซํ˜€์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ์ˆ˜์ • --- src/ui/contents-ui/line-manager-ui.js | 2 +- src/ui/contents-ui/section-manager-ui.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 588f77027..8fbdf060b 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -93,7 +93,7 @@ export default class LineManagerUI extends contentsUI { - + `; } makeSelectorInnerHTML_() { diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index f328cd772..ab747059b 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -152,7 +152,7 @@ class SectionRegisterUI extends contentsUI { - + `; } } From e9e8c2c01828d1a34f4166c585d7dacdfc37e79c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Sun, 13 Dec 2020 23:35:26 +0900 Subject: [PATCH 64/82] =?UTF-8?q?refactor:=20=ED=9A=A8=EC=9C=A8=EC=84=B1?= =?UTF-8?q?=EA=B3=BC=20=EC=A0=80=EC=9E=A5=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=B4=20=EC=97=AD=EA=B3=BC=20=EB=85=B8=EC=84=A0=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EC=9D=98=20=EC=9E=90=EB=A3=8C=EA=B5=AC?= =?UTF-8?q?=EC=A1=B0=EB=A5=BC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 158 +++++++++++++-------- src/ui/contents-ui/line-manager-ui.js | 8 +- src/ui/contents-ui/map-print-manager-ui.js | 4 +- src/ui/contents-ui/section-manager-ui.js | 8 +- 4 files changed, 109 insertions(+), 69 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 6aa7d6862..3c0b96338 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -2,6 +2,7 @@ export default class StationINFOManager { constructor() { this.stations_ = []; this.lines_ = []; + //this.loadAllFromLocalStorage_(); } addNewStation({ name }) { @@ -10,27 +11,67 @@ export default class StationINFOManager { linesOfStation: new Set(), }; this.stations_.push(newStation); + this.saveAllToLocalStorage_(); + console.log(this.stations_); + console.log(this.lines_); } addNewLine({ lineName, startStationName, endStationName }) { - const startStationPtr = this.getPointerFromStationsArray_(startStationName); - const endStationPtr = this.getPointerFromStationsArray_(endStationName); const newLine = { name: lineName, - stationsOfLine: [startStationPtr, endStationPtr], + stationsOfLine: [startStationName, endStationName], }; - startStationPtr.linesOfStation.add(lineName); - endStationPtr.linesOfStation.add(lineName); + const startStation = this.getOneStationINFOByName(startStationName); + const endStation = this.getOneStationINFOByName(endStationName); this.lines_.push(newLine); + startStation.linesOfStation.add(lineName); + endStation.linesOfStation.add(lineName); + this.saveAllToLocalStorage_(); } registerStationToLine(lineName, orderToRegister, stationName) { - const targetLine = this.getOneLineINFOByCondition((line) => { + const targetLine = this.getOneLineByCondition((line) => { return line.name === lineName; }); - const targetStation = this.getOneStationINFOByCondition((station) => { - return station.name === stationName; - }); - targetLine.stationsOfLine.splice(orderToRegister, 0, targetStation); + const targetStation = this.getOneStationINFOByName(stationName); + targetLine.stationsOfLine.splice(orderToRegister, 0, stationName); targetStation.linesOfStation.add(lineName); + this.saveAllToLocalStorage_(); + } + deleteStation(nameToDelete) { + const stationIndexToDelete = this.stations_.findIndex(({ name }) => { + return nameToDelete === name; + }); + if ( + this.stations_[stationIndexToDelete].linesOfStation.size > + MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + ) { + alert(STATION_INCLUDE_IN_LINE_ERROR_MESSAGE); + return; + } + this.stations_.splice(stationIndexToDelete, 1); + this.saveAllToLocalStorage_(); + } + deleteLine(nameToDelete) { + const lineIndexToDelete = this.lines_.findIndex(({ name }) => { + return nameToDelete === name; + }); + if (lineIndexToDelete === -1) { + return; + } + this.deleteLineINFOInAllStations_(this.lines_[lineIndexToDelete]); + this.lines_.splice(lineIndexToDelete, 1); + this.saveAllToLocalStorage_(); + } + deleteSection(targetStationName, targetLineName) { + const targetLine = this.getOneLineByCondition((line) => { + return line.name === targetLineName; + }); + if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { + alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); + return; + } + this.deleteLineInStation_(targetStationName, targetLineName); + this.deleteStationInLine_(targetStationName, targetLineName); + this.saveAllToLocalStorage_(); } getStationsNames() { const stationNames = []; @@ -47,6 +88,14 @@ export default class StationINFOManager { } return -1; } + getOneStationINFOByName(name) { + for (let station of this.stations_) { + if (station.name === name) { + return station; + } + } + return -1; + } getStationNamesByCondition(condition) { const returnStations = []; this.stations_.forEach((station) => { @@ -56,7 +105,7 @@ export default class StationINFOManager { }); return returnStations; } - getLineINFOs() { + getLines() { const linesINFOs = []; this.lines_.forEach(({ name, stationsOfLine }) => { linesINFOs.push({ @@ -66,7 +115,15 @@ export default class StationINFOManager { }); return linesINFOs; } - getOneLineINFOByCondition(condition) { + getOneLineByName(name) { + for (let line of this.lines_) { + if (line.name === name) { + return line; + } + } + return -1; + } + getOneLineByCondition(condition) { for (let line of this.lines_) { if (condition(line)) { return line; @@ -74,7 +131,7 @@ export default class StationINFOManager { } return -1; } - getLineINFOsByCondition(condition) { + getAllLineByCondition(condition) { const returnlines = []; this.lines_.forEach((line) => { if (condition(line)) { @@ -83,40 +140,6 @@ export default class StationINFOManager { }); return returnlines; } - deleteStation(nameToDelete) { - const stationIndexToDelete = this.stations_.findIndex(({ name }) => { - return nameToDelete === name; - }); - if ( - this.stations_[stationIndexToDelete].linesOfStation.size > - MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION - ) { - alert(STATION_INCLUDE_IN_LINE_ERROR_MESSAGE); - return; - } - this.stations_.splice(stationIndexToDelete, 1); - } - deleteLine(nameToDelete) { - const lineIndexToDelete = this.lines_.findIndex(({ name }) => { - return nameToDelete === name; - }); - if (lineIndexToDelete === -1) { - return; - } - this.deleteLineINFOInAllStations_(this.lines_[lineIndexToDelete]); - this.lines_.splice(lineIndexToDelete, 1); - } - deleteSection(targetStationName, targetLineName) { - const targetLine = this.getOneLineINFOByCondition((line) => { - return line.name === targetLineName; - }); - if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { - alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); - return; - } - this.deleteLineInStation_(targetStationName, targetLineName); - this.deleteStationInLine_(targetStationName, targetLineName); - } isNotOverlapNameInStationsArray(inputName) { const isValid = this.isNotOverlapName_(this.stations_, inputName); if (!isValid) { @@ -133,6 +156,30 @@ export default class StationINFOManager { } //private + loadAllFromLocalStorage_() { + const stations = JSON.parse(localStorage.getItem("stations")); + const lines = JSON.parse(localStorage.getItem("lines")); + stations.forEach((station) => { + station.linesOfStation = new Set(station.linesOfStation); + }); + this.stations_ = stations; + this.lines_ = lines; + console.log(stations); + console.log(lines); + } + saveAllToLocalStorage_() { + const jsonStations = JSON.stringify(this.stations_, this._replacer); + const jsonLines = JSON.stringify(this.lines_); + + localStorage.setItem("stations", jsonStations); + localStorage.setItem("lines", jsonLines); + } + _replacer(key, value) { + if (value.__proto__.constructor.name === "Set") { + return Array.from(value); + } + return value; + } isNotOverlapName_(targetToFindOverlap, inputName) { const overlapIndex = targetToFindOverlap.findIndex( ({ name }) => name === inputName @@ -146,27 +193,20 @@ export default class StationINFOManager { targetStation.linesOfStation.delete(targetLineName); } deleteStationInLine_(targetStationName, targetLineName) { - const targetLine = this.getOneLineINFOByCondition((line) => { - return line.name === targetLineName; - }); + const targetLine = this.getOneLineByName(targetLineName); const targetStationIndex = targetLine.stationsOfLine.findIndex( (stationName) => { - return stationName.name === targetStationName; + return stationName === targetStationName; } ); targetLine.stationsOfLine.splice(targetStationIndex, 1); } deleteLineINFOInAllStations_(lineToDelete) { const { name, stationsOfLine } = lineToDelete; - stationsOfLine.forEach((station) => { - station.linesOfStation.delete(name); - }); - } - getPointerFromStationsArray_(targetName) { - const targetIndex = this.stations_.findIndex(({ name }) => { - return name === targetName; + stationsOfLine.forEach((stationName) => { + const targetStation = this.getOneStationINFOByName(stationName); + targetStation.linesOfStation.delete(name); }); - return this.stations_[targetIndex]; } } diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 8fbdf060b..4c2ce11c0 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -20,10 +20,10 @@ export default class LineManagerUI extends contentsUI { } updateLinesTable() { - const linesINFOs = this.stationINFOManager_.getLineINFOs(); + const liness = this.stationINFOManager_.getLines(); const tableContainer = document.getElementById(TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - linesINFOs.forEach((lineINFOs) => { + liness.forEach((lineINFOs) => { innerHTMLOfTable += this.makeNewTableRowHTML_(lineINFOs); }); tableContainer.innerHTML = innerHTMLOfTable; @@ -88,8 +88,8 @@ export default class LineManagerUI extends contentsUI { return ` ${name} - ${stationsOfLine[0].name} - ${stationsOfLine[stationsOfLine.length - 1].name} + ${stationsOfLine[0]} + ${stationsOfLine[stationsOfLine.length - 1]} diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index 6a6f25cf6..7e23a0d0c 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -7,7 +7,7 @@ export default class MapPrintManager extends contentsUI { } setContentsHTML(initialTemplate) { - const lines = this.stationINFOManager_.getLineINFOs(); + const lines = this.stationINFOManager_.getLines(); lines.forEach((line) => { initialTemplate += this.makeLineINFOHTML_(line); }); @@ -29,7 +29,7 @@ export default class MapPrintManager extends contentsUI { makeStationListHTML_(line) { let listHTML = ""; line.stationsOfLine.forEach((station) => { - listHTML += `
  • ${station.name}
  • `; + listHTML += `
  • ${station}
  • `; }); return listHTML; } diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index ab747059b..bf772b6da 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -20,9 +20,9 @@ export default class SectionManagerUI extends contentsUI { updateLineButtons_() { const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV_ID); - const lineINFOs = this.stationINFOManager_.getLineINFOs(); + const lines = this.stationINFOManager_.getLines(); let buttonDivInnerHTML = ""; - lineINFOs.forEach(({ name }) => { + lines.forEach(({ name }) => { buttonDivInnerHTML += this.makeNewSelectLineButtonHTML_(name); }); buttonDiv.innerHTML = buttonDivInnerHTML; @@ -67,12 +67,12 @@ class SectionRegisterUI extends contentsUI { } updateLineStationsTable() { const table = document.getElementById(SECTION_REGISTER_TABLE_ID); - const myLine = this.stationINFOManager_.getLineINFOsByCondition((line) => { + const myLine = this.stationINFOManager_.getAllLineByCondition((line) => { return line.name === this.lineName_; })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; myLine.stationsOfLine.forEach((station, order) => { - tableInnerHTML += this.makeNewTableRowHTML_(order, station.name); + tableInnerHTML += this.makeNewTableRowHTML_(order, station); }); table.innerHTML = tableInnerHTML; this.addEventToAllDeleteButtons_(); From d5c86b5c5c8e09d169108a0dbb8dcaa458005ee6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 00:05:08 +0900 Subject: [PATCH 65/82] =?UTF-8?q?style:=20private=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=EC=99=80=20=EB=B3=80=EC=88=98=20=EB=84=A4=EC=9D=B4?= =?UTF-8?q?=EB=B0=8D=20=EB=B0=A9=EC=8B=9D=EC=9D=84=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/html-manager.js | 22 ++--- src/station-info-manager.js | 98 +++++++++++----------- src/ui/contents-ui/contents-ui.js | 17 ++-- src/ui/contents-ui/line-manager-ui.js | 62 +++++++------- src/ui/contents-ui/map-print-manager-ui.js | 11 ++- src/ui/contents-ui/section-manager-ui.js | 86 +++++++++---------- src/ui/contents-ui/station-manager-ui.js | 42 +++++----- src/ui/menubar-ui.js | 31 ++++--- 8 files changed, 178 insertions(+), 191 deletions(-) diff --git a/src/html-manager.js b/src/html-manager.js index c0eae1e68..9d55a6538 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -6,36 +6,36 @@ import MapPrintManagerUI from "./ui/contents-ui/map-print-manager-ui.js"; export default class HTMLManager { constructor(stationINFOManager) { - this.stationINFOManager = stationINFOManager; - this.menubarUI_ = new MenubarUI({ + this._stationINFOManager = stationINFOManager; + this._menubarUI = new MenubarUI({ htmlManager: this, menubarID: MENUBAR_ID, }); + this._contentsUI = null; this.setContentsUIOnStationUI(); } - setContentsUIOnStationUI() { - this.contentsUI_ = new StationManagerUI( + this._contentsUI = new StationManagerUI( CONTENTS_ID, - this.stationINFOManager + this._stationINFOManager ); } setContentsUIOnSectionUI() { - this.contentsUI_ = new LineManagerUI( + this._contentsUI = new LineManagerUI( CONTENTS_ID, - this.stationINFOManager + this._stationINFOManager ); } setContentsUIOnLineUI() { - this.contentsUI_ = new SectionManagerUI( + this._contentsUI = new SectionManagerUI( CONTENTS_ID, - this.stationINFOManager + this._stationINFOManager ); } setContentsUIOnMapPrintUI() { - this.contentsUI_ = new MapPrintManagerUI( + this._contentsUI = new MapPrintManagerUI( CONTENTS_ID, - this.stationINFOManager + this._stationINFOManager ); } } diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 3c0b96338..a62e22bcb 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -1,19 +1,18 @@ export default class StationINFOManager { constructor() { - this.stations_ = []; - this.lines_ = []; - //this.loadAllFromLocalStorage_(); + this._stations = []; + this._lines = []; + //this._loadAllFromLocalStorage(); } - addNewStation({ name }) { const newStation = { name: name, linesOfStation: new Set(), }; - this.stations_.push(newStation); - this.saveAllToLocalStorage_(); - console.log(this.stations_); - console.log(this.lines_); + this._stations.push(newStation); + this._saveAllToLocalStorage(); + console.log(this._stations); + console.log(this._lines); } addNewLine({ lineName, startStationName, endStationName }) { const newLine = { @@ -22,10 +21,10 @@ export default class StationINFOManager { }; const startStation = this.getOneStationINFOByName(startStationName); const endStation = this.getOneStationINFOByName(endStationName); - this.lines_.push(newLine); + this._lines.push(newLine); startStation.linesOfStation.add(lineName); endStation.linesOfStation.add(lineName); - this.saveAllToLocalStorage_(); + this._saveAllToLocalStorage(); } registerStationToLine(lineName, orderToRegister, stationName) { const targetLine = this.getOneLineByCondition((line) => { @@ -34,54 +33,54 @@ export default class StationINFOManager { const targetStation = this.getOneStationINFOByName(stationName); targetLine.stationsOfLine.splice(orderToRegister, 0, stationName); targetStation.linesOfStation.add(lineName); - this.saveAllToLocalStorage_(); + this._saveAllToLocalStorage(); } deleteStation(nameToDelete) { - const stationIndexToDelete = this.stations_.findIndex(({ name }) => { + const stationIndexToDelete = this._stations.findIndex(({ name }) => { return nameToDelete === name; }); if ( - this.stations_[stationIndexToDelete].linesOfStation.size > - MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + this._stations[stationIndexToDelete].linesOfStation.size > + MAXIMUM_NUMBER__linesOF_STATION_TO_DELETE_STATION ) { alert(STATION_INCLUDE_IN_LINE_ERROR_MESSAGE); return; } - this.stations_.splice(stationIndexToDelete, 1); - this.saveAllToLocalStorage_(); + this._stations.splice(stationIndexToDelete, 1); + this._saveAllToLocalStorage(); } deleteLine(nameToDelete) { - const lineIndexToDelete = this.lines_.findIndex(({ name }) => { + const lineIndexToDelete = this._lines.findIndex(({ name }) => { return nameToDelete === name; }); if (lineIndexToDelete === -1) { return; } - this.deleteLineINFOInAllStations_(this.lines_[lineIndexToDelete]); - this.lines_.splice(lineIndexToDelete, 1); - this.saveAllToLocalStorage_(); + this._deleteLineInAllStations(this._lines[lineIndexToDelete]); + this._lines.splice(lineIndexToDelete, 1); + this._saveAllToLocalStorage(); } deleteSection(targetStationName, targetLineName) { const targetLine = this.getOneLineByCondition((line) => { return line.name === targetLineName; }); - if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { - alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); + if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER__stationsOF_LINE) { + alert(NOT_MINIMUM_NUMBER__stationsOF_LINE_ERROR_MESSAGE); return; } - this.deleteLineInStation_(targetStationName, targetLineName); - this.deleteStationInLine_(targetStationName, targetLineName); - this.saveAllToLocalStorage_(); + this._deleteLineInStation(targetStationName, targetLineName); + this._deleteStationInLine(targetStationName, targetLineName); + this._saveAllToLocalStorage(); } getStationsNames() { const stationNames = []; - this.stations_.forEach(({ name }) => { + this._stations.forEach(({ name }) => { stationNames.push(name); }); return stationNames; } getOneStationINFOByCondition(condition) { - for (let station of this.stations_) { + for (let station of this._stations) { if (condition(station)) { return station; } @@ -89,7 +88,7 @@ export default class StationINFOManager { return -1; } getOneStationINFOByName(name) { - for (let station of this.stations_) { + for (let station of this._stations) { if (station.name === name) { return station; } @@ -98,7 +97,7 @@ export default class StationINFOManager { } getStationNamesByCondition(condition) { const returnStations = []; - this.stations_.forEach((station) => { + this._stations.forEach((station) => { if (condition(station)) { returnStations.push(station.name); } @@ -107,7 +106,7 @@ export default class StationINFOManager { } getLines() { const linesINFOs = []; - this.lines_.forEach(({ name, stationsOfLine }) => { + this._lines.forEach(({ name, stationsOfLine }) => { linesINFOs.push({ name: name, stationsOfLine: stationsOfLine, @@ -116,7 +115,7 @@ export default class StationINFOManager { return linesINFOs; } getOneLineByName(name) { - for (let line of this.lines_) { + for (let line of this._lines) { if (line.name === name) { return line; } @@ -124,7 +123,7 @@ export default class StationINFOManager { return -1; } getOneLineByCondition(condition) { - for (let line of this.lines_) { + for (let line of this._lines) { if (condition(line)) { return line; } @@ -133,7 +132,7 @@ export default class StationINFOManager { } getAllLineByCondition(condition) { const returnlines = []; - this.lines_.forEach((line) => { + this._lines.forEach((line) => { if (condition(line)) { returnlines.push(line); } @@ -141,35 +140,34 @@ export default class StationINFOManager { return returnlines; } isNotOverlapNameInStationsArray(inputName) { - const isValid = this.isNotOverlapName_(this.stations_, inputName); + const isValid = this._isNotOverlapName(this._stations, inputName); if (!isValid) { alert(OVERLAP_STATION_ERROR_MESSAGE); } return isValid; } isNotOverlapNameInLinesArray(inputName) { - const isValid = this.isNotOverlapName_(this.lines_, inputName); + const isValid = this._isNotOverlapName(this._lines, inputName); if (!isValid) { alert(OVERLAP_LINE_ERROR_MESSAGE); } return isValid; } - //private - loadAllFromLocalStorage_() { + _loadAllFromLocalStorage() { const stations = JSON.parse(localStorage.getItem("stations")); const lines = JSON.parse(localStorage.getItem("lines")); stations.forEach((station) => { station.linesOfStation = new Set(station.linesOfStation); }); - this.stations_ = stations; - this.lines_ = lines; + this._stations = stations; + this._lines = lines; console.log(stations); console.log(lines); } - saveAllToLocalStorage_() { - const jsonStations = JSON.stringify(this.stations_, this._replacer); - const jsonLines = JSON.stringify(this.lines_); + _saveAllToLocalStorage() { + const jsonStations = JSON.stringify(this._stations, this._replacer); + const jsonLines = JSON.stringify(this._lines); localStorage.setItem("stations", jsonStations); localStorage.setItem("lines", jsonLines); @@ -180,19 +178,19 @@ export default class StationINFOManager { } return value; } - isNotOverlapName_(targetToFindOverlap, inputName) { + _isNotOverlapName(targetToFindOverlap, inputName) { const overlapIndex = targetToFindOverlap.findIndex( ({ name }) => name === inputName ); return overlapIndex === -1; } - deleteLineInStation_(targetStationName, targetLineName) { + _deleteLineInStation(targetStationName, targetLineName) { const targetStation = this.getOneStationINFOByCondition((station) => { return station.name === targetStationName; }); targetStation.linesOfStation.delete(targetLineName); } - deleteStationInLine_(targetStationName, targetLineName) { + _deleteStationInLine(targetStationName, targetLineName) { const targetLine = this.getOneLineByName(targetLineName); const targetStationIndex = targetLine.stationsOfLine.findIndex( (stationName) => { @@ -201,7 +199,7 @@ export default class StationINFOManager { ); targetLine.stationsOfLine.splice(targetStationIndex, 1); } - deleteLineINFOInAllStations_(lineToDelete) { + _deleteLineInAllStations(lineToDelete) { const { name, stationsOfLine } = lineToDelete; stationsOfLine.forEach((stationName) => { const targetStation = this.getOneStationINFOByName(stationName); @@ -213,7 +211,7 @@ export default class StationINFOManager { const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; -const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; -const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; -const MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION = 0; -const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + 1}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; +const MINIMUM_NUMBER__stationsOF_LINE = 2; +const NOT_MINIMUM_NUMBER__stationsOF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER__stationsOF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; +const MAXIMUM_NUMBER__linesOF_STATION_TO_DELETE_STATION = 0; +const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${MAXIMUM_NUMBER__linesOF_STATION_TO_DELETE_STATION + 1}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; diff --git a/src/ui/contents-ui/contents-ui.js b/src/ui/contents-ui/contents-ui.js index 68ca25327..e7c00c870 100644 --- a/src/ui/contents-ui/contents-ui.js +++ b/src/ui/contents-ui/contents-ui.js @@ -1,24 +1,23 @@ export class contentsUI { constructor(contentsID, stationINFOManager) { - this.contentsID_ = contentsID; - this.stationINFOManager_ = stationINFOManager; + this._contentsID = contentsID; + this._stationINFOManager = stationINFOManager; } - setContentsHTML(initialTemplate) { - document.getElementById(this.contentsID_).innerHTML = initialTemplate; + document.getElementById(this._contentsID).innerHTML = initialTemplate; } - getInputTextByID(id) { + _getInputTextByID(id) { return document.getElementById(id).value.trim(); } - getAllElementsByClass(className) { + _getAllElementsByClass(className) { return document.querySelectorAll("." + className); } - getSelectedOptionByID(id) { + _getSelectedOptionByID(id) { const selector = document.getElementById(id); return selector[selector.selectedIndex].value; } - addClickEventToAllButtonByClassName(className, callback) { + _addClickEventToAllButtonByClassName(className, callback) { const buttons = document.querySelectorAll("." + className); Array.prototype.forEach.call(buttons, (button) => { button.addEventListener("click", (event) => { @@ -26,7 +25,7 @@ export class contentsUI { }); }); } - addClickEventToButtonByID_(id, callback) { + _addClickEventToButtonByID(id, callback) { const button = document.getElementById(id); button.addEventListener("click", () => { callback.call(this); diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 4c2ce11c0..a9f627827 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -10,71 +10,67 @@ export default class LineManagerUI extends contentsUI { super(contentsID, stationINFOManager); this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML(initialTemplate) { super.setContentsHTML(initialTemplate); - this.setStationSelector_(START_STATION_SELECTOR_ID); - this.setStationSelector_(END_STATION_SELECTOR_ID); - this.addEventToLineAddButton_(); + this._setStationSelector(START_STATION_SELECTOR_ID); + this._setStationSelector(END_STATION_SELECTOR_ID); + this._addEventToLineAddButton(); this.updateLinesTable(); } updateLinesTable() { - const liness = this.stationINFOManager_.getLines(); + const liness = this._stationINFOManager.getLines(); const tableContainer = document.getElementById(TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; liness.forEach((lineINFOs) => { - innerHTMLOfTable += this.makeNewTableRowHTML_(lineINFOs); + innerHTMLOfTable += this._makeNewTableRowHTML(lineINFOs); }); tableContainer.innerHTML = innerHTMLOfTable; - this.addEventToAllTableDeleteButton_(); + this._addEventToAllTableDeleteButton(); } - //private - setStationSelector_(selectorID) { + _setStationSelector(selectorID) { const selector = document.getElementById(selectorID); - selector.innerHTML = this.makeSelectorInnerHTML_(); + selector.innerHTML = this._makeSelectorInnerHTML(); } - addEventToLineAddButton_() { - this.addClickEventToButtonByID_( + _addEventToLineAddButton() { + this._addClickEventToButtonByID( LINE_ADD_BUTTON_ID, - this.callbackLineAddButton + this._callbackLineAddButton ); } - callbackLineAddButton() { - const lineName = this.getInputTextByID(NAME_INPUT_ID); - const startStationName = this.getSelectedOptionByID( + _callbackLineAddButton() { + const lineName = this._getInputTextByID(NAME_INPUT_ID); + const startStationName = this._getSelectedOptionByID( START_STATION_SELECTOR_ID ); - const endStationName = this.getSelectedOptionByID(END_STATION_SELECTOR_ID); - if (!this.isValidLineInput_(lineName, startStationName, endStationName)) { + const endStationName = this._getSelectedOptionByID(END_STATION_SELECTOR_ID); + if (!this._isValidLineInput(lineName, startStationName, endStationName)) { return; } - this.stationINFOManager_.addNewLine({ + this._stationINFOManager.addNewLine({ lineName: lineName, startStationName: startStationName, endStationName: endStationName, }); this.updateLinesTable(); } - - addEventToAllTableDeleteButton_() { - this.addClickEventToAllButtonByClassName( + _addEventToAllTableDeleteButton() { + this._addClickEventToAllButtonByClassName( LINE_DELETE_BUTTON_CLASS, - this.callbackOfDeleteButton_ + this._callbackOfDeleteButton ); } - callbackOfDeleteButton_(event) { + _callbackOfDeleteButton(event) { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } - this.stationINFOManager_.deleteLine(event.target.dataset.name); + this._stationINFOManager.deleteLine(event.target.dataset.name); this.updateLinesTable(); } - - isValidLineInput_(lineName, startStationName, endStationName) { + _isValidLineInput(lineName, startStationName, endStationName) { const condition1 = isValidLine(lineName, startStationName, endStationName); - const condition2 = this.stationINFOManager_.isNotOverlapNameInLinesArray( + const condition2 = this._stationINFOManager.isNotOverlapNameInLinesArray( lineName ); const condition3 = isValidOption([startStationName, endStationName]); @@ -84,7 +80,7 @@ export default class LineManagerUI extends contentsUI { } return boolToReturn; } - makeNewTableRowHTML_({ name, stationsOfLine }) { + _makeNewTableRowHTML({ name, stationsOfLine }) { return ` ${name} @@ -96,15 +92,15 @@ export default class LineManagerUI extends contentsUI { `; } - makeSelectorInnerHTML_() { - const stationNames = this.stationINFOManager_.getStationsNames(); + _makeSelectorInnerHTML() { + const stationNames = this._stationINFOManager.getStationsNames(); let selectorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; stationNames.forEach((name) => { - selectorInnerHTML += this.makeNewSelectorOptionHTML_(name); + selectorInnerHTML += this._makeNewSelectorOptionHTML(name); }); return selectorInnerHTML; } - makeNewSelectorOptionHTML_(name) { + _makeNewSelectorOptionHTML(name) { return ` `; diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index 7e23a0d0c..ee4dfd863 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -5,17 +5,16 @@ export default class MapPrintManager extends contentsUI { super(contentsID, stationINFOManager); this.setContentsHTML(""); } - setContentsHTML(initialTemplate) { - const lines = this.stationINFOManager_.getLines(); + const lines = this._stationINFOManager.getLines(); lines.forEach((line) => { - initialTemplate += this.makeLineINFOHTML_(line); + initialTemplate += this._makeLineINFOHTML(line); }); super.setContentsHTML(initialTemplate); } - makeLineINFOHTML_(line) { - const stationListHTML = this.makeStationListHTML_(line); + _makeLineINFOHTML(line) { + const stationListHTML = this._makeStationListHTML(line); const infoHTML = `

    ${line.name}

    @@ -26,7 +25,7 @@ export default class MapPrintManager extends contentsUI { `; return infoHTML; } - makeStationListHTML_(line) { + _makeStationListHTML(line) { let listHTML = ""; line.stationsOfLine.forEach((station) => { listHTML += `
  • ${station}
  • `; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index bf772b6da..3cc3d4bf7 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -9,38 +9,37 @@ export default class SectionManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { super(contentsID, stationINFOManager); - this.sectionRegisterUI = null; + this._sectionRegisterUI = null; this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML(initialTemplate) { super.setContentsHTML(initialTemplate); - this.updateLineButtons_(); + this._updateLineButtons(); } - updateLineButtons_() { + _updateLineButtons() { const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV_ID); - const lines = this.stationINFOManager_.getLines(); + const lines = this._stationINFOManager.getLines(); let buttonDivInnerHTML = ""; lines.forEach(({ name }) => { - buttonDivInnerHTML += this.makeNewSelectLineButtonHTML_(name); + buttonDivInnerHTML += this._makeNewSelectLineButtonHTML(name); }); buttonDiv.innerHTML = buttonDivInnerHTML; - this.addEventToSelectLineButton_(); + this._addEventToSelectLineButton(); } - addEventToSelectLineButton_() { - const buttons = this.getAllElementsByClass(SECTION_LINE_MENU_BUTTON_CLASS); + _addEventToSelectLineButton() { + const buttons = this._getAllElementsByClass(SECTION_LINE_MENU_BUTTON_CLASS); Array.prototype.forEach.call(buttons, (button) => { button.addEventListener("click", (e) => { - this.sectionRegisterUI = new SectionRegisterUI( + this._sectionRegisterUI = new SectionRegisterUI( SECTION_REGISTER_DIV_ID, - this.stationINFOManager_, + this._stationINFOManager, e.target.dataset.name ); }); }); } - makeNewSelectLineButtonHTML_(name) { + _makeNewSelectLineButtonHTML(name) { return ` `; @@ -50,71 +49,72 @@ export default class SectionManagerUI extends contentsUI { class SectionRegisterUI extends contentsUI { constructor(contentsID, stationINFOManager, lineName) { super(contentsID, stationINFOManager); - this.lineName_ = lineName; + this._lineName = lineName; this.setContentsHTML(SECTION_REGISTER_TEMPLATE); } setContentsHTML(initialTemplate) { - initialTemplate = this.makeTitleHTML_(this.lineName_) + initialTemplate; + initialTemplate = this._makeTitleHTML(this._lineName) + initialTemplate; super.setContentsHTML(initialTemplate); - this.addEventToSectionAddButton_(); + this._addEventToSectionAddButton(); this.updateAllContents(); } updateAllContents() { - this.setComboboxOption_(); + this._setComboboxOption(); this.updateLineStationsTable(); } updateLineStationsTable() { const table = document.getElementById(SECTION_REGISTER_TABLE_ID); - const myLine = this.stationINFOManager_.getAllLineByCondition((line) => { - return line.name === this.lineName_; + const myLine = this._stationINFOManager.getAllLineByCondition((line) => { + return line.name === this._lineName; })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; myLine.stationsOfLine.forEach((station, order) => { - tableInnerHTML += this.makeNewTableRowHTML_(order, station); + tableInnerHTML += this._makeNewTableRowHTML(order, station); }); table.innerHTML = tableInnerHTML; - this.addEventToAllDeleteButtons_(); + this._addEventToAllDeleteButtons(); } //private - addEventToAllDeleteButtons_() { - this.addClickEventToAllButtonByClassName( + _addEventToAllDeleteButtons() { + this._addClickEventToAllButtonByClassName( SECTION_DELETE_BUTTON_CLASS, - this.callbackOfDeleteButton_ + this._callbackOfDeleteButton ); } - callbackOfDeleteButton_(event) { + _callbackOfDeleteButton(event) { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } const targetStationName = event.target.dataset.name; - this.stationINFOManager_.deleteSection(targetStationName, this.lineName_); + this._stationINFOManager.deleteSection(targetStationName, this._lineName); this.updateAllContents(); } - addEventToSectionAddButton_() { - this.addClickEventToButtonByID_( + _addEventToSectionAddButton() { + this._addClickEventToButtonByID( SECTION_ADD_BUTTON_ID, - this.callbackOfSectionAddButton_ + this._callbackOfSectionAddButton ); } - callbackOfSectionAddButton_() { - const orderToRegister = this.getInputTextByID(SECTION_ORDER_INPUT_ID); - const stationName = this.getSelectedOptionByID(SECTION_STATION_SELECTOR_ID); - if (!this.isValidSectionAddInput_(orderToRegister, stationName)) { + _callbackOfSectionAddButton() { + const orderToRegister = this._getInputTextByID(SECTION_ORDER_INPUT_ID); + const stationName = this._getSelectedOptionByID( + SECTION_STATION_SELECTOR_ID + ); + if (!this._isValidSectionAddInput(orderToRegister, stationName)) { return; } - this.stationINFOManager_.registerStationToLine( - this.lineName_, + this._stationINFOManager.registerStationToLine( + this._lineName, orderToRegister, stationName ); this.updateAllContents(); } - - isValidSectionAddInput_(orderToRegister, stationName) { + _isValidSectionAddInput(orderToRegister, stationName) { const condition1 = isValidOrder(orderToRegister); const condition2 = isValidOption([stationName]); let boolToReturn = true; @@ -123,28 +123,28 @@ class SectionRegisterUI extends contentsUI { } return boolToReturn; } - setComboboxOption_() { + _setComboboxOption() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); - const optionNames = this.stationINFOManager_.getStationNamesByCondition( + const optionNames = this._stationINFOManager.getStationNamesByCondition( (station) => { - return !station.linesOfStation.has(this.lineName_); + return !station.linesOfStation.has(this._lineName); } ); let seletorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; optionNames.forEach((optionName) => { - seletorInnerHTML += this.makeNewOptionHTML_(optionName); + seletorInnerHTML += this._makeNewOptionHTML(optionName); }); seletor.innerHTML = seletorInnerHTML; } - makeNewOptionHTML_(name) { + _makeNewOptionHTML(name) { return ` `; } - makeTitleHTML_(name) { + _makeTitleHTML(name) { return `

    ${name} ๊ด€๋ฆฌ

    `; } - makeNewTableRowHTML_(order, name) { + _makeNewTableRowHTML(order, name) { return ` ${order} diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 9fd8bd3f8..a30452405 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -7,59 +7,55 @@ export default class StationManagerUI extends contentsUI { this.setContentsHTML(INITIAL_TEMPLATE); } - setContentsHTML(initialTemplate) { super.setContentsHTML(initialTemplate); - this.addEventToNameInputButton_(); + this._addEventToNameInputButton(); this.updateStationsTable(); } - updateStationsTable() { - const stationsNames = this.stationINFOManager_.getStationsNames(); + const stationsNames = this._stationINFOManager.getStationsNames(); const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; for (let name of stationsNames) { - innerHTMLOfTable += this.makeNewTableRowHTML_(name); + innerHTMLOfTable += this._makeNewTableRowHTML(name); } tableContainer.innerHTML = innerHTMLOfTable; - this.addEventToAllTableDeleteButton_(); + this._addEventToAllTableDeleteButton(); } - //private - addEventToNameInputButton_() { - this.addClickEventToButtonByID_( + _addEventToNameInputButton() { + this._addClickEventToButtonByID( STATION_ADD_BUTTON_ID, - this.callbackOfNameInputButton_ + this._callbackOfNameInputButton ); } - callbackOfNameInputButton_() { - const name = this.getInputTextByID(STATION_NAME_INPUT_ID); - if (!this.isValidStationInput_(name)) { + _callbackOfNameInputButton() { + const name = this._getInputTextByID(STATION_NAME_INPUT_ID); + if (!this._isValidStationInput(name)) { return; } - this.stationINFOManager_.addNewStation({ + this._stationINFOManager.addNewStation({ name: name, }); this.updateStationsTable(); } - addEventToAllTableDeleteButton_() { - this.addClickEventToAllButtonByClassName( + _addEventToAllTableDeleteButton() { + this._addClickEventToAllButtonByClassName( STATION_DELETE_BUTTON_CLASS, - this.callbackOfTableDeleteButton_ + this._callbackOfTableDeleteButton ); } - callbackOfTableDeleteButton_(event) { + _callbackOfTableDeleteButton(event) { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } - this.stationINFOManager_.deleteStation(event.target.dataset.name); + this._stationINFOManager.deleteStation(event.target.dataset.name); this.updateStationsTable(); } - - isValidStationInput_(name) { + _isValidStationInput(name) { const condition1 = isValidStation(name); - const condition2 = this.stationINFOManager_.isNotOverlapNameInStationsArray( + const condition2 = this._stationINFOManager.isNotOverlapNameInStationsArray( name ); let boolToReturn = true; @@ -68,7 +64,7 @@ export default class StationManagerUI extends contentsUI { } return boolToReturn; } - makeNewTableRowHTML_(name) { + _makeNewTableRowHTML(name) { const newTableRow = ` ${name} diff --git a/src/ui/menubar-ui.js b/src/ui/menubar-ui.js index 33adbb38e..d71d2b077 100644 --- a/src/ui/menubar-ui.js +++ b/src/ui/menubar-ui.js @@ -1,40 +1,39 @@ export default class MenubarUI { constructor({ htmlManager, menubarID }) { - this.htmlManager_ = htmlManager; - this.menubarID_ = menubarID; + this._htmlManager = htmlManager; + this._menubarID = menubarID; this.setMenubar(); } - setMenubar() { - document.getElementById(this.menubarID_).innerHTML = MENU_TEMPLATE; - this.addEventToStationButton_(); - this.addEventToLineButton_(); - this.addEventToSectionButton_(); - this.addEventToMapPrintButton_(); + document.getElementById(this._menubarID).innerHTML = MENU_TEMPLATE; + this._addEventToStationButton(); + this._addEventToLineButton(); + this._addEventToSectionButton(); + this._addEventToMapPrintButton(); } - addEventToStationButton_() { + _addEventToStationButton() { const button = document.getElementById(STATION_ID); button.addEventListener("click", () => { - this.htmlManager_.setContentsUIOnStationUI(); + this._htmlManager.setContentsUIOnStationUI(); }); } - addEventToLineButton_() { + _addEventToLineButton() { const button = document.getElementById(LINE_ID); button.addEventListener("click", () => { - this.htmlManager_.setContentsUIOnSectionUI(); + this._htmlManager.setContentsUIOnSectionUI(); }); } - addEventToSectionButton_() { + _addEventToSectionButton() { const button = document.getElementById(SECTION_ID); button.addEventListener("click", () => { - this.htmlManager_.setContentsUIOnLineUI(); + this._htmlManager.setContentsUIOnLineUI(); }); } - addEventToMapPrintButton_() { + _addEventToMapPrintButton() { const button_ = document.getElementById(MAP_PRINT_ID); button_.addEventListener("click", () => { - this.htmlManager_.setContentsUIOnMapPrintUI(); + this._htmlManager.setContentsUIOnMapPrintUI(); }); } } From 214296f10b5296968fdcef0b7fdca5a43c41b552 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 00:27:34 +0900 Subject: [PATCH 66/82] =?UTF-8?q?style:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95,=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 44 ++++++------------------ src/ui/contents-ui/line-manager-ui.js | 2 +- src/ui/contents-ui/section-manager-ui.js | 2 +- src/ui/contents-ui/station-manager-ui.js | 2 +- 4 files changed, 14 insertions(+), 36 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index a62e22bcb..522212a2c 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -19,18 +19,16 @@ export default class StationINFOManager { name: lineName, stationsOfLine: [startStationName, endStationName], }; - const startStation = this.getOneStationINFOByName(startStationName); - const endStation = this.getOneStationINFOByName(endStationName); + const startStation = this.getOneStationByName(startStationName); + const endStation = this.getOneStationByName(endStationName); this._lines.push(newLine); startStation.linesOfStation.add(lineName); endStation.linesOfStation.add(lineName); this._saveAllToLocalStorage(); } registerStationToLine(lineName, orderToRegister, stationName) { - const targetLine = this.getOneLineByCondition((line) => { - return line.name === lineName; - }); - const targetStation = this.getOneStationINFOByName(stationName); + const targetLine = this.getOneLineByName(lineName); + const targetStation = this.getOneStationByName(stationName); targetLine.stationsOfLine.splice(orderToRegister, 0, stationName); targetStation.linesOfStation.add(lineName); this._saveAllToLocalStorage(); @@ -61,9 +59,7 @@ export default class StationINFOManager { this._saveAllToLocalStorage(); } deleteSection(targetStationName, targetLineName) { - const targetLine = this.getOneLineByCondition((line) => { - return line.name === targetLineName; - }); + const targetLine = this.getOneLineByName(targetLineName); if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER__stationsOF_LINE) { alert(NOT_MINIMUM_NUMBER__stationsOF_LINE_ERROR_MESSAGE); return; @@ -79,15 +75,7 @@ export default class StationINFOManager { }); return stationNames; } - getOneStationINFOByCondition(condition) { - for (let station of this._stations) { - if (condition(station)) { - return station; - } - } - return -1; - } - getOneStationINFOByName(name) { + getOneStationByName(name) { for (let station of this._stations) { if (station.name === name) { return station; @@ -122,15 +110,7 @@ export default class StationINFOManager { } return -1; } - getOneLineByCondition(condition) { - for (let line of this._lines) { - if (condition(line)) { - return line; - } - } - return -1; - } - getAllLineByCondition(condition) { + getAllLinesByCondition(condition) { const returnlines = []; this._lines.forEach((line) => { if (condition(line)) { @@ -139,14 +119,14 @@ export default class StationINFOManager { }); return returnlines; } - isNotOverlapNameInStationsArray(inputName) { + hasNotOverlapNameAmongStations(inputName) { const isValid = this._isNotOverlapName(this._stations, inputName); if (!isValid) { alert(OVERLAP_STATION_ERROR_MESSAGE); } return isValid; } - isNotOverlapNameInLinesArray(inputName) { + hasNotOverlapNameAmongLines(inputName) { const isValid = this._isNotOverlapName(this._lines, inputName); if (!isValid) { alert(OVERLAP_LINE_ERROR_MESSAGE); @@ -185,9 +165,7 @@ export default class StationINFOManager { return overlapIndex === -1; } _deleteLineInStation(targetStationName, targetLineName) { - const targetStation = this.getOneStationINFOByCondition((station) => { - return station.name === targetStationName; - }); + const targetStation = this.getOneStationByName(targetStationName); targetStation.linesOfStation.delete(targetLineName); } _deleteStationInLine(targetStationName, targetLineName) { @@ -202,7 +180,7 @@ export default class StationINFOManager { _deleteLineInAllStations(lineToDelete) { const { name, stationsOfLine } = lineToDelete; stationsOfLine.forEach((stationName) => { - const targetStation = this.getOneStationINFOByName(stationName); + const targetStation = this.getOneStationByName(stationName); targetStation.linesOfStation.delete(name); }); } diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index a9f627827..d9aa436cc 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -70,7 +70,7 @@ export default class LineManagerUI extends contentsUI { } _isValidLineInput(lineName, startStationName, endStationName) { const condition1 = isValidLine(lineName, startStationName, endStationName); - const condition2 = this._stationINFOManager.isNotOverlapNameInLinesArray( + const condition2 = this._stationINFOManager.hasNotOverlapNameAmongLines( lineName ); const condition3 = isValidOption([startStationName, endStationName]); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 3cc3d4bf7..3e8da77ca 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -66,7 +66,7 @@ class SectionRegisterUI extends contentsUI { } updateLineStationsTable() { const table = document.getElementById(SECTION_REGISTER_TABLE_ID); - const myLine = this._stationINFOManager.getAllLineByCondition((line) => { + const myLine = this._stationINFOManager.getAllLinesByCondition((line) => { return line.name === this._lineName; })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index a30452405..067272046 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -55,7 +55,7 @@ export default class StationManagerUI extends contentsUI { } _isValidStationInput(name) { const condition1 = isValidStation(name); - const condition2 = this._stationINFOManager.isNotOverlapNameInStationsArray( + const condition2 = this._stationINFOManager.hasNotOverlapNameAmongStations( name ); let boolToReturn = true; From 321cfaff903ca34dbcff7188503c03cb93e44c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 00:38:56 +0900 Subject: [PATCH 67/82] =?UTF-8?q?style:=20condition1,condition2=EB=A1=9C?= =?UTF-8?q?=20=EB=AA=85=EB=AA=85=EB=90=9C=20=EC=A1=B0=EA=B1=B4=EB=B3=80?= =?UTF-8?q?=EC=88=98=EB=A5=BC=20=EA=B0=80=EB=8F=85=EC=84=B1=EC=A2=8B?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/contents-ui/line-manager-ui.js | 12 ++++++++---- src/ui/contents-ui/section-manager-ui.js | 6 +++--- src/ui/contents-ui/station-manager-ui.js | 8 ++++---- src/utility/input-check-utility.js | 12 ++++++------ 4 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index d9aa436cc..7b6ab0343 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -69,13 +69,17 @@ export default class LineManagerUI extends contentsUI { this.updateLinesTable(); } _isValidLineInput(lineName, startStationName, endStationName) { - const condition1 = isValidLine(lineName, startStationName, endStationName); - const condition2 = this._stationINFOManager.hasNotOverlapNameAmongLines( + const hasValidLine = isValidLine( + lineName, + startStationName, + endStationName + ); + const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongLines( lineName ); - const condition3 = isValidOption([startStationName, endStationName]); + const hasValidOption = isValidOption([startStationName, endStationName]); let boolToReturn = true; - if (!(condition1 && condition2 && condition3)) { + if (!(hasValidLine && isNotOverlapName && hasValidOption)) { boolToReturn = false; } return boolToReturn; diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 3e8da77ca..06b96c64a 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -115,10 +115,10 @@ class SectionRegisterUI extends contentsUI { this.updateAllContents(); } _isValidSectionAddInput(orderToRegister, stationName) { - const condition1 = isValidOrder(orderToRegister); - const condition2 = isValidOption([stationName]); + const hasValidOrder = isValidOrder(orderToRegister); + const hasValidOption = isValidOption([stationName]); let boolToReturn = true; - if (!(condition1 && condition2)) { + if (!(hasValidOrder && hasValidOption)) { boolToReturn = false; } return boolToReturn; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 067272046..dab03b335 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,4 +1,4 @@ -import { isValidStation } from "../../utility/input-check-utility.js"; +import { isValidStationName } from "../../utility/input-check-utility.js"; import { contentsUI } from "./contents-ui.js"; export default class StationManagerUI extends contentsUI { @@ -54,12 +54,12 @@ export default class StationManagerUI extends contentsUI { this.updateStationsTable(); } _isValidStationInput(name) { - const condition1 = isValidStation(name); - const condition2 = this._stationINFOManager.hasNotOverlapNameAmongStations( + const hasValidStationName = isValidStationName(name); + const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongStations( name ); let boolToReturn = true; - if (!(condition1 && condition2)) { + if (!(hasValidStationName && isNotOverlapName)) { boolToReturn = false; } return boolToReturn; diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index d08145783..bd8c1ada0 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -1,27 +1,27 @@ import { SELECTEOR_NONE } from "./share-constant-utility.js"; -export function isValidStation(name) { - const condition1 = canSatisfyLengthCondition({ +export function isValidStationName(name) { + const isValidLength = canSatisfyLengthCondition({ name: name, minLength: MINIMUM_LENGTH_OF_STATION_NAME, errorMessage: MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE, }); - if (!condition1) { + if (!isValidLength) { return false; } return true; } export function isValidLine(name, startStationName, endStationName) { - const condition1 = canSatisfyLengthCondition({ + const isValidLength = canSatisfyLengthCondition({ name: name, minLength: MINIMUM_LENGTH_OF_LINE_NAME, errorMessage: MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE, }); - const condition2 = hasNotEqualName(startStationName, endStationName); + const isNotEqualName = hasNotEqualName(startStationName, endStationName); let boolToReturn = true; - if (!(condition1 && condition2)) { + if (!(isValidLength && isNotEqualName)) { boolToReturn = false; } return boolToReturn; From 30206abf2d4b91789c7c8857d7ed655e9925dc4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 00:57:09 +0900 Subject: [PATCH 68/82] =?UTF-8?q?feat:=20=EC=97=AD=EA=B3=BC=20=EB=85=B8?= =?UTF-8?q?=EC=84=A0=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20localStorage=EB=A5=BC?= =?UTF-8?q?=20=EC=9D=B4=EC=9A=A9=ED=95=98=EC=97=AC=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index 522212a2c..fccc00f55 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -2,7 +2,7 @@ export default class StationINFOManager { constructor() { this._stations = []; this._lines = []; - //this._loadAllFromLocalStorage(); + this._loadAllFromLocalStorage(); } addNewStation({ name }) { const newStation = { @@ -11,8 +11,6 @@ export default class StationINFOManager { }; this._stations.push(newStation); this._saveAllToLocalStorage(); - console.log(this._stations); - console.log(this._lines); } addNewLine({ lineName, startStationName, endStationName }) { const newLine = { From 221f1518fe5abc942d2648af7392580654f2f2d2 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Mon, 14 Dec 2020 00:58:05 +0900 Subject: [PATCH 69/82] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=B4?= =?UTF-8?q?=EC=95=BC=ED=95=A0=20=EC=83=88=EB=A1=9C=EC=9A=B4=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index a085845ba..0ec435002 100644 --- a/docs/README.md +++ b/docs/README.md @@ -40,6 +40,8 @@ - ๋…ธ์„ ๋„ ์ถœ๋ ฅ - (์™„๋ฃŒ)html string ์ž‘์„ฑ - (์™„๋ฃŒ)๋…ธ์„ ๋„ ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€ ์ถœ๋ ฅํ•จ +- ๊ทธ ์™ธ์˜ ์ถ”๊ฐ€ํ•ด์•ผํ•  ๊ธฐ๋Šฅ๋“ค + - (์™„๋ฃŒ)์—ญ๊ณผ ๋…ธ์„  ์ •๋ณด๋ฅผ localStorage๋ฅผ ์ด์šฉํ•˜์—ฌ ์ €์žฅ ## ๐Ÿ˜ต ๊ณ ๋ฏผํ•ด์•ผํ•  ์‚ฌํ•ญ๋“ค From 7c4c729690ca391a1764face51b7737f3abd452f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 13:54:36 +0900 Subject: [PATCH 70/82] =?UTF-8?q?refactor:=20=EC=9E=85=EB=A0=A5=EA=B0=92?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EB=A6=AC=ED=84=B4=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 25 ++++---- src/ui/contents-ui/line-manager-ui.js | 18 ++---- src/ui/contents-ui/section-manager-ui.js | 6 +- src/ui/contents-ui/station-manager-ui.js | 10 +--- src/utility/input-check-utility.js | 73 ++++++++++++++---------- 5 files changed, 67 insertions(+), 65 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index fccc00f55..e01835b25 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -1,3 +1,5 @@ +import { canSatisfyMaxLengthCondition } from "./utility/input-check-utility.js"; + export default class StationINFOManager { constructor() { this._stations = []; @@ -35,11 +37,12 @@ export default class StationINFOManager { const stationIndexToDelete = this._stations.findIndex(({ name }) => { return nameToDelete === name; }); - if ( - this._stations[stationIndexToDelete].linesOfStation.size > - MAXIMUM_NUMBER__linesOF_STATION_TO_DELETE_STATION - ) { - alert(STATION_INCLUDE_IN_LINE_ERROR_MESSAGE); + const isSatisfyMaxLengthCondition = canSatisfyMaxLengthCondition({ + operandLength: this._stations[stationIndexToDelete].linesOfStation.size, + maxLength: MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION, + errorMessage: STATION_INCLUDE_IN_LINE_ERROR_MESSAGE, + }); + if (!isSatisfyMaxLengthCondition) { return; } this._stations.splice(stationIndexToDelete, 1); @@ -58,8 +61,8 @@ export default class StationINFOManager { } deleteSection(targetStationName, targetLineName) { const targetLine = this.getOneLineByName(targetLineName); - if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER__stationsOF_LINE) { - alert(NOT_MINIMUM_NUMBER__stationsOF_LINE_ERROR_MESSAGE); + if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { + alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); return; } this._deleteLineInStation(targetStationName, targetLineName); @@ -187,7 +190,7 @@ export default class StationINFOManager { const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; -const MINIMUM_NUMBER__stationsOF_LINE = 2; -const NOT_MINIMUM_NUMBER__stationsOF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER__stationsOF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; -const MAXIMUM_NUMBER__linesOF_STATION_TO_DELETE_STATION = 0; -const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${MAXIMUM_NUMBER__linesOF_STATION_TO_DELETE_STATION + 1}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; +const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; +const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; +const MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION = 0; +const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + 1}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index 7b6ab0343..c46d35912 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -41,17 +41,15 @@ export default class LineManagerUI extends contentsUI { } _callbackLineAddButton() { const lineName = this._getInputTextByID(NAME_INPUT_ID); - const startStationName = this._getSelectedOptionByID( - START_STATION_SELECTOR_ID - ); - const endStationName = this._getSelectedOptionByID(END_STATION_SELECTOR_ID); - if (!this._isValidLineInput(lineName, startStationName, endStationName)) { + const startStation = this._getSelectedOptionByID(START_STATION_SELECTOR_ID); + const endStation = this._getSelectedOptionByID(END_STATION_SELECTOR_ID); + if (!this._isValidLineInput(lineName, startStation, endStation)) { return; } this._stationINFOManager.addNewLine({ lineName: lineName, - startStationName: startStationName, - endStationName: endStationName, + startStationName: startStation, + endStationName: endStation, }); this.updateLinesTable(); } @@ -78,11 +76,7 @@ export default class LineManagerUI extends contentsUI { lineName ); const hasValidOption = isValidOption([startStationName, endStationName]); - let boolToReturn = true; - if (!(hasValidLine && isNotOverlapName && hasValidOption)) { - boolToReturn = false; - } - return boolToReturn; + return hasValidLine && isNotOverlapName && hasValidOption; } _makeNewTableRowHTML({ name, stationsOfLine }) { return ` diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 06b96c64a..6450ddc08 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -117,11 +117,7 @@ class SectionRegisterUI extends contentsUI { _isValidSectionAddInput(orderToRegister, stationName) { const hasValidOrder = isValidOrder(orderToRegister); const hasValidOption = isValidOption([stationName]); - let boolToReturn = true; - if (!(hasValidOrder && hasValidOption)) { - boolToReturn = false; - } - return boolToReturn; + return hasValidOrder && hasValidOption; } _setComboboxOption() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index dab03b335..734ee5b0c 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -39,7 +39,6 @@ export default class StationManagerUI extends contentsUI { }); this.updateStationsTable(); } - _addEventToAllTableDeleteButton() { this._addClickEventToAllButtonByClassName( STATION_DELETE_BUTTON_CLASS, @@ -58,14 +57,10 @@ export default class StationManagerUI extends contentsUI { const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongStations( name ); - let boolToReturn = true; - if (!(hasValidStationName && isNotOverlapName)) { - boolToReturn = false; - } - return boolToReturn; + return hasValidStationName && isNotOverlapName; } _makeNewTableRowHTML(name) { - const newTableRow = ` + return ` ${name} @@ -73,7 +68,6 @@ export default class StationManagerUI extends contentsUI { `; - return newTableRow; } } const STATION_NAME_INPUT_ID = "station-name-input"; diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index bd8c1ada0..1ba005df9 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -1,42 +1,33 @@ import { SELECTEOR_NONE } from "./share-constant-utility.js"; export function isValidStationName(name) { - const isValidLength = canSatisfyLengthCondition({ - name: name, + const isValidLength = canSatisfyMinLengthCondition({ + operandLength: name.length, minLength: MINIMUM_LENGTH_OF_STATION_NAME, errorMessage: MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE, }); - - if (!isValidLength) { - return false; - } - return true; + return isValidLength; } export function isValidLine(name, startStationName, endStationName) { - const isValidLength = canSatisfyLengthCondition({ - name: name, + const isValidLength = canSatisfyMinLengthCondition({ + operandLength: name.length, minLength: MINIMUM_LENGTH_OF_LINE_NAME, errorMessage: MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE, }); const isNotEqualName = hasNotEqualName(startStationName, endStationName); - let boolToReturn = true; - - if (!(isValidLength && isNotEqualName)) { - boolToReturn = false; - } - return boolToReturn; + return isValidLength && isNotEqualName; } export function isValidOrder(order) { - let retBool = true; - if (order === "") { - alert(NOT_TYPE_OF_NUMBER_ERROR_MESSAGE); - retBool = false; - } - if (Number(order) < MINIMUM_VAILD_ORDER) { - alert(LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE); - retBool = false; - } - return retBool; + const isTypeOfNumber = hasTypeOfNumber({ + operand: order, + errorMessage: NOT_TYPE_OF_NUMBER_ERROR_MESSAGE, + }); + const isSatisfyLengthCondition = canSatisfyMinLengthCondition({ + operandLength: Number(order), + minLength: MINIMUM_VAILD_ORDER, + errorMessage: LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE, + }); + return isTypeOfNumber && isSatisfyLengthCondition; } export function isValidOption(inputOptions) { let retBool = true; @@ -49,15 +40,39 @@ export function isValidOption(inputOptions) { } return retBool; } - -function canSatisfyLengthCondition({ name, minLength, errorMessage }) { +export function canSatisfyMinLengthCondition({ + operandLength, + minLength, + errorMessage, +}) { + let boolToReturn = true; + if (operandLength < minLength) { + alert(errorMessage); + boolToReturn = false; + } + return boolToReturn; +} +export function canSatisfyMaxLengthCondition({ + operandLength, + maxLength, + errorMessage, +}) { let boolToReturn = true; - if (name.length < minLength) { + if (operandLength > maxLength) { alert(errorMessage); boolToReturn = false; } return boolToReturn; } + +function hasTypeOfNumber({ operand, errorMessage }) { + let retBool = true; + if (String) { + alert(errorMessage); + retBool = false; + } + return retBool; +} function hasNotEqualName(startStationName, endStationName) { let boolToReturn = true; if (startStationName === endStationName) { @@ -76,4 +91,4 @@ const MINIMUM_VAILD_ORDER = 0; const NOT_TYPE_OF_NUMBER_ERROR_MESSAGE = "์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."; const LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE = `์ˆœ์„œ๊ฐ’์€ ์ตœ์†Œ ${MINIMUM_VAILD_ORDER} ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const HAS_EQUAL_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; -const NOT_SELECTED_OPTION_ERROR_MESSAGE = "์ฝค๋ณด๋ฐ•์Šค์˜ ์˜ต์…˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."; \ No newline at end of file +const NOT_SELECTED_OPTION_ERROR_MESSAGE = "์ฝค๋ณด๋ฐ•์Šค์˜ ์˜ต์…˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”."; From fb63695e474b79ba5e91df04d49eaeb0094c01a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 14:04:41 +0900 Subject: [PATCH 71/82] =?UTF-8?q?fix:=20=EA=B5=AC=EA=B0=84=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=EC=97=90=EC=84=9C=20=EC=9E=85=EB=A0=A5=EB=90=9C=20?= =?UTF-8?q?=EC=88=AB=EC=9E=90=EC=9D=98=20=EC=9C=A0=ED=9A=A8=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EA=B2=80=EC=82=AC=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ui/menubar-ui.js | 4 ++-- src/utility/input-check-utility.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/ui/menubar-ui.js b/src/ui/menubar-ui.js index d71d2b077..7cef557a1 100644 --- a/src/ui/menubar-ui.js +++ b/src/ui/menubar-ui.js @@ -31,8 +31,8 @@ export default class MenubarUI { }); } _addEventToMapPrintButton() { - const button_ = document.getElementById(MAP_PRINT_ID); - button_.addEventListener("click", () => { + const button = document.getElementById(MAP_PRINT_ID); + button.addEventListener("click", () => { this._htmlManager.setContentsUIOnMapPrintUI(); }); } diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index 1ba005df9..82b69288b 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -67,7 +67,7 @@ export function canSatisfyMaxLengthCondition({ function hasTypeOfNumber({ operand, errorMessage }) { let retBool = true; - if (String) { + if (operand === "") { alert(errorMessage); retBool = false; } From ed2c39e96aeadc53f0dfed4fdd87e74b8341f04d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 14:27:48 +0900 Subject: [PATCH 72/82] =?UTF-8?q?style:=20boolean=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=EB=8A=94=20=EC=A0=91=EB=91=90?= =?UTF-8?q?=EC=82=AC=20has,=20=EA=B4=80=EB=A0=A8=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=8A=94=20=EC=A0=91=EB=91=90=EC=82=AC=20is=EB=A1=9C=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 10 ++++----- src/ui/contents-ui/line-manager-ui.js | 27 ++++++++++++------------ src/ui/contents-ui/section-manager-ui.js | 14 ++++++------ src/ui/contents-ui/station-manager-ui.js | 20 +++++++++--------- src/utility/input-check-utility.js | 18 ++++++++-------- 5 files changed, 44 insertions(+), 45 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index e01835b25..d8daabaaa 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -1,4 +1,4 @@ -import { canSatisfyMaxLengthCondition } from "./utility/input-check-utility.js"; +import { hasSatisfiedMaxLengthCondition } from "./utility/input-check-utility.js"; export default class StationINFOManager { constructor() { @@ -37,7 +37,7 @@ export default class StationINFOManager { const stationIndexToDelete = this._stations.findIndex(({ name }) => { return nameToDelete === name; }); - const isSatisfyMaxLengthCondition = canSatisfyMaxLengthCondition({ + const isSatisfyMaxLengthCondition = hasSatisfiedMaxLengthCondition({ operandLength: this._stations[stationIndexToDelete].linesOfStation.size, maxLength: MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION, errorMessage: STATION_INCLUDE_IN_LINE_ERROR_MESSAGE, @@ -121,14 +121,14 @@ export default class StationINFOManager { return returnlines; } hasNotOverlapNameAmongStations(inputName) { - const isValid = this._isNotOverlapName(this._stations, inputName); + const isValid = this._hasNotOverlapName(this._stations, inputName); if (!isValid) { alert(OVERLAP_STATION_ERROR_MESSAGE); } return isValid; } hasNotOverlapNameAmongLines(inputName) { - const isValid = this._isNotOverlapName(this._lines, inputName); + const isValid = this._hasNotOverlapName(this._lines, inputName); if (!isValid) { alert(OVERLAP_LINE_ERROR_MESSAGE); } @@ -159,7 +159,7 @@ export default class StationINFOManager { } return value; } - _isNotOverlapName(targetToFindOverlap, inputName) { + _hasNotOverlapName(targetToFindOverlap, inputName) { const overlapIndex = targetToFindOverlap.findIndex( ({ name }) => name === inputName ); diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index c46d35912..fed3bb593 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,7 +1,7 @@ import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; import { - isValidLine, - isValidOption, + hasValidLine, + hasValidOption, } from "../../utility/input-check-utility.js"; import { contentsUI } from "./contents-ui.js"; @@ -17,7 +17,6 @@ export default class LineManagerUI extends contentsUI { this._addEventToLineAddButton(); this.updateLinesTable(); } - updateLinesTable() { const liness = this._stationINFOManager.getLines(); const tableContainer = document.getElementById(TABLE_ID); @@ -39,11 +38,17 @@ export default class LineManagerUI extends contentsUI { this._callbackLineAddButton ); } + _addEventToAllTableDeleteButton() { + this._addClickEventToAllButtonByClassName( + LINE_DELETE_BUTTON_CLASS, + this._callbackOfDeleteButton + ); + } _callbackLineAddButton() { const lineName = this._getInputTextByID(NAME_INPUT_ID); const startStation = this._getSelectedOptionByID(START_STATION_SELECTOR_ID); const endStation = this._getSelectedOptionByID(END_STATION_SELECTOR_ID); - if (!this._isValidLineInput(lineName, startStation, endStation)) { + if (!this._hasValidLineInput(lineName, startStation, endStation)) { return; } this._stationINFOManager.addNewLine({ @@ -53,12 +58,6 @@ export default class LineManagerUI extends contentsUI { }); this.updateLinesTable(); } - _addEventToAllTableDeleteButton() { - this._addClickEventToAllButtonByClassName( - LINE_DELETE_BUTTON_CLASS, - this._callbackOfDeleteButton - ); - } _callbackOfDeleteButton(event) { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; @@ -66,8 +65,8 @@ export default class LineManagerUI extends contentsUI { this._stationINFOManager.deleteLine(event.target.dataset.name); this.updateLinesTable(); } - _isValidLineInput(lineName, startStationName, endStationName) { - const hasValidLine = isValidLine( + _hasValidLineInput(lineName, startStationName, endStationName) { + const isValidLine = hasValidLine( lineName, startStationName, endStationName @@ -75,8 +74,8 @@ export default class LineManagerUI extends contentsUI { const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongLines( lineName ); - const hasValidOption = isValidOption([startStationName, endStationName]); - return hasValidLine && isNotOverlapName && hasValidOption; + const isValidOption = hasValidOption([startStationName, endStationName]); + return isValidLine && isNotOverlapName && isValidOption; } _makeNewTableRowHTML({ name, stationsOfLine }) { return ` diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 6450ddc08..6dcba820f 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -1,6 +1,6 @@ import { - isValidOrder, - isValidOption, + hasValidOrder, + hasValidOption, } from "../../utility/input-check-utility.js"; import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; import { contentsUI } from "./contents-ui.js"; @@ -104,7 +104,7 @@ class SectionRegisterUI extends contentsUI { const stationName = this._getSelectedOptionByID( SECTION_STATION_SELECTOR_ID ); - if (!this._isValidSectionAddInput(orderToRegister, stationName)) { + if (!this._hasValidSectionAddInput(orderToRegister, stationName)) { return; } this._stationINFOManager.registerStationToLine( @@ -114,10 +114,10 @@ class SectionRegisterUI extends contentsUI { ); this.updateAllContents(); } - _isValidSectionAddInput(orderToRegister, stationName) { - const hasValidOrder = isValidOrder(orderToRegister); - const hasValidOption = isValidOption([stationName]); - return hasValidOrder && hasValidOption; + _hasValidSectionAddInput(orderToRegister, stationName) { + const isValidOrder = hasValidOrder(orderToRegister); + const isValidOption = hasValidOption([stationName]); + return isValidOrder && isValidOption; } _setComboboxOption() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 734ee5b0c..b821450a0 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,4 +1,4 @@ -import { isValidStationName } from "../../utility/input-check-utility.js"; +import { hasValidStationName } from "../../utility/input-check-utility.js"; import { contentsUI } from "./contents-ui.js"; export default class StationManagerUI extends contentsUI { @@ -29,6 +29,12 @@ export default class StationManagerUI extends contentsUI { this._callbackOfNameInputButton ); } + _addEventToAllTableDeleteButton() { + this._addClickEventToAllButtonByClassName( + STATION_DELETE_BUTTON_CLASS, + this._callbackOfTableDeleteButton + ); + } _callbackOfNameInputButton() { const name = this._getInputTextByID(STATION_NAME_INPUT_ID); if (!this._isValidStationInput(name)) { @@ -39,12 +45,6 @@ export default class StationManagerUI extends contentsUI { }); this.updateStationsTable(); } - _addEventToAllTableDeleteButton() { - this._addClickEventToAllButtonByClassName( - STATION_DELETE_BUTTON_CLASS, - this._callbackOfTableDeleteButton - ); - } _callbackOfTableDeleteButton(event) { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; @@ -52,12 +52,12 @@ export default class StationManagerUI extends contentsUI { this._stationINFOManager.deleteStation(event.target.dataset.name); this.updateStationsTable(); } - _isValidStationInput(name) { - const hasValidStationName = isValidStationName(name); + _hasValidStationInput(name) { + const isValidStationName = hasValidStationName(name); const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongStations( name ); - return hasValidStationName && isNotOverlapName; + return isValidStationName && isNotOverlapName; } _makeNewTableRowHTML(name) { return ` diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index 82b69288b..a92839669 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -1,15 +1,15 @@ import { SELECTEOR_NONE } from "./share-constant-utility.js"; -export function isValidStationName(name) { - const isValidLength = canSatisfyMinLengthCondition({ +export function hasValidStationName(name) { + const isValidLength = hasSatisfiedMinLengthCondition({ operandLength: name.length, minLength: MINIMUM_LENGTH_OF_STATION_NAME, errorMessage: MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE, }); return isValidLength; } -export function isValidLine(name, startStationName, endStationName) { - const isValidLength = canSatisfyMinLengthCondition({ +export function hasValidLine(name, startStationName, endStationName) { + const isValidLength = hasSatisfiedMinLengthCondition({ operandLength: name.length, minLength: MINIMUM_LENGTH_OF_LINE_NAME, errorMessage: MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE, @@ -17,19 +17,19 @@ export function isValidLine(name, startStationName, endStationName) { const isNotEqualName = hasNotEqualName(startStationName, endStationName); return isValidLength && isNotEqualName; } -export function isValidOrder(order) { +export function hasValidOrder(order) { const isTypeOfNumber = hasTypeOfNumber({ operand: order, errorMessage: NOT_TYPE_OF_NUMBER_ERROR_MESSAGE, }); - const isSatisfyLengthCondition = canSatisfyMinLengthCondition({ + const isSatisfyLengthCondition = hasSatisfiedMinLengthCondition({ operandLength: Number(order), minLength: MINIMUM_VAILD_ORDER, errorMessage: LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE, }); return isTypeOfNumber && isSatisfyLengthCondition; } -export function isValidOption(inputOptions) { +export function hasValidOption(inputOptions) { let retBool = true; for (let inputOption of inputOptions) { if (inputOption === SELECTEOR_NONE) { @@ -40,7 +40,7 @@ export function isValidOption(inputOptions) { } return retBool; } -export function canSatisfyMinLengthCondition({ +export function hasSatisfiedMinLengthCondition({ operandLength, minLength, errorMessage, @@ -52,7 +52,7 @@ export function canSatisfyMinLengthCondition({ } return boolToReturn; } -export function canSatisfyMaxLengthCondition({ +export function hasSatisfiedMaxLengthCondition({ operandLength, maxLength, errorMessage, From 830ad1e790bad1cdbc938dd65accb913d07dbd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 15:00:54 +0900 Subject: [PATCH 73/82] =?UTF-8?q?refactor:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=EC=83=88=EB=A1=9C=EC=9A=B4=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=83=9D=EC=84=B1,=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=EB=8F=84=EB=A5=BC=20=EC=9C=84=ED=95=B4=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=EB=A5=BC=EC=9D=BC=EB=B0=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ์ƒˆ๋กœ์šด station๊ณผ line์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒ์„ฑํ•˜๊ฒŒ ํ•จ์œผ๋กœ์จ ๊ฐ€๋…์„ฑ์„ ๋†’์ž„ - hasNotEqualName ๋ฉ”์†Œ๋“œ๋ฅผ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ํ™œ์šฉ๋„๋ฅผ ๋†’์ž„ --- src/station-info-manager.js | 61 ++++++++++++++---------- src/ui/contents-ui/station-manager-ui.js | 2 +- src/utility/input-check-utility.js | 18 ++++--- 3 files changed, 49 insertions(+), 32 deletions(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index d8daabaaa..d056cf95d 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -7,18 +7,17 @@ export default class StationINFOManager { this._loadAllFromLocalStorage(); } addNewStation({ name }) { - const newStation = { - name: name, - linesOfStation: new Set(), - }; + const newStation = this._makeNewStationByTemplate(name); this._stations.push(newStation); this._saveAllToLocalStorage(); + console.log(this._stations); } addNewLine({ lineName, startStationName, endStationName }) { - const newLine = { - name: lineName, - stationsOfLine: [startStationName, endStationName], - }; + const newLine = this._makeNewLineByTemplate( + lineName, + startStationName, + endStationName + ); const startStation = this.getOneStationByName(startStationName); const endStation = this.getOneStationByName(endStationName); this._lines.push(newLine); @@ -69,13 +68,6 @@ export default class StationINFOManager { this._deleteStationInLine(targetStationName, targetLineName); this._saveAllToLocalStorage(); } - getStationsNames() { - const stationNames = []; - this._stations.forEach(({ name }) => { - stationNames.push(name); - }); - return stationNames; - } getOneStationByName(name) { for (let station of this._stations) { if (station.name === name) { @@ -84,6 +76,13 @@ export default class StationINFOManager { } return -1; } + getStationsNames() { + const stationNames = []; + this._stations.forEach(({ name }) => { + stationNames.push(name); + }); + return stationNames; + } getStationNamesByCondition(condition) { const returnStations = []; this._stations.forEach((station) => { @@ -93,6 +92,14 @@ export default class StationINFOManager { }); return returnStations; } + getOneLineByName(name) { + for (let line of this._lines) { + if (line.name === name) { + return line; + } + } + return -1; + } getLines() { const linesINFOs = []; this._lines.forEach(({ name, stationsOfLine }) => { @@ -103,14 +110,6 @@ export default class StationINFOManager { }); return linesINFOs; } - getOneLineByName(name) { - for (let line of this._lines) { - if (line.name === name) { - return line; - } - } - return -1; - } getAllLinesByCondition(condition) { const returnlines = []; this._lines.forEach((line) => { @@ -185,6 +184,18 @@ export default class StationINFOManager { targetStation.linesOfStation.delete(name); }); } + _makeNewStationByTemplate(stationName) { + return { + name: stationName, + linesOfStation: new Set(), + }; + } + _makeNewLineByTemplate(lineName, startStationName, endStationName) { + return { + name: lineName, + stationsOfLine: [startStationName, endStationName], + }; + } } const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; @@ -193,4 +204,6 @@ const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„ const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; const MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION = 0; -const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + 1}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; +const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${ + MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + 1 +}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index b821450a0..754acdf56 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -37,7 +37,7 @@ export default class StationManagerUI extends contentsUI { } _callbackOfNameInputButton() { const name = this._getInputTextByID(STATION_NAME_INPUT_ID); - if (!this._isValidStationInput(name)) { + if (!this._hasValidStationInput(name)) { return; } this._stationINFOManager.addNewStation({ diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index a92839669..966c1fdd3 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -14,7 +14,11 @@ export function hasValidLine(name, startStationName, endStationName) { minLength: MINIMUM_LENGTH_OF_LINE_NAME, errorMessage: MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE, }); - const isNotEqualName = hasNotEqualName(startStationName, endStationName); + const isNotEqualName = hasNotEqualName({ + operand1: startStationName, + operand2: endStationName, + errorMessage: HAS_EQUAL_NAME_ERROR_MESSAGE, + }); return isValidLength && isNotEqualName; } export function hasValidOrder(order) { @@ -73,13 +77,13 @@ function hasTypeOfNumber({ operand, errorMessage }) { } return retBool; } -function hasNotEqualName(startStationName, endStationName) { - let boolToReturn = true; - if (startStationName === endStationName) { - alert(HAS_EQUAL_NAME_ERROR_MESSAGE); - boolToReturn = false; +function hasNotEqualName({ operand1, operand2, errorMessage }) { + let isNotEqualName = true; + if (operand1 === operand2) { + alert(errorMessage); + isNotEqualName = false; } - return boolToReturn; + return isNotEqualName; } const MINIMUM_LENGTH_OF_STATION_NAME = 2; From 31bff59c5ba5100caa6c07fdb5f51bd3fad374a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 16:14:26 +0900 Subject: [PATCH 74/82] =?UTF-8?q?style:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=9E=91=EC=97=85=20=EC=88=98?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ๊ฐ€๋…์„ฑ์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„ ๋ณ€๊ฒฝ getStations() => getAllStations() getLines() => getAllLines() - ์ƒ์ˆ˜ ์„ ์–ธ ์ˆœ์„œ ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ๋ณ€๊ฒฝ - ํด๋ž˜์Šค ์ด๋ฆ„์ด ์ž˜๋ชป๋˜์–ด ์ˆ˜์ • MapPrintManager => MapPrintManagerUI --- src/html-manager.js | 2 +- src/index.js | 1 - src/station-info-manager.js | 37 +++++++++----------- src/ui/contents-ui/contents-ui.js | 12 +++---- src/ui/contents-ui/line-manager-ui.js | 21 +++++------- src/ui/contents-ui/map-print-manager-ui.js | 4 +-- src/ui/contents-ui/section-manager-ui.js | 40 ++++++++++------------ src/ui/contents-ui/station-manager-ui.js | 7 ++-- src/utility/input-check-utility.js | 6 ++-- src/utility/share-constant-utility.js | 1 - 10 files changed, 61 insertions(+), 70 deletions(-) diff --git a/src/html-manager.js b/src/html-manager.js index 9d55a6538..9e60c3316 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -30,7 +30,7 @@ export default class HTMLManager { this._contentsUI = new SectionManagerUI( CONTENTS_ID, this._stationINFOManager - ); + ); } setContentsUIOnMapPrintUI() { this._contentsUI = new MapPrintManagerUI( diff --git a/src/index.js b/src/index.js index 5bab1ccd1..2b04707d2 100644 --- a/src/index.js +++ b/src/index.js @@ -2,5 +2,4 @@ import HTMLManager from "./html-manager.js"; import StationINFOManager from "./station-info-manager.js"; const stationINFOManager = new StationINFOManager(); - new HTMLManager(stationINFOManager); diff --git a/src/station-info-manager.js b/src/station-info-manager.js index d056cf95d..d06614ca8 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -10,7 +10,6 @@ export default class StationINFOManager { const newStation = this._makeNewStationByTemplate(name); this._stations.push(newStation); this._saveAllToLocalStorage(); - console.log(this._stations); } addNewLine({ lineName, startStationName, endStationName }) { const newLine = this._makeNewLineByTemplate( @@ -76,13 +75,6 @@ export default class StationINFOManager { } return -1; } - getStationsNames() { - const stationNames = []; - this._stations.forEach(({ name }) => { - stationNames.push(name); - }); - return stationNames; - } getStationNamesByCondition(condition) { const returnStations = []; this._stations.forEach((station) => { @@ -92,6 +84,13 @@ export default class StationINFOManager { }); return returnStations; } + getAllStationsNames() { + const stationNames = []; + this._stations.forEach(({ name }) => { + stationNames.push(name); + }); + return stationNames; + } getOneLineByName(name) { for (let line of this._lines) { if (line.name === name) { @@ -100,16 +99,6 @@ export default class StationINFOManager { } return -1; } - getLines() { - const linesINFOs = []; - this._lines.forEach(({ name, stationsOfLine }) => { - linesINFOs.push({ - name: name, - stationsOfLine: stationsOfLine, - }); - }); - return linesINFOs; - } getAllLinesByCondition(condition) { const returnlines = []; this._lines.forEach((line) => { @@ -119,6 +108,16 @@ export default class StationINFOManager { }); return returnlines; } + getAllLines() { + const linesINFOs = []; + this._lines.forEach(({ name, stationsOfLine }) => { + linesINFOs.push({ + name: name, + stationsOfLine: stationsOfLine, + }); + }); + return linesINFOs; + } hasNotOverlapNameAmongStations(inputName) { const isValid = this._hasNotOverlapName(this._stations, inputName); if (!isValid) { @@ -142,8 +141,6 @@ export default class StationINFOManager { }); this._stations = stations; this._lines = lines; - console.log(stations); - console.log(lines); } _saveAllToLocalStorage() { const jsonStations = JSON.stringify(this._stations, this._replacer); diff --git a/src/ui/contents-ui/contents-ui.js b/src/ui/contents-ui/contents-ui.js index e7c00c870..fdf9fd5b2 100644 --- a/src/ui/contents-ui/contents-ui.js +++ b/src/ui/contents-ui/contents-ui.js @@ -17,6 +17,12 @@ export class contentsUI { const selector = document.getElementById(id); return selector[selector.selectedIndex].value; } + _addClickEventToButtonByID(id, callback) { + const button = document.getElementById(id); + button.addEventListener("click", () => { + callback.call(this); + }); + } _addClickEventToAllButtonByClassName(className, callback) { const buttons = document.querySelectorAll("." + className); Array.prototype.forEach.call(buttons, (button) => { @@ -25,10 +31,4 @@ export class contentsUI { }); }); } - _addClickEventToButtonByID(id, callback) { - const button = document.getElementById(id); - button.addEventListener("click", () => { - callback.call(this); - }); - } } diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index fed3bb593..d1517e4a2 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -18,7 +18,7 @@ export default class LineManagerUI extends contentsUI { this.updateLinesTable(); } updateLinesTable() { - const liness = this._stationINFOManager.getLines(); + const liness = this._stationINFOManager.getAllLines(); const tableContainer = document.getElementById(TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; liness.forEach((lineINFOs) => { @@ -90,7 +90,7 @@ export default class LineManagerUI extends contentsUI { `; } _makeSelectorInnerHTML() { - const stationNames = this._stationINFOManager.getStationsNames(); + const stationNames = this._stationINFOManager.getAllStationsNames(); let selectorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; stationNames.forEach((name) => { selectorInnerHTML += this._makeNewSelectorOptionHTML(name); @@ -104,23 +104,14 @@ export default class LineManagerUI extends contentsUI { } } const NAME_INPUT_ID = "line-name-input"; - const START_STATION_SELECTOR_ID = "line-start-station-selector"; const END_STATION_SELECTOR_ID = "line-end-station-selector"; - const LINE_ADD_BUTTON_ID = "line-add-button"; +const TABLE_ID = "line-table"; const LINE_DELETE_BUTTON_CLASS = "line-delete-button"; const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; -const TABLE_ID = "line-table"; -const TABLE_HEADER_TEMPLATE = ` -๋…ธ์„  ์ด๋ฆ„ -์ƒํ–‰ ์ข…์ ์—ญ -ํ•˜ํ–‰ ์ข…์ ์—ญ -์„ค์ • -`; - const INITIAL_TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„
    @@ -137,3 +128,9 @@ const INITIAL_TEMPLATE = `
    `; +const TABLE_HEADER_TEMPLATE = ` +๋…ธ์„  ์ด๋ฆ„ +์ƒํ–‰ ์ข…์ ์—ญ +ํ•˜ํ–‰ ์ข…์ ์—ญ +์„ค์ • +`; diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index ee4dfd863..d6e30f5d3 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -1,12 +1,12 @@ import { contentsUI } from "./contents-ui.js"; -export default class MapPrintManager extends contentsUI { +export default class MapPrintManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { super(contentsID, stationINFOManager); this.setContentsHTML(""); } setContentsHTML(initialTemplate) { - const lines = this._stationINFOManager.getLines(); + const lines = this._stationINFOManager.getAllLines(); lines.forEach((line) => { initialTemplate += this._makeLineINFOHTML(line); }); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index 6dcba820f..f2b79dfc8 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -8,7 +8,6 @@ import { contentsUI } from "./contents-ui.js"; export default class SectionManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { super(contentsID, stationINFOManager); - this._sectionRegisterUI = null; this.setContentsHTML(INITIAL_TEMPLATE); } @@ -19,7 +18,7 @@ export default class SectionManagerUI extends contentsUI { _updateLineButtons() { const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV_ID); - const lines = this._stationINFOManager.getLines(); + const lines = this._stationINFOManager.getAllLines(); let buttonDivInnerHTML = ""; lines.forEach(({ name }) => { buttonDivInnerHTML += this._makeNewSelectLineButtonHTML(name); @@ -52,14 +51,12 @@ class SectionRegisterUI extends contentsUI { this._lineName = lineName; this.setContentsHTML(SECTION_REGISTER_TEMPLATE); } - setContentsHTML(initialTemplate) { initialTemplate = this._makeTitleHTML(this._lineName) + initialTemplate; super.setContentsHTML(initialTemplate); this._addEventToSectionAddButton(); this.updateAllContents(); } - updateAllContents() { this._setComboboxOption(); this.updateLineStationsTable(); @@ -84,6 +81,12 @@ class SectionRegisterUI extends contentsUI { this._callbackOfDeleteButton ); } + _addEventToSectionAddButton() { + this._addClickEventToButtonByID( + SECTION_ADD_BUTTON_ID, + this._callbackOfSectionAddButton + ); + } _callbackOfDeleteButton(event) { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; @@ -92,13 +95,6 @@ class SectionRegisterUI extends contentsUI { this._stationINFOManager.deleteSection(targetStationName, this._lineName); this.updateAllContents(); } - - _addEventToSectionAddButton() { - this._addClickEventToButtonByID( - SECTION_ADD_BUTTON_ID, - this._callbackOfSectionAddButton - ); - } _callbackOfSectionAddButton() { const orderToRegister = this._getInputTextByID(SECTION_ORDER_INPUT_ID); const stationName = this._getSelectedOptionByID( @@ -156,10 +152,21 @@ class SectionRegisterUI extends contentsUI { const SECTION_REGISTER_DIV_ID = "section-register-div"; const SECTION_STATION_SELECTOR_ID = "section-station-selector"; const SECTION_REGISTER_TABLE_ID = "section-register-table"; -const SECTION_DELETE_BUTTON_CLASS = "section-delete-button"; const SECTION_ORDER_INPUT_ID = "section-order-input"; const SECTION_ADD_BUTTON_ID = "section-add-button"; +const SECTION_DELETE_BUTTON_CLASS = "section-delete-button"; +const SECTION_LINE_MENU_DIV_ID = "section-line-menu-div"; +const SECTION_LINE_MENU_BUTTON_CLASS = "section-line-menu-button"; + const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ๋…ธ์„ ์—์„œ ์ œ๊ฑฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; + +const INITIAL_TEMPLATE = ` +

    ๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

    +
    +
    +
    +
    +`; const TABLE_HEADER_TEMPLATE = ` ์ˆœ์„œ ์ด๋ฆ„ @@ -177,12 +184,3 @@ const SECTION_REGISTER_TEMPLATE = ` `; -const SECTION_LINE_MENU_DIV_ID = "section-line-menu-div"; -const SECTION_LINE_MENU_BUTTON_CLASS = "section-line-menu-button"; -const INITIAL_TEMPLATE = ` -

    ๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

    -
    -
    -
    -
    -`; diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 754acdf56..e188cf9e2 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -4,7 +4,6 @@ import { contentsUI } from "./contents-ui.js"; export default class StationManagerUI extends contentsUI { constructor(contentsID, stationINFOManager) { super(contentsID, stationINFOManager); - this.setContentsHTML(INITIAL_TEMPLATE); } setContentsHTML(initialTemplate) { @@ -13,7 +12,7 @@ export default class StationManagerUI extends contentsUI { this.updateStationsTable(); } updateStationsTable() { - const stationsNames = this._stationINFOManager.getStationsNames(); + const stationsNames = this._stationINFOManager.getAllStationsNames(); const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; for (let name of stationsNames) { @@ -72,9 +71,11 @@ export default class StationManagerUI extends contentsUI { } const STATION_NAME_INPUT_ID = "station-name-input"; const STATION_ADD_BUTTON_ID = "station-add-button"; -const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; const STATION_NAME_TABLE_ID = "station-name-table"; +const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; + const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; + const INITIAL_TEMPLATE = ` ์—ญ ์ด๋ฆ„
    diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index 966c1fdd3..49e8e8557 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -87,11 +87,11 @@ function hasNotEqualName({ operand1, operand2, errorMessage }) { } const MINIMUM_LENGTH_OF_STATION_NAME = 2; -const MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_STATION_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const MINIMUM_LENGTH_OF_LINE_NAME = 1; -const MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE = `๋…ธ์„  ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_LINE_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; - const MINIMUM_VAILD_ORDER = 0; + +const MINIMUM_LENGTH_STATION_NAME_ERROR_MESSAGE = `์—ญ ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_STATION_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; +const MINIMUM_LENGTH_LINE_NAME_ERROR_MESSAGE = `๋…ธ์„  ์ด๋ฆ„์€ ์ตœ์†Œ ${MINIMUM_LENGTH_OF_LINE_NAME} ๊ธ€์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const NOT_TYPE_OF_NUMBER_ERROR_MESSAGE = "์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."; const LESS_THAN_MINIMUM_ORDER_ERROR_MESSAGE = `์ˆœ์„œ๊ฐ’์€ ์ตœ์†Œ ${MINIMUM_VAILD_ORDER} ์ด์ƒ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.`; const HAS_EQUAL_NAME_ERROR_MESSAGE = `์ƒํ–‰ ์ข…์ ๊ณผ ํ•˜ํ–‰ ์ข…์ ์ด ๊ฐ™์€ ์—ญ์ž…๋‹ˆ๋‹ค.`; diff --git a/src/utility/share-constant-utility.js b/src/utility/share-constant-utility.js index e4554af66..08883be0c 100644 --- a/src/utility/share-constant-utility.js +++ b/src/utility/share-constant-utility.js @@ -1,5 +1,4 @@ export const SELECTEOR_NONE = "none"; - export const SELECTOR_DEFAULT_TEMPLATE = ` `; From 93978dee1b2fd97079af58eaa4d6d634eff8e7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 16:48:23 +0900 Subject: [PATCH 75/82] =?UTF-8?q?docs:=20=EB=AF=B8=EC=85=98=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EC=84=A4=EB=AA=85=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=8C=8C=EC=9D=BC=20=EC=97=85?= =?UTF-8?q?=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/images/line-manager.png | Bin 0 -> 33584 bytes docs/images/map-print-manager.png | Bin 0 -> 30952 bytes docs/images/section-manager.png | Bin 0 -> 49783 bytes docs/images/stations-manager.png | Bin 0 -> 30397 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/line-manager.png create mode 100644 docs/images/map-print-manager.png create mode 100644 docs/images/section-manager.png create mode 100644 docs/images/stations-manager.png diff --git a/docs/images/line-manager.png b/docs/images/line-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..78a981af89a5bd189a49da7faac8245a8fae3c0d GIT binary patch literal 33584 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

    cxOmnulfe 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 X>rQVDbif9JgOe1M6Dbw?>hnJUqwuX` literal 0 HcmV?d00001 diff --git a/docs/images/map-print-manager.png b/docs/images/map-print-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..2e89a54daaf73c877abff24508ff69afed5e3d3a GIT binary patch literal 30952 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 literal 0 HcmV?d00001 diff --git a/docs/images/stations-manager.png b/docs/images/stations-manager.png new file mode 100644 index 0000000000000000000000000000000000000000..fad405656e4c10cf375edcf9ea811ccbb1fe04ae GIT binary patch literal 30397 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 oI9b4d{D01ntEb%7 literal 0 HcmV?d00001 From 22628bd808be2c70c9197d508bccfaef3afec7ee Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Mon, 14 Dec 2020 17:23:23 +0900 Subject: [PATCH 76/82] =?UTF-8?q?docs:=20=EB=AF=B8=EC=85=98=20=EB=AA=A9?= =?UTF-8?q?=ED=91=9C=20=EC=9E=91=EC=84=B1,=20=EA=B3=A0=EB=AF=BC=ED=95=B4?= =?UTF-8?q?=EC=95=BC=ED=95=A0=20=EC=82=AC=ED=95=AD=EB=93=A4=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 --- docs/README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/docs/README.md b/docs/README.md index 0ec435002..4158cb5ef 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,5 +1,57 @@ # ๐Ÿš‡ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜ +## ๐ŸŽฏ ๋ฏธ์…˜ ๋ชฉํ‘œ + +์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜์€ ์ง€ํ•˜์ฒ ์˜ ์—ญ๊ณผ ๋…ธ์„ ์„ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ๋“ฑ + +์ง€ํ•˜์ฒ ์˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์›น์„ ์ œ์ž‘ํ•˜๋Š” ๋ฏธ์…˜์ž…๋‹ˆ๋‹ค. + +์›น์€ '์—ญ ๊ด€๋ฆฌ', '๋…ธ์„  ๊ด€๋ฆฌ', '๊ตฌ๊ฐ„ ๊ด€๋ฆฌ', '์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์ถœ๋ ฅ'์˜ + +4๊ฐ€์ง€ ์ปจํ…์ธ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์›น ์ƒ๋‹จ์˜ ๋ฉ”๋‰ด ๋ฐ”๋กœ ์ปจํ…์ธ  ๊ฐ„์˜ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. + +์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์›น์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ •๋ณด๋Š” ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด + +์›น์„ ๋„๊ณ  ์ผœ๋”๋ผ๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์—…ํ•œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. + +### 1. ์—ญ ๊ด€๋ฆฌ + + + +ํ˜„์žฌ ์ง€ํ•˜์ฒ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ญ ์ •๋ณด๋“ค์„ ๋ชฉ๋ก์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + +์ƒˆ๋กœ์šด ์—ญ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๊ธฐ์กด์˜ ์—ญ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + +### 2. ๋…ธ์„  ๊ด€๋ฆฌ + + + +์ง€ํ•˜์ฒ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋…ธ์„  ์ •๋ณด๋“ค์„ ๋ชฉ๋ก์œผ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. + +ํ‘œ์‹œ๋˜๋Š” ๋…ธ์„  ์ •๋ณด๋Š” ๋…ธ์„  ์ด๋ฆ„, ์ƒํ–‰ ์ข…์ , ํ•˜ํ–‰ ์ข…์ ์ž…๋‹ˆ๋‹ค. + +์ƒˆ๋กœ์šด ๋…ธ์„ ์„ ์ž…๋ ฅ๋ฐ›์•„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ  + +๊ธฐ์กด์˜ ๋…ธ์„ ์„ ์‚ญ์ œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. + +### 3. ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ + + + +๊ตฌ๊ฐ„ ๊ด€๋ฆฌ๋Š” ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. + +๊ฐ ๋…ธ์„ ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์—ญ์„ ๋“ฑ๋ก์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ  + +๋…ธ์„ ์— ํฌํ•จ๋˜์–ด์žˆ๋˜ ๊ธฐ์กด ์—ญ์„ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. + +### 4. ๋…ธ์„ ๋„ ์ถœ๋ ฅ + + + +๋…ธ์„ ๋„ ์ถœ๋ ฅ์€ ์ €์žฅ๋œ ๋…ธ์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ + +๊ฐ ๋…ธ์„ ์˜ ์ด๋ฆ„๊ณผ ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. + ## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก - (์™„๋ฃŒ)4๊ฐ€์ง€ ํŽ˜์ด์ง€๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋ฉ”๋‰ด ๋ฒ„ํŠผ ๊ตฌํ˜„ @@ -48,3 +100,6 @@ - ํ™”๋ฉด ์ „ํ™˜์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€ - ํด๋ž˜์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด์•ผ ํ• ๊นŒ - IO๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์ด๊ด„ํ•˜๋„๋ก ํ•  ๊ฒƒ์ธ๊ฐ€ ๋‚˜๋ˆŒ ๊ฒƒ์ธ๊ฐ€ +- ์ง€ํ•˜์ฒ  ์—ญ๊ณผ ๋…ธ์„ ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ +- ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋น„์Šทํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ํ™œ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ +- ๋ฉ”์†Œ๋“œ์™€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์ •ํ• ์ˆ˜ ์žˆ์„๊นŒ From 0b507fe839efcc717706729c242c5005899adf97 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Mon, 14 Dec 2020 17:28:06 +0900 Subject: [PATCH 77/82] =?UTF-8?q?docs:=20=EB=AC=B8=EC=84=9C=20=EA=B0=80?= =?UTF-8?q?=EB=8F=85=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 24 ++++++------------------ 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/docs/README.md b/docs/README.md index 4158cb5ef..3bfc6d0d3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,17 +2,11 @@ ## ๐ŸŽฏ ๋ฏธ์…˜ ๋ชฉํ‘œ -์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜์€ ์ง€ํ•˜์ฒ ์˜ ์—ญ๊ณผ ๋…ธ์„ ์„ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ๋“ฑ +์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ๋ฏธ์…˜์€ ์ง€ํ•˜์ฒ ์˜ ์—ญ๊ณผ ๋…ธ์„ ์„ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ๋“ฑ ์ง€ํ•˜์ฒ ์˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์›น์„ ์ œ์ž‘ํ•˜๋Š” ๋ฏธ์…˜์ž…๋‹ˆ๋‹ค. -์ง€ํ•˜์ฒ ์˜ ๊ตฌ์กฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์›น์„ ์ œ์ž‘ํ•˜๋Š” ๋ฏธ์…˜์ž…๋‹ˆ๋‹ค. +์›น์€ '์—ญ ๊ด€๋ฆฌ', '๋…ธ์„  ๊ด€๋ฆฌ', '๊ตฌ๊ฐ„ ๊ด€๋ฆฌ', '์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์ถœ๋ ฅ'์˜ 4๊ฐ€์ง€ ์ปจํ…์ธ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์›น ์ƒ๋‹จ์˜ ๋ฉ”๋‰ด ๋ฐ”๋กœ ์ปจํ…์ธ  ๊ฐ„์˜ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. -์›น์€ '์—ญ ๊ด€๋ฆฌ', '๋…ธ์„  ๊ด€๋ฆฌ', '๊ตฌ๊ฐ„ ๊ด€๋ฆฌ', '์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์ถœ๋ ฅ'์˜ - -4๊ฐ€์ง€ ์ปจํ…์ธ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ์›น ์ƒ๋‹จ์˜ ๋ฉ”๋‰ด ๋ฐ”๋กœ ์ปจํ…์ธ  ๊ฐ„์˜ ์ด๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. - -์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์›น์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ •๋ณด๋Š” ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด - -์›น์„ ๋„๊ณ  ์ผœ๋”๋ผ๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์—…ํ•œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. +์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์›น์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ •๋ณด๋Š” ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด ์›น์„ ๋„๊ณ  ์ผœ๋”๋ผ๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์—…ํ•œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. ### 1. ์—ญ ๊ด€๋ฆฌ @@ -30,9 +24,7 @@ ํ‘œ์‹œ๋˜๋Š” ๋…ธ์„  ์ •๋ณด๋Š” ๋…ธ์„  ์ด๋ฆ„, ์ƒํ–‰ ์ข…์ , ํ•˜ํ–‰ ์ข…์ ์ž…๋‹ˆ๋‹ค. -์ƒˆ๋กœ์šด ๋…ธ์„ ์„ ์ž…๋ ฅ๋ฐ›์•„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ  - -๊ธฐ์กด์˜ ๋…ธ์„ ์„ ์‚ญ์ œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. +์ƒˆ๋กœ์šด ๋…ธ์„ ์„ ์ž…๋ ฅ๋ฐ›์•„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ  ๊ธฐ์กด์˜ ๋…ธ์„ ์„ ์‚ญ์ œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ### 3. ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ @@ -40,17 +32,13 @@ ๊ตฌ๊ฐ„ ๊ด€๋ฆฌ๋Š” ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. -๊ฐ ๋…ธ์„ ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์—ญ์„ ๋“ฑ๋ก์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ  - -๋…ธ์„ ์— ํฌํ•จ๋˜์–ด์žˆ๋˜ ๊ธฐ์กด ์—ญ์„ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. +๊ฐ ๋…ธ์„ ์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์—ญ์„ ๋“ฑ๋ก์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๊ณ  ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด์žˆ๋˜ ๊ธฐ์กด ์—ญ์„ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ### 4. ๋…ธ์„ ๋„ ์ถœ๋ ฅ -๋…ธ์„ ๋„ ์ถœ๋ ฅ์€ ์ €์žฅ๋œ ๋…ธ์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ - -๊ฐ ๋…ธ์„ ์˜ ์ด๋ฆ„๊ณผ ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. +๋…ธ์„ ๋„ ์ถœ๋ ฅ์€ ์ €์žฅ๋œ ๋…ธ์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฐ ๋…ธ์„ ์˜ ์ด๋ฆ„๊ณผ ๋…ธ์„ ์— ๋“ฑ๋ก๋œ ์—ญ ์ด๋ฆ„์„ ๋‚˜์—ดํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ## ๐Ÿ“ ๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ ๋ชฉ๋ก From 6f2063b35a64460433770e221ce91e7706eb2f74 Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Mon, 14 Dec 2020 17:39:16 +0900 Subject: [PATCH 78/82] =?UTF-8?q?docs:=20=EC=84=9C=EC=88=A0=20=EC=A3=BC?= =?UTF-8?q?=EC=A0=9C=EC=97=90=20=EB=94=B0=EB=9D=BC=20=ED=83=AD=20=EB=82=98?= =?UTF-8?q?=EB=88=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/README.md b/docs/README.md index 3bfc6d0d3..c6eba5556 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,6 +8,8 @@ ์ง€ํ•˜์ฒ  ๋…ธ์„ ๋„ ์›น์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ์ •๋ณด๋Š” ์ปดํ“จํ„ฐ์— ์ €์žฅ๋˜์–ด ์›น์„ ๋„๊ณ  ์ผœ๋”๋ผ๋„ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ž‘์—…ํ•œ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. +## ๐Ÿ’ป ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋Šฅ + ### 1. ์—ญ ๊ด€๋ฆฌ From 0911a4463d3529686e822a03550b22b126a0cfa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Mon, 14 Dec 2020 17:48:22 +0900 Subject: [PATCH 79/82] =?UTF-8?q?fix:=20localstorage=EC=97=90=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EA=B0=80=20=EC=97=86=EC=9C=BC=EB=A9=B4=20?= =?UTF-8?q?=EC=98=A4=EC=9E=91=EB=8F=99=ED=95=98=EB=8A=94=20=ED=98=84?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/station-info-manager.js | 3 +++ src/ui/contents-ui/section-manager-ui.js | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/station-info-manager.js b/src/station-info-manager.js index d06614ca8..e9fd1a0be 100644 --- a/src/station-info-manager.js +++ b/src/station-info-manager.js @@ -136,6 +136,9 @@ export default class StationINFOManager { _loadAllFromLocalStorage() { const stations = JSON.parse(localStorage.getItem("stations")); const lines = JSON.parse(localStorage.getItem("lines")); + if (stations === null || lines === null) { + return; + } stations.forEach((station) => { station.linesOfStation = new Set(station.linesOfStation); }); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index f2b79dfc8..a2544fb48 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -183,4 +183,3 @@ const SECTION_REGISTER_TEMPLATE = `
    `; - From 0882aa8d11eafe393abbca6cb7d41261a0ca133b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Tue, 15 Dec 2020 14:41:50 +0900 Subject: [PATCH 80/82] =?UTF-8?q?style:=20=EA=B0=80=EB=8F=85=EC=84=B1?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20=ED=8C=8C=EC=9D=BC,=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=84=A4=EC=9E=84=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 station-info-manager.js๋Š” ์—ญ ์ •๋ณด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋…ธ์„  ์ •๋ณด๋„ ์ €์žฅํ•˜๋ฏ€๋กœ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด station-info-manager.js => subway-info-manager.js๋กœ ์ด๋ฆ„์„ ๋ณ€๊ฒฝ --- src/html-manager.js | 12 +++++------ src/index.js | 6 +++--- ...info-manager.js => subway-info-manager.js} | 2 +- src/ui/contents-ui/contents-ui.js | 4 ++-- src/ui/contents-ui/line-manager-ui.js | 14 ++++++------- src/ui/contents-ui/map-print-manager-ui.js | 6 +++--- src/ui/contents-ui/section-manager-ui.js | 20 +++++++++---------- src/ui/contents-ui/station-manager-ui.js | 12 +++++------ 8 files changed, 38 insertions(+), 38 deletions(-) rename src/{station-info-manager.js => subway-info-manager.js} (99%) diff --git a/src/html-manager.js b/src/html-manager.js index 9e60c3316..28b1f4f1f 100644 --- a/src/html-manager.js +++ b/src/html-manager.js @@ -5,8 +5,8 @@ import SectionManagerUI from "./ui/contents-ui/section-manager-ui.js"; import MapPrintManagerUI from "./ui/contents-ui/map-print-manager-ui.js"; export default class HTMLManager { - constructor(stationINFOManager) { - this._stationINFOManager = stationINFOManager; + constructor(subwayINFOManager) { + this._subwayINFOManager = subwayINFOManager; this._menubarUI = new MenubarUI({ htmlManager: this, menubarID: MENUBAR_ID, @@ -17,25 +17,25 @@ export default class HTMLManager { setContentsUIOnStationUI() { this._contentsUI = new StationManagerUI( CONTENTS_ID, - this._stationINFOManager + this._subwayINFOManager ); } setContentsUIOnSectionUI() { this._contentsUI = new LineManagerUI( CONTENTS_ID, - this._stationINFOManager + this._subwayINFOManager ); } setContentsUIOnLineUI() { this._contentsUI = new SectionManagerUI( CONTENTS_ID, - this._stationINFOManager + this._subwayINFOManager ); } setContentsUIOnMapPrintUI() { this._contentsUI = new MapPrintManagerUI( CONTENTS_ID, - this._stationINFOManager + this._subwayINFOManager ); } } diff --git a/src/index.js b/src/index.js index 2b04707d2..7f2f31324 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,5 @@ import HTMLManager from "./html-manager.js"; -import StationINFOManager from "./station-info-manager.js"; +import SubwayINFOManager from "./subway-info-manager.js"; -const stationINFOManager = new StationINFOManager(); -new HTMLManager(stationINFOManager); +const subwayINFOManager = new SubwayINFOManager(); +new HTMLManager(subwayINFOManager); diff --git a/src/station-info-manager.js b/src/subway-info-manager.js similarity index 99% rename from src/station-info-manager.js rename to src/subway-info-manager.js index e9fd1a0be..fe4f49f5c 100644 --- a/src/station-info-manager.js +++ b/src/subway-info-manager.js @@ -1,6 +1,6 @@ import { hasSatisfiedMaxLengthCondition } from "./utility/input-check-utility.js"; -export default class StationINFOManager { +export default class SubwayINFOManager { constructor() { this._stations = []; this._lines = []; diff --git a/src/ui/contents-ui/contents-ui.js b/src/ui/contents-ui/contents-ui.js index fdf9fd5b2..6bf574ebf 100644 --- a/src/ui/contents-ui/contents-ui.js +++ b/src/ui/contents-ui/contents-ui.js @@ -1,7 +1,7 @@ export class contentsUI { - constructor(contentsID, stationINFOManager) { + constructor(contentsID, subwayINFOManager) { this._contentsID = contentsID; - this._stationINFOManager = stationINFOManager; + this._subwayINFOManager = subwayINFOManager; } setContentsHTML(initialTemplate) { document.getElementById(this._contentsID).innerHTML = initialTemplate; diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index d1517e4a2..a80a1f517 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -6,8 +6,8 @@ import { import { contentsUI } from "./contents-ui.js"; export default class LineManagerUI extends contentsUI { - constructor(contentsID, stationINFOManager) { - super(contentsID, stationINFOManager); + constructor(contentsID, subwayINFOManager) { + super(contentsID, subwayINFOManager); this.setContentsHTML(INITIAL_TEMPLATE); } setContentsHTML(initialTemplate) { @@ -18,7 +18,7 @@ export default class LineManagerUI extends contentsUI { this.updateLinesTable(); } updateLinesTable() { - const liness = this._stationINFOManager.getAllLines(); + const liness = this._subwayINFOManager.getAllLines(); const tableContainer = document.getElementById(TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; liness.forEach((lineINFOs) => { @@ -51,7 +51,7 @@ export default class LineManagerUI extends contentsUI { if (!this._hasValidLineInput(lineName, startStation, endStation)) { return; } - this._stationINFOManager.addNewLine({ + this._subwayINFOManager.addNewLine({ lineName: lineName, startStationName: startStation, endStationName: endStation, @@ -62,7 +62,7 @@ export default class LineManagerUI extends contentsUI { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } - this._stationINFOManager.deleteLine(event.target.dataset.name); + this._subwayINFOManager.deleteLine(event.target.dataset.name); this.updateLinesTable(); } _hasValidLineInput(lineName, startStationName, endStationName) { @@ -71,7 +71,7 @@ export default class LineManagerUI extends contentsUI { startStationName, endStationName ); - const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongLines( + const isNotOverlapName = this._subwayINFOManager.hasNotOverlapNameAmongLines( lineName ); const isValidOption = hasValidOption([startStationName, endStationName]); @@ -90,7 +90,7 @@ export default class LineManagerUI extends contentsUI { `; } _makeSelectorInnerHTML() { - const stationNames = this._stationINFOManager.getAllStationsNames(); + const stationNames = this._subwayINFOManager.getAllStationsNames(); let selectorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; stationNames.forEach((name) => { selectorInnerHTML += this._makeNewSelectorOptionHTML(name); diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index d6e30f5d3..74692ee08 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -1,12 +1,12 @@ import { contentsUI } from "./contents-ui.js"; export default class MapPrintManagerUI extends contentsUI { - constructor(contentsID, stationINFOManager) { - super(contentsID, stationINFOManager); + constructor(contentsID, subwayINFOManager) { + super(contentsID, subwayINFOManager); this.setContentsHTML(""); } setContentsHTML(initialTemplate) { - const lines = this._stationINFOManager.getAllLines(); + const lines = this._subwayINFOManager.getAllLines(); lines.forEach((line) => { initialTemplate += this._makeLineINFOHTML(line); }); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index a2544fb48..ebf93fa70 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -6,8 +6,8 @@ import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility. import { contentsUI } from "./contents-ui.js"; export default class SectionManagerUI extends contentsUI { - constructor(contentsID, stationINFOManager) { - super(contentsID, stationINFOManager); + constructor(contentsID, subwayINFOManager) { + super(contentsID, subwayINFOManager); this._sectionRegisterUI = null; this.setContentsHTML(INITIAL_TEMPLATE); } @@ -18,7 +18,7 @@ export default class SectionManagerUI extends contentsUI { _updateLineButtons() { const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV_ID); - const lines = this._stationINFOManager.getAllLines(); + const lines = this._subwayINFOManager.getAllLines(); let buttonDivInnerHTML = ""; lines.forEach(({ name }) => { buttonDivInnerHTML += this._makeNewSelectLineButtonHTML(name); @@ -32,7 +32,7 @@ export default class SectionManagerUI extends contentsUI { button.addEventListener("click", (e) => { this._sectionRegisterUI = new SectionRegisterUI( SECTION_REGISTER_DIV_ID, - this._stationINFOManager, + this._subwayINFOManager, e.target.dataset.name ); }); @@ -46,8 +46,8 @@ export default class SectionManagerUI extends contentsUI { } class SectionRegisterUI extends contentsUI { - constructor(contentsID, stationINFOManager, lineName) { - super(contentsID, stationINFOManager); + constructor(contentsID, subwayINFOManager, lineName) { + super(contentsID, subwayINFOManager); this._lineName = lineName; this.setContentsHTML(SECTION_REGISTER_TEMPLATE); } @@ -63,7 +63,7 @@ class SectionRegisterUI extends contentsUI { } updateLineStationsTable() { const table = document.getElementById(SECTION_REGISTER_TABLE_ID); - const myLine = this._stationINFOManager.getAllLinesByCondition((line) => { + const myLine = this._subwayINFOManager.getAllLinesByCondition((line) => { return line.name === this._lineName; })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; @@ -92,7 +92,7 @@ class SectionRegisterUI extends contentsUI { return; } const targetStationName = event.target.dataset.name; - this._stationINFOManager.deleteSection(targetStationName, this._lineName); + this._subwayINFOManager.deleteSection(targetStationName, this._lineName); this.updateAllContents(); } _callbackOfSectionAddButton() { @@ -103,7 +103,7 @@ class SectionRegisterUI extends contentsUI { if (!this._hasValidSectionAddInput(orderToRegister, stationName)) { return; } - this._stationINFOManager.registerStationToLine( + this._subwayINFOManager.registerStationToLine( this._lineName, orderToRegister, stationName @@ -117,7 +117,7 @@ class SectionRegisterUI extends contentsUI { } _setComboboxOption() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); - const optionNames = this._stationINFOManager.getStationNamesByCondition( + const optionNames = this._subwayINFOManager.getStationNamesByCondition( (station) => { return !station.linesOfStation.has(this._lineName); } diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index e188cf9e2..3f3d1a8d4 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -2,8 +2,8 @@ import { hasValidStationName } from "../../utility/input-check-utility.js"; import { contentsUI } from "./contents-ui.js"; export default class StationManagerUI extends contentsUI { - constructor(contentsID, stationINFOManager) { - super(contentsID, stationINFOManager); + constructor(contentsID, subwayINFOManager) { + super(contentsID, subwayINFOManager); this.setContentsHTML(INITIAL_TEMPLATE); } setContentsHTML(initialTemplate) { @@ -12,7 +12,7 @@ export default class StationManagerUI extends contentsUI { this.updateStationsTable(); } updateStationsTable() { - const stationsNames = this._stationINFOManager.getAllStationsNames(); + const stationsNames = this._subwayINFOManager.getAllStationsNames(); const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; for (let name of stationsNames) { @@ -39,7 +39,7 @@ export default class StationManagerUI extends contentsUI { if (!this._hasValidStationInput(name)) { return; } - this._stationINFOManager.addNewStation({ + this._subwayINFOManager.addNewStation({ name: name, }); this.updateStationsTable(); @@ -48,12 +48,12 @@ export default class StationManagerUI extends contentsUI { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } - this._stationINFOManager.deleteStation(event.target.dataset.name); + this._subwayINFOManager.deleteStation(event.target.dataset.name); this.updateStationsTable(); } _hasValidStationInput(name) { const isValidStationName = hasValidStationName(name); - const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongStations( + const isNotOverlapName = this._subwayINFOManager.hasNotOverlapNameAmongStations( name ); return isValidStationName && isNotOverlapName; From 2ab1e11d5b90ab0387fc4d84b40618264e0c139e Mon Sep 17 00:00:00 2001 From: Kwon Se-jin <48755175+0307kwon@users.noreply.github.com> Date: Tue, 15 Dec 2020 15:30:56 +0900 Subject: [PATCH 81/82] =?UTF-8?q?docs:=20=EC=95=A0=EB=A7=A4=ED=95=9C=20?= =?UTF-8?q?=EC=9A=A9=EC=96=B4=EB=A5=BC=20=EA=B5=AC=EC=B2=B4=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index c6eba5556..c12fb49d1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -91,5 +91,5 @@ - ํด๋ž˜์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜๋ˆ„์–ด์•ผ ํ• ๊นŒ - IO๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค๊ฐ€ ์ด๊ด„ํ•˜๋„๋ก ํ•  ๊ฒƒ์ธ๊ฐ€ ๋‚˜๋ˆŒ ๊ฒƒ์ธ๊ฐ€ - ์ง€ํ•˜์ฒ  ์—ญ๊ณผ ๋…ธ์„ ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ -- ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋น„์Šทํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ํ™œ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ +- ์ˆ˜ํ–‰ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋น„์Šทํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธํ™”ํ•˜์—ฌ ํ™œ์šฉํ•  ๊ฒƒ์ธ๊ฐ€ - ๋ฉ”์†Œ๋“œ์™€ ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์ •ํ• ์ˆ˜ ์žˆ์„๊นŒ From 0c475f5eb6b071662f39605d89bd01d776b6abcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B6=8C=EC=84=B8=EC=A7=84?= <0307kwon@gmail.com> Date: Tue, 15 Dec 2020 22:04:03 +0900 Subject: [PATCH 82/82] =?UTF-8?q?refactor:=20=EC=A7=80=ED=95=98=EC=B2=A0?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=A0=80=EC=9E=A5=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD,=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC=20=EB=AA=A8=EB=93=88=20=EC=84=B8=EB=B6=84?= =?UTF-8?q?=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -station ๋ฐ์ดํ„ฐ๊ฐ€ station ์ด๋ฆ„ ์ •๋ณด๋งŒ ๋‹ด๋„๋ก ๋ณ€๊ฒฝ - ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ชจ๋“ˆ์„ line-info-manager.js ์™€ station-info-manager.js ๋กœ ์„ธ๋ถ„ํ™” --- package-lock.json | 6 +- package.json | 2 +- src/info-manager/line-info-manager.js | 97 ++++++++++ src/info-manager/station-info-manager.js | 80 ++++++++ src/subway-info-manager.js | 209 +-------------------- src/ui/contents-ui/contents-ui.js | 2 + src/ui/contents-ui/line-manager-ui.js | 19 +- src/ui/contents-ui/map-print-manager-ui.js | 2 +- src/ui/contents-ui/section-manager-ui.js | 23 ++- src/ui/contents-ui/station-manager-ui.js | 12 +- src/utility/input-check-utility.js | 6 + src/utility/share-constant-utility.js | 1 + src/utility/storage-utility.js | 9 + 13 files changed, 235 insertions(+), 233 deletions(-) create mode 100644 src/info-manager/line-info-manager.js create mode 100644 src/info-manager/station-info-manager.js create mode 100644 src/utility/storage-utility.js diff --git a/package-lock.json b/package-lock.json index 7852da13d..104414d89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -329,9 +329,9 @@ "dev": true }, "eslint-plugin-prettier": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.2.0.tgz", - "integrity": "sha512-kOUSJnFjAUFKwVxuzy6sA5yyMx6+o9ino4gCdShzBNx4eyFRudWRYKCFolKjoM40PEiuU6Cn7wBLfq3WsGg7qg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.0.tgz", + "integrity": "sha512-tMTwO8iUWlSRZIwS9k7/E4vrTsfvsrcM5p1eftyuqWH25nKsz/o6/54I7jwQ/3zobISyC7wMy9ZsFwgTxOcOpQ==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0" diff --git a/package.json b/package.json index ea4dfb7c7..5b34e6d68 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "eslint": "^7.15.0", "eslint-config-google": "^0.14.0", "eslint-config-prettier": "^7.0.0", - "eslint-plugin-prettier": "^3.2.0", + "eslint-plugin-prettier": "^3.3.0", "prettier": "^2.2.1" } } diff --git a/src/info-manager/line-info-manager.js b/src/info-manager/line-info-manager.js new file mode 100644 index 000000000..4976fcdcc --- /dev/null +++ b/src/info-manager/line-info-manager.js @@ -0,0 +1,97 @@ +import { hasNotOverlapName } from "../utility/input-check-utility.js"; +import { + saveToLocalStorage, + loadFromLocalStorage, +} from "../utility/storage-utility.js"; + +export default class LineINFOManager { + constructor(subwayINFOManager) { + this._lines = loadFromLocalStorage(ITEM_NAME_OF_LINES); + if (this._lines === null) { + this._lines = []; + } + this._subwayINFOManager = subwayINFOManager; + } + addNewLine({ lineName, startStationName, endStationName }) { + const newLine = this._makeNewLineByTemplate( + lineName, + startStationName, + endStationName + ); + this._lines.push(newLine); + saveToLocalStorage(ITEM_NAME_OF_LINES, this._lines); + } + deleteLine(nameToDelete) { + const lineIndexToDelete = this._lines.findIndex(({ name }) => { + return nameToDelete === name; + }); + if (lineIndexToDelete === -1) { + return; + } + this._lines.splice(lineIndexToDelete, 1); + saveToLocalStorage(ITEM_NAME_OF_LINES, this._lines); + } + deleteSection(targetStationName, targetLineName) { + const targetLine = this.getOneLineByName(targetLineName); + if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { + alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); + return; + } + this._deleteStationInLine(targetStationName, targetLineName); + saveToLocalStorage(ITEM_NAME_OF_LINES, this._lines); + } + getOneLineByName(name) { + for (let line of this._lines) { + if (line.name === name) { + return line; + } + } + return -1; + } + getAllLinesByCondition(condition) { + const returnlines = []; + this._lines.forEach((line) => { + if (condition(line)) { + returnlines.push(line); + } + }); + return returnlines; + } + getAllLines() { + return [...this._lines]; + } + hasNotOverlapNameAmongLines(inputName) { + const isValid = hasNotOverlapName(this._lines, inputName); + if (!isValid) { + alert(OVERLAP_LINE_ERROR_MESSAGE); + } + return isValid; + } + registerStationToLine(lineName, orderToRegister, stationName) { + const targetLine = this.getOneLineByName(lineName); + targetLine.stationsOfLine.splice(orderToRegister, 0, stationName); + saveToLocalStorage(ITEM_NAME_OF_LINES, this._lines); + } + + _deleteStationInLine(targetStationName, targetLineName) { + const targetLine = this.getOneLineByName(targetLineName); + const targetStationIndex = targetLine.stationsOfLine.findIndex( + (stationName) => { + return stationName === targetStationName; + } + ); + targetLine.stationsOfLine.splice(targetStationIndex, 1); + } + _makeNewLineByTemplate(lineName, startStationName, endStationName) { + return { + name: lineName, + stationsOfLine: [startStationName, endStationName], + }; + } +} + +const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; +const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; +const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; + +const ITEM_NAME_OF_LINES = "lines"; diff --git a/src/info-manager/station-info-manager.js b/src/info-manager/station-info-manager.js new file mode 100644 index 000000000..a07e7027d --- /dev/null +++ b/src/info-manager/station-info-manager.js @@ -0,0 +1,80 @@ +import { hasNotOverlapName } from "../utility/input-check-utility.js"; +import { + saveToLocalStorage, + loadFromLocalStorage, +} from "../utility/storage-utility.js"; + +export default class StationINFOManager { + constructor(subwayINFOManager) { + this._stations = loadFromLocalStorage(ITEM_NAME_OF_STATIONS); + if (this._stations === null) { + this._stations = []; + } + this._subwayINFOManager = subwayINFOManager; + } + addNewStation({ name }) { + const newStation = this._makeNewStationByTemplate(name); + this._stations.push(newStation); + saveToLocalStorage(ITEM_NAME_OF_STATIONS, this._stations); + } + deleteStation(nameToDelete, lines) { + const stationIndexToDelete = this._stations.findIndex(({ name }) => { + return nameToDelete === name; + }); + const isRegistedStationInLine = this._hasRegistedStationInLine( + nameToDelete, + lines + ); + if (isRegistedStationInLine) { + alert(STATION_INCLUDE_IN_LINE_ERROR_MESSAGE); + return; + } + this._stations.splice(stationIndexToDelete, 1); + saveToLocalStorage(ITEM_NAME_OF_STATIONS, this._stations); + } + getOneStationByName(name) { + for (let station of this._stations) { + if (station.name === name) { + return station; + } + } + return -1; + } + getAllStationNames() { + const stationNames = []; + this._stations.forEach(({ name }) => { + stationNames.push(name); + }); + return stationNames; + } + getAllStations() { + return [...this._stations]; + } + hasNotOverlapNameAmongStations(inputName) { + const isNotOverlapName = hasNotOverlapName(this._stations, inputName); + if (!isNotOverlapName) { + alert(OVERLAP_STATION_ERROR_MESSAGE); + } + return isNotOverlapName; + } + + _makeNewStationByTemplate(stationName) { + return { + name: stationName, + }; + } + _hasRegistedStationInLine(stationName, lines) { + const isRegistedStationInLine = lines.some((line) => { + const indexToEqualStationName = line.stationsOfLine.findIndex((name) => { + return name === stationName; + }); + return indexToEqualStationName !== -1; + }); + return isRegistedStationInLine; + } +} + +const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; +const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `1๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; + +const ITEM_NAME_OF_STATIONS = "stations"; diff --git a/src/subway-info-manager.js b/src/subway-info-manager.js index fe4f49f5c..9e60eccd7 100644 --- a/src/subway-info-manager.js +++ b/src/subway-info-manager.js @@ -1,209 +1,16 @@ -import { hasSatisfiedMaxLengthCondition } from "./utility/input-check-utility.js"; +import StationINFOManager from "./info-manager/station-info-manager.js"; +import LineINFOManager from "./info-manager/line-info-manager.js"; export default class SubwayINFOManager { constructor() { - this._stations = []; - this._lines = []; - this._loadAllFromLocalStorage(); + this._stationINFOManager = new StationINFOManager(this); + this._lineINFOManager = new LineINFOManager(this); } - addNewStation({ name }) { - const newStation = this._makeNewStationByTemplate(name); - this._stations.push(newStation); - this._saveAllToLocalStorage(); - } - addNewLine({ lineName, startStationName, endStationName }) { - const newLine = this._makeNewLineByTemplate( - lineName, - startStationName, - endStationName - ); - const startStation = this.getOneStationByName(startStationName); - const endStation = this.getOneStationByName(endStationName); - this._lines.push(newLine); - startStation.linesOfStation.add(lineName); - endStation.linesOfStation.add(lineName); - this._saveAllToLocalStorage(); - } - registerStationToLine(lineName, orderToRegister, stationName) { - const targetLine = this.getOneLineByName(lineName); - const targetStation = this.getOneStationByName(stationName); - targetLine.stationsOfLine.splice(orderToRegister, 0, stationName); - targetStation.linesOfStation.add(lineName); - this._saveAllToLocalStorage(); - } - deleteStation(nameToDelete) { - const stationIndexToDelete = this._stations.findIndex(({ name }) => { - return nameToDelete === name; - }); - const isSatisfyMaxLengthCondition = hasSatisfiedMaxLengthCondition({ - operandLength: this._stations[stationIndexToDelete].linesOfStation.size, - maxLength: MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION, - errorMessage: STATION_INCLUDE_IN_LINE_ERROR_MESSAGE, - }); - if (!isSatisfyMaxLengthCondition) { - return; - } - this._stations.splice(stationIndexToDelete, 1); - this._saveAllToLocalStorage(); - } - deleteLine(nameToDelete) { - const lineIndexToDelete = this._lines.findIndex(({ name }) => { - return nameToDelete === name; - }); - if (lineIndexToDelete === -1) { - return; - } - this._deleteLineInAllStations(this._lines[lineIndexToDelete]); - this._lines.splice(lineIndexToDelete, 1); - this._saveAllToLocalStorage(); - } - deleteSection(targetStationName, targetLineName) { - const targetLine = this.getOneLineByName(targetLineName); - if (targetLine.stationsOfLine.length <= MINIMUM_NUMBER_STATIONS_OF_LINE) { - alert(NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE); - return; - } - this._deleteLineInStation(targetStationName, targetLineName); - this._deleteStationInLine(targetStationName, targetLineName); - this._saveAllToLocalStorage(); - } - getOneStationByName(name) { - for (let station of this._stations) { - if (station.name === name) { - return station; - } - } - return -1; - } - getStationNamesByCondition(condition) { - const returnStations = []; - this._stations.forEach((station) => { - if (condition(station)) { - returnStations.push(station.name); - } - }); - return returnStations; - } - getAllStationsNames() { - const stationNames = []; - this._stations.forEach(({ name }) => { - stationNames.push(name); - }); - return stationNames; - } - getOneLineByName(name) { - for (let line of this._lines) { - if (line.name === name) { - return line; - } - } - return -1; - } - getAllLinesByCondition(condition) { - const returnlines = []; - this._lines.forEach((line) => { - if (condition(line)) { - returnlines.push(line); - } - }); - return returnlines; - } - getAllLines() { - const linesINFOs = []; - this._lines.forEach(({ name, stationsOfLine }) => { - linesINFOs.push({ - name: name, - stationsOfLine: stationsOfLine, - }); - }); - return linesINFOs; - } - hasNotOverlapNameAmongStations(inputName) { - const isValid = this._hasNotOverlapName(this._stations, inputName); - if (!isValid) { - alert(OVERLAP_STATION_ERROR_MESSAGE); - } - return isValid; - } - hasNotOverlapNameAmongLines(inputName) { - const isValid = this._hasNotOverlapName(this._lines, inputName); - if (!isValid) { - alert(OVERLAP_LINE_ERROR_MESSAGE); - } - return isValid; - } - - _loadAllFromLocalStorage() { - const stations = JSON.parse(localStorage.getItem("stations")); - const lines = JSON.parse(localStorage.getItem("lines")); - if (stations === null || lines === null) { - return; - } - stations.forEach((station) => { - station.linesOfStation = new Set(station.linesOfStation); - }); - this._stations = stations; - this._lines = lines; - } - _saveAllToLocalStorage() { - const jsonStations = JSON.stringify(this._stations, this._replacer); - const jsonLines = JSON.stringify(this._lines); - localStorage.setItem("stations", jsonStations); - localStorage.setItem("lines", jsonLines); - } - _replacer(key, value) { - if (value.__proto__.constructor.name === "Set") { - return Array.from(value); - } - return value; - } - _hasNotOverlapName(targetToFindOverlap, inputName) { - const overlapIndex = targetToFindOverlap.findIndex( - ({ name }) => name === inputName - ); - return overlapIndex === -1; + getStationINFOManager() { + return this._stationINFOManager; } - _deleteLineInStation(targetStationName, targetLineName) { - const targetStation = this.getOneStationByName(targetStationName); - targetStation.linesOfStation.delete(targetLineName); - } - _deleteStationInLine(targetStationName, targetLineName) { - const targetLine = this.getOneLineByName(targetLineName); - const targetStationIndex = targetLine.stationsOfLine.findIndex( - (stationName) => { - return stationName === targetStationName; - } - ); - targetLine.stationsOfLine.splice(targetStationIndex, 1); - } - _deleteLineInAllStations(lineToDelete) { - const { name, stationsOfLine } = lineToDelete; - stationsOfLine.forEach((stationName) => { - const targetStation = this.getOneStationByName(stationName); - targetStation.linesOfStation.delete(name); - }); - } - _makeNewStationByTemplate(stationName) { - return { - name: stationName, - linesOfStation: new Set(), - }; - } - _makeNewLineByTemplate(lineName, startStationName, endStationName) { - return { - name: lineName, - stationsOfLine: [startStationName, endStationName], - }; + getLineINFOManager() { + return this._lineINFOManager; } } - -const OVERLAP_STATION_ERROR_MESSAGE = "๊ธฐ์กด ์—ญ ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; -const OVERLAP_LINE_ERROR_MESSAGE = "๊ธฐ์กด ๋…ธ์„  ์ด๋ฆ„๊ณผ ์ค‘๋ณต๋˜๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค."; - -const MINIMUM_NUMBER_STATIONS_OF_LINE = 2; -const NOT_MINIMUM_NUMBER_STATIONS_OF_LINE_ERROR_MESSAGE = `๋…ธ์„ ์—๋Š” ์ตœ์†Œ ${MINIMUM_NUMBER_STATIONS_OF_LINE}๊ฐœ์˜ ์—ญ์ด ํฌํ•จ๋˜์–ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.`; -const MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION = 0; -const STATION_INCLUDE_IN_LINE_ERROR_MESSAGE = `${ - MAXIMUM_NUMBER_LINES_OF_STATION_TO_DELETE_STATION + 1 -}๊ฐœ ์ด์ƒ์˜ ๋…ธ์„ ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ์—ญ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.`; diff --git a/src/ui/contents-ui/contents-ui.js b/src/ui/contents-ui/contents-ui.js index 6bf574ebf..8ba538e89 100644 --- a/src/ui/contents-ui/contents-ui.js +++ b/src/ui/contents-ui/contents-ui.js @@ -2,6 +2,8 @@ export class contentsUI { constructor(contentsID, subwayINFOManager) { this._contentsID = contentsID; this._subwayINFOManager = subwayINFOManager; + this._stationINFOManager = this._subwayINFOManager.getStationINFOManager(); + this._lineINFOManager = this._subwayINFOManager.getLineINFOManager(); } setContentsHTML(initialTemplate) { document.getElementById(this._contentsID).innerHTML = initialTemplate; diff --git a/src/ui/contents-ui/line-manager-ui.js b/src/ui/contents-ui/line-manager-ui.js index a80a1f517..05cb87756 100644 --- a/src/ui/contents-ui/line-manager-ui.js +++ b/src/ui/contents-ui/line-manager-ui.js @@ -1,4 +1,7 @@ -import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; +import { + DELETE_CONFIRM_MESSAGE, + SELECTOR_DEFAULT_TEMPLATE, +} from "../../utility/share-constant-utility.js"; import { hasValidLine, hasValidOption, @@ -18,10 +21,10 @@ export default class LineManagerUI extends contentsUI { this.updateLinesTable(); } updateLinesTable() { - const liness = this._subwayINFOManager.getAllLines(); + const lines = this._lineINFOManager.getAllLines(); const tableContainer = document.getElementById(TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; - liness.forEach((lineINFOs) => { + lines.forEach((lineINFOs) => { innerHTMLOfTable += this._makeNewTableRowHTML(lineINFOs); }); tableContainer.innerHTML = innerHTMLOfTable; @@ -51,7 +54,7 @@ export default class LineManagerUI extends contentsUI { if (!this._hasValidLineInput(lineName, startStation, endStation)) { return; } - this._subwayINFOManager.addNewLine({ + this._lineINFOManager.addNewLine({ lineName: lineName, startStationName: startStation, endStationName: endStation, @@ -62,7 +65,7 @@ export default class LineManagerUI extends contentsUI { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } - this._subwayINFOManager.deleteLine(event.target.dataset.name); + this._lineINFOManager.deleteLine(event.target.dataset.name); this.updateLinesTable(); } _hasValidLineInput(lineName, startStationName, endStationName) { @@ -71,7 +74,7 @@ export default class LineManagerUI extends contentsUI { startStationName, endStationName ); - const isNotOverlapName = this._subwayINFOManager.hasNotOverlapNameAmongLines( + const isNotOverlapName = this._lineINFOManager.hasNotOverlapNameAmongLines( lineName ); const isValidOption = hasValidOption([startStationName, endStationName]); @@ -90,7 +93,7 @@ export default class LineManagerUI extends contentsUI { `; } _makeSelectorInnerHTML() { - const stationNames = this._subwayINFOManager.getAllStationsNames(); + const stationNames = this._stationINFOManager.getAllStationNames(); let selectorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; stationNames.forEach((name) => { selectorInnerHTML += this._makeNewSelectorOptionHTML(name); @@ -110,8 +113,6 @@ const LINE_ADD_BUTTON_ID = "line-add-button"; const TABLE_ID = "line-table"; const LINE_DELETE_BUTTON_CLASS = "line-delete-button"; -const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; - const INITIAL_TEMPLATE = ` ๋…ธ์„  ์ด๋ฆ„
    diff --git a/src/ui/contents-ui/map-print-manager-ui.js b/src/ui/contents-ui/map-print-manager-ui.js index 74692ee08..7559e88db 100644 --- a/src/ui/contents-ui/map-print-manager-ui.js +++ b/src/ui/contents-ui/map-print-manager-ui.js @@ -6,7 +6,7 @@ export default class MapPrintManagerUI extends contentsUI { this.setContentsHTML(""); } setContentsHTML(initialTemplate) { - const lines = this._subwayINFOManager.getAllLines(); + const lines = this._lineINFOManager.getAllLines(); lines.forEach((line) => { initialTemplate += this._makeLineINFOHTML(line); }); diff --git a/src/ui/contents-ui/section-manager-ui.js b/src/ui/contents-ui/section-manager-ui.js index ebf93fa70..083f27742 100644 --- a/src/ui/contents-ui/section-manager-ui.js +++ b/src/ui/contents-ui/section-manager-ui.js @@ -2,6 +2,7 @@ import { hasValidOrder, hasValidOption, } from "../../utility/input-check-utility.js"; +import { DELETE_CONFIRM_MESSAGE } from "../../utility/share-constant-utility.js"; import { SELECTOR_DEFAULT_TEMPLATE } from "../../utility/share-constant-utility.js"; import { contentsUI } from "./contents-ui.js"; @@ -18,7 +19,7 @@ export default class SectionManagerUI extends contentsUI { _updateLineButtons() { const buttonDiv = document.getElementById(SECTION_LINE_MENU_DIV_ID); - const lines = this._subwayINFOManager.getAllLines(); + const lines = this._lineINFOManager.getAllLines(); let buttonDivInnerHTML = ""; lines.forEach(({ name }) => { buttonDivInnerHTML += this._makeNewSelectLineButtonHTML(name); @@ -63,7 +64,7 @@ class SectionRegisterUI extends contentsUI { } updateLineStationsTable() { const table = document.getElementById(SECTION_REGISTER_TABLE_ID); - const myLine = this._subwayINFOManager.getAllLinesByCondition((line) => { + const myLine = this._lineINFOManager.getAllLinesByCondition((line) => { return line.name === this._lineName; })[0]; let tableInnerHTML = TABLE_HEADER_TEMPLATE; @@ -74,7 +75,6 @@ class SectionRegisterUI extends contentsUI { this._addEventToAllDeleteButtons(); } - //private _addEventToAllDeleteButtons() { this._addClickEventToAllButtonByClassName( SECTION_DELETE_BUTTON_CLASS, @@ -92,7 +92,7 @@ class SectionRegisterUI extends contentsUI { return; } const targetStationName = event.target.dataset.name; - this._subwayINFOManager.deleteSection(targetStationName, this._lineName); + this._lineINFOManager.deleteSection(targetStationName, this._lineName); this.updateAllContents(); } _callbackOfSectionAddButton() { @@ -103,7 +103,7 @@ class SectionRegisterUI extends contentsUI { if (!this._hasValidSectionAddInput(orderToRegister, stationName)) { return; } - this._subwayINFOManager.registerStationToLine( + this._lineINFOManager.registerStationToLine( this._lineName, orderToRegister, stationName @@ -117,11 +117,12 @@ class SectionRegisterUI extends contentsUI { } _setComboboxOption() { const seletor = document.getElementById(SECTION_STATION_SELECTOR_ID); - const optionNames = this._subwayINFOManager.getStationNamesByCondition( - (station) => { - return !station.linesOfStation.has(this._lineName); - } - ); + const optionNames = this._stationINFOManager.getAllStationNames(); + const currentLine = this._lineINFOManager.getOneLineByName(this._lineName); + currentLine.stationsOfLine.forEach((stationName) => { + const index = optionNames.findIndex((name) => name === stationName); + optionNames.splice(index, 1); + }); let seletorInnerHTML = SELECTOR_DEFAULT_TEMPLATE; optionNames.forEach((optionName) => { seletorInnerHTML += this._makeNewOptionHTML(optionName); @@ -158,8 +159,6 @@ const SECTION_DELETE_BUTTON_CLASS = "section-delete-button"; const SECTION_LINE_MENU_DIV_ID = "section-line-menu-div"; const SECTION_LINE_MENU_BUTTON_CLASS = "section-line-menu-button"; -const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ๋…ธ์„ ์—์„œ ์ œ๊ฑฐํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; - const INITIAL_TEMPLATE = `

    ๊ตฌ๊ฐ„์„ ์ˆ˜์ •ํ•  ๋…ธ์„ ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.

    diff --git a/src/ui/contents-ui/station-manager-ui.js b/src/ui/contents-ui/station-manager-ui.js index 3f3d1a8d4..fb860d97c 100644 --- a/src/ui/contents-ui/station-manager-ui.js +++ b/src/ui/contents-ui/station-manager-ui.js @@ -1,4 +1,5 @@ import { hasValidStationName } from "../../utility/input-check-utility.js"; +import { DELETE_CONFIRM_MESSAGE } from "../../utility/share-constant-utility.js"; import { contentsUI } from "./contents-ui.js"; export default class StationManagerUI extends contentsUI { @@ -12,7 +13,7 @@ export default class StationManagerUI extends contentsUI { this.updateStationsTable(); } updateStationsTable() { - const stationsNames = this._subwayINFOManager.getAllStationsNames(); + const stationsNames = this._stationINFOManager.getAllStationNames(); const tableContainer = document.getElementById(STATION_NAME_TABLE_ID); let innerHTMLOfTable = TABLE_HEADER_TEMPLATE; for (let name of stationsNames) { @@ -39,7 +40,7 @@ export default class StationManagerUI extends contentsUI { if (!this._hasValidStationInput(name)) { return; } - this._subwayINFOManager.addNewStation({ + this._stationINFOManager.addNewStation({ name: name, }); this.updateStationsTable(); @@ -48,12 +49,13 @@ export default class StationManagerUI extends contentsUI { if (!confirm(DELETE_CONFIRM_MESSAGE)) { return; } - this._subwayINFOManager.deleteStation(event.target.dataset.name); + const lines = this._lineINFOManager.getAllLines(); + this._stationINFOManager.deleteStation(event.target.dataset.name, lines); this.updateStationsTable(); } _hasValidStationInput(name) { const isValidStationName = hasValidStationName(name); - const isNotOverlapName = this._subwayINFOManager.hasNotOverlapNameAmongStations( + const isNotOverlapName = this._stationINFOManager.hasNotOverlapNameAmongStations( name ); return isValidStationName && isNotOverlapName; @@ -74,8 +76,6 @@ const STATION_ADD_BUTTON_ID = "station-add-button"; const STATION_NAME_TABLE_ID = "station-name-table"; const STATION_DELETE_BUTTON_CLASS = "station-delete-button"; -const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; - const INITIAL_TEMPLATE = ` ์—ญ ์ด๋ฆ„
    diff --git a/src/utility/input-check-utility.js b/src/utility/input-check-utility.js index 49e8e8557..9ac11b17a 100644 --- a/src/utility/input-check-utility.js +++ b/src/utility/input-check-utility.js @@ -68,6 +68,12 @@ export function hasSatisfiedMaxLengthCondition({ } return boolToReturn; } +export function hasNotOverlapName(targetToFindOverlap, inputName) { + const overlapIndex = targetToFindOverlap.findIndex( + ({ name }) => name === inputName + ); + return overlapIndex === -1; +} function hasTypeOfNumber({ operand, errorMessage }) { let retBool = true; diff --git a/src/utility/share-constant-utility.js b/src/utility/share-constant-utility.js index 08883be0c..3e455f61f 100644 --- a/src/utility/share-constant-utility.js +++ b/src/utility/share-constant-utility.js @@ -2,3 +2,4 @@ export const SELECTEOR_NONE = "none"; export const SELECTOR_DEFAULT_TEMPLATE = ` `; +export const DELETE_CONFIRM_MESSAGE = "์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?"; diff --git a/src/utility/storage-utility.js b/src/utility/storage-utility.js new file mode 100644 index 000000000..7f8c8f9a7 --- /dev/null +++ b/src/utility/storage-utility.js @@ -0,0 +1,9 @@ +export function saveToLocalStorage(itemName, objectToSave) { + const jsonForm = JSON.stringify(objectToSave); + localStorage.setItem(itemName, jsonForm); +} + +export function loadFromLocalStorage(itemName) { + let objectToLoad = JSON.parse(localStorage.getItem(itemName)); + return objectToLoad; +}