Compare commits
18 Commits
9f4c3de2cf
...
ff644395ec
| Author | SHA1 | Date | |
|---|---|---|---|
| ff644395ec | |||
| 02283c3b71 | |||
| 2217426152 | |||
| 2bfacca06b | |||
| 8034424d15 | |||
| 4ca4a28c7d | |||
| 3212763a1b | |||
| 5c0593b755 | |||
| 70c45bc182 | |||
| 2ba6583ffb | |||
| a4c36474d5 | |||
| c545cbab93 | |||
| a2a2b2e6fa | |||
| 98299ffe92 | |||
| f33786a8eb | |||
| e5affe0df5 | |||
| f8b11c3e7e | |||
| 7973d7c2b1 |
@ -8,3 +8,10 @@ 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
|
||||
@ -6,3 +6,10 @@ 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
|
||||
17
README.md
17
README.md
@ -41,3 +41,20 @@ 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
300
package-lock.json
generated
@ -8,7 +8,7 @@
|
||||
"name": "on-site-survey",
|
||||
"version": "0.1.0",
|
||||
"dependencies": {
|
||||
"@prisma/client": "^6.5.0",
|
||||
"@prisma/client": "^6.7.0",
|
||||
"@tanstack/react-query": "^5.71.0",
|
||||
"@tanstack/react-query-devtools": "^5.71.0",
|
||||
"axios": "^1.8.4",
|
||||
@ -20,6 +20,7 @@
|
||||
"react-to-pdf": "^2.0.0",
|
||||
"sass": "^1.87.0",
|
||||
"swiper": "^11.2.6",
|
||||
"usehooks-ts": "^3.1.1",
|
||||
"zustand": "^5.0.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
@ -27,7 +28,7 @@
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"prisma": "^6.5.0",
|
||||
"prisma": "^6.7.0",
|
||||
"tailwindcss": "^4",
|
||||
"typescript": "^5"
|
||||
}
|
||||
@ -311,9 +312,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/aix-ppc64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
|
||||
"integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
|
||||
"integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@ -328,9 +329,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz",
|
||||
"integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
|
||||
"integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -345,9 +346,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-arm64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz",
|
||||
"integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==",
|
||||
"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==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -362,9 +363,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/android-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
|
||||
"integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -379,9 +380,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-arm64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz",
|
||||
"integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
|
||||
"integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -396,9 +397,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/darwin-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==",
|
||||
"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==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -413,9 +414,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-arm64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz",
|
||||
"integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
|
||||
"integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -430,9 +431,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/freebsd-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
|
||||
"integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -447,9 +448,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz",
|
||||
"integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
|
||||
"integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
|
||||
"cpu": [
|
||||
"arm"
|
||||
],
|
||||
@ -464,9 +465,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-arm64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz",
|
||||
"integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
|
||||
"integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -481,9 +482,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ia32": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz",
|
||||
"integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
|
||||
"integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@ -498,9 +499,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-loong64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz",
|
||||
"integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
|
||||
"integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
|
||||
"cpu": [
|
||||
"loong64"
|
||||
],
|
||||
@ -515,9 +516,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-mips64el": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz",
|
||||
"integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==",
|
||||
"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==",
|
||||
"cpu": [
|
||||
"mips64el"
|
||||
],
|
||||
@ -532,9 +533,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-ppc64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz",
|
||||
"integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
|
||||
"integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
|
||||
"cpu": [
|
||||
"ppc64"
|
||||
],
|
||||
@ -549,9 +550,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-riscv64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz",
|
||||
"integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
|
||||
"integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
|
||||
"cpu": [
|
||||
"riscv64"
|
||||
],
|
||||
@ -566,9 +567,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-s390x": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz",
|
||||
"integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
|
||||
"integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
|
||||
"cpu": [
|
||||
"s390x"
|
||||
],
|
||||
@ -583,9 +584,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/linux-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==",
|
||||
"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==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -600,9 +601,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-arm64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz",
|
||||
"integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
|
||||
"integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -617,9 +618,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/netbsd-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
|
||||
"integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -634,9 +635,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-arm64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz",
|
||||
"integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==",
|
||||
"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==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -651,9 +652,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/openbsd-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
|
||||
"integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -668,9 +669,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/sunos-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
|
||||
"integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -685,9 +686,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-arm64": {
|
||||
"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==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
|
||||
"integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
|
||||
"cpu": [
|
||||
"arm64"
|
||||
],
|
||||
@ -702,9 +703,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-ia32": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz",
|
||||
"integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
|
||||
"integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
|
||||
"cpu": [
|
||||
"ia32"
|
||||
],
|
||||
@ -719,9 +720,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@esbuild/win32-x64": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz",
|
||||
"integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==",
|
||||
"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==",
|
||||
"cpu": [
|
||||
"x64"
|
||||
],
|
||||
@ -1546,9 +1547,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/client": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.5.0.tgz",
|
||||
"integrity": "sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.7.0.tgz",
|
||||
"integrity": "sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==",
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"engines": {
|
||||
@ -1568,9 +1569,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/config": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.5.0.tgz",
|
||||
"integrity": "sha512-sOH/2Go9Zer67DNFLZk6pYOHj+rumSb0VILgltkoxOjYnlLqUpHPAN826vnx8HigqnOCxj9LRhT6U7uLiIIWgw==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.7.0.tgz",
|
||||
"integrity": "sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
@ -1579,53 +1580,53 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/debug": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.5.0.tgz",
|
||||
"integrity": "sha512-fc/nusYBlJMzDmDepdUtH9aBsJrda2JNErP9AzuHbgUEQY0/9zQYZdNlXmKoIWENtio+qarPNe/+DQtrX5kMcQ==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.7.0.tgz",
|
||||
"integrity": "sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@prisma/engines": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.5.0.tgz",
|
||||
"integrity": "sha512-FVPQYHgOllJklN9DUyujXvh3hFJCY0NX86sDmBErLvoZjy2OXGiZ5FNf3J/C4/RZZmCypZBYpBKEhx7b7rEsdw==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.7.0.tgz",
|
||||
"integrity": "sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==",
|
||||
"devOptional": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@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/debug": "6.7.0",
|
||||
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
|
||||
"@prisma/fetch-engine": "6.7.0",
|
||||
"@prisma/get-platform": "6.7.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/engines-version": {
|
||||
"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==",
|
||||
"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==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0"
|
||||
},
|
||||
"node_modules/@prisma/fetch-engine": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.5.0.tgz",
|
||||
"integrity": "sha512-3LhYA+FXP6pqY8FLHCjewyE8pGXXJ7BxZw2rhPq+CZAhvflVzq4K8Qly3OrmOkn6wGlz79nyLQdknyCG2HBTuA==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz",
|
||||
"integrity": "sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/debug": "6.5.0",
|
||||
"@prisma/engines-version": "6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60",
|
||||
"@prisma/get-platform": "6.5.0"
|
||||
"@prisma/debug": "6.7.0",
|
||||
"@prisma/engines-version": "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed",
|
||||
"@prisma/get-platform": "6.7.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@prisma/get-platform": {
|
||||
"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==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.7.0.tgz",
|
||||
"integrity": "sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==",
|
||||
"devOptional": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/debug": "6.5.0"
|
||||
"@prisma/debug": "6.7.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/counter": {
|
||||
@ -2517,9 +2518,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.25.2",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
|
||||
"integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==",
|
||||
"version": "0.25.4",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz",
|
||||
"integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
|
||||
"devOptional": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "MIT",
|
||||
@ -2530,31 +2531,31 @@
|
||||
"node": ">=18"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@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"
|
||||
"@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"
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild-register": {
|
||||
@ -3293,6 +3294,12 @@
|
||||
"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",
|
||||
@ -3592,15 +3599,15 @@
|
||||
}
|
||||
},
|
||||
"node_modules/prisma": {
|
||||
"version": "6.5.0",
|
||||
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.5.0.tgz",
|
||||
"integrity": "sha512-yUGXmWqv5F4PByMSNbYFxke/WbnyTLjnJ5bKr8fLkcnY7U5rU9rUTh/+Fja+gOrRxEgtCbCtca94IeITj4j/pg==",
|
||||
"version": "6.7.0",
|
||||
"resolved": "https://registry.npmjs.org/prisma/-/prisma-6.7.0.tgz",
|
||||
"integrity": "sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==",
|
||||
"devOptional": true,
|
||||
"hasInstallScript": true,
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"@prisma/config": "6.5.0",
|
||||
"@prisma/engines": "6.5.0"
|
||||
"@prisma/config": "6.7.0",
|
||||
"@prisma/engines": "6.7.0"
|
||||
},
|
||||
"bin": {
|
||||
"prisma": "build/index.js"
|
||||
@ -4068,6 +4075,21 @@
|
||||
"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",
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
"lint": "next lint"
|
||||
},
|
||||
"dependencies": {
|
||||
"@prisma/client": "^6.5.0",
|
||||
"@prisma/client": "^6.7.0",
|
||||
"@tanstack/react-query": "^5.71.0",
|
||||
"@tanstack/react-query-devtools": "^5.71.0",
|
||||
"axios": "^1.8.4",
|
||||
@ -21,6 +21,7 @@
|
||||
"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 +29,7 @@
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"prisma": "^6.5.0",
|
||||
"prisma": "^6.7.0",
|
||||
"tailwindcss": "^4",
|
||||
"typescript": "^5"
|
||||
}
|
||||
|
||||
97
pnpm-lock.yaml
generated
97
pnpm-lock.yaml
generated
@ -9,8 +9,8 @@ importers:
|
||||
.:
|
||||
dependencies:
|
||||
'@prisma/client':
|
||||
specifier: ^6.5.0
|
||||
version: 6.5.0(prisma@6.5.0(typescript@5.8.2))(typescript@5.8.2)
|
||||
specifier: ^6.7.0
|
||||
version: 6.7.0(prisma@6.7.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,6 +44,9 @@ 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)
|
||||
@ -61,8 +64,8 @@ importers:
|
||||
specifier: ^19
|
||||
version: 19.0.4(@types/react@19.0.12)
|
||||
prisma:
|
||||
specifier: ^6.5.0
|
||||
version: 6.5.0(typescript@5.8.2)
|
||||
specifier: ^6.7.0
|
||||
version: 6.7.0(typescript@5.8.2)
|
||||
tailwindcss:
|
||||
specifier: ^4
|
||||
version: 4.0.17
|
||||
@ -538,8 +541,8 @@ packages:
|
||||
resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
|
||||
'@prisma/client@6.5.0':
|
||||
resolution: {integrity: sha512-M6w1Ql/BeiGoZmhMdAZUXHu5sz5HubyVcKukbLs3l0ELcQb8hTUJxtGEChhv4SVJ0QJlwtLnwOLgIRQhpsm9dw==}
|
||||
'@prisma/client@6.7.0':
|
||||
resolution: {integrity: sha512-+k61zZn1XHjbZul8q6TdQLpuI/cvyfil87zqK2zpreNIXyXtpUv3+H/oM69hcsFcZXaokHJIzPAt5Z8C8eK2QA==}
|
||||
engines: {node: '>=18.18'}
|
||||
peerDependencies:
|
||||
prisma: '*'
|
||||
@ -550,23 +553,23 @@ packages:
|
||||
typescript:
|
||||
optional: true
|
||||
|
||||
'@prisma/config@6.5.0':
|
||||
resolution: {integrity: sha512-sOH/2Go9Zer67DNFLZk6pYOHj+rumSb0VILgltkoxOjYnlLqUpHPAN826vnx8HigqnOCxj9LRhT6U7uLiIIWgw==}
|
||||
'@prisma/config@6.7.0':
|
||||
resolution: {integrity: sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==}
|
||||
|
||||
'@prisma/debug@6.5.0':
|
||||
resolution: {integrity: sha512-fc/nusYBlJMzDmDepdUtH9aBsJrda2JNErP9AzuHbgUEQY0/9zQYZdNlXmKoIWENtio+qarPNe/+DQtrX5kMcQ==}
|
||||
'@prisma/debug@6.7.0':
|
||||
resolution: {integrity: sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==}
|
||||
|
||||
'@prisma/engines-version@6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60':
|
||||
resolution: {integrity: sha512-iK3EmiVGFDCmXjSpdsKGNqy9hOdLnvYBrJB61far/oP03hlIxrb04OWmDjNTwtmZ3UZdA5MCvI+f+3k2jPTflQ==}
|
||||
'@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed':
|
||||
resolution: {integrity: sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==}
|
||||
|
||||
'@prisma/engines@6.5.0':
|
||||
resolution: {integrity: sha512-FVPQYHgOllJklN9DUyujXvh3hFJCY0NX86sDmBErLvoZjy2OXGiZ5FNf3J/C4/RZZmCypZBYpBKEhx7b7rEsdw==}
|
||||
'@prisma/engines@6.7.0':
|
||||
resolution: {integrity: sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==}
|
||||
|
||||
'@prisma/fetch-engine@6.5.0':
|
||||
resolution: {integrity: sha512-3LhYA+FXP6pqY8FLHCjewyE8pGXXJ7BxZw2rhPq+CZAhvflVzq4K8Qly3OrmOkn6wGlz79nyLQdknyCG2HBTuA==}
|
||||
'@prisma/fetch-engine@6.7.0':
|
||||
resolution: {integrity: sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==}
|
||||
|
||||
'@prisma/get-platform@6.5.0':
|
||||
resolution: {integrity: sha512-xYcvyJwNMg2eDptBYFqFLUCfgi+wZLcj6HDMsj0Qw0irvauG4IKmkbywnqwok0B+k+W+p+jThM2DKTSmoPCkzw==}
|
||||
'@prisma/get-platform@6.7.0':
|
||||
resolution: {integrity: sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==}
|
||||
|
||||
'@swc/counter@0.1.3':
|
||||
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
|
||||
@ -1082,6 +1085,9 @@ 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==}
|
||||
|
||||
@ -1181,8 +1187,8 @@ packages:
|
||||
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
|
||||
engines: {node: ^10 || ^12 || >=14}
|
||||
|
||||
prisma@6.5.0:
|
||||
resolution: {integrity: sha512-yUGXmWqv5F4PByMSNbYFxke/WbnyTLjnJ5bKr8fLkcnY7U5rU9rUTh/+Fja+gOrRxEgtCbCtca94IeITj4j/pg==}
|
||||
prisma@6.7.0:
|
||||
resolution: {integrity: sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==}
|
||||
engines: {node: '>=18.18'}
|
||||
hasBin: true
|
||||
peerDependencies:
|
||||
@ -1349,6 +1355,12 @@ 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==}
|
||||
|
||||
@ -1754,38 +1766,38 @@ snapshots:
|
||||
'@parcel/watcher-win32-x64': 2.5.1
|
||||
optional: true
|
||||
|
||||
'@prisma/client@6.5.0(prisma@6.5.0(typescript@5.8.2))(typescript@5.8.2)':
|
||||
'@prisma/client@6.7.0(prisma@6.7.0(typescript@5.8.2))(typescript@5.8.2)':
|
||||
optionalDependencies:
|
||||
prisma: 6.5.0(typescript@5.8.2)
|
||||
prisma: 6.7.0(typescript@5.8.2)
|
||||
typescript: 5.8.2
|
||||
|
||||
'@prisma/config@6.5.0':
|
||||
'@prisma/config@6.7.0':
|
||||
dependencies:
|
||||
esbuild: 0.25.2
|
||||
esbuild-register: 3.6.0(esbuild@0.25.2)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@prisma/debug@6.5.0': {}
|
||||
'@prisma/debug@6.7.0': {}
|
||||
|
||||
'@prisma/engines-version@6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60': {}
|
||||
'@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed': {}
|
||||
|
||||
'@prisma/engines@6.5.0':
|
||||
'@prisma/engines@6.7.0':
|
||||
dependencies:
|
||||
'@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/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/fetch-engine@6.5.0':
|
||||
'@prisma/fetch-engine@6.7.0':
|
||||
dependencies:
|
||||
'@prisma/debug': 6.5.0
|
||||
'@prisma/engines-version': 6.5.0-73.173f8d54f8d52e692c7e27e72a88314ec7aeff60
|
||||
'@prisma/get-platform': 6.5.0
|
||||
'@prisma/debug': 6.7.0
|
||||
'@prisma/engines-version': 6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed
|
||||
'@prisma/get-platform': 6.7.0
|
||||
|
||||
'@prisma/get-platform@6.5.0':
|
||||
'@prisma/get-platform@6.7.0':
|
||||
dependencies:
|
||||
'@prisma/debug': 6.5.0
|
||||
'@prisma/debug': 6.7.0
|
||||
|
||||
'@swc/counter@0.1.3': {}
|
||||
|
||||
@ -2312,6 +2324,8 @@ 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: {}
|
||||
@ -2413,10 +2427,10 @@ snapshots:
|
||||
picocolors: 1.1.1
|
||||
source-map-js: 1.2.1
|
||||
|
||||
prisma@6.5.0(typescript@5.8.2):
|
||||
prisma@6.7.0(typescript@5.8.2):
|
||||
dependencies:
|
||||
'@prisma/config': 6.5.0
|
||||
'@prisma/engines': 6.5.0
|
||||
'@prisma/config': 6.7.0
|
||||
'@prisma/engines': 6.7.0
|
||||
optionalDependencies:
|
||||
fsevents: 2.3.3
|
||||
typescript: 5.8.2
|
||||
@ -2581,6 +2595,11 @@ 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
|
||||
|
||||
@ -57,65 +57,65 @@ model MS_SUITABLE {
|
||||
updated_at DateTime @updatedAt
|
||||
}
|
||||
|
||||
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_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_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 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 BC_COMM_H {
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
<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 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>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 3.4 KiB |
5
public/assets/images/layout/side_swiper_icon03.svg
Normal file
5
public/assets/images/layout/side_swiper_icon03.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<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>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
22
src/app/api/auth/chg-pwd/route.ts
Normal file
22
src/app/api/auth/chg-pwd/route.ts
Normal file
@ -0,0 +1,22 @@
|
||||
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 })
|
||||
}
|
||||
@ -29,6 +29,7 @@ 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
|
||||
@ -49,6 +50,21 @@ 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()
|
||||
|
||||
44
src/app/api/comm-code/route.ts
Normal file
44
src/app/api/comm-code/route.ts
Normal file
@ -0,0 +1,44 @@
|
||||
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 })
|
||||
}
|
||||
}
|
||||
@ -1,16 +0,0 @@
|
||||
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)
|
||||
}
|
||||
@ -1,17 +0,0 @@
|
||||
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)
|
||||
}
|
||||
@ -1,5 +1,6 @@
|
||||
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 {
|
||||
@ -9,24 +10,59 @@ export async function GET(request: NextRequest) {
|
||||
|
||||
let whereCondition: any = {}
|
||||
if (category) {
|
||||
whereCondition['roof_material'] = category
|
||||
whereCondition[SUITABLE_HEAD_CODE.ROOF_MT_CD] = 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 suitables = await prisma.MS_SUITABLE.findMany({
|
||||
const suitable = await prisma.MS_SUITABLE_MAIN.findMany({
|
||||
select: {
|
||||
ID: true,
|
||||
PRODUCT_NAME: true,
|
||||
ROOF_MT_CD: true,
|
||||
},
|
||||
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(suitables)
|
||||
return NextResponse.json({ suitable, suitableDetail })
|
||||
} catch (error) {
|
||||
console.error('❌ 데이터 조회 중 오류가 발생했습니다:', error)
|
||||
return NextResponse.json({ error: '데이터 조회 중 오류가 발생했습니다' }, { status: 500 })
|
||||
|
||||
@ -3,7 +3,10 @@
|
||||
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'
|
||||
|
||||
@ -24,6 +27,7 @@ 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, {
|
||||
@ -48,7 +52,6 @@ export default function Login() {
|
||||
loginId: account.loginId,
|
||||
pwd: account.pwd,
|
||||
})
|
||||
// router.push('/')
|
||||
|
||||
return data
|
||||
},
|
||||
@ -60,6 +63,11 @@ export default function Login() {
|
||||
useEffect(() => {
|
||||
setIsLogin(false)
|
||||
if (loginData?.code === 200) {
|
||||
// 유저 정보 저장
|
||||
setValue({
|
||||
indivisualData: account.pwd,
|
||||
})
|
||||
// 세션 정보 저장
|
||||
setSession({
|
||||
...session,
|
||||
...loginData?.result,
|
||||
|
||||
@ -1,9 +1,18 @@
|
||||
'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">
|
||||
@ -24,30 +33,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={'Hong gi'} disabled />
|
||||
<input type="text" className="input-frame" defaultValue={session.userNm ?? ''} disabled />
|
||||
</div>
|
||||
<div className="data-input-form-bx">
|
||||
<div className="data-input-form-tit">ユーザーID </div>
|
||||
<input type="text" className="input-frame" defaultValue={'KG123'} disabled />
|
||||
<input type="text" className="input-frame" defaultValue={session.userId ?? ''} disabled />
|
||||
</div>
|
||||
<div className="data-input-form-bx">
|
||||
<div className="data-input-form-tit">メールアドレス</div>
|
||||
<input type="text" className="input-frame" defaultValue={'Kim@interplug.co.kr'} disabled />
|
||||
<input type="text" className="input-frame" defaultValue={session.email ?? ''} disabled />
|
||||
</div>
|
||||
<div className="data-input-form-bx">
|
||||
<div className="data-input-form-tit">電話番号</div>
|
||||
<input type="text" className="input-frame" defaultValue={'02123456'} disabled />
|
||||
<input type="text" className="input-frame" defaultValue={session.telNo ?? ''} disabled />
|
||||
</div>
|
||||
<div className="data-input-form-bx">
|
||||
<div className="data-input-form-tit">販売店名</div>
|
||||
<input type="text" className="input-frame" defaultValue={'Interplug'} disabled />
|
||||
<input type="text" className="input-frame" defaultValue={session.storeNm ?? ''} disabled />
|
||||
</div>
|
||||
<div className="data-input-form-bx">
|
||||
<div className="data-input-form-tit">建設ID</div>
|
||||
<input type="text" className="input-frame" defaultValue={'Interplug2'} disabled />
|
||||
<input type="text" className="input-frame" defaultValue={session.builderNo ?? ''} disabled />
|
||||
</div>
|
||||
</div>
|
||||
<button className="btn-frame n-blue icon">
|
||||
<button className="btn-frame n-blue icon" onClick={handlePwReset}>
|
||||
パスワードリセット<i className="btn-arr"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -3,11 +3,50 @@
|
||||
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(false) //비밀번호 확인 보이기 숨기기
|
||||
const [pwShow02, setPwShow02] = useState(false) //비밀번호 재확인 보이기 숨기기
|
||||
const [pwShow01, setPwShow01] = useState<boolean>(false) //비밀번호 확인 보이기 숨기기
|
||||
const [pwShow02, setPwShow02] = useState<boolean>(false) //비밀번호 재확인 보이기 숨기기
|
||||
|
||||
const [pwd01, setPwd01] = useState<string>('')
|
||||
const [pwd02, setPwd02] = useState<string>('')
|
||||
|
||||
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">
|
||||
@ -18,7 +57,12 @@ export default function PwResetForm() {
|
||||
</div>
|
||||
<div className="data-input">
|
||||
<div className="login-input pw change">
|
||||
<input type={`${pwShow01 ? 'text' : 'password'}`} className="login-frame" placeholder="●●●●" />
|
||||
<input
|
||||
type={`${pwShow01 ? 'text' : 'password'}`}
|
||||
className="login-frame"
|
||||
placeholder="●●●●"
|
||||
onChange={(e) => setPwd01(e.target.value)}
|
||||
/>
|
||||
<button className={`login-icon ${pwShow01 ? 'act' : ''}`} onClick={() => setPwShow01(!pwShow01)}>
|
||||
<i className="show-icon"></i>
|
||||
</button>
|
||||
@ -32,7 +76,12 @@ export default function PwResetForm() {
|
||||
</div>
|
||||
<div className="data-input">
|
||||
<div className="login-input pw change">
|
||||
<input type={`${pwShow02 ? 'text' : 'password'}`} className="login-frame" placeholder="●●●●" />
|
||||
<input
|
||||
type={`${pwShow02 ? 'text' : 'password'}`}
|
||||
className="login-frame"
|
||||
placeholder="●●●●"
|
||||
onChange={(e) => setPwd02(e.target.value)}
|
||||
/>
|
||||
<button className={`login-icon ${pwShow02 ? 'act' : ''}`} onClick={() => setPwShow02(!pwShow02)}>
|
||||
<i className="show-icon"></i>
|
||||
</button>
|
||||
@ -48,7 +97,7 @@ export default function PwResetForm() {
|
||||
</button>
|
||||
</div>
|
||||
<div className="btn-bx">
|
||||
<button className="btn-frame red icon">
|
||||
<button className="btn-frame red icon" onClick={handleReset}>
|
||||
リセットする<i className="btn-arr"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@ -1,27 +1,69 @@
|
||||
'use client'
|
||||
|
||||
import { useState } from 'react'
|
||||
import SuitableCheckData from './SuitableCheckData'
|
||||
import SuitableNoData from './SuitableNoData'
|
||||
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'
|
||||
|
||||
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="">
|
||||
<option value="">屋根材を選択してください.</option>
|
||||
<option value="">屋根材を選択してください.</option>
|
||||
<option value="">屋根材を選択してください.</option>
|
||||
<option value="">屋根材を選択してください.</option>
|
||||
<select className="select-form" name="" id="" value={selectedCategory || ''} onChange={(e) => setSelectedCategory(e.target.value)}>
|
||||
<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="屋根材 製品名を入力してください." />
|
||||
<button className="search-icon"></button>
|
||||
<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} />
|
||||
</div>
|
||||
</div>
|
||||
<div className="compliance-check-wrap">
|
||||
@ -55,33 +97,8 @@ export default function Suitable() {
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
{/* checkData */}
|
||||
{/* 데이터 없을경우 버튼 영역 안보여야함 */}
|
||||
<SuitableCheckData />
|
||||
<SuitableCheckData />
|
||||
<SuitableCheckData />
|
||||
<SuitableCheckData />
|
||||
<SuitableList />
|
||||
</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>
|
||||
)
|
||||
}
|
||||
|
||||
@ -1,68 +0,0 @@
|
||||
'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">アースティ40</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>
|
||||
</>
|
||||
)
|
||||
}
|
||||
76
src/components/suitable/SuitableList.tsx
Normal file
76
src/components/suitable/SuitableList.tsx
Normal file
@ -0,0 +1,76 @@
|
||||
'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 />
|
||||
)}
|
||||
</>
|
||||
)
|
||||
}
|
||||
@ -3,22 +3,25 @@
|
||||
import Link from 'next/link'
|
||||
import { usePathname, useRouter } from 'next/navigation'
|
||||
|
||||
import { Swiper, SwiperSlide } from 'swiper/react'
|
||||
import { useLocalStorage } from 'usehooks-ts'
|
||||
import { useQueryClient } from '@tanstack/react-query'
|
||||
import { Swiper, SwiperSlide } from 'swiper/react'
|
||||
|
||||
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()
|
||||
@ -26,12 +29,15 @@ 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()
|
||||
@ -39,22 +45,6 @@ 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">
|
||||
@ -62,7 +52,7 @@ export default function Header() {
|
||||
<div className="header-inner">
|
||||
{backBtn && (
|
||||
<div className="back-button-wrap">
|
||||
<button className="back-button" onClick={handleCofirm}></button>
|
||||
<button className="back-button" onClick={() => router.back()}></button>
|
||||
</div>
|
||||
)}
|
||||
<h2 className="logo">
|
||||
@ -137,7 +127,7 @@ export default function Header() {
|
||||
</button>
|
||||
</li>
|
||||
<li className="side-footer-item">
|
||||
<button>Jynoadmin</button>
|
||||
<button onClick={() => popupController.setMemberInfomationPopup(true)}>MY ADMIN</button>
|
||||
</li>
|
||||
<li className="side-footer-item">
|
||||
<button onClick={() => router.push('/')}>HOME</button>
|
||||
|
||||
18
src/hooks/useCommCode.ts
Normal file
18
src/hooks/useCommCode.ts
Normal file
@ -0,0 +1,18 @@
|
||||
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,
|
||||
}
|
||||
}
|
||||
@ -1,30 +1,95 @@
|
||||
import { suitableApi } from '@/api/suitable'
|
||||
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'
|
||||
|
||||
export function useSuitable() {
|
||||
const getCategories = async () => {
|
||||
try {
|
||||
return await suitableApi.getCategory()
|
||||
} catch (error) {
|
||||
console.error('카테고리 데이터 로드 실패:', error)
|
||||
return []
|
||||
}
|
||||
}
|
||||
const { getCommCode } = useCommCode()
|
||||
const { selectedCategory, searchValue, suitableCommCode, setSuitableCommCode, isSearch } = useSuitableStore()
|
||||
|
||||
const getSuitables = async () => {
|
||||
const getSuitables = async (): Promise<SuitableData> => {
|
||||
try {
|
||||
return await suitableApi.getList()
|
||||
const response = await axiosInstance(null).get<SuitableData>('/api/suitable/list')
|
||||
return response.data
|
||||
} catch (error) {
|
||||
console.error('지붕재 데이터 로드 실패:', error)
|
||||
return {
|
||||
suitable: [],
|
||||
suitableDetail: [],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const updateSearchResults = async (selectedCategory: string | undefined, searchValue: string | undefined) => {
|
||||
try {
|
||||
return await suitableApi.getList(selectedCategory, searchValue)
|
||||
} catch (error) {
|
||||
console.error('지붕재 데이터 검색 실패:', error)
|
||||
// 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)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return { getCategories, getSuitables, updateSearchResults }
|
||||
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,
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,14 +1,16 @@
|
||||
'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
|
||||
}
|
||||
}
|
||||
@ -55,6 +57,10 @@ 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
|
||||
|
||||
@ -21,6 +21,7 @@ const initialState: InitialState = {
|
||||
compCd: null,
|
||||
agencyStoreId: null,
|
||||
storeId: null,
|
||||
storeNm: null,
|
||||
userId: null,
|
||||
category: null,
|
||||
userNm: null,
|
||||
@ -41,6 +42,7 @@ const initialState: InitialState = {
|
||||
custCd: null,
|
||||
builderNo: null,
|
||||
isLoggedIn: false,
|
||||
role: null,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@ -1,68 +1,71 @@
|
||||
import { create } from 'zustand'
|
||||
import { Suitable, suitableApi } from '@/api/suitable'
|
||||
import type { CommCode } from '@/types/CommCode'
|
||||
|
||||
interface SuitableState {
|
||||
// // 검색 결과 리스트
|
||||
// searchResults: Suitable[]
|
||||
// // 초기 데이터 로드
|
||||
// fetchInitializeData: () => Promise<void>
|
||||
// // 검색 결과 설정
|
||||
// setSearchResults: (results: Suitable[]) => void
|
||||
// // 검색 결과 초기화
|
||||
// resetSearchResults: () => void
|
||||
/* 공통코드 */
|
||||
suitableCommCode: Map<string, CommCode[]>
|
||||
/* 공통코드 설정 */
|
||||
setSuitableCommCode: (headCode: string, commCode: CommCode[]) => void
|
||||
|
||||
// 선택된 아이템 리스트
|
||||
selectedItems: Suitable[]
|
||||
// 선택된 아이템 추가
|
||||
addSelectedItem: (item: Suitable) => 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
|
||||
/* 선택된 아이템 제거 */
|
||||
removeSelectedItem: (itemId: number) => void
|
||||
// 선택된 아이템 모두 제거
|
||||
/* 선택된 아이템 모두 제거 */
|
||||
clearSelectedItems: () => void
|
||||
}
|
||||
|
||||
export const useSuitableStore = create<SuitableState>((set) => ({
|
||||
// // 초기 상태
|
||||
// searchResults: [],
|
||||
suitableCommCode: new Map() as Map<string, CommCode[]>,
|
||||
isSearch: false as boolean,
|
||||
selectedCategory: '' as string,
|
||||
searchValue: '' as string,
|
||||
selectedItems: [] as number[],
|
||||
|
||||
// // 초기 데이터 로드
|
||||
// fetchInitializeData: async () => {
|
||||
// const suitables = await fetchInitialSuitablee()
|
||||
// set({ searchResults: suitables })
|
||||
// },
|
||||
|
||||
// // 검색 결과 설정
|
||||
// setSearchResults: (results) => set({ searchResults: results }),
|
||||
|
||||
// // 검색 결과 초기화
|
||||
// resetSearchResults: () => set({ searchResults: [] }),
|
||||
|
||||
// 초기 상태
|
||||
selectedItems: [],
|
||||
|
||||
// 선택된 아이템 추가 (중복 방지)
|
||||
addSelectedItem: (item) =>
|
||||
/* 공통코드 설정 */
|
||||
setSuitableCommCode: (headCode: string, commCode: CommCode[]) =>
|
||||
set((state) => ({
|
||||
selectedItems: state.selectedItems.some((i) => i.id === item.id) ? state.selectedItems : [...state.selectedItems, item],
|
||||
suitableCommCode: new Map(state.suitableCommCode).set(headCode, commCode),
|
||||
})),
|
||||
|
||||
// 선택된 아이템 제거
|
||||
removeSelectedItem: (itemId) =>
|
||||
/* 검색 상태 설정 */
|
||||
setIsSearch: (isSearch: boolean) => set({ isSearch }),
|
||||
|
||||
/* 선택된 카테고리 설정 */
|
||||
setSelectedCategory: (category: string) => set({ selectedCategory: category }),
|
||||
|
||||
/* 검색 값 설정 */
|
||||
setSearchValue: (value: string) => set({ searchValue: value }),
|
||||
|
||||
/* 선택된 아이템 추가 */
|
||||
addSelectedItem: (itemId: number) =>
|
||||
set((state) => ({
|
||||
selectedItems: state.selectedItems.filter((item) => item.id !== itemId),
|
||||
selectedItems: state.selectedItems.some((i) => i === itemId) ? state.selectedItems : [...state.selectedItems, 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 []
|
||||
// }
|
||||
// }
|
||||
|
||||
@ -31,14 +31,14 @@
|
||||
.check-form-box{
|
||||
position: relative;
|
||||
label{
|
||||
padding-left: 30px;
|
||||
padding-left: 28px;
|
||||
&::before{
|
||||
content: "";
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
top: -1px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
top: 0px;
|
||||
left: 0;
|
||||
margin-left: 0px;
|
||||
border: 1px solid #A8B6C7;
|
||||
@ -51,9 +51,9 @@
|
||||
content: "";
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
top: -1px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
top: 0px;
|
||||
left: 0;
|
||||
margin-left: 0;
|
||||
border-color: #fff;
|
||||
@ -69,7 +69,7 @@
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
left: 0%;
|
||||
left: -1px;
|
||||
width: 7px;
|
||||
height: 9px;
|
||||
border: 2px solid #fff;
|
||||
@ -89,20 +89,30 @@
|
||||
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: 30px;
|
||||
padding-left: 28px;
|
||||
&::before{
|
||||
content: "";
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
top: -1px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
top: 0px;
|
||||
left: 0;
|
||||
margin-left: 0;
|
||||
border: 1px solid #A8B6C7;
|
||||
@ -119,7 +129,7 @@
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
left: 6px;
|
||||
left: 5px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
background-color: transparent;
|
||||
|
||||
@ -36,8 +36,84 @@
|
||||
}
|
||||
|
||||
// 지붕재 적합성 상세
|
||||
.compliance-check-bx{
|
||||
&.act{
|
||||
.compliance-check-pop-contents{
|
||||
padding: 14px;
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
}
|
||||
.compliance-check-pop-contents{
|
||||
display: none;
|
||||
padding: 14px 14px 10px 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);
|
||||
}
|
||||
}
|
||||
@ -338,8 +338,34 @@
|
||||
position: relative;
|
||||
padding-right: 70px;
|
||||
.inquiry-item-category{
|
||||
@include defaultFont($font-s-13, $font-w-400, $font-c);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
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);
|
||||
@ -419,8 +445,34 @@
|
||||
border-bottom: 1px solid #2E3A59;
|
||||
margin-bottom: 24px;
|
||||
.inquiry-detail-category{
|
||||
@include defaultFont($font-s-13, $font-w-400, $font-c);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
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);
|
||||
@ -434,6 +486,7 @@
|
||||
// 1:1 문의 답변
|
||||
.inquiry-answer-wrap{
|
||||
margin-top: 24px;
|
||||
|
||||
}
|
||||
.inquiry-answer-header{
|
||||
padding: 20px 0;
|
||||
@ -447,6 +500,10 @@
|
||||
@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{
|
||||
@ -553,12 +610,7 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
.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{
|
||||
@ -567,44 +619,14 @@
|
||||
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;
|
||||
}
|
||||
|
||||
@ -161,6 +161,9 @@ 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);
|
||||
|
||||
@ -22,7 +22,6 @@
|
||||
.modal-content{
|
||||
flex:1;
|
||||
position: relative;
|
||||
margin: 0 16px;
|
||||
background-clip: padding-box;
|
||||
background-color: $white-fff;
|
||||
border-radius: 16px;
|
||||
|
||||
@ -7,6 +7,7 @@ export interface SessionData {
|
||||
compCd: null
|
||||
agencyStoreId: null
|
||||
storeId: null
|
||||
storeNm: null
|
||||
userId: null
|
||||
category: null
|
||||
userNm: null
|
||||
@ -27,4 +28,5 @@ export interface SessionData {
|
||||
custCd: null
|
||||
builderNo: null
|
||||
isLoggedIn: boolean
|
||||
role: string | null
|
||||
}
|
||||
|
||||
5
src/types/CommCode.ts
Normal file
5
src/types/CommCode.ts
Normal file
@ -0,0 +1,5 @@
|
||||
export type CommCode = {
|
||||
HEAD_CD: string
|
||||
CODE: string
|
||||
CODE_JP: string
|
||||
}
|
||||
40
src/types/Suitable.ts
Normal file
40
src/types/Suitable.ts
Normal file
@ -0,0 +1,40 @@
|
||||
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
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user