Compare commits

..

No commits in common. "ff644395ec3c774c7e909c657e1e83652abb6517" and "9f4c3de2cf16f8e563b983b77bc27605cab1bef9" have entirely different histories.

35 changed files with 545 additions and 1041 deletions

View File

@ -7,11 +7,4 @@ NEXT_PUBLIC_API_URL=http://localhost:3000
NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120
#1:1문의 api
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080
#QPARTNER 로그인 api
DB_HOST=asdf
DB_USER=asdf
DB_PASSWORD=asdf
DB_DATABASE=asdf
DB_PORT=3306
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080

View File

@ -5,11 +5,4 @@ NEXT_PUBLIC_API_URL=http://172.30.1.35:3000
NEXT_PUBLIC_QSP_API_URL=http://1.248.227.176:8120
#1:1문의 api
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080
#QPARTNER 로그인 api
DB_HOST=asdf
DB_USER=asdf
DB_PASSWORD=asdf
DB_DATABASE=asdf
DB_PORT=3306
NEXT_PUBLIC_INQUIRY_API_URL=http://1.248.227.176:38080

View File

@ -41,20 +41,3 @@ onClick={() => popupController.setZipCodePopup(false)}
# useEffect 정리
- client url pathname 변경시 -> @/components/ui/Header.tsx
# User Role 구분
session에 있는 role 키로 구분한다
- T01 / T01 -> Super user\
session.role === 'T01'
- A03 / 1234 -> T01을 제외한 1차점\
session.role === 'Admin'
- 2A03 / 1234 -> 2차점\
session.role === 'Admin_Sub'
- constA03_01 / 1234 -> 시공사\
session.role === 'Builder'
- partners -> Q.Partners 계정\
session.role === 'Partner'
- 이외의 경우 -> 굳이 체크할 필요 없어보임\
session.role === 'User'

300
package-lock.json generated
View File

@ -8,7 +8,7 @@
"name": "on-site-survey",
"version": "0.1.0",
"dependencies": {
"@prisma/client": "^6.7.0",
"@prisma/client": "^6.5.0",
"@tanstack/react-query": "^5.71.0",
"@tanstack/react-query-devtools": "^5.71.0",
"axios": "^1.8.4",
@ -20,7 +20,6 @@
"react-to-pdf": "^2.0.0",
"sass": "^1.87.0",
"swiper": "^11.2.6",
"usehooks-ts": "^3.1.1",
"zustand": "^5.0.3"
},
"devDependencies": {
@ -28,7 +27,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"prisma": "^6.7.0",
"prisma": "^6.5.0",
"tailwindcss": "^4",
"typescript": "^5"
}
@ -312,9 +311,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
"integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
"integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==",
"cpu": [
"ppc64"
],
@ -329,9 +328,9 @@
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
"integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz",
"integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==",
"cpu": [
"arm"
],
@ -346,9 +345,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
"integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz",
"integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==",
"cpu": [
"arm64"
],
@ -363,9 +362,9 @@
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
"integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz",
"integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==",
"cpu": [
"x64"
],
@ -380,9 +379,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
"integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz",
"integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==",
"cpu": [
"arm64"
],
@ -397,9 +396,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
"integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz",
"integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==",
"cpu": [
"x64"
],
@ -414,9 +413,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
"integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz",
"integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==",
"cpu": [
"arm64"
],
@ -431,9 +430,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
"integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz",
"integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==",
"cpu": [
"x64"
],
@ -448,9 +447,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
"integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz",
"integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==",
"cpu": [
"arm"
],
@ -465,9 +464,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
"integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz",
"integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==",
"cpu": [
"arm64"
],
@ -482,9 +481,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
"integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz",
"integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==",
"cpu": [
"ia32"
],
@ -499,9 +498,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
"integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz",
"integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==",
"cpu": [
"loong64"
],
@ -516,9 +515,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
"integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz",
"integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==",
"cpu": [
"mips64el"
],
@ -533,9 +532,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
"integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz",
"integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==",
"cpu": [
"ppc64"
],
@ -550,9 +549,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
"integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz",
"integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==",
"cpu": [
"riscv64"
],
@ -567,9 +566,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
"integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz",
"integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==",
"cpu": [
"s390x"
],
@ -584,9 +583,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
"integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz",
"integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==",
"cpu": [
"x64"
],
@ -601,9 +600,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
"integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz",
"integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==",
"cpu": [
"arm64"
],
@ -618,9 +617,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
"integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz",
"integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==",
"cpu": [
"x64"
],
@ -635,9 +634,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
"integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz",
"integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==",
"cpu": [
"arm64"
],
@ -652,9 +651,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
"integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz",
"integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==",
"cpu": [
"x64"
],
@ -669,9 +668,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
"integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz",
"integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==",
"cpu": [
"x64"
],
@ -686,9 +685,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
"integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz",
"integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==",
"cpu": [
"arm64"
],
@ -703,9 +702,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
"integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz",
"integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==",
"cpu": [
"ia32"
],
@ -720,9 +719,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
"integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz",
"integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==",
"cpu": [
"x64"
],
@ -1547,9 +1546,9 @@
}
},
"node_modules/@prisma/client": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.7.0.tgz",
"integrity": "sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.5.0.tgz",
"integrity": "sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==",
"hasInstallScript": true,
"license": "Apache-2.0",
"engines": {
@ -1569,9 +1568,9 @@
}
},
"node_modules/@prisma/config": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.7.0.tgz",
"integrity": "sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.5.0.tgz",
"integrity": "sha512-sOH/2Go9Zer67DNFLZk6pYOHj+rumSb0VILgltkoxOjYnlLqUpHPAN826vnx8HigqnOCxj9LRhT6U7uLiIIWgw==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
@ -1580,53 +1579,53 @@
}
},
"node_modules/@prisma/debug": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.7.0.tgz",
"integrity": "sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.5.0.tgz",
"integrity": "sha512-fc/nusYBlJMzDmDepdUtH9aBsJrda2JNErP9AzuHbgUEQY0/9zQYZdNlXmKoIWENtio+qarPNe/+DQtrX5kMcQ==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/engines": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.7.0.tgz",
"integrity": "sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.5.0.tgz",
"integrity": "sha512-FVPQYHgOllJklN9DUyujXvh3hFJCY0NX86sDmBErLvoZjy2OXGiZ5FNf3J/C4/RZZmCypZBYpBKEhx7b7rEsdw==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.7.0",
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"@prisma/fetch-engine": "6.7.0",
"@prisma/get-platform": "6.7.0"
"@prisma/debug": "6.5.0",
"@prisma/engines-version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60",
"@prisma/fetch-engine": "6.5.0",
"@prisma/get-platform": "6.5.0"
}
},
"node_modules/@prisma/engines-version": {
"version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz",
"integrity": "sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==",
"version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60",
"resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60.tgz",
"integrity": "sha512-iK3EmiVGFDCmXjSpdsKGNqy9hOdLnvYBrJB61far/oP03hlIxrb04OWmDjNTwtmZ3UZdA5MCvI+f+3k2jPTflQ==",
"devOptional": true,
"license": "Apache-2.0"
},
"node_modules/@prisma/fetch-engine": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz",
"integrity": "sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.5.0.tgz",
"integrity": "sha512-3LhYA+FXP6pqY8FLHCjewyE8pGXXJ7BxZw2rhPq+CZAhvflVzq4K8Qly3OrmOkn6wGlz79nyLQdknyCG2HBTuA==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.7.0",
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
"@prisma/get-platform": "6.7.0"
"@prisma/debug": "6.5.0",
"@prisma/engines-version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60",
"@prisma/get-platform": "6.5.0"
}
},
"node_modules/@prisma/get-platform": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.7.0.tgz",
"integrity": "sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.5.0.tgz",
"integrity": "sha512-xYcvyJwNMg2eDptBYFqFLUCfgi+wZLcj6HDMsj0Qw0irvauG4IKmkbywnqwok0B+k+W+p+jThM2DKTSmoPCkzw==",
"devOptional": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/debug": "6.7.0"
"@prisma/debug": "6.5.0"
}
},
"node_modules/@swc/counter": {
@ -2518,9 +2517,9 @@
}
},
"node_modules/esbuild": {
"version": "0.25.4",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz",
"integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
"integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==",
"devOptional": true,
"hasInstallScript": true,
"license": "MIT",
@ -2531,31 +2530,31 @@
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.25.4",
"@esbuild/android-arm": "0.25.4",
"@esbuild/android-arm64": "0.25.4",
"@esbuild/android-x64": "0.25.4",
"@esbuild/darwin-arm64": "0.25.4",
"@esbuild/darwin-x64": "0.25.4",
"@esbuild/freebsd-arm64": "0.25.4",
"@esbuild/freebsd-x64": "0.25.4",
"@esbuild/linux-arm": "0.25.4",
"@esbuild/linux-arm64": "0.25.4",
"@esbuild/linux-ia32": "0.25.4",
"@esbuild/linux-loong64": "0.25.4",
"@esbuild/linux-mips64el": "0.25.4",
"@esbuild/linux-ppc64": "0.25.4",
"@esbuild/linux-riscv64": "0.25.4",
"@esbuild/linux-s390x": "0.25.4",
"@esbuild/linux-x64": "0.25.4",
"@esbuild/netbsd-arm64": "0.25.4",
"@esbuild/netbsd-x64": "0.25.4",
"@esbuild/openbsd-arm64": "0.25.4",
"@esbuild/openbsd-x64": "0.25.4",
"@esbuild/sunos-x64": "0.25.4",
"@esbuild/win32-arm64": "0.25.4",
"@esbuild/win32-ia32": "0.25.4",
"@esbuild/win32-x64": "0.25.4"
"@esbuild/aix-ppc64": "0.25.2",
"@esbuild/android-arm": "0.25.2",
"@esbuild/android-arm64": "0.25.2",
"@esbuild/android-x64": "0.25.2",
"@esbuild/darwin-arm64": "0.25.2",
"@esbuild/darwin-x64": "0.25.2",
"@esbuild/freebsd-arm64": "0.25.2",
"@esbuild/freebsd-x64": "0.25.2",
"@esbuild/linux-arm": "0.25.2",
"@esbuild/linux-arm64": "0.25.2",
"@esbuild/linux-ia32": "0.25.2",
"@esbuild/linux-loong64": "0.25.2",
"@esbuild/linux-mips64el": "0.25.2",
"@esbuild/linux-ppc64": "0.25.2",
"@esbuild/linux-riscv64": "0.25.2",
"@esbuild/linux-s390x": "0.25.2",
"@esbuild/linux-x64": "0.25.2",
"@esbuild/netbsd-arm64": "0.25.2",
"@esbuild/netbsd-x64": "0.25.2",
"@esbuild/openbsd-arm64": "0.25.2",
"@esbuild/openbsd-x64": "0.25.2",
"@esbuild/sunos-x64": "0.25.2",
"@esbuild/win32-arm64": "0.25.2",
"@esbuild/win32-ia32": "0.25.2",
"@esbuild/win32-x64": "0.25.2"
}
},
"node_modules/esbuild-register": {
@ -3294,12 +3293,6 @@
"url": "https://opencollective.com/parcel"
}
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"license": "MIT"
},
"node_modules/lodash.includes": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
@ -3599,15 +3592,15 @@
}
},
"node_modules/prisma": {
"version": "6.7.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.7.0.tgz",
"integrity": "sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==",
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.5.0.tgz",
"integrity": "sha512-yUGXmWqv5F4PByMSNbYFxke/WbnyTLjnJ5bKr8fLkcnY7U5rU9rUTh/+Fja+gOrRxEgtCbCtca94IeITj4j/pg==",
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"@prisma/config": "6.7.0",
"@prisma/engines": "6.7.0"
"@prisma/config": "6.5.0",
"@prisma/engines": "6.5.0"
},
"bin": {
"prisma": "build/index.js"
@ -4075,21 +4068,6 @@
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"license": "MIT"
},
"node_modules/usehooks-ts": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-3.1.1.tgz",
"integrity": "sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA==",
"license": "MIT",
"dependencies": {
"lodash.debounce": "^4.0.8"
},
"engines": {
"node": ">=16.15.0"
},
"peerDependencies": {
"react": "^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc"
}
},
"node_modules/utrie": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",

