diff --git a/package-lock.json b/package-lock.json index fc0b89d..a398f1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,6 +84,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure/node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions": { "version": "7.25.9", "dev": true, @@ -128,6 +140,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions/node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-member-expression-to-functions/node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "dev": true, @@ -223,6 +247,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports/node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "dev": true, @@ -286,7 +322,16 @@ } }, "node_modules/@babel/helper-optimise-call-expression/node_modules/@babel/types": { - "dev": true + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.26.5", @@ -340,6 +385,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-skip-transparent-expression-wrappers/node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "dev": true, @@ -426,6 +483,17 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/parser/node_modules/@babel/types": { + "version": "7.26.7", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.25.9", "dev": true, @@ -439,10 +507,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" @@ -542,10 +610,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.20.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.20.0.tgz", - "integrity": "sha512-iZA07H9io9Wn836aVTytRaNqh00Sad+EamwOVJT12GTLw1VGMFV/4JaME+JjLtr9fiGaoWgYnS54wrfWsSs4oQ==", + "version": "9.19.0", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -649,14 +716,16 @@ }, "node_modules/@octokit/auth-token": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "engines": { "node": ">= 18" } }, "node_modules/@octokit/core": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", + "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", @@ -672,7 +741,8 @@ }, "node_modules/@octokit/endpoint": { "version": "9.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz", + "integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==", "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" @@ -683,7 +753,8 @@ }, "node_modules/@octokit/graphql": { "version": "7.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", + "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", "dependencies": { "@octokit/request": "^8.3.0", "@octokit/types": "^13.0.0", @@ -695,11 +766,13 @@ }, "node_modules/@octokit/openapi-types": { "version": "23.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz", + "integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "11.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", + "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -712,7 +785,8 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", + "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", "engines": { "node": ">= 18" }, @@ -722,7 +796,8 @@ }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "13.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", + "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", "dependencies": { "@octokit/types": "^13.5.0" }, @@ -735,7 +810,8 @@ }, "node_modules/@octokit/request": { "version": "8.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz", + "integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==", "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", @@ -748,7 +824,8 @@ }, "node_modules/@octokit/request-error": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz", + "integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==", "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", @@ -760,7 +837,8 @@ }, "node_modules/@octokit/rest": { "version": "20.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", + "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", "dependencies": { "@octokit/core": "^5.0.2", "@octokit/plugin-paginate-rest": "11.3.1", @@ -773,7 +851,8 @@ }, "node_modules/@octokit/types": { "version": "13.8.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz", + "integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==", "dependencies": { "@octokit/openapi-types": "^23.0.1" } @@ -1130,7 +1209,8 @@ }, "node_modules/before-after-hook": { "version": "2.2.3", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, "node_modules/birpc": { "version": "0.2.19", @@ -1216,26 +1296,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/browserslist/node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, "node_modules/bundle-name": { "version": "4.1.0", "dev": true, @@ -1299,6 +1359,25 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001697", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -1517,7 +1596,8 @@ }, "node_modules/deprecation": { "version": "2.3.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" }, "node_modules/dompurify": { "version": "3.2.4", @@ -1611,336 +1691,6 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild/node_modules/@esbuild/win32-x64": { "version": "0.21.5", "cpu": [ @@ -1975,17 +1725,16 @@ } }, "node_modules/eslint": { - "version": "9.20.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.20.1.tgz", - "integrity": "sha512-m1mM33o6dBUjxl2qb6wv6nGNwCAsns1eKtaQ4l/NPHeTvhiUPbtdfMyktxN4B3fgHIgsYh1VT3V9txblpQHq+g==", + "version": "9.19.0", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.19.0", - "@eslint/core": "^0.11.0", + "@eslint/core": "^0.10.0", "@eslint/eslintrc": "^3.2.0", - "@eslint/js": "9.20.0", + "@eslint/js": "9.19.0", "@eslint/plugin-kit": "^0.2.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -2134,18 +1883,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.11.0.tgz", - "integrity": "sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, "node_modules/espree": { "version": "10.3.0", "dev": true, @@ -3025,7 +2762,8 @@ }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -3432,222 +3170,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.4.tgz", - "integrity": "sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.4.tgz", - "integrity": "sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.4.tgz", - "integrity": "sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.4.tgz", - "integrity": "sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.4.tgz", - "integrity": "sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.4.tgz", - "integrity": "sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.4.tgz", - "integrity": "sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.4.tgz", - "integrity": "sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.4.tgz", - "integrity": "sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.4.tgz", - "integrity": "sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.4.tgz", - "integrity": "sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.4.tgz", - "integrity": "sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.4.tgz", - "integrity": "sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.4.tgz", - "integrity": "sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.4.tgz", - "integrity": "sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.4.tgz", - "integrity": "sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.4.tgz", - "integrity": "sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.4.tgz", - "integrity": "sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.34.4", "cpu": [ @@ -3659,19 +3181,6 @@ "win32" ] }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/run-applescript": { "version": "7.0.0", "dev": true, @@ -3895,7 +3404,8 @@ }, "node_modules/universal-user-agent": { "version": "6.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==" }, "node_modules/universalify": { "version": "2.0.1", @@ -4043,7 +3553,8 @@ }, "node_modules/vite-plugin-mkcert": { "version": "1.17.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vite-plugin-mkcert/-/vite-plugin-mkcert-1.17.6.tgz", + "integrity": "sha512-4JR1RN0HEg/w17eRQJ/Ve2pSa6KCVQcQO6yKtIaKQCFDyd63zGfXHWpygBkvvRSpqa0GcqNKf0fjUJ0HiJQXVQ==", "dependencies": { "@octokit/rest": "^20.1.1", "axios": "^1.7.4", @@ -4382,6 +3893,18 @@ "node": ">=6.9.0" } }, + "node_modules/vite-plugin-vue-inspector/node_modules/@babel/types": { + "version": "7.26.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/vite-plugin-vue-inspector/node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "dev": true, @@ -4481,19 +4004,6 @@ "semver": "bin/semver.js" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vue": { "version": "3.5.13", "license": "MIT", @@ -4656,7 +4166,8 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/xml-name-validator": { "version": "4.0.0", diff --git a/public/css/custom.css b/public/css/custom.css index d9c6ca3..c4bb01d 100644 --- a/public/css/custom.css +++ b/public/css/custom.css @@ -5,77 +5,44 @@ display: block !important; } -/* 게시판리스트 */ -.bg-label-gray td { - color: #DC3545 !important; -} - /* 휴가 */ .half-day-buttons { - display: flex; - justify-content: center; - gap: 10px; - margin-top: 20px; - } - .half-day-buttons .btn.active { - border: 2px solid black; - } - .fc-daygrid-day-frame { - min-height: 80px !important; - max-height: 120px !important; - overflow: hidden !important; - padding-top: 25px !important; - } - .fc-daygrid-day-events { - max-height: 100px !important; - overflow-y: auto !important; - } - .fc-daygrid-event { - position: absolute !important; - height: 20px !important; - width: 100% !important; - left: 0 !important; - margin: 2px 0 !important; - padding: 0 !important; - border-radius: 2px !important; - border: none !important; - } - .fc-daygrid-event-harness { - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: flex-start; - width: 100%; - gap: 22px; - } - .fc-daygrid-event.half-day-am { - width: 45% !important; - left: 0 !important; - } - .fc-daygrid-event.half-day-pm { - width: 45% !important; - left: auto !important; - right: 0 !important; - } - .fc-daygrid-event.full-day { - width: 100% !important; - left: 0 !important; - } - .fc-day-sun .fc-daygrid-day-number, - .fc-col-header-cell:first-child .fc-col-header-cell-cushion { - color: #ff4500 !important; - } - .fc-day-sat .fc-daygrid-day-number, - .fc-col-header-cell:last-child .fc-col-header-cell-cushion { - color: #6076e0 !important; - } - .fc-daygrid-day-number { - position: absolute !important; - top: 0px !important; - left: 5px !important; - text-align: left !important; - } + display: flex; + justify-content: center; + gap: 10px; + margin-top: 20px; +} +.half-day-buttons .btn.active { + border: 2px solid black; +} + +.fc-daygrid-day-events { + max-height: 100px !important; + overflow-y: auto !important; +} + +.fc-event { + border: none; +} +.fc-daygrid-event.half-day-am { + width: calc(50% - 4px) !important; +} +.fc-daygrid-event.half-day-pm { + width: calc(50% - 4px) !important; + margin-left: auto !important +} +.fc-day-sun .fc-daygrid-day-number, +.fc-col-header-cell:first-child .fc-col-header-cell-cushion { + color: #ff4500 !important; +} +.fc-day-sat .fc-daygrid-day-number, +.fc-col-header-cell:last-child .fc-col-header-cell-cushion { + color: #6076e0 !important; +} +.fc-daygrid-day-number { + margin-right: auto; +} .grayscaleImg { filter: grayscale(100%); diff --git a/src/components/board/BoardComment.vue b/src/components/board/BoardComment.vue index 07e2327..932c36f 100644 --- a/src/components/board/BoardComment.vue +++ b/src/components/board/BoardComment.vue @@ -9,21 +9,32 @@ :showDetail="false" :author="true" :isLike="!isLike" - :isPassword="isPassword" - @editClick="editClick" - @deleteClick="deleteClick" - @submitPassword="submitPassword" + :isCommentPassword="comment.isCommentPassword" + @editClick="$emit('editClick', comment)" + @deleteClick="$emit('deleteClick', comment)" @updateReaction="handleUpdateReaction" - @toggleEdit="emit('toggleEdit', comment.commentId, true)" /> - + +
+
+ + +
+ {{ passwordCommentAlert }} +
+
- @@ -34,34 +38,37 @@ const props = defineProps({ type: Boolean, default: true, }, - isPassword: { + isCommentPassword: { type: Boolean, default: false, }, + isEditTextarea: { + type: Boolean, + default: false, + }, + passwordCommentAlert: { + type: String, + default: false + } }); -const emit = defineEmits(['submitComment', 'updateReaction', 'editClick']); +const emit = defineEmits(['submitComment', 'updateReaction', 'editClick', 'submitPassword', 'clearPassword']); const submitComment = (replyData) => { emit('submitComment', replyData); }; -const handleUpdateReaction = (reactionData, commentId) => { - // console.log('📢 BoardCommentList에서 이벤트 수신:', reactionData); - // console.log('📌 전달할 댓글 ID>>>>:', commentId); - +const handleUpdateReaction = (reactionData, commentId, boardId) => { const updatedReactionData = { - ...reactionData, - commentId: commentId + ...reactionData, + commentId: commentId || reactionData.commentId, + boardId: boardId || reactionData.boardId, }; - // console.log('🚀 최종 전달할 데이터:', updatedReactionData); - emit('updateReaction', updatedReactionData); } -const editClick = (data) => { - emit('editClick', data); +const submitPassword = (comment, password) => { + emit('submitPassword', comment, password); }; - diff --git a/src/components/board/BoardProfile.vue b/src/components/board/BoardProfile.vue index 10a52b2..766bc31 100644 --- a/src/components/board/BoardProfile.vue +++ b/src/components/board/BoardProfile.vue @@ -31,23 +31,10 @@ - - -
-
- - -
- {{ props.passwordAlert }} -
+ > +
@@ -58,9 +45,6 @@ import DeleteButton from '../button/DeleteBtn.vue'; import EditButton from '../button/EditBtn.vue'; import BoardRecommendBtn from '../button/BoardRecommendBtn.vue'; -// Vue Router 인스턴스 -const password = ref(''); - // Props 정의 const props = defineProps({ comment: { @@ -77,7 +61,7 @@ const props = defineProps({ }, profileName: { type: String, - default: '익명 사용자', + default: '익명', }, unknown: { type: Boolean, @@ -107,18 +91,10 @@ const props = defineProps({ isLike: { type: Boolean, default: false, - }, - isPassword: { - type: Boolean, - default: false, - }, - passwordAlert: { - type: String, - default: false, } }); -const emit = defineEmits(['togglePasswordInput', 'updateReaction', 'editClick', 'deleteClick', 'updatePasswordAlert']); +const emit = defineEmits(['updateReaction', 'editClick', 'deleteClick']); // 수정 const editClick = () => { @@ -131,11 +107,6 @@ const deleteClick = () => { }; const handleUpdateReaction = (reactionData) => { - // console.log("🔥 BoardProfile에서 좋아요/싫어요 이벤트 발생"); - // console.log("📌 게시글 ID:", props.boardId); - // console.log("📌 댓글 ID (수정 후):", props.comment?.commentId); - // console.log("📌 reactionData:", reactionData); - emit("updateReaction", { boardId: props.boardId, commentId: props.comment?.commentId, diff --git a/src/components/button/BoardRecommendBtn.vue b/src/components/button/BoardRecommendBtn.vue index 7125374..e297eb7 100644 --- a/src/components/button/BoardRecommendBtn.vue +++ b/src/components/button/BoardRecommendBtn.vue @@ -8,9 +8,13 @@ diff --git a/src/components/input/FormInput.vue b/src/components/input/FormInput.vue index 904d89f..0cbb4a7 100644 --- a/src/components/input/FormInput.vue +++ b/src/components/input/FormInput.vue @@ -13,6 +13,7 @@ :maxLength="maxlength" :placeholder="title" :disabled="disabled" + :min="min" />
{{ title }}을 확인해주세요. @@ -64,6 +65,10 @@ const props = defineProps({ disabled: { type: Boolean, default: false, + }, + min: { + type: String, + default: '', } }); diff --git a/src/components/list/ProjectCard.vue b/src/components/list/ProjectCard.vue index 7ea65c0..25195a1 100644 --- a/src/components/list/ProjectCard.vue +++ b/src/components/list/ProjectCard.vue @@ -34,23 +34,17 @@
- + diff --git a/src/components/list/ProjectCardList.vue b/src/components/list/ProjectCardList.vue deleted file mode 100644 index 6f65d9f..0000000 --- a/src/components/list/ProjectCardList.vue +++ /dev/null @@ -1,190 +0,0 @@ - - - diff --git a/src/components/projectlist/ProjectList.vue b/src/components/projectlist/ProjectList.vue index 812fc9c..4975995 100644 --- a/src/components/projectlist/ProjectList.vue +++ b/src/components/projectlist/ProjectList.vue @@ -1,163 +1,365 @@ diff --git a/src/components/user/FindPassword.vue b/src/components/user/FindPassword.vue index c4e073a..0260908 100644 --- a/src/components/user/FindPassword.vue +++ b/src/components/user/FindPassword.vue @@ -40,10 +40,11 @@ @update:alert="pwhintResAlert = $event" :value="pwhintRes" /> -
- 취소 - +
+ +
+

{{ userCheckMsg }}

@@ -73,7 +74,8 @@ {{ passwordcheckError }}
- + +

{{ pwErrMsg }}

@@ -86,6 +88,8 @@ import { useToastStore } from '@s/toastStore'; import UserFormInput from '@c/input/UserFormInput.vue'; import FormSelect from '../input/FormSelect.vue'; + import BackBtn from '@c/button/BackBtn.vue'; + import SaveBtn from '../button/SaveBtn.vue'; const router = useRouter(); const toastStore = useToastStore(); @@ -94,6 +98,8 @@ const birth = ref(''); const pwhint = ref(''); const pwhintRes = ref(''); + const userCheckMsg = ref(""); + const pwErrMsg = ref(""); const idAlert = ref(false); const birthAlert = ref(false); @@ -108,15 +114,22 @@ const passwordcheckAlert = ref(false); const passwordcheckErrorAlert = ref(false); - const { pwhintList } = commonApi(); + const { pwhintList } = commonApi({ + loadPwhint: true, + }); const handleIdChange = value => { id.value = value; idAlert.value = false; }; + const handleback = () => { + router.push('/login'); + } + // 아이디, 생년월일, 비밀번호 힌트, 답변이 일치하는 member 재설정 input 보이기 const handleSubmit = async () => { + userCheckMsg.value = ''; idAlert.value = id.value.trim() === ''; pwhintResAlert.value = pwhintRes.value.trim() === ''; birthAlert.value = birth.value.trim() === ''; @@ -135,7 +148,8 @@ if (response.status === 200 && response.data.data === true) { resetForm.value = true; } else { - toastStore.onToast('일치하는 정보가 없습니다.', 'e'); + userCheckMsg.value = '입력하신 정보와 일치하는 회원이 없습니다.'; + return; } }; @@ -151,9 +165,10 @@ // 비밀번호 업데이트 const handleNewPassword = async () => { + pwErrMsg.value = ''; passwordAlert.value = password.value.trim() === ''; passwordcheckAlert.value = passwordcheck.value.trim() === ''; - + checkPw(); if (passwordAlert.value || passwordcheckAlert.value || passwordcheckErrorAlert.value) { return; } @@ -164,7 +179,7 @@ }); if (checkResponse.data.data === false) { - toastStore.onToast('기존 비밀번호와 동일한 비밀번호로 변경할 수 없습니다.', 'e'); + pwErrMsg.value = '기존 비밀번호와 동일한 비밀번호로 변경할 수 없습니다.'; return; } diff --git a/src/components/user/LoginForm.vue b/src/components/user/LoginForm.vue index d176fed..90b4859 100644 --- a/src/components/user/LoginForm.vue +++ b/src/components/user/LoginForm.vue @@ -13,6 +13,7 @@
+

{{ errorMessage }}

@@ -29,7 +30,6 @@ diff --git a/src/components/user/RegisterForm.vue b/src/components/user/RegisterForm.vue index 1924e21..2953ea3 100644 --- a/src/components/user/RegisterForm.vue +++ b/src/components/user/RegisterForm.vue @@ -141,9 +141,11 @@ :is-alert="phoneAlert" @update:data="phone = $event" @update:alert="phoneAlert = $event" + @blur="checkPhoneDuplicate" :maxlength="11" :value="phone" /> + {{ phoneError }}
취소 @@ -181,6 +183,7 @@ const detailAddress = ref(''); const postcode = ref(''); // 우편번호 const phone = ref(''); + const phoneError = ref(''); const color = ref(''); // 선택된 color const mbti = ref(''); // 선택된 MBTI const pwhint = ref(''); // 선택된 pwhint @@ -196,6 +199,7 @@ const birthAlert = ref(false); const addressAlert = ref(false); const phoneAlert = ref(false); + const phoneErrorAlert = ref(false); const toastStore = useToastStore(); @@ -251,6 +255,19 @@ } }; + // 전화번호 중복체크 + const checkPhoneDuplicate = async () => { + const response = await $api.get(`/user/checkPhone?memberTel=${phone.value}`); + + if (!response.data.data) { + phoneErrorAlert.value = true; + phoneError.value = '이미 사용 중인 전화번호입니다.'; + } else { + phoneErrorAlert.value = false; + phoneError.value = ''; + } + }; + // 컬러, mbti, 비밀번호 힌트 목록 불러오기 const { colorList, mbtiList, pwhintList } = commonApi({ loadColor: true, colorType: 'YON', @@ -298,7 +315,7 @@ } if (profilAlert.value || idAlert.value || idErrorAlert.value || passwordAlert.value || passwordcheckAlert.value || - passwordcheckErrorAlert.value || pwhintResAlert.value || nameAlert.value || birthAlert.value || addressAlert.value || phoneAlert.value) { + passwordcheckErrorAlert.value || pwhintResAlert.value || nameAlert.value || birthAlert.value || addressAlert.value || phoneAlert.value || phoneErrorAlert.value) { return; } diff --git a/src/components/user/UserList.vue b/src/components/user/UserList.vue index c5a1779..27f81e6 100644 --- a/src/components/user/UserList.vue +++ b/src/components/user/UserList.vue @@ -5,7 +5,7 @@ :key="index" class="avatar pull-up" :class="{ 'opacity-100': isUserDisabled(user) }" - @click="toggleDisable(index)" + @click.stop="toggleDisable(index)" data-bs-toggle="tooltip" data-popup="tooltip-custom" data-bs-placement="top" @@ -17,6 +17,7 @@ :class="{ 'grayscaleImg': isUserDisabled(user) }" :src="`${baseUrl}upload/img/profile/${user.MEMBERPRF}`" :style="`border-color: ${user.usercolor} !important;`" + @error="$event.target.src = '/img/icons/icon.png'" alt="user" /> diff --git a/src/layouts/NormalLayout.vue b/src/layouts/NormalLayout.vue index e6af2d8..bdf1271 100644 --- a/src/layouts/NormalLayout.vue +++ b/src/layouts/NormalLayout.vue @@ -38,17 +38,11 @@ const loadScript = src => { script.type = 'text/javascript'; script.async = true; document.body.appendChild(script); - script.onload = () => { - console.log(`${src} loaded successfully.`); - }; - script.onerror = () => { - console.error(`Failed to load script: ${src}`); - }; }; nextTick(async () => { await wait(200); loadScript('/vendor/js/menu.js'); - loadScript('/js/main.js'); + // loadScript('/js/main.js'); }); diff --git a/src/views/board/BoardView.vue b/src/views/board/BoardView.vue index 2559318..b322fa4 100644 --- a/src/views/board/BoardView.vue +++ b/src/views/board/BoardView.vue @@ -5,22 +5,34 @@
- +
+ + + +
+
+ + +
+ {{ passwordAlert }} +
+
@@ -86,13 +98,17 @@ profileName.value === '익명 사용자'); +const unknown = computed(() => profileName.value === '익명'); const currentUserId = ref('김자바'); // 현재 로그인한 사용자 id const authorId = ref(null); // 작성자 id const isAuthor = computed(() => currentUserId.value === authorId.value); -const isEditTextarea = ref({}); +const password = ref(''); const passwordAlert = ref(""); +const passwordCommentAlert = ref(""); const isPassword = ref(false); +const isCommentPassword = ref(false); const lastClickedButton = ref(""); +const lastCommentClickedButton = ref(""); +const isEditTextarea = ref(false); const pagination = ref({ currentPage: 1, @@ -170,10 +190,10 @@ const fetchBoardDetails = async () => { // API 응답 데이터 반영 // const boardDetail = data.boardDetail || {}; - profileName.value = data.author || '익명 사용자'; + profileName.value = data.author || '익명'; // 익명확인하고 싶을때 - profileName.value = '익명 사용자'; + // profileName.value = 'null; // 게시글의 작성자 여부를 확인 : 현재 로그인한 사용자가 이 게시글의 작성자인지 여부 authorId.value = data.author; @@ -195,15 +215,13 @@ const fetchBoardDetails = async () => { // 좋아요, 싫어요 const handleUpdateReaction = async ({ boardId, commentId, isLike, isDislike }) => { try { - const aa = await axios.post(`/board/${boardId}/${commentId}/reaction`, { + await axios.post(`/board/${boardId}/${commentId}/reaction`, { LOCBRDSEQ: boardId, // 게시글 id LOCCMTSEQ: commentId, //댓글 id // MEMBERSEQ: 1, // 멤버아이디 지금은 1 나중에 수정해야함 LOCGOBGOD: isLike ? 'T' : 'F', LOCGOBBAD: isDislike ? 'T' : 'F' }); - console.log("좋아요 API 응답 데이터:", aa.data); - const response = await axios.get(`board/${boardId}`); const updatedData = response.data.data; @@ -215,52 +233,92 @@ const handleUpdateReaction = async ({ boardId, commentId, isLike, isDislike }) = dislikeClicked.value = isDislike; // console.log(updatedData) + // console.log("갱신된 데이터:", updatedData); + } catch (error) { alert('반응을 업데이트하는 중 오류 발생'); } }; -// 댓글 목록 조회 + +// 대댓글 좋아요 +const handleCommentReaction = async ({ boardId, commentId, isLike, isDislike }) => { + if (!commentId) return; // 댓글 ID가 없으면 실행 안 함 + + try { + const response = await axios.post(`/board/${boardId}/${commentId}/reaction`, { + LOCBRDSEQ: boardId, // 게시글 ID + LOCCMTSEQ: commentId, // 댓글 ID + LOCGOBGOD: isLike ? 'T' : 'F', + LOCGOBBAD: isDislike ? 'T' : 'F' + }); + + // console.log("댓글 좋아요 API 응답 데이터:", response.data); + + await fetchComments(); + + } catch (error) { + alert('댓글 반응을 업데이트하는 중 오류 발생'); + } +}; + +// 댓글 목록 조회 (대댓글 포함) const fetchComments = async (page = 1) => { try { + // 댓글 const response = await axios.get(`board/${currentBoardId.value}/comments`, { params: { LOCBRDSEQ: currentBoardId.value, page } }); - console.log("목록 API 응답 데이터:", response.data); - let allComments = response.data.data.list.map(comment => ({ - commentId: comment.LOCCMTSEQ, // 댓글 id + const commentsList = response.data.data.list.map(comment => ({ + commentId: comment.LOCCMTSEQ, // 댓글 ID boardId: comment.LOCBRDSEQ, - parentId: comment.LOCCMTPNT, // 부모 id - author: comment.author || "익명 사용자", // 작성자 - content: comment.LOCCMTRPY, // 댓글 내용 - createdAt: formattedDate(comment.LOCCMTRDT), // 생성 날짜 - children: [] + parentId: comment.LOCCMTPNT, // 부모 ID + author: comment.author || '익명', + content: comment.LOCCMTRPY, + likeCount: comment.likeCount || 0, + dislikeCount: comment.dislikeCount || 0, + likeClicked: comment.likeClicked || false, + dislikeClicked: comment.dislikeClicked || false, + createdAtRaw: new Date(comment.LOCCMTRDT), // 정렬용 + createdAt: formattedDate(comment.LOCCMTRDT), // 표시용 + children: [], // 대댓글을 담을 배열 + // isCommentPassword: false, // 개별 댓글 비밀번호 입력 상태 + // isEditTextarea: false // 개별 댓글 수정 상태 })); - allComments.sort((a, b) => b.commentId - a.commentId); + for (const comment of commentsList) { + if (!comment.commentId) continue; - let commentMap = {}; - let rootComments = []; + const replyResponse = await axios.get(`board/${currentBoardId.value}/reply`, { + params: { LOCCMTPNT: comment.commentId } + }); - allComments.forEach(comment => { - commentMap[comment.commentId] = comment; - }); + // console.log(`대댓글 데이터 (${comment.commentId}의 대댓글):`, replyResponse.data); - allComments.forEach(comment => { - if (comment.parentId && commentMap[comment.parentId]) { - commentMap[comment.parentId].children.push(comment); + if (replyResponse.data.data) { + comment.children = replyResponse.data.data.map(reply => ({ + commentId: reply.LOCCMTSEQ, + boardId: reply.LOCBRDSEQ, + parentId: reply.LOCCMTPNT, // 부모 댓글 ID + content: reply.LOCCMTRPY || "내용 없음", + createdAtRaw: new Date(reply.LOCCMTRDT), + createdAt: formattedDate(reply.LOCCMTRDT), + likeCount: reply.likeCount || 0, + dislikeCount: reply.dislikeCount || 0, + likeClicked: false, + dislikeClicked: false + })); } else { - rootComments.push(comment); + comment.children = []; // 대댓글이 없으면 빈 배열로 초기화 } - }); + } - comments.value = rootComments; - - // console.log("변환된 comments 데이터:", comments.value); + // 최종적으로 댓글 목록 업데이트 + comments.value = commentsList; pagination.value = { ...pagination.value, @@ -278,51 +336,93 @@ const fetchComments = async (page = 1) => { navigateLastPage: response.data.data.navigateLastPage // 페이지네이션에서 마지막 페이지 번호 }; + // console.log("📌 댓글 목록:", comments.value); + + } catch (error) { - console.error('댓글 목록 불러오기 오류:', error); + console.log('댓글 목록 불러오기 오류:', error); } }; - +const isSubmitting = ref(false); // 댓글 작성 const handleCommentSubmit = async ({ comment, password }) => { + // if (unknown.value && !password) { + // passwordAlert.value = "익명 사용자는 비밀번호를 입력해야 합니다."; // UI에 메시지 표시 + // return; + // } + // if (!password) { + // passwordAlert.value = "비밀번호를 입력해야 합니다."; // UI에서 경고 표시 + // return; + // } + + // 중복 실행 방지 + if (isSubmitting.value) return; + isSubmitting.value = true; + try { const response = await axios.post(`board/${currentBoardId.value}/comment`, { LOCBRDSEQ: currentBoardId.value, LOCCMTRPY: comment, - LOCCMTPWD: password || null, + LOCCMTPWD: password, LOCCMTPNT: 1 }); - // console.log('📥 서버 응답 전체:', response.data); if (response.status === 200) { - console.log('댓글 작성 성공:', response.data.message); + // console.log('댓글 작성 성공:', response.data.message); await fetchComments(); } else { - console.error('댓글 작성 실패:', response.data.message); + console.log('댓글 작성 실패:', response.data.message); } } catch (error) { - console.error('댓글 작성 중 오류 발생:', error); + console.log('댓글 작성 중 오류 발생:', error); } }; -const handleCommentReply = async (reply) => { - const response = await axios.post(`board/${currentBoardId.value}/comment`, { - LOCBRDSEQ: currentBoardId.value, - LOCCMTRPY: reply.comment, - LOCCMTPWD: reply.password || null, - LOCCMTPNT: reply.parentId - }); - if (response.status === 200) { - console.log('대댓글 작성 성공:', response.data.message); - await fetchComments(); - } else { - console.error('대댓글 작성 실패:', response.data.message); +// 대댓글 추가 (부모 `BoardCommentList`로부터 이벤트 받아서 처리) +const handleCommentReply = async (reply) => { + try { + // console.log('대댓글 작성 요청 데이터:', { + // LOCBRDSEQ: currentBoardId.value, + // LOCCMTRPY: reply.comment, + // LOCCMTPWD: reply.password || null, + // LOCCMTPNT: reply.parentId + // }); + + const response = await axios.post(`board/${currentBoardId.value}/comment`, { + LOCBRDSEQ: currentBoardId.value, + LOCCMTRPY: reply.comment, + LOCCMTPWD: reply.password || null, + LOCCMTPNT: reply.parentId + }); + + // 응답 데이터를 자세히 로그로 확인 + // console.log('대댓글 작성 응답:', { + // status: response.status, + // data: response.data, + // headers: response.headers + // }); + + if (response.status === 200) { + if (response.data.code === 200) { // 서버 응답 코드도 확인 + console.log('대댓글 작성 성공:', response.data); + await fetchComments(); // 댓글 목록 새로고침 + } else { + console.log('대댓글 작성 실패 - 서버 응답:', response.data); + alert('대댓글 작성에 실패했습니다.'); + } + } + } catch (error) { + console.error('대댓글 작성 중 오류 발생:', error); + if (error.response) { + console.error('서버 응답 에러:', error.response.data); + } + alert('대댓글 작성 중 오류가 발생했습니다.'); } } +// 게시글 수정 버튼 클릭 const editClick = (unknown) => { - if (unknown) { togglePassword("edit"); } else { @@ -330,6 +430,7 @@ const editClick = (unknown) => { } }; +// 게시글 삭제 버튼 클릭 const deleteClick = (unknown) => { if (unknown) { togglePassword("delete"); @@ -338,6 +439,64 @@ const deleteClick = (unknown) => { } }; +// 댓글 수정 버튼 클릭(대댓글 포함) +const editComment = (comment) => { + if (comment.isEditTextarea) { + // 이미 수정창이 열려 있으면 닫기 + comment.isEditTextarea = false; + return; + } + + if (unknown.value) { + toggleCommentPassword(comment, "edit"); + } else { + comment.isEditTextarea = true; + } + + // comments.value.forEach(c => { + // c.isEditTextarea = false; + // c.isCommentPassword = false; + // }); + + // if (comment.unknown) { + // comment.isCommentPassword = true; + // } else { + // comment.isEditTextarea = true; + // } +} + +// 댓글 삭제 버튼 클릭(대댓글 포함) +const deleteComment = (comment) => { + if (unknown.value) { + if (comment.isEditTextarea) { + // 현재 수정 중이라면 수정 모드를 끄고, 삭제 비밀번호 입력창을 띄움 + comment.isEditTextarea = false; + comment.isCommentPassword = true; + } else { + // 수정 중이 아니면 기존의 삭제 비밀번호 입력창을 띄우는 로직 실행 + toggleCommentPassword(comment, "delete"); + } + } else { + // 로그인 사용자 바로 삭제 + comments.value = comments.value.filter(c => c.commentId !== comment.commentId); + } +}; + +// 익명 비밀번호 창 토글 +const toggleCommentPassword = (comment, button) => { + if (lastCommentClickedButton.value === button && comment.isCommentPassword) { + comment.isCommentPassword = false; + } else { + // 모든 댓글의 비밀번호 입력창 닫기 + comments.value.forEach(c => (c.isCommentPassword = false)); + + // 현재 선택된 댓글만 비밀번호 입력창 열기 + comment.isCommentPassword = true; + } + + lastCommentClickedButton.value = button; +}; + const togglePassword = (button) => { if (lastClickedButton.value === button) { isPassword.value = !isPassword.value; @@ -347,25 +506,23 @@ const togglePassword = (button) => { lastClickedButton.value = button; }; - -const submitPassword = async (inputPassword) => { - console.log(inputPassword) - if (!inputPassword) { +// 게시글 비밀번호 제출 +const submitPassword = async () => { + if (!password.value) { passwordAlert.value = "비밀번호를 입력해주세요."; return; } + // console.log("📌 요청 시작: submitPassword 실행됨"); try { - const requestData = { - LOCBRDPWD: inputPassword, - LOCBRDSEQ: 288 - }; + const response = await axios.post(`board/${currentBoardId.value}/password`, { + LOCBRDPWD: password.value, + LOCBRDSEQ: 288, // 나중에 현재 게시글 ID 사용해야함 + }); - const postResponse = await axios.post(`board/${currentBoardId.value}/password`, requestData); - - if (postResponse.data.code === 200 && postResponse.data.data === true) { + if (response.data.code === 200 && response.data.data === true) { + password.value = ''; isPassword.value = false; - passwordAlert.value = ""; if (lastClickedButton.value === "edit") { router.push({ name: "BoardEdit", params: { id: currentBoardId.value } }); @@ -374,19 +531,58 @@ const submitPassword = async (inputPassword) => { } lastClickedButton.value = null; } else { - passwordAlert.value = "비밀번호가 일치하지 않습니다."; + passwordAlert.value = "비밀번호가 일치하지 않습니다.????"; } } catch (error) { - if (error.response && error.response.status === 401) { - passwordAlert.value = "비밀번호가 일치하지 않습니다."; - } else if (error.response) { - alert(`오류 발생: ${error.response.data.message || "서버 오류"}`); + // console.log("📌 전체 오류:", error); + + if (error.response) { + if (error.response.status === 401) { + passwordAlert.value = "비밀번호가 일치하지 않습니다."; + } else { + passwordAlert.value = error.response.data?.message || "서버 오류가 발생했습니다."; + } + } else if (error.request) { + passwordAlert.value = "네트워크 오류가 발생했습니다. 다시 시도해주세요."; } else { - alert("네트워크 오류가 발생했습니다. 다시 시도해주세요."); + passwordAlert.value = "요청 중 알 수 없는 오류가 발생했습니다."; } } }; +// 댓글 삭제 (비밀번호 확인 후) +const submitCommentPassword = async (comment, password) => { + if (!password) { + passwordCommentAlert.value = "비밀번호를 입력해주세요."; + return; + } + + try { + const response = await axios.post(`board/comment/${comment.commentId}/password`, { + LOCCMTPWD: password, + LOCCMTSEQ: comment.commentId, + }); + + if (response.data.code === 200 && response.data.data === true) { + comment.isCommentPassword = false; + + if (lastCommentClickedButton.value === "edit") { + comment.isEditTextarea = true; + // handleSubmitEdit(comment, comment.content); + } else if (lastCommentClickedButton.value === "delete") { + + deleteReplyComment(comment) + } + lastCommentClickedButton.value = null; + } else { + passwordCommentAlert.value = "비밀번호가 일치하지 않습니다."; + } + } catch (error) { + passwordCommentAlert.value = "비밀번호가 일치하지 않습니다"; + } +}; + +// 게시글 삭제 const deletePost = async () => { if (confirm("정말 삭제하시겠습니까?")) { try { @@ -410,6 +606,53 @@ const deletePost = async () => { } }; +// 댓글 삭제 (대댓글 포함) +const deleteReplyComment = async (comment) => { + if (!confirm("정말 이 댓글을 삭제하시겠습니까?")) return; + // console.log("댓글 ID:", comment); + + try { + const response = await axios.delete(`board/comment/${comment.commentId}`, { + data: { LOCCMTSEQ: comment.commentId } + }); + + // console.log("서버 응답:", response.data); + + if (response.data.code === 200) { + // console.log("댓글 삭제 성공!"); + await fetchComments(); + } else { + // console.log("댓글 삭제 실패:", response.data.message); + alert("댓글 삭제에 실패했습니다."); + } + } catch (error) { + console.log("댓글 삭제 중 오류 발생:", error); + alert("댓글 삭제 중 오류가 발생했습니다."); + } +}; + +// 댓글 수정 확인 (대댓글 포함) +const handleSubmitEdit = async (comment, editedContent) => { + try { + const response = await axios.put(`board/comment/${comment.commentId}`, { + LOCCMTSEQ: comment.commentId, + LOCCMTRPY: editedContent + }); + + // 수정 성공 시 업데이트 + comment.content = editedContent; + comment.isEditTextarea = false; + } catch (error) { + console.error("댓글 수정 중 오류 발생:", error); + } +}; + +// 댓글 수정 취소 (대댓글 포함) +const handleCancelEdit = (comment) => { + console.log("BoardView.vue - 댓글 수정 취소:", comment); + comment.isEditTextarea = false; +}; + // 페이지 변경 const handlePageChange = (page) => { if (page !== pagination.value.currentPage) { @@ -418,6 +661,10 @@ const handlePageChange = (page) => { } }; +const handleCommentDeleted = (deletedCommentId) => { + comments.value = comments.value.filter(comment => comment.commentId !== deletedCommentId); +}; + // 날짜 const formattedDate = (dateString) => { if (!dateString) return "날짜 없음"; diff --git a/src/views/commuters/TheCommuters.vue b/src/views/commuters/TheCommuters.vue new file mode 100644 index 0000000..545eca1 --- /dev/null +++ b/src/views/commuters/TheCommuters.vue @@ -0,0 +1,9 @@ + + + diff --git a/src/views/vacation/VacationManagement.vue b/src/views/vacation/VacationManagement.vue index 2412d73..4ffa1f8 100644 --- a/src/views/vacation/VacationManagement.vue +++ b/src/views/vacation/VacationManagement.vue @@ -1,117 +1,148 @@ + - -// 컴포넌트 마운트 시 현재 달의 데이터 로드 -onMounted(async () => { -await fetchUserList(); // 사용자 목록 먼저 불러오기 -await fetchVacationCodes(); -const today = new Date(); -const year = today.getFullYear(); -const month = String(today.getMonth() + 1).padStart(2, "0"); -await loadCalendarData(year, month); -}); - - - +