View File

@ -9,7 +9,7 @@
"lint": "next lint"
},
"dependencies": {
"@prisma/client": "^6.7.0",
"@prisma/client": "^6.5.0",
"@tanstack/react-query": "^5.71.0",
"@tanstack/react-query-devtools": "^5.71.0",
"axios": "^1.8.4",
@ -21,7 +21,6 @@
"react-to-pdf": "^2.0.0",
"sass": "^1.87.0",
"swiper": "^11.2.6",
"usehooks-ts": "^3.1.1",
"zustand": "^5.0.3"
},
"devDependencies": {
@ -29,7 +28,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"prisma": "^6.7.0",
"prisma": "^6.5.0",
"tailwindcss": "^4",
"typescript": "^5"
}

97
pnpm-lock.yaml generated
View File

@ -9,8 +9,8 @@ importers:
.:
dependencies:
'@prisma/client':
specifier: ^6.7.0
version: 6.7.0(prisma@6.7.0(typescript@5.8.2))(typescript@5.8.2)
specifier: ^6.5.0
version: 6.5.0(prisma@6.5.0(typescript@5.8.2))(typescript@5.8.2)
'@tanstack/react-query':
specifier: ^5.71.0
version: 5.71.0(react@19.1.0)
@ -44,9 +44,6 @@ importers:
swiper:
specifier: ^11.2.6
version: 11.2.6
usehooks-ts:
specifier: ^3.1.1
version: 3.1.1(react@19.1.0)
zustand:
specifier: ^5.0.3
version: 5.0.3(@types/react@19.0.12)(react@19.1.0)
@ -64,8 +61,8 @@ importers:
specifier: ^19
version: 19.0.4(@types/react@19.0.12)
prisma:
specifier: ^6.7.0
version: 6.7.0(typescript@5.8.2)
specifier: ^6.5.0
version: 6.5.0(typescript@5.8.2)
tailwindcss:
specifier: ^4
version: 4.0.17
@ -541,8 +538,8 @@ packages:
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
engines: {node: '>= 10.0.0'}
'@prisma/client@6.7.0':
resolution: {integrity: sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==}
'@prisma/client@6.5.0':
resolution: {integrity: sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==}
engines: {node: '>=18.18'}
peerDependencies:
prisma: '*'
@ -553,23 +550,23 @@ packages:
typescript:
optional: true
'@prisma/config@6.7.0':
resolution: {integrity: sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==}
'@prisma/config@6.5.0':
resolution: {integrity: sha512-sOH/2Go9Zer67DNFLZk6pYOHj+rumSb0VILgltkoxOjYnlLqUpHPAN826vnx8HigqnOCxj9LRhT6U7uLiIIWgw==}
'@prisma/debug@6.7.0':
resolution: {integrity: sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==}
'@prisma/debug@6.5.0':
resolution: {integrity: sha512-fc/nusYBlJMzDmDepdUtH9aBsJrda2JNErP9AzuHbgUEQY0/9zQYZdNlXmKoIWENtio+qarPNe/+DQtrX5kMcQ==}
'@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed':
resolution: {integrity: sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==}
'@prisma/engines-version@6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60':
resolution: {integrity: sha512-iK3EmiVGFDCmXjSpdsKGNqy9hOdLnvYBrJB61far/oP03hlIxrb04OWmDjNTwtmZ3UZdA5MCvI+f+3k2jPTflQ==}
'@prisma/engines@6.7.0':
resolution: {integrity: sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==}
'@prisma/engines@6.5.0':
resolution: {integrity: sha512-FVPQYHgOllJklN9DUyujXvh3hFJCY0NX86sDmBErLvoZjy2OXGiZ5FNf3J/C4/RZZmCypZBYpBKEhx7b7rEsdw==}
'@prisma/fetch-engine@6.7.0':
resolution: {integrity: sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==}
'@prisma/fetch-engine@6.5.0':
resolution: {integrity: sha512-3LhYA+FXP6pqY8FLHCjewyE8pGXXJ7BxZw2rhPq+CZAhvflVzq4K8Qly3OrmOkn6wGlz79nyLQdknyCG2HBTuA==}
'@prisma/get-platform@6.7.0':
resolution: {integrity: sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==}
'@prisma/get-platform@6.5.0':
resolution: {integrity: sha512-xYcvyJwNMg2eDptBYFqFLUCfgi+wZLcj6HDMsj0Qw0irvauG4IKmkbywnqwok0B+k+W+p+jThM2DKTSmoPCkzw==}
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
@ -1085,9 +1082,6 @@ packages:
resolution: {integrity: sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==}
engines: {node: '>= 12.0.0'}
lodash.debounce@4.0.8:
resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
lodash.includes@4.3.0:
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
@ -1187,8 +1181,8 @@ packages:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
prisma@6.7.0:
resolution: {integrity: sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==}
prisma@6.5.0:
resolution: {integrity: sha512-yUGXmWqv5F4PByMSNbYFxke/WbnyTLjnJ5bKr8fLkcnY7U5rU9rUTh/+Fja+gOrRxEgtCbCtca94IeITj4j/pg==}
engines: {node: '>=18.18'}
hasBin: true
peerDependencies:
@ -1355,12 +1349,6 @@ packages:
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
usehooks-ts@3.1.1:
resolution: {integrity: sha512-I4diPp9Cq6ieSUH2wu+fDAVQO43xwtulo+fKEidHUwZPnYImbtkTjzIJYcDcJqxgmX31GVqNFURodvcgHcW0pA==}
engines: {node: '>=16.15.0'}
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19 || ^19.0.0-rc
utrie@1.0.2:
resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==}
@ -1766,38 +1754,38 @@ snapshots:
'@parcel/watcher-win32-x64': 2.5.1
optional: true
'@prisma/client@6.7.0(prisma@6.7.0(typescript@5.8.2))(typescript@5.8.2)':
'@prisma/client@6.5.0(prisma@6.5.0(typescript@5.8.2))(typescript@5.8.2)':
optionalDependencies:
prisma: 6.7.0(typescript@5.8.2)
prisma: 6.5.0(typescript@5.8.2)
typescript: 5.8.2
'@prisma/config@6.7.0':
'@prisma/config@6.5.0':
dependencies:
esbuild: 0.25.2
esbuild-register: 3.6.0(esbuild@0.25.2)
transitivePeerDependencies:
- supports-color
'@prisma/debug@6.7.0': {}
'@prisma/debug@6.5.0': {}
'@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed': {}
'@prisma/engines-version@6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60': {}
'@prisma/engines@6.7.0':
'@prisma/engines@6.5.0':
dependencies:
'@prisma/debug': 6.7.0
'@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed
'@prisma/fetch-engine': 6.7.0
'@prisma/get-platform': 6.7.0
'@prisma/debug': 6.5.0
'@prisma/engines-version': 6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60
'@prisma/fetch-engine': 6.5.0
'@prisma/get-platform': 6.5.0
'@prisma/fetch-engine@6.7.0':
'@prisma/fetch-engine@6.5.0':
dependencies:
'@prisma/debug': 6.7.0
'@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed
'@prisma/get-platform': 6.7.0
'@prisma/debug': 6.5.0
'@prisma/engines-version': 6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60
'@prisma/get-platform': 6.5.0
'@prisma/get-platform@6.7.0':
'@prisma/get-platform@6.5.0':
dependencies:
'@prisma/debug': 6.7.0
'@prisma/debug': 6.5.0
'@swc/counter@0.1.3': {}
@ -2324,8 +2312,6 @@ snapshots:
lightningcss-win32-arm64-msvc: 1.29.2
lightningcss-win32-x64-msvc: 1.29.2
lodash.debounce@4.0.8: {}
lodash.includes@4.3.0: {}
lodash.isboolean@3.0.3: {}
@ -2427,10 +2413,10 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
prisma@6.7.0(typescript@5.8.2):
prisma@6.5.0(typescript@5.8.2):
dependencies:
'@prisma/config': 6.7.0
'@prisma/engines': 6.7.0
'@prisma/config': 6.5.0
'@prisma/engines': 6.5.0
optionalDependencies:
fsevents: 2.3.3
typescript: 5.8.2
@ -2595,11 +2581,6 @@ snapshots:
undici-types@6.19.8: {}
usehooks-ts@3.1.1(react@19.1.0):
dependencies:
lodash.debounce: 4.0.8
react: 19.1.0
utrie@1.0.2:
dependencies:
base64-arraybuffer: 1.0.2

View File

@ -57,65 +57,65 @@ model MS_SUITABLE {
updated_at DateTime @updatedAt
}
model SD_SURVEY_SALES_BASIC_INFO {
ID Int @id @default(autoincrement())
REPRESENTATIVE String @db.VarChar(200)
STORE String? @db.VarChar(200)
CONSTRUCTION_POINT String? @db.VarChar(200)
INVESTIGATION_DATE String? @db.VarChar(10)
BUILDING_NAME String? @db.VarChar(200)
CUSTOMER_NAME String? @db.VarChar(200)
POST_CODE String? @db.VarChar(10)
ADDRESS String? @db.VarChar(200)
ADDRESS_DETAIL String? @db.VarChar(300)
SUBMISSION_STATUS Boolean @default(false)
SUBMISSION_DATE DateTime? @db.Date
REG_DT DateTime @default(now())
UPT_DT DateTime @updatedAt
DETAIL_INFO SD_SURVEY_SALES_DETAIL_INFO?
model SD_SERVEY_SALES_BASIC_INFO {
id Int @id @default(autoincrement())
representative String @db.VarChar(200)
store String? @db.VarChar(200)
construction_point String? @db.VarChar(200)
investigation_date String? @db.VarChar(10)
building_name String? @db.VarChar(200)
customer_name String? @db.VarChar(200)
post_code String? @db.VarChar(10)
address String? @db.VarChar(200)
address_detail String? @db.VarChar(300)
submission_status Boolean @default(false)
submission_date DateTime? @db.Date
created_at DateTime @default(now())
updated_at DateTime @updatedAt
detail_info SD_SERVEY_SALES_DETAIL_INFO?
}
model SD_SURVEY_SALES_DETAIL_INFO {
ID Int @id @default(autoincrement())
CONTRACT_CAPACITY String? @db.VarChar(20)
RETAIL_COMPANY String? @db.VarChar(100)
SUPPLEMENTARY_FACILITIES String? @db.VarChar(20)
SUPPLEMENTARY_FACILITIES_ETC String? @db.VarChar(200)
INSTALLATION_SYSTEM String? @db.VarChar(20)
INSTALLATION_SYSTEM_ETC String? @db.VarChar(200)
CONSTRUCTION_YEAR String? @db.VarChar(200)
CONSTRUCTION_YEAR_ETC String? @db.VarChar(200)
ROOF_MATERIAL String? @db.VarChar(20)
ROOF_MATERIAL_ETC String? @db.VarChar(200)
ROOF_SHAPE String? @db.VarChar(20)
ROOF_SHAPE_ETC String? @db.VarChar(200)
ROOF_SLOPE String? @db.VarChar(5)
HOUSE_STRUCTURE String? @db.VarChar(20)
HOUSE_STRUCTURE_ETC String? @db.VarChar(200)
RAFTER_MATERIAL String? @db.VarChar(20)
RAFTER_MATERIAL_ETC String? @db.VarChar(200)
RAFTER_SIZE String? @db.VarChar(20)
RAFTER_SIZE_ETC String? @db.VarChar(200)
RAFTER_PITCH String? @db.VarChar(20)
RAFTER_PITCH_ETC String? @db.VarChar(200)
RAFTER_DIRECTION String? @db.VarChar(20)
OPEN_FIELD_PLATE_KIND String? @db.VarChar(20)
OPEN_FIELD_PLATE_KIND_ETC String? @db.VarChar(200)
OPEN_FIELD_PLATE_THICKNESS String? @db.VarChar(5)
LEAK_TRACE Boolean? @default(false)
WATERPROOF_MATERIAL String? @db.VarChar(20)
WATERPROOF_MATERIAL_ETC String? @db.VarChar(200)
INSULATION_PRESENCE String? @db.VarChar(20)
INSULATION_PRESENCE_ETC String? @db.VarChar(200)
STRUCTURE_ORDER String? @db.VarChar(20)
STRUCTURE_ORDER_ETC String? @db.VarChar(200)
INSTALLATION_AVAILABILITY String? @db.VarChar(20)
INSTALLATION_AVAILABILITY_ETC String? @db.VarChar(200)
MEMO String? @db.VarChar(500)
REG_DT DateTime @default(now())
UPT_DT DateTime @updatedAt
BASIC_INFO_ID Int @unique
BASIC_INFO SD_SURVEY_SALES_BASIC_INFO @relation(fields: [BASIC_INFO_ID], references: [ID])
model SD_SERVEY_SALES_DETAIL_INFO {
id Int @id @default(autoincrement())
contract_capacity String? @db.VarChar(20)
retail_company String? @db.VarChar(100)
supplementary_facilities String? @db.VarChar(20)
supplementary_facilities_etc String? @db.VarChar(200)
installation_system Int?
installation_system_etc String? @db.VarChar(200)
construction_year Int?
construction_year_etc String? @db.VarChar(200)
roof_material String? @db.VarChar(20)
roof_material_etc String? @db.VarChar(200)
roof_shape Int?
roof_shape_etc String? @db.VarChar(200)
roof_slope String? @db.VarChar(5)
house_structure Int?
house_structure_etc String? @db.VarChar(200)
rafter_material Int?
rafter_material_etc String? @db.VarChar(200)
rafter_size Int?
rafter_size_etc String? @db.VarChar(200)
rafter_pitch Int?
rafter_pitch_etc String? @db.VarChar(200)
rafter_direction Int?
open_field_plate_kind Int?
open_field_plate_kind_etc String? @db.VarChar(200)
open_field_plate_thickness String? @db.VarChar(5)
leak_trace Boolean? @default(false)
waterproof_material Int?
waterproof_material_etc String? @db.VarChar(200)
insulation_presence Int?
insulation_presence_etc String? @db.VarChar(200)
structure_order Int?
structure_order_etc String? @db.VarChar(200)
installation_availability Int?
installation_availability_etc String? @db.VarChar(200)
memo String? @db.VarChar(500)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
basic_info_id Int @unique
basic_info SD_SERVEY_SALES_BASIC_INFO @relation(fields: [basic_info_id], references: [id])
}
model BC_COMM_H {

View File

@ -1,7 +1,6 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.2435 0.855705C15.4097 0.855705 19.5984 4.76701 19.5984 9.59169C19.5983 14.4163 15.4097 18.3277 10.2435 18.3277C9.21282 18.3276 8.22209 18.1686 7.2948 17.8811L6.93848 18.2343L3.16521 18.8557L4.21196 16.2668C2.1806 14.6643 0.889448 12.2694 0.889404 9.59169C0.889404 4.76712 5.07732 0.85588 10.2435 0.855705Z" fill="white"/>
<path d="M0 9.59678C0.000163056 4.27209 4.50324 3.08562e-05 9.99974 0C10.5114 0 11.0145 0.0367594 11.5062 0.108105L11.994 0.190773L12.0635 0.208033C12.4039 0.310445 12.6172 0.654717 12.5476 1.00928C12.478 1.36387 12.15 1.6032 11.7958 1.5707L11.7245 1.5607L11.3034 1.48894C10.8786 1.42731 10.4433 1.39537 9.99974 1.39537C5.22716 1.3954 1.40338 5.09254 1.40322 9.59678C1.40322 11.7648 2.28418 13.7385 3.73095 15.2082L3.89265 15.3881C4.25873 15.8329 4.5322 16.4532 4.40149 17.1468V17.1487C4.30484 17.6562 4.13751 18.1444 3.91092 18.6022C4.74024 18.5824 5.56144 18.369 6.29803 17.9772L6.82058 17.7073C6.95458 17.6437 7.12248 17.5708 7.30476 17.5429L7.43723 17.5302C7.56728 17.5242 7.69099 17.5364 7.79808 17.5511C7.94476 17.5712 8.12535 17.6059 8.33159 17.6447L8.74543 17.7119C9.16053 17.77 9.57922 17.7996 9.99883 17.7991H9.99974L10.4446 17.7882C15.0079 17.5669 18.5963 13.9603 18.5963 9.59678C18.5964 9.21163 18.9105 8.89916 19.2979 8.8991C19.6853 8.8991 19.9993 9.21159 19.9995 9.59678C19.9995 14.9216 15.4964 19.1936 9.99974 19.1936C9.51427 19.1941 9.02994 19.1608 8.54993 19.0936L8.07032 19.0155C7.84995 18.9741 7.71018 18.948 7.60623 18.9337C7.56695 18.9284 7.5409 18.924 7.52493 18.9228C7.5106 18.9282 7.47931 18.9408 7.42535 18.9664L6.96035 19.2072C5.6279 19.9161 4.07257 20.1676 2.57256 19.8885C2.32985 19.8433 2.12903 19.6747 2.04362 19.4443C1.95822 19.2139 2.00084 18.9558 2.15598 18.7648L2.31311 18.5586C2.66358 18.067 2.90718 17.4969 3.02294 16.8888C3.05428 16.7202 2.99503 16.5004 2.81374 16.2793L2.72787 16.1839C1.04031 14.4693 0 12.1512 0 9.59678Z" fill="#7896BA"/>
<path d="M19.2978 4.88379C19.2978 6.68195 17.8408 8.13965 16.0434 8.13965C14.2461 8.13965 12.7891 6.68195 12.7891 4.88379C12.7891 3.08563 14.2461 1.62794 16.0434 1.62794C17.8408 1.62794 19.2978 3.08563 19.2978 4.88379Z" fill="#F4F9FF"/>
<path d="M18.5967 4.88379C18.5967 3.46695 17.4492 2.32562 16.0433 2.32562C14.6376 2.32578 13.4909 3.46705 13.4909 4.88379C13.4909 6.30053 14.6376 7.4418 16.0433 7.44196C17.4492 7.44196 18.5967 6.30063 18.5967 4.88379ZM19.9999 4.88379C19.9999 7.06327 18.2322 8.83733 16.0433 8.83733C13.8546 8.83717 12.0876 7.06318 12.0876 4.88379C12.0876 2.70441 13.8546 0.930412 16.0433 0.930252C18.2322 0.930252 19.9999 2.70431 19.9999 4.88379Z" fill="#7896BA"/>
<path d="M6.28867 9.06989L6.38459 9.07444C6.85625 9.12213 7.22415 9.51853 7.22415 10.0001C7.22415 10.4817 6.85625 10.8781 6.38459 10.9258L6.28867 10.9304H6.28045C5.7638 10.9304 5.34497 10.5139 5.34497 10.0001C5.34497 9.48638 5.7638 9.06989 6.28045 9.06989H6.28867ZM10.0041 9.06989L10.0991 9.07444C10.571 9.12186 10.9396 9.51833 10.9396 10.0001C10.9396 10.4819 10.571 10.8784 10.0991 10.9258L10.0041 10.9304H9.99586C9.47921 10.9304 9.06039 10.5139 9.06039 10.0001C9.06039 9.48638 9.47921 9.06989 9.99586 9.06989H10.0041ZM13.7186 9.06989L13.8145 9.07444C14.2863 9.122 14.6541 9.51843 14.6541 10.0001C14.6541 10.4818 14.2863 10.8783 13.8145 10.9258L13.7186 10.9304H13.7104C13.1939 10.9302 12.7749 10.5138 12.7749 10.0001C12.7749 9.48648 13.1939 9.07005 13.7104 9.06989H13.7186Z" fill="#7896BA"/>
<svg width="23" height="22" viewBox="0 0 23 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 1C16.5228 1 21 5.25329 21 10.5C21 15.7467 16.5228 20 11 20C9.7958 20 8.64147 19.7974 7.57227 19.4268L7 20L4 20.5L4.96875 18.0762C2.55822 16.3416 1 13.5943 1 10.5C1 5.25329 5.47715 1 11 1Z" fill="white"/>
<path d="M21 10.5667C21 15.8499 16.5222 20.1334 11 20.1334C10.3507 20.1343 9.70324 20.0742 9.06542 19.9545C8.60633 19.8682 8.37678 19.8251 8.21653 19.8496C8.05627 19.8741 7.82918 19.9949 7.37499 20.2364C6.09014 20.9197 4.59195 21.161 3.15111 20.893C3.69874 20.2194 4.07275 19.4112 4.23778 18.5448C4.33778 18.0148 4.09 17.5 3.71889 17.1231C2.03333 15.4115 1 13.1051 1 10.5667C1 5.28357 5.47778 1 11 1C11.6849 1 12.3538 1.0659 13 1.19142" stroke="#7896BA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M22 4.5C22 6.433 20.433 8 18.5 8C16.567 8 15 6.433 15 4.5C15 2.567 16.567 1 18.5 1C20.433 1 22 2.567 22 4.5Z" fill="#F4F9FF" stroke="#7896BA" stroke-width="1.5"/>
<path d="M10.9955 11H11.0045M14.991 11H15M7 11H7.00897" stroke="#7896BA" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,5 +0,0 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11 1.5L13 2.5L19 8.5L20 9.5L20.5 10.5V11.5L19.5 12.5L19 13.5L18.5 14.5L18 16.5L17.5 18H16L14.5 18.5L12.5 19.5L11 20.5L9 19.5L8 18.5L5 18L4 17L3.5 15L3 13L1.5 11.5V10L3.5 7.5L4 4.5L5.5 4L9 2.5L11 1.5Z" fill="white"/>
<path d="M13.2618 2.59937C12.1956 1.53312 11.6625 1 11 1C10.3375 1 9.8044 1.53312 8.73815 2.59937C8.09832 3.2392 7.46427 3.53626 6.55208 3.53626C5.7556 3.53626 4.62243 3.38178 4 4.00944C3.38249 4.63214 3.53628 5.76065 3.53628 6.55206C3.53628 7.46428 3.2392 8.09832 2.59935 8.73817C1.53312 9.8044 1.00001 10.3375 1 11C1.00002 11.6624 1.53314 12.1956 2.59938 13.2618C3.31616 13.9786 3.53628 14.4414 3.53628 15.4479C3.53628 16.2444 3.38181 17.3776 4.00949 18C4.63218 18.6175 5.76068 18.4637 6.55206 18.4637C7.52349 18.4637 7.99128 18.6537 8.68457 19.347C9.27492 19.9374 10.0663 21 11 21C11.9337 21 12.7251 19.9374 13.3154 19.347C14.0087 18.6537 14.4765 18.4637 15.4479 18.4637C16.2393 18.4637 17.3678 18.6175 17.9905 18M19.4006 8.73817C20.4669 9.8044 21 10.3375 21 11C21 11.6624 20.4669 12.1956 19.4006 13.2618C18.6838 13.9786 18.4637 14.4414 18.4637 15.4479C18.4637 16.2444 18.6182 17.3776 17.9905 18M17.9905 18H18" stroke="#7896BA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7.5 8.5L11 12L20.0002 2" stroke="#7896BA" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,22 +0,0 @@
import { NextResponse } from 'next/server'
import { axiosInstance } from '@/libs/axios'
export async function POST(req: Request) {
const { loginId, email, pwd, chgPwd } = await req.json()
console.log('🚀 ~ POST ~ loginId:', loginId)
console.log('🚀 ~ POST ~ email:', email)
console.log('🚀 ~ POST ~ pwd:', pwd)
console.log('🚀 ~ POST ~ chgPwd:', chgPwd)
const result = await axiosInstance(`${process.env.NEXT_PUBLIC_QSP_API_URL}`).post(`/api/user/userPwdChg`, {
loginId,
chgType: 'C',
email,
pwd,
chgPwd,
})
console.log('🚀 ~ result ~ result:', result)
return NextResponse.json({ code: 200, data: result.data })
}

View File

@ -29,7 +29,6 @@ export async function POST(request: Request) {
session.compCd = result.data.data.compCd
session.agencyStoreId = result.data.data.agencyStoreId
session.storeId = result.data.data.storeId
session.storeNm = result.data.data.storeNm
session.userId = result.data.data.userId
session.category = result.data.data.category
session.userNm = result.data.data.userNm
@ -50,21 +49,6 @@ export async function POST(request: Request) {
session.custCd = result.data.data.custCd
session.builderNo = result.data.data.builderNo
session.isLoggedIn = true
if (result.data.data.userId === 'T01') {
session.role = 'T01'
} else if (result.data.data.groupId === '60000') {
session.role = 'Admin'
} else if (result.data.data.groupId === '70000' && result.data.data.builderNo === null) {
session.role = 'Admin_Sub'
} else if (result.data.data.groupId === '70000' && result.data.data.builderNo !== null) {
session.role = 'Builder'
} else if (result.data.data.groupId === '90000' && result.data.data.builderNo !== null) {
session.role = 'Partner'
} else {
session.role = 'User'
}
console.log('end session edit!')
await session.save()

View File

@ -1,44 +0,0 @@
import { NextRequest, NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
import type { CommCode } from '@/types/CommCode'
export async function GET(request: NextRequest) {
try {
const searchParams = request.nextUrl.searchParams
const headCode = searchParams.get('headCode')
// @ts-ignore
const headCd = await prisma.BC_COMM_H.findFirst({
where: {
HEAD_ID: headCode,
},
select: {
HEAD_CD: true,
},
})
if (!headCd) {
return NextResponse.json({ error: `${headCode}를 찾을 수 없습니다` }, { status: 404 })
}
// @ts-ignore
const roofMaterials: CommCode[] = await prisma.BC_COMM_L.findMany({
where: {
HEAD_CD: headCd.HEAD_CD,
},
select: {
HEAD_CD: true,
CODE: true,
CODE_JP: true,
},
orderBy: {
CODE: 'asc',
},
})
return NextResponse.json(roofMaterials)
} catch (error) {
console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error)
return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 })
}
}

View File

@ -0,0 +1,16 @@
import { NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
export async function GET() {
// @ts-ignore
const roofMaterialCategory = await prisma.MS_SUITABLE.findMany({
select: {
roof_material: true,
},
distinct: ['roof_material'],
orderBy: {
roof_material: 'asc',
},
})
return NextResponse.json(roofMaterialCategory)
}

View File

@ -0,0 +1,17 @@
import { NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
export async function GET(request: Request) {
const { searchParams } = new URL(request.url)
const roofMaterial = searchParams.get('roof-material')
console.log('🚀 ~ GET ~ roof-material:', roofMaterial)
// @ts-ignore
const suitables = await prisma.MS_SUITABLE.findMany({
where: {
roof_material: roofMaterial,
},
})
return NextResponse.json(suitables)
}

View File

@ -1,6 +1,5 @@
import { NextRequest, NextResponse } from 'next/server'
import { prisma } from '@/libs/prisma'
import { SUITABLE_HEAD_CODE } from '@/types/Suitable'
export async function GET(request: NextRequest) {
try {
@ -10,59 +9,24 @@ export async function GET(request: NextRequest) {
let whereCondition: any = {}
if (category) {
whereCondition[SUITABLE_HEAD_CODE.ROOF_MT_CD] = category
whereCondition['roof_material'] = category
}
if (keyword) {
whereCondition['PRODUCT_NAME'] = {
whereCondition['product_name'] = {
contains: keyword,
}
}
console.log('🚀 ~ /api/suitable/list: ~ prisma where condition:', whereCondition)
// // 1 include 사용
// // @ts-ignore
// const suitable = await prisma.MS_SUITABLE_MAIN.findMany({
// where: whereCondition,
// include: {
// MS_SUITABLE_DETAIL: true,
// },
// orderBy: {
// PRODUCT_NAME: 'asc',
// },
// })
// 2 include 안쓰고 따로 쿼리, 쓸거만 골라서 조회
// @ts-ignore
const suitable = await prisma.MS_SUITABLE_MAIN.findMany({
select: {
ID: true,
PRODUCT_NAME: true,
ROOF_MT_CD: true,
},
const suitables = await prisma.MS_SUITABLE.findMany({
where: whereCondition,
orderBy: {
PRODUCT_NAME: 'asc',
product_name: 'asc',
},
})
// @ts-ignore
const suitableDetail = await prisma.MS_SUITABLE_DETAIL.findMany({
select: {
ID: true,
MAIN_ID: true,
TRESTLE_MFPC_CD: true,
TRESTLE_MANUFACTURER_PRODUCT_NAME: true,
MEMO: true,
},
where: whereCondition
? {
MAIN_ID: {
in: suitable.map((suitable: { ID: number }) => suitable.ID),
},
}
: undefined,
orderBy: [{ MAIN_ID: 'asc' }, { TRESTLE_MANUFACTURER_PRODUCT_NAME: 'asc' }],
})
return NextResponse.json({ suitable, suitableDetail })
return NextResponse.json(suitables)
} catch (error) {
console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error)
return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 })

View File

@ -3,10 +3,7 @@
import type { SessionData } from '@/types/Auth'
import { useEffect, useReducer, useState } from 'react'
import { useRouter } from 'next/navigation'
import { useLocalStorage } from 'usehooks-ts'
import { useQuery } from '@tanstack/react-query'
import { axiosInstance } from '@/libs/axios'
import { useSessionStore } from '@/store/session'
@ -27,7 +24,6 @@ export default function Login() {
const [isLogin, setIsLogin] = useState(false)
const { session, setSession } = useSessionStore()
const [value, setValue, removeValue] = useLocalStorage<{ indivisualData: string }>('hanasysIndivisualState', { indivisualData: '' })
const reducer = (state: AccountState, newState: Partial<AccountState>) => ({ ...state, ...newState })
const [account, setAccount] = useReducer(reducer, {
@ -52,6 +48,7 @@ export default function Login() {
loginId: account.loginId,
pwd: account.pwd,
})
// router.push('/')
return data
},
@ -63,11 +60,6 @@ export default function Login() {
useEffect(() => {
setIsLogin(false)
if (loginData?.code === 200) {
// 유저 정보 저장
setValue({
indivisualData: account.pwd,
})
// 세션 정보 저장
setSession({
...session,
...loginData?.result,

View File

@ -1,18 +1,9 @@
'use client'
import { useRouter } from 'next/navigation'
import { usePopupController } from '@/store/popupController'
import { useSessionStore } from '@/store/session'
export default function MemberInformationPopup() {
const popupController = usePopupController()
const { session } = useSessionStore()
const router = useRouter()
const handlePwReset = () => {
router.push('/pw-reset')
popupController.setMemberInfomationPopup(false)
}
return (
<div className="modal-popup">
@ -33,30 +24,30 @@ export default function MemberInformationPopup() {
<div className="member-infor-form-wrap">
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input type="text" className="input-frame" defaultValue={session.userNm ?? ''} disabled />
<input type="text" className="input-frame" defaultValue={'Hong gi'} disabled />
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit">ID </div>
<input type="text" className="input-frame" defaultValue={session.userId ?? ''} disabled />
<input type="text" className="input-frame" defaultValue={'KG123'} disabled />
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input type="text" className="input-frame" defaultValue={session.email ?? ''} disabled />
<input type="text" className="input-frame" defaultValue={'Kim@interplug.co.kr'} disabled />
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input type="text" className="input-frame" defaultValue={session.telNo ?? ''} disabled />
<input type="text" className="input-frame" defaultValue={'02123456'} disabled />
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input type="text" className="input-frame" defaultValue={session.storeNm ?? ''} disabled />
<input type="text" className="input-frame" defaultValue={'Interplug'} disabled />
</div>
<div className="data-input-form-bx">
<div className="data-input-form-tit">ID</div>
<input type="text" className="input-frame" defaultValue={session.builderNo ?? ''} disabled />
<input type="text" className="input-frame" defaultValue={'Interplug2'} disabled />
</div>
</div>
<button className="btn-frame n-blue icon" onClick={handlePwReset}>
<button className="btn-frame n-blue icon">
<i className="btn-arr"></i>
</button>
</div>

View File

@ -3,50 +3,11 @@
import { useState } from 'react'
import { useRouter } from 'next/navigation'
import { useLocalStorage } from 'usehooks-ts'
import { axiosInstance } from '@/libs/axios'
import { useSessionStore } from '@/store/session'
export default function PwResetForm() {
const [pwShow01, setPwShow01] = useState<boolean>(false) //비밀번호 확인 보이기 숨기기
const [pwShow02, setPwShow02] = useState<boolean>(false) //비밀번호 재확인 보이기 숨기기
const [pwd01, setPwd01] = useState<string>('')
const [pwd02, setPwd02] = useState<string>('')
const [pwShow01, setPwShow01] = useState(false) //비밀번호 확인 보이기 숨기기
const [pwShow02, setPwShow02] = useState(false) //비밀번호 재확인 보이기 숨기기
const router = useRouter()
const { session } = useSessionStore()
const [value, setValue, removeValue] = useLocalStorage<{ indivisualData: string }>('hanasysIndivisualState', { indivisualData: '' })
const validatePwd = () => {
if (pwd01 !== pwd02) {
alert('비밀번호가 일치하지 않습니다.')
return false
}
return true
}
const handleReset = async () => {
if (validatePwd()) {
const { data } = await axiosInstance(null).post(`/api/auth/chg-pwd`, {
loginId: session.userId,
email: session.email,
pwd: value.indivisualData,
chgPwd: pwd01,
})
if (data.data.result.resultCode === 'S') {
setValue({ indivisualData: pwd01 })
}
window.neoAlert(data.data.result.resultMsg, () => {
router.back()
})
}
}
return (
<>
<div className="border-frame">
@ -57,12 +18,7 @@ export default function PwResetForm() {
</div>
<div className="data-input">
<div className="login-input pw change">
<input
type={`${pwShow01 ? 'text' : 'password'}`}
className="login-frame"
placeholder="●●●●"
onChange={(e) => setPwd01(e.target.value)}
/>
<input type={`${pwShow01 ? 'text' : 'password'}`} className="login-frame" placeholder="●●●●" />
<button className={`login-icon ${pwShow01 ? 'act' : ''}`} onClick={() => setPwShow01(!pwShow01)}>
<i className="show-icon"></i>
</button>
@ -76,12 +32,7 @@ export default function PwResetForm() {
</div>
<div className="data-input">
<div className="login-input pw change">
<input
type={`${pwShow02 ? 'text' : 'password'}`}
className="login-frame"
placeholder="●●●●"
onChange={(e) => setPwd02(e.target.value)}
/>
<input type={`${pwShow02 ? 'text' : 'password'}`} className="login-frame" placeholder="●●●●" />
<button className={`login-icon ${pwShow02 ? 'act' : ''}`} onClick={() => setPwShow02(!pwShow02)}>
<i className="show-icon"></i>
</button>
@ -97,7 +48,7 @@ export default function PwResetForm() {
</button>
</div>
<div className="btn-bx">
<button className="btn-frame red icon" onClick={handleReset}>
<button className="btn-frame red icon">
<i className="btn-arr"></i>
</button>
</div>

View File

@ -1,69 +1,27 @@
'use client'
import { useEffect, useState } from 'react'
import SuitableList from './SuitableList'
import { useSuitable } from '@/hooks/useSuitable'
import { useSuitableStore } from '@/store/useSuitableStore'
import type { CommCode } from '@/types/CommCode'
import { SUITABLE_HEAD_CODE } from '@/types/Suitable'
import { useState } from 'react'
import SuitableCheckData from './SuitableCheckData'
import SuitableNoData from './SuitableNoData'
export default function Suitable() {
const [reference, setReference] = useState(false)
const { getSuitableCommCode, refetchBySearch } = useSuitable()
const { suitableCommCode, selectedCategory, setSelectedCategory, searchValue, setSearchValue, setIsSearch, clearSelectedItems } = useSuitableStore()
const handleInputSearch = async () => {
if (!searchValue.trim()) {
alert('屋根材の製品名を入力してください。')
return
}
setIsSearch(true)
refetchBySearch()
}
const handleInputClear = () => {
setSearchValue('')
setIsSearch(false)
refetchBySearch()
}
useEffect(() => {
refetchBySearch()
}, [selectedCategory])
useEffect(() => {
getSuitableCommCode()
return () => {
setSelectedCategory('')
setSearchValue('')
clearSelectedItems()
}
}, [])
return (
<div className="border-frame">
<div className="sale-form-bx">
<select className="select-form" name="" id="" value={selectedCategory || ''} onChange={(e) => setSelectedCategory(e.target.value)}>
<select className="select-form" name="" id="">
<option value="">.</option>
<option value="">.</option>
<option value="">.</option>
<option value="">.</option>
<option value="">.</option>
{suitableCommCode.get(SUITABLE_HEAD_CODE.ROOF_MT_CD)?.map((category: CommCode, index: number) => (
<option key={index} value={category.CODE}>
{category.CODE_JP}
</option>
))}
</select>
</div>
<div className="sale-form-bx">
<div className="search-input">
<input
type="text"
className="search-frame"
placeholder="屋根材 製品名を入力してください."
value={searchValue}
onChange={(e) => setSearchValue(e.target.value)}
/>
{searchValue && <button className="del-icon" onClick={handleInputClear} />}
<button className="search-icon" onClick={handleInputSearch} />
<input type="text" className="search-frame" placeholder="屋根材 製品名を入力してください." />
<button className="search-icon"></button>
</div>
</div>
<div className="compliance-check-wrap">
@ -97,8 +55,33 @@ export default function Suitable() {
</li>
</ul>
</div>
<SuitableList />
{/* checkData */}
{/* 데이터 없을경우 버튼 영역 안보여야함 */}
<SuitableCheckData />
<SuitableCheckData />
<SuitableCheckData />
<SuitableCheckData />
</div>
{/* 데이터 없을경우 버튼 영역 안보여야함 */}
<div className="btn-flex-wrap com">
<div className="btn-bx">
<button className="btn-frame n-blue icon">
<i className="btn-arr"></i>
</button>
</div>
<div className="btn-bx">
<button className="btn-frame red icon">
<i className="btn-arr"></i>
</button>
</div>
<div className="btn-bx">
<button className="btn-frame n-blue icon">
<i className="btn-arr"></i>
</button>
</div>
</div>
{/* 검색기록 없을떄 위에 두 영역 안보이고 이 부분만 보여야 함*/}
{/* <SuitableNoData /> */}
</div>
)
}

View File

@ -0,0 +1,68 @@
'use client'
export default function SuitableCheckData() {
return (
<>
<div className={`compliance-check-bx act`}>
<div className="check-name-wrap">
<div className="check-form-box com-tit">
<input type="checkbox" id="ch01" />
<label htmlFor="ch01"></label>
</div>
<div className="check-name-btn">
<button className="bx-btn"></button>
</div>
</div>
<ul className="reference-list check">
<li className="reference-item">
<div className="check-item-wrap">
<div className="check-form-box com-txt">
<input type="checkbox" id="ch02" />
<label htmlFor="ch02"> </label>
</div>
<div className="compliance-icon-wrap">
<i className="compliance-icon check"></i>
<i className="compliance-icon x"></i>
</div>
</div>
</li>
<li className="reference-item">
<div className="check-item-wrap">
<div className="check-form-box com-txt">
<input type="checkbox" id="ch03" />
<label htmlFor="ch03"> </label>
</div>
<div className="compliance-icon-wrap">
<i className="compliance-icon x"></i>
<i className="compliance-icon tip"></i>
</div>
</div>
</li>
<li className="reference-item">
<div className="check-item-wrap">
<div className="check-form-box com-txt">
<input type="checkbox" id="ch04" />
<label htmlFor="ch04">YGアンカー</label>
</div>
<div className="compliance-icon-wrap">
<i className="compliance-icon tip"></i>
<i className="compliance-icon quest"></i>
</div>
</div>
</li>
<li className="reference-item">
<div className="check-item-wrap">
<div className="check-form-box com-txt">
<input type="checkbox" id="ch05" />
<label htmlFor="ch05"></label>
</div>
<div className="compliance-icon-wrap">
<i className="compliance-icon check"></i>
</div>
</div>
</li>
</ul>
</div>
</>
)
}

View File

@ -1,76 +0,0 @@
'use client'
import SuitableNoData from './SuitableNoData'
import { useSuitable } from '@/hooks/useSuitable'
import { useSuitableStore } from '@/store/useSuitableStore'
import { SUITABLE_HEAD_CODE, type SuitableMain, type SuitableDetail } from '@/types/Suitable'
export default function SuitableList() {
const { toCodeName, suitableSearchResults, isSearchLoading } = useSuitable()
const { selectedItems, addSelectedItem, removeSelectedItem } = useSuitableStore()
const handleItemClick = (itemId: number) => {
selectedItems.some((selected) => selected === itemId) ? removeSelectedItem(itemId) : addSelectedItem(itemId)
}
const suitableCheck = (value: string) => {
if (value === '×') {
return <i className="compliance-icon x" />
} else if (value === 'ー') {
return <i className="compliance-icon quest" />
} else {
return <i className="compliance-icon check" />
}
}
const filterSuitableDetail = (mainId: number): SuitableDetail[] | undefined => {
const result: SuitableDetail[] = []
for (const subItem of suitableSearchResults?.suitableDetail ?? []) {
if (subItem.MAIN_ID > mainId) break
if (subItem.MAIN_ID === mainId) {
result.push(subItem)
}
}
return result
}
return (
<>
{isSearchLoading ? (
<div>Loading...</div>
) : suitableSearchResults && suitableSearchResults.suitable.length > 0 ? (
suitableSearchResults.suitable.map((item: SuitableMain) => (
<div className={`compliance-check-bx act`} key={item.ID}>
<div className="check-name-wrap">
<div className="check-form-box com-tit">
<input type="checkbox" id={`ch${item.ID}`} />
<label htmlFor={`ch${item.ID}`}>{item.PRODUCT_NAME}</label>
</div>
<div className="check-name-btn">
<button className="bx-btn" onClick={() => handleItemClick(item.ID)}></button>
</div>
</div>
<ul className="reference-list check">
<li className="reference-item">
{filterSuitableDetail(item.ID)?.map((subItem: SuitableDetail) => (
<div className="check-item-wrap" key={subItem.ID}>
<div className="check-form-box com-txt">
<input type="checkbox" id={`ch${subItem.ID}`} />
<label htmlFor={`ch${subItem.ID}`}>{toCodeName(SUITABLE_HEAD_CODE.TRESTLE_MFPC_CD, subItem.TRESTLE_MFPC_CD)}</label>
</div>
<div className="compliance-icon-wrap">
{suitableCheck(subItem.TRESTLE_MANUFACTURER_PRODUCT_NAME)}
{subItem.MEMO && <i className="compliance-icon tip"></i>}
</div>
</div>
))}
</li>
</ul>
</div>
))
) : (
<SuitableNoData />
)}
</>
)
}

View File

@ -3,25 +3,22 @@
import Link from 'next/link'
import { usePathname, useRouter } from 'next/navigation'
import { useLocalStorage } from 'usehooks-ts'
import { useQueryClient } from '@tanstack/react-query'
import { Swiper, SwiperSlide } from 'swiper/react'
import { useQueryClient } from '@tanstack/react-query'
import { useSideNavState } from '@/store/sideNavState'
import { useHeaderStore } from '@/store/header'
import { useSessionStore } from '@/store/session'
import { usePopupController } from '@/store/popupController'
import { useTitle } from '@/hooks/useTitle'
import { axiosInstance } from '@/libs/axios'
import 'swiper/css'
import { confirmParamsSerialize } from '@/utils/window'
export default function Header() {
const router = useRouter()
const pathname = usePathname()
const [value, setValue, removeValue] = useLocalStorage<{ indivisualData: string }>('hanasysIndivisualState', { indivisualData: '' })
const { sideNavIsOpen, setSideNavIsOpen } = useSideNavState()
const { backBtn } = useHeaderStore()
const { getTitle } = useTitle()
@ -29,15 +26,12 @@ export default function Header() {
const { session, reset } = useSessionStore()
const queryClient = useQueryClient()
const popupController = usePopupController()
if (pathname === '/login') {
return null
}
const handleLogout = async () => {
reset()
removeValue()
const { data } = await axiosInstance(null).get('/api/auth/logout')
if (data.code === 200) {
queryClient.clear()
@ -45,6 +39,22 @@ export default function Header() {
}
}
const handleYes = () => {
console.log('yes')
}
const handleNo = () => {
console.log('no')
}
const handleCofirm = () => {
window.neoConfirm(
'よろしいですか?',
() => console.log('yes'),
() => console.log('no'),
)
}
return (
<>
<div className="header-warp">
@ -52,7 +62,7 @@ export default function Header() {
<div className="header-inner">
{backBtn && (
<div className="back-button-wrap">
<button className="back-button" onClick={() => router.back()}></button>
<button className="back-button" onClick={handleCofirm}></button>
</div>
)}
<h2 className="logo">
@ -127,7 +137,7 @@ export default function Header() {
</button>
</li>
<li className="side-footer-item">
<button onClick={() => popupController.setMemberInfomationPopup(true)}>MY ADMIN</button>
<button>Jynoadmin</button>
</li>
<li className="side-footer-item">
<button onClick={() => router.push('/')}>HOME</button>

View File

@ -1,18 +0,0 @@
import { axiosInstance } from '@/libs/axios'
import type { CommCode } from '@/types/CommCode'
export function useCommCode() {
const getCommCode = async (headCode: string): Promise<CommCode[]> => {
try {
const response = await axiosInstance(null).get<CommCode[]>('/api/comm-code', { params: { headCode: headCode } })
return response.data
} catch (error) {
console.error(`common code (${headCode}) load failed:`, error)
return []
}
}
return {
getCommCode,
}
}

View File

@ -1,95 +1,30 @@
import { useQuery } from '@tanstack/react-query'
import { axiosInstance } from '@/libs/axios'
import { useSuitableStore } from '@/store/useSuitableStore'
import { useCommCode } from './useCommCode'
import { SUITABLE_HEAD_CODE, type SuitableData, type SuitableMain, type SuitableDetail } from '@/types/Suitable'
import { suitableApi } from '@/api/suitable'
export function useSuitable() {
const { getCommCode } = useCommCode()
const { selectedCategory, searchValue, suitableCommCode, setSuitableCommCode, isSearch } = useSuitableStore()
const getSuitables = async (): Promise<SuitableData> => {
const getCategories = async () => {
try {
const response = await axiosInstance(null).get<SuitableData>('/api/suitable/list')
return response.data
return await suitableApi.getCategory()
} catch (error) {
console.error('카테고리 데이터 로드 실패:', error)
return []
}
}
const getSuitables = async () => {
try {
return await suitableApi.getList()
} catch (error) {
console.error('지붕재 데이터 로드 실패:', error)
return {
suitable: [],
suitableDetail: [],
}
}
}
// const updateSearchResults = async (selectedCategory: string | undefined, searchValue: string | undefined): Promise<SuitableData[]> => {
// try {
// const response = await axiosInstance(null).get<SuitableData[]>('/api/suitable/list', { params: { selectedCategory, searchValue } })
// return response.data
// } catch (error) {
// console.error('지붕재 데이터 검색 실패:', error)
// return []
// }
// }
const getSuitableCommCode = () => {
const headCodes = Object.values(SUITABLE_HEAD_CODE) as SUITABLE_HEAD_CODE[]
for (const code of headCodes) {
getCommCode(code).then((res) => {
setSuitableCommCode(code, res)
})
const updateSearchResults = async (selectedCategory: string | undefined, searchValue: string | undefined) => {
try {
return await suitableApi.getList(selectedCategory, searchValue)
} catch (error) {
console.error('지붕재 데이터 검색 실패:', error)
}
}
const toCodeName = (headCode: string, code: string): string => {
const commCode = suitableCommCode.get(headCode)
return commCode?.find((item) => item.CODE === code)?.CODE_JP || ''
}
const { data: suitableList, isLoading: isInitialLoading } = useQuery<SuitableData>({
queryKey: ['suitables', 'list'],
queryFn: async () => await getSuitables(),
staleTime: 1000 * 60 * 10, // 10분
gcTime: 1000 * 60 * 10, // 10분
})
const {
data: suitableSearchResults,
refetch: refetchBySearch,
isLoading: isSearchLoading,
} = useQuery<SuitableData>({
queryKey: ['suitables', 'search', selectedCategory, searchValue],
queryFn: async () => {
if (!isSearch && !selectedCategory) {
return suitableList ?? (await getSuitables()) // 검색 상태가 아니면 초기 데이터 반환 임시처리
} else {
const suitable = suitableList?.suitable.filter((item: SuitableMain) => {
const categoryMatch = !selectedCategory || item.ROOF_MT_CD === selectedCategory
const searchMatch = !searchValue || item.PRODUCT_NAME.includes(searchValue)
return categoryMatch && searchMatch
})
const mainIds = suitable?.map((item: SuitableMain) => item.ID)
const suitableDetail = suitableList?.suitableDetail.filter((item: SuitableDetail) => {
return mainIds?.includes(item.MAIN_ID)
})
return {
suitable: suitable ?? [],
suitableDetail: suitableDetail ?? [],
}
}
},
staleTime: 1000 * 60 * 10,
gcTime: 1000 * 60 * 10,
enabled: true,
})
return {
getSuitables,
getSuitableCommCode,
toCodeName,
suitableList,
isInitialLoading,
suitableSearchResults,
refetchBySearch,
isSearchLoading,
}
return { getCategories, getSuitables, updateSearchResults }
}

View File

@ -1,16 +1,14 @@
'use client'
import { useEffect } from 'react'
import { usePathname } from 'next/navigation'
import { useHeaderStore } from '@/store/header'
import { usePopupController } from '@/store/popupController'
import { useSideNavState } from '@/store/sideNavState'
import { usePathname } from 'next/navigation'
import { useEffect } from 'react'
import { useSessionStore } from '@/store/session'
declare global {
interface Window {
neoAlert: (msg?: string, alertBtn?: Function) => void
neoConfirm: (msg?: string, alertBtn2Yes?: Function, alertBtn2No?: Function) => boolean
}
}
@ -57,10 +55,6 @@ export default function EdgeProvider({ children, sessionData }: EdgeProviderProp
window.alert = function (msg, alertBtn = () => setAlert(false)) {
alertFunc(msg, alertBtn)
}
window.neoAlert = function (msg?: string, alertBtn = () => setAlert(false)) {
if (!msg) return
alertFunc(msg, alertBtn)
}
// confirm 함수 변경해서 바인딩
window.neoConfirm = function (msg: string | undefined, alertBtn2Yes?: Function, alertBtn2No?: Function) {
if (!msg) return false

View File

@ -21,7 +21,6 @@ const initialState: InitialState = {
compCd: null,
agencyStoreId: null,
storeId: null,
storeNm: null,
userId: null,
category: null,
userNm: null,
@ -42,7 +41,6 @@ const initialState: InitialState = {
custCd: null,
builderNo: null,
isLoggedIn: false,
role: null,
},
}

View File

@ -1,71 +1,68 @@
import { create } from 'zustand'
import type { CommCode } from '@/types/CommCode'
import { Suitable, suitableApi } from '@/api/suitable'
interface SuitableState {
/* 공통코드 */
suitableCommCode: Map<string, CommCode[]>
/* 공통코드 설정 */
setSuitableCommCode: (headCode: string, commCode: CommCode[]) => void
// // 검색 결과 리스트
// searchResults: Suitable[]
// // 초기 데이터 로드
// fetchInitializeData: () => Promise<void>
// // 검색 결과 설정
// setSearchResults: (results: Suitable[]) => void
// // 검색 결과 초기화
// resetSearchResults: () => void
/* 검색 상태 */
isSearch: boolean
/* 검색 상태 설정 */
setIsSearch: (isSearch: boolean) => void
/* 선택된 카테고리 */
selectedCategory: string
/* 선택된 카테고리 설정 */
setSelectedCategory: (category: string) => void
/* 검색 값 */
searchValue: string
/* 검색 값 설정 */
setSearchValue: (value: string) => void
/* 선택된 아이템 리스트 */
selectedItems: number[]
/* 선택된 아이템 추가 */
addSelectedItem: (itemId: number) => void
/* 선택된 아이템 제거 */
// 선택된 아이템 리스트
selectedItems: Suitable[]
// 선택된 아이템 추가
addSelectedItem: (item: Suitable) => void
// 선택된 아이템 제거
removeSelectedItem: (itemId: number) => void
/* 선택된 아이템 모두 제거 */
// 선택된 아이템 모두 제거
clearSelectedItems: () => void
}
export const useSuitableStore = create<SuitableState>((set) => ({
suitableCommCode: new Map() as Map<string, CommCode[]>,
isSearch: false as boolean,
selectedCategory: '' as string,
searchValue: '' as string,
selectedItems: [] as number[],
// // 초기 상태
// searchResults: [],
/* 공통코드 설정 */
setSuitableCommCode: (headCode: string, commCode: CommCode[]) =>
// // 초기 데이터 로드
// fetchInitializeData: async () => {
// const suitables = await fetchInitialSuitablee()
// set({ searchResults: suitables })
// },
// // 검색 결과 설정
// setSearchResults: (results) => set({ searchResults: results }),
// // 검색 결과 초기화
// resetSearchResults: () => set({ searchResults: [] }),
// 초기 상태
selectedItems: [],
// 선택된 아이템 추가 (중복 방지)
addSelectedItem: (item) =>
set((state) => ({
suitableCommCode: new Map(state.suitableCommCode).set(headCode, commCode),
selectedItems: state.selectedItems.some((i) => i.id === item.id) ? state.selectedItems : [...state.selectedItems, item],
})),
/* 검색 상태 설정 */
setIsSearch: (isSearch: boolean) => set({ isSearch }),
/* 선택된 카테고리 설정 */
setSelectedCategory: (category: string) => set({ selectedCategory: category }),
/* 검색 값 설정 */
setSearchValue: (value: string) => set({ searchValue: value }),
/* 선택된 아이템 추가 */
addSelectedItem: (itemId: number) =>
// 선택된 아이템 제거
removeSelectedItem: (itemId) =>
set((state) => ({
selectedItems: state.selectedItems.some((i) => i === itemId) ? state.selectedItems : [...state.selectedItems, itemId],
selectedItems: state.selectedItems.filter((item) => item.id !== itemId),
})),
/* 선택된 아이템 제거 */
removeSelectedItem: (itemId: number) =>
set((state) => ({
selectedItems: state.selectedItems.filter((i) => i !== itemId),
})),
/* 선택된 아이템 모두 제거 */
// 선택된 아이템 모두 제거
clearSelectedItems: () => set({ selectedItems: [] }),
}))
// // 전체 데이터 초기화 함수
// async function fetchInitialSuitablee() {
// try {
// const suitable = await suitableApi.getList()
// return suitable
// } catch (error) {
// console.error('초기 데이터 로드 실패:', error)
// return []
// }
// }

View File

@ -31,14 +31,14 @@
.check-form-box{
position: relative;
label{
padding-left: 28px;
padding-left: 30px;
&::before{
content: "";
display: inline-block;
position: absolute;
width: 20px;
height: 20px;
top: 0px;
width: 22px;
height: 22px;
top: -1px;
left: 0;
margin-left: 0px;
border: 1px solid #A8B6C7;
@ -51,9 +51,9 @@
content: "";
display: inline-block;
position: absolute;
width: 20px;
height: 20px;
top: 0px;
width: 22px;
height: 22px;
top: -1px;
left: 0;
margin-left: 0;
border-color: #fff;
@ -69,7 +69,7 @@
display: inline-block;
position: absolute;
top: -1px;
left: -1px;
left: 0%;
width: 7px;
height: 9px;
border: 2px solid #fff;
@ -89,30 +89,20 @@
input[type="checkbox"]:disabled + label::after{
cursor: default;
}
&.ch-bld{
input[type="checkbox"]:checked + label{
font-weight: 500;
}
}
&.light{
label{
color: #8595A7;
}
}
}
// radio box
.radio-form-box{
position: relative;
label{
padding-left: 28px;
padding-left: 30px;
&::before{
content: "";
display: inline-block;
position: absolute;
width: 20px;
height: 20px;
top: 0px;
width: 22px;
height: 22px;
top: -1px;
left: 0;
margin-left: 0;
border: 1px solid #A8B6C7;
@ -129,7 +119,7 @@
display: inline-block;
position: absolute;
top: 5px;
left: 5px;
left: 6px;
width: 10px;
height: 10px;
background-color: transparent;

View File

@ -36,84 +36,8 @@
}
// 지붕재 적합성 상세
.compliance-check-bx{
&.act{
.compliance-check-pop-contents{
display: block;
}
}
}
.compliance-check-pop-contents{
display: none;
padding: 14px 14px 10px 14px;
padding: 14px;
border-top: 1px solid #ECECEC;
margin-top: 10px;
}
.check-pop-data-wrap{
margin-bottom: 24px;
.check-pop-data-tit{
position: relative;
padding-left: 10px;
margin-bottom: 8px;
@include defaultFont($font-s-13, $font-w-500, $font-c);
&::before{
content: '';
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
width: 4px;
height: 4px;
background-color: #2E3A59;
border-radius: 50%;
}
}
.check-pop-data-txt{
padding-left: 10px;
@include defaultFont($font-s-13, $font-w-400, $font-c);
}
}
.check-pop-data-table{
border-top: 1px solid #2E3A59;
&:last-child{
.pop-data-table-footer{
border-bottom: 1px solid #2E3A59;
}
}
}
.pop-data-table-head{
@include flex(0px);
align-items: center;
padding: 10px;
border-top: 1px solid #2E3A59;
border-bottom: 1px solid #2E3A59;
.pop-data-table-head-name{
@include defaultFont($font-s-13, $font-w-500, $font-c);
}
.pop-data-table-head-icon{
margin-left: auto;
min-width: 44px;
@include flex(0px);
}
}
.pop-data-table-body{
padding: 11px 10px;
border-bottom: 1px solid #2E3A59;
@include defaultFont($font-s-13, $font-w-400, $font-c);
}
.pop-data-table-footer{
@include flex(0px);
.pop-data-table-footer-unit{
flex: 1;
padding: 10px;
@include defaultFont($font-s-13, $font-w-500, $font-c);
border-right: 1px solid #2E3A59;
}
.pop-data-table-footer-data{
flex: none;
width: 104px;
padding: 10px;
@include defaultFont($font-s-13, $font-w-400, $font-c);
}
}

View File

@ -338,34 +338,8 @@
position: relative;
padding-right: 70px;
.inquiry-item-category{
display: flex;
align-items: center;
@include defaultFont($font-s-13, $font-w-400, $font-c);
margin-bottom: 5px;
span{
position: relative;
display: block;
@include defaultFont($font-s-13, $font-w-400, $font-c);
padding: 0 6px;
&:first-child{
padding-left: 0;
}
&:last-child{
padding-right: 0;
&::before{
display: none;
}
}
&::before{
content: '';
position: absolute;
top: 50%;
right: 0;
transform: translateY(-50%);
width: 1px;
height: 10px;
background-color: #A2ABB8;
}
}
}
.inquiry-item-tit{
@include defaultFont($font-s-15, $font-w-500, $font-c);
@ -445,34 +419,8 @@
border-bottom: 1px solid #2E3A59;
margin-bottom: 24px;
.inquiry-detail-category{
display: flex;
align-items: center;
@include defaultFont($font-s-13, $font-w-400, $font-c);
margin-bottom: 3px;
span{
position: relative;
display: block;
@include defaultFont($font-s-13, $font-w-400, $font-c);
padding: 0 6px;
&:first-child{
padding-left: 0;
}
&:last-child{
padding-right: 0;
&::before{
display: none;
}
}
&::before{
content: '';
position: absolute;
top: 50%;
right: 0;
transform: translateY(-50%);
width: 1px;
height: 10px;
background-color: #A2ABB8;
}
}
}
.inquiry-detail-tit{
@include defaultFont($font-s-15, $font-w-500, $font-c);
@ -486,7 +434,6 @@
// 1:1 문의 답변
.inquiry-answer-wrap{
margin-top: 24px;
}
.inquiry-answer-header{
padding: 20px 0;
@ -500,10 +447,6 @@
@include defaultFont($font-s-13, $font-w-400, #F86A56);
}
}
.inquiry-answer-tit{
@include defaultFont($font-s-13, $font-w-400, $font-c);
margin-bottom: 3px;
}
// 비밀번호 변경
.border-frame{
@ -610,7 +553,12 @@
}
}
}
.compliace-nodata{
margin-top: 24px;
padding: 30px 0;
@include defaultFont($font-s-13, $font-w-400, $font-c);
text-align: center;
}
.compliace-nosearch{
padding: 30px 0;
span{
@ -619,14 +567,44 @@
text-align: center;
}
}
.check-form-box{
&.com-tit{
label{
&:before{
width: 20px;
height: 20px;
top: 0;
}
}
input[type="checkbox"]:checked + label{
font-weight: 500;
&::after{
left: -1px;
}
}
}
&.com-txt{
label{
@include defaultFont($font-s-13, $font-w-400, #8595A7);
&:before{
width: 20px;
height: 20px;
top: 0;
}
}
input[type="checkbox"]:checked + label{
&::after{
left: -1px;
}
}
}
}
.check-item-wrap{
display: flex;
align-items: center;
}
.compliance-icon-wrap{
margin-left: auto;
min-width: 44px;
display: flex;
align-items: center;
}

View File

@ -161,9 +161,6 @@ header{
&.icon02{
background-image: url(/assets/images/layout/side_swiper_icon02.svg)
}
&.icon03{
background-image: url(/assets/images/layout/side_swiper_icon03.svg)
}
}
.side-swiper-infor{
@include defaultFont($font-s-12, $font-w-500, #7896BA);

View File

@ -22,6 +22,7 @@
.modal-content{
flex:1;
position: relative;
margin: 0 16px;
background-clip: padding-box;
background-color: $white-fff;
border-radius: 16px;

View File

@ -7,7 +7,6 @@ export interface SessionData {
compCd: null
agencyStoreId: null
storeId: null
storeNm: null
userId: null
category: null
userNm: null
@ -28,5 +27,4 @@ export interface SessionData {
custCd: null
builderNo: null
isLoggedIn: boolean
role: string | null
}

View File

@ -1,5 +0,0 @@
export type CommCode = {
HEAD_CD: string
CODE: string
CODE_JP: string
}

View File

@ -1,40 +0,0 @@
export enum SUITABLE_HEAD_CODE {
/* 지붕재 제조사명 */
MANU_FT_CD = 'MANU_FT_CD',
/* 지붕재 종류 */
ROOF_MT_CD = 'ROOF_MT_CD',
/* 마운팅 브래킷 종류 */
ROOF_SH_CD = 'ROOF_SH_CD',
/* 마운팅 브래킷 제조사명 및 제품코드드 */
TRESTLE_MFPC_CD = 'TRESTLE_MFPC_CD',
}
export type SuitableIncludeDetail = {
ID: number
PRODUCT_NAME: string
MANU_FT_CD: string
ROOF_MT_CD: string
ROOF_SH_CD: string
MS_SUITABLE_DETAIL: SuitableDetail[]
}
export type SuitableData = {
suitable: SuitableMain[]
suitableDetail: SuitableDetail[]
}
export type SuitableMain = {
ID: number
PRODUCT_NAME: string
MANU_FT_CD: string
ROOF_MT_CD: string
ROOF_SH_CD: string
}
export type SuitableDetail = {
ID: number
MAIN_ID: number
TRESTLE_MFPC_CD: string
TRESTLE_MANUFACTURER_PRODUCT_NAME: string
MEMO: string
}