From 4467c043212c5385faad610f90f082c96c27ee32 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 8 May 2025 17:55:10 +0900 Subject: [PATCH 1/7] style: update SCSS styles for various components, adding responsive design adjustments and new styles for compliance checks --- src/styles/base/_inputs.scss | 13 +- src/styles/components/_login.scss | 6 + src/styles/components/_main.scss | 8 + src/styles/components/_pop-contents.scss | 7 + src/styles/components/_sub.scss | 203 +++++++++++++++++++++++ src/styles/publishpage.scss | 1 + 6 files changed, 235 insertions(+), 3 deletions(-) diff --git a/src/styles/base/_inputs.scss b/src/styles/base/_inputs.scss index 7bc0784..b6bddc8 100644 --- a/src/styles/base/_inputs.scss +++ b/src/styles/base/_inputs.scss @@ -82,13 +82,13 @@ input::-webkit-inner-spin-button { width: 100%; padding: 0 10px; height: 40px; - font-size: $font-s-13; - color: $font-c; - font-weight: $font-w-400; background-color: $white-fff; border: 1px solid #D5DEE8; border-radius: 4px; input{ + font-size: $font-s-13; + color: $font-c; + font-weight: $font-w-400; width: 100%; height: 100%; background-color: transparent; @@ -194,4 +194,11 @@ input::-webkit-inner-spin-button { } } } + &.change{ + height: 40px; + padding-left: 10px; + &::before{ + display: none; + } + } } diff --git a/src/styles/components/_login.scss b/src/styles/components/_login.scss index 7aae640..c577177 100644 --- a/src/styles/components/_login.scss +++ b/src/styles/components/_login.scss @@ -16,4 +16,10 @@ margin-top: 24px; } } +} + +@media screen and (max-width: 360px){ + .login-contents{ + padding: 70px 34px 0; + } } \ No newline at end of file diff --git a/src/styles/components/_main.scss b/src/styles/components/_main.scss index 0c1f3b5..eb35446 100644 --- a/src/styles/components/_main.scss +++ b/src/styles/components/_main.scss @@ -88,4 +88,12 @@ } } } +} + +@media screen and (max-width: 360px){ + .main-grid-wrap{ + .main-grid-bx{ + padding: 40px 20px 20px; + } + } } \ No newline at end of file diff --git a/src/styles/components/_pop-contents.scss b/src/styles/components/_pop-contents.scss index 88180a2..3eb796b 100644 --- a/src/styles/components/_pop-contents.scss +++ b/src/styles/components/_pop-contents.scss @@ -33,4 +33,11 @@ .btn-flex-wrap{ margin-top: 20px; } +} + +// 지붕재 적합성 상세 +.compliance-check-pop-contents{ + padding: 14px; + border-top: 1px solid #ECECEC; + margin-top: 10px; } \ No newline at end of file diff --git a/src/styles/components/_sub.scss b/src/styles/components/_sub.scss index c1f05f8..9f52715 100644 --- a/src/styles/components/_sub.scss +++ b/src/styles/components/_sub.scss @@ -17,6 +17,10 @@ @include defaultFont($font-s-13, $font-w-400, #A8B6C7); } } + .data-input-guide{ + margin-top: 8px; + @include defaultFont($font-s-13, $font-w-400, #A8B6C7); + } } .btn-flex-wrap{ @@ -25,6 +29,14 @@ .btn-bx{ flex: 1; } + &.com{ + .btn-bx{ + flex: 1 1 auto; + button{ + font-size: 12px; + } + } + } } // 매물 common @@ -177,6 +189,13 @@ padding-left: 6px; } } + &.nodata{ + .sale-item-nodata{ + padding: 5px 0; + text-align: center; + @include defaultFont($font-s-15, $font-w-500, $font-c); + } + } } .sale-edit-btn{ margin-top: 24px; @@ -335,6 +354,14 @@ top: 0; right: 0; } + &.nodata{ + padding-right: 0; + .inquiry-item-nodata{ + padding: 10px 0; + text-align: center; + @include defaultFont($font-s-15, $font-w-500, $font-c); + } + } } } } @@ -360,9 +387,12 @@ @include flex(0px); align-items: center; .file-item-name{ + @include ellipsis(1); @include defaultFont($font-s-13, $font-w-400, $font-c); + padding-right: 10px; } .file-del{ + flex: none; display: block; margin-left: auto; width: 16px; @@ -416,4 +446,177 @@ .inquiry-answer-date{ @include defaultFont($font-s-13, $font-w-400, #F86A56); } +} + +// 비밀번호 변경 +.border-frame{ + padding: 20px; + border-top: 1px solid #ECECEC; + border-bottom: 1px solid #ECECEC; + background-color: #fff; + margin-bottom: 10px; + &:last-child{ + border-bottom: none; + padding-bottom: 0; + margin-bottom: 0; + } +} +.pw-guide{ + .pw-guide-tit{ + @include defaultFont($font-s-16, $font-w-500, #1259CB); + } + .pw-guide-txt{ + @include defaultFont($font-s-13, $font-w-400, #417DDC); + } +} + +// 지붕재 적합성 +.compliance-icon{ + display: block; + width: 22px; + height: 22px; + background-size: cover; + background-repeat: no-repeat; + background-position: center; + &.check{ + background-image: url(/assets/images/sub/compliance_check_icon.svg); + } + &.x{ + background-image: url(/assets/images/sub/compliance_x_icon.svg); + } + &.quest{ + background-image: url(/assets/images/sub/compliance_quest_icon.svg); + } + &.tip{ + background-image: url(/assets/images/sub/compliance_tip_icon.svg); + } +} +.compliance-check-wrap{ + padding-top: 10px; +} +.compliance-check-bx{ + position: relative; + padding: 14px 18px; + border: 1px solid #EFEFEF; + border-radius: 4px; + margin-bottom: 10px; + &:last-child{ + margin-bottom: 0; + } + &.act{ + .bx-btn{ + transform: rotate(0) !important; + } + .reference-list{ + display: block + } + } +} +.check-name-wrap{ + @include flex(0px); + align-items: center; + .check-name{ + @include defaultFont($font-s-13, $font-w-500, $font-c); + } + .check-name-btn{ + margin-left: auto; + .bx-btn{ + display: block; + width: 22px; + height: 22px; + background: url(/assets/images/sub/compliance_bx_icon.svg)no-repeat center; + transform: rotate(180deg); + } + } +} +.reference-list{ + display: none; + margin-top: 10px; + padding-top: 14px; + border-top: 1px solid #ECECEC; + transition: all .15s ease-in-out; + .reference-item{ + margin-bottom: 8px; + padding-left: 14px; + .reference-item-bx{ + @include flex(10px); + @include defaultFont($font-s-13, $font-w-400, $font-c); + align-items: center; + } + &:last-child{ + margin-bottom: 0; + } + } + &.check{ + .reference-item{ + margin-bottom: 14px; + } + } +} +.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{ + display: block; + @include defaultFont($font-s-13, $font-w-400, $font-c); + 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; + display: flex; + align-items: center; +} + +@media screen and (max-width: 360px){ + .btn-flex-wrap{ + flex-direction: column; + } + .data-check-wrap{ + .radio-form-box, + .check-form-box{ + width: 100%; + } + } } \ No newline at end of file diff --git a/src/styles/publishpage.scss b/src/styles/publishpage.scss index 64e89e0..e27a6fd 100644 --- a/src/styles/publishpage.scss +++ b/src/styles/publishpage.scss @@ -31,6 +31,7 @@ $default-color: #2C2C2C; .p-body{ margin-top: 30px; + padding-bottom: 70px; flex: 1 1 auto; .p-contents{ max-width: 1480px; From 1746c9174228b8b37fbd32f9d51bc02dd7907721 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 8 May 2025 17:55:24 +0900 Subject: [PATCH 2/7] feat: integrate EdgeProvider for alert management and add Suitable components for roof material compatibility checks --- src/app/layout.tsx | 25 +++--- src/app/suitable/layout.tsx | 24 +++++ src/app/suitable/page.tsx | 4 +- src/components/popup/SuitableDetailPopup.tsx | 32 +++++++ src/components/suitable/Suitable.tsx | 87 +++++++++++++++++++ src/components/suitable/SuitableCheckData.tsx | 68 +++++++++++++++ src/components/suitable/SuitableNoData.tsx | 15 ++++ src/components/ui/Main.tsx | 22 +---- src/components/ui/PopupController.tsx | 7 ++ src/components/ui/common/Alert.tsx | 24 +++++ src/components/ui/common/DoubleBtnAlert.tsx | 21 +++++ src/providers/EdgeProvider.tsx | 64 ++++++++++++++ src/store/popupController.ts | 36 ++++++++ 13 files changed, 397 insertions(+), 32 deletions(-) create mode 100644 src/app/suitable/layout.tsx create mode 100644 src/components/popup/SuitableDetailPopup.tsx create mode 100644 src/components/suitable/Suitable.tsx create mode 100644 src/components/suitable/SuitableCheckData.tsx create mode 100644 src/components/suitable/SuitableNoData.tsx create mode 100644 src/components/ui/common/Alert.tsx create mode 100644 src/components/ui/common/DoubleBtnAlert.tsx create mode 100644 src/providers/EdgeProvider.tsx diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4b043a8..e7fbcf6 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from 'next' import ReactQueryProviders from '@/providers/ReactQueryProvider' +import EdgeProvider from '@/providers/EdgeProvider' import PopupController from '@/components/ui/PopupController' import '@/styles/style.scss' @@ -22,17 +23,19 @@ interface RootLayoutProps { export default async function RootLayout({ children, header, footer, floatBtn }: RootLayoutProps): Promise { return ( - - -
- {header} - {children} - {footer} - {floatBtn} -
- - - + + + +
+ {header} + {children} + {footer} + {floatBtn} +
+ + + +
) } diff --git a/src/app/suitable/layout.tsx b/src/app/suitable/layout.tsx new file mode 100644 index 0000000..25e2615 --- /dev/null +++ b/src/app/suitable/layout.tsx @@ -0,0 +1,24 @@ +import { ReactNode } from 'react' + +interface SuitableLayoutProps { + children: ReactNode +} + +export default function layout({ children }: SuitableLayoutProps) { + return ( + <> +
+
+
+
+
この適合表は参考資料として使用してください.
+
詳細やお問い合わせは1:1お問い合わせをご利用ください.
+
屋根材の選択or屋根材名を直接入力してください.
+
+
+ {children} +
+
+ + ) +} diff --git a/src/app/suitable/page.tsx b/src/app/suitable/page.tsx index 10e60d6..fe9d9c1 100644 --- a/src/app/suitable/page.tsx +++ b/src/app/suitable/page.tsx @@ -1,7 +1,9 @@ +import Suitable from '@/components/suitable/Suitable' + export default function page() { return ( <> -

지붕재 적합성

+ ) } diff --git a/src/components/popup/SuitableDetailPopup.tsx b/src/components/popup/SuitableDetailPopup.tsx new file mode 100644 index 0000000..59b7838 --- /dev/null +++ b/src/components/popup/SuitableDetailPopup.tsx @@ -0,0 +1,32 @@ +export default function SuitableDetailPopup() { + return ( +
+
+
+
+
+
+
+ +
+
屋根材適合性詳細
+
+ +
+
+
+
+
+
アースティ40
+
+ +
+
+
+
+
+
+
+
+ ) +} diff --git a/src/components/suitable/Suitable.tsx b/src/components/suitable/Suitable.tsx new file mode 100644 index 0000000..5120aa3 --- /dev/null +++ b/src/components/suitable/Suitable.tsx @@ -0,0 +1,87 @@ +'use client' + +import { useState } from 'react' +import SuitableCheckData from './SuitableCheckData' +import SuitableNoData from './SuitableNoData' + +export default function Suitable() { + const [reference, setReference] = useState(false) + + return ( +
+
+ +
+
+
+ + +
+
+
+
+
+
凡例
+
+ +
+
+
    +
  • +
    + 設置可能 +
    +
  • +
  • +
    + 設置可能 +
    +
  • +
  • +
    + 設置可能 +
    +
  • +
  • +
    + 設置可能 +
    +
  • +
+
+ {/* checkData */} + {/* 데이터 없을경우 버튼 영역 안보여야함 */} + + + + +
+ {/* 데이터 없을경우 버튼 영역 안보여야함 */} +
+
+ +
+
+ +
+
+ +
+
+ {/* 검색기록 없을떄 위에 두 영역 안보이고 이 부분만 보여야 함*/} + {/* */} +
+ ) +} diff --git a/src/components/suitable/SuitableCheckData.tsx b/src/components/suitable/SuitableCheckData.tsx new file mode 100644 index 0000000..2cef53b --- /dev/null +++ b/src/components/suitable/SuitableCheckData.tsx @@ -0,0 +1,68 @@ +'use client' + +export default function SuitableCheckData() { + return ( + <> +
+
+
+ + +
+
+ +
+
+
    +
  • +
    +
    + + +
    +
    + + +
    +
    +
  • +
  • +
    +
    + + +
    +
    + + +
    +
    +
  • +
  • +
    +
    + + +
    +
    + + +
    +
    +
  • +
  • +
    +
    + + +
    +
    + +
    +
    +
  • +
+
+ + ) +} diff --git a/src/components/suitable/SuitableNoData.tsx b/src/components/suitable/SuitableNoData.tsx new file mode 100644 index 0000000..1245fbf --- /dev/null +++ b/src/components/suitable/SuitableNoData.tsx @@ -0,0 +1,15 @@ +export default function SuitableNoData() { + return ( + <> +
+ 検索結果はありません。 + 屋根材適合性表にない製品の情報を入力してください。 今後返信いたします。 + + + +
+ + ) +} diff --git a/src/components/ui/Main.tsx b/src/components/ui/Main.tsx index 37de8e7..5f6eff4 100644 --- a/src/components/ui/Main.tsx +++ b/src/components/ui/Main.tsx @@ -1,27 +1,9 @@ 'use client' -import { useHeaderStore } from '@/store/header' -import { useSideNavState } from '@/store/sideNavState' -import { usePathname, useRouter } from 'next/navigation' -import { useEffect } from 'react' +import { useRouter } from 'next/navigation' export default function Main() { const router = useRouter() - const pathname = usePathname() - const { setBackBtn } = useHeaderStore() - const { reset } = useSideNavState() - - /** - * 헤더 뒤로가기 버튼 컨트롤 - * 사이드바 초기화 컨트롤 - */ - useEffect(() => { - if (pathname === '/') { - setBackBtn(false) - } - //사이드바 초기화 - reset() - }, [pathname]) return ( <> @@ -30,7 +12,7 @@ export default function Main() {
屋根材の照会
ご使用の屋根材の適合性をご確認いただけます
-
diff --git a/src/components/ui/PopupController.tsx b/src/components/ui/PopupController.tsx index e221d6a..0bf79e7 100644 --- a/src/components/ui/PopupController.tsx +++ b/src/components/ui/PopupController.tsx @@ -1,8 +1,12 @@ 'use client' import { usePopupController } from '@/store/popupController' + import MemberInfomationPopup from '../popup/MemberInformationPopup' import ZipCodePopup from '../popup/ZipCodePopup' +import Alert from './common/Alert' +import DoubleBtnAlert from './common/DoubleBtnAlert' +import SuitableDetailPopup from '../popup/SuitableDetailPopup' export default function PopupController() { const popupController = usePopupController() @@ -11,6 +15,9 @@ export default function PopupController() { <> {popupController.memberInfomationPopup && } {popupController.zipCodePopup && } + {popupController.alert && } + {popupController.alert2 && } + {popupController.suitableDetailPopup && } ) } diff --git a/src/components/ui/common/Alert.tsx b/src/components/ui/common/Alert.tsx new file mode 100644 index 0000000..96dd5ca --- /dev/null +++ b/src/components/ui/common/Alert.tsx @@ -0,0 +1,24 @@ +'use client' + +import { usePopupController } from '@/store/popupController' + +export default function Alert() { + const { alertMsg, alertBtn } = usePopupController() + + return ( +
+
+
+
{alertMsg}
+
+
+ +
+
+
+
+
+ ) +} diff --git a/src/components/ui/common/DoubleBtnAlert.tsx b/src/components/ui/common/DoubleBtnAlert.tsx new file mode 100644 index 0000000..34af34b --- /dev/null +++ b/src/components/ui/common/DoubleBtnAlert.tsx @@ -0,0 +1,21 @@ +import React from 'react' + +export default function DoubleBtnAlert() { + return ( +
+
+
+
本当に削除しますか?
+
+
+ +
+
+ +
+
+
+
+
+ ) +} diff --git a/src/providers/EdgeProvider.tsx b/src/providers/EdgeProvider.tsx new file mode 100644 index 0000000..2ca2811 --- /dev/null +++ b/src/providers/EdgeProvider.tsx @@ -0,0 +1,64 @@ +'use client' + +import { useHeaderStore } from '@/store/header' +import { usePopupController } from '@/store/popupController' +import { useSideNavState } from '@/store/sideNavState' +import { usePathname } from 'next/navigation' +import { useEffect } from 'react' + +declare global { + interface Window { + alert2: (msg: string, alert2BtnYes?: () => void, alert2BtnNo?: () => void) => void + } +} + +export default function EdgeProvider({ children }: React.PropsWithChildren) { + const pathname = usePathname() + const { setBackBtn } = useHeaderStore() + const { reset } = useSideNavState() + const { setAlertMsg, setAlertBtn, setAlert, setAlert2, setAlert2BtnYes, setAlert2BtnNo } = usePopupController() + + const alertFunc = (msg: string, alertBtn: Function) => { + console.log('🚀 ~ alertFunc ~ msg:', msg) + setAlertMsg(msg) + setAlertBtn(alertBtn) + setAlert(true) + } + /** + * alert2 함수 + * @param msg alert 메시지 + * @param alertBtn2Yes alert 확인 버튼 클릭시 실행되는 함수 + * @param alertBtn2No alert 취소 버튼 클릭시 실행되는 함수 + */ + const alertFunc2 = (msg: string, alertBtn2Yes: Function, alertBtn2No: Function) => { + console.log('🚀 ~ alertFunc ~ msg:', msg) + setAlertMsg(msg) + setAlert2BtnYes(alertBtn2Yes) + setAlert2BtnNo(alertBtn2No) + setAlert2(true) + } + + useEffect(() => { + window.alert = function (msg, alertBtn = () => setAlert(false)) { + alertFunc(msg, alertBtn) + } + + window.alert2 = function (msg, alert2BtnYes = () => setAlert2(false), alert2BtnNo = () => setAlert2(false)) { + alertFunc2(msg, alert2BtnYes, alert2BtnNo) + } + }, []) + + /** + * 헤더 뒤로가기 버튼 컨트롤 + * 사이드바 초기화 컨트롤 + */ + useEffect(() => { + if (pathname === '/') { + setBackBtn(false) + } + //사이드바 초기화 + reset() + }, [pathname]) + + return <>{children} +} diff --git a/src/store/popupController.ts b/src/store/popupController.ts index 2a83120..611bb55 100644 --- a/src/store/popupController.ts +++ b/src/store/popupController.ts @@ -3,23 +3,59 @@ import { create } from 'zustand' type PoupControllerState = { memberInfomationPopup: boolean zipCodePopup: boolean + alertMsg: string + setAlertMsg: (value: string) => void + alert: boolean + alertBtn: Function + alert2: boolean + alert2BtnYes: Function + alert2BtnNo: Function setMemberInfomationPopup: (value: boolean) => void setZipCodePopup: (value: boolean) => void + setAlert: (value: boolean) => void + setAlertBtn: (value: Function) => void + setAlert2: (value: boolean) => void + setAlert2BtnYes: (value: Function) => void + setAlert2BtnNo: (value: Function) => void + suitableDetailPopup: boolean + setSuitableDetailPopup: (value: boolean) => void + reset: () => void } type InitialState = { memberInfomationPopup: boolean zipCodePopup: boolean + alertMsg: string + alert: boolean + alertBtn: Function + alert2: boolean + alert2BtnYes: Function + alert2BtnNo: Function + suitableDetailPopup: boolean } const initialState: InitialState = { memberInfomationPopup: false, zipCodePopup: false, + alertMsg: '', + alert: false, + alertBtn: () => {}, + alert2: false, + alert2BtnYes: () => {}, + alert2BtnNo: () => {}, + suitableDetailPopup: false, } export const usePopupController = create((set) => ({ ...initialState, setMemberInfomationPopup: (value: boolean) => set((state) => ({ ...state, memberInfomationPopup: value })), setZipCodePopup: (value: boolean) => set((state) => ({ ...state, zipCodePopup: value })), + setAlertMsg: (value: string) => set((state) => ({ ...state, alertMsg: value })), + setAlert: (value: boolean) => set((state) => ({ ...state, alert: value })), + setAlertBtn: (value: Function) => set((state) => ({ ...state, alertBtn: value })), + setAlert2: (value: boolean) => set((state) => ({ ...state, alert2: value })), + setAlert2BtnYes: (value: Function) => set((state) => ({ ...state, alert2BtnYes: value })), + setAlert2BtnNo: (value: Function) => set((state) => ({ ...state, alert2BtnNo: value })), + setSuitableDetailPopup: (value: boolean) => set((state) => ({ ...state, suitableDetailPopup: value })), reset: () => set(initialState), })) From 5628d330d5aed078403329fd9a6ee91cd718e706 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 8 May 2025 17:56:35 +0900 Subject: [PATCH 3/7] fix: update button action in Main component to navigate to suitable page for roof material compatibility checks --- src/components/ui/Main.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ui/Main.tsx b/src/components/ui/Main.tsx index 5f6eff4..9931293 100644 --- a/src/components/ui/Main.tsx +++ b/src/components/ui/Main.tsx @@ -12,7 +12,7 @@ export default function Main() {
屋根材の照会
ご使用の屋根材の適合性をご確認いただけます
-
From 4ab2b225cd5f95d4d1c0befacc1bc27dc561d276 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 8 May 2025 17:57:48 +0900 Subject: [PATCH 4/7] feat: add new compliance-related SVG icons for enhanced UI representation --- public/assets/images/layout/modal_header_icon03.svg | 5 +++++ public/assets/images/sub/compliance_bx_icon.svg | 4 ++++ public/assets/images/sub/compliance_check_icon.svg | 4 ++++ public/assets/images/sub/compliance_quest_icon.svg | 4 ++++ public/assets/images/sub/compliance_tip_icon.svg | 4 ++++ public/assets/images/sub/compliance_x_icon.svg | 4 ++++ 6 files changed, 25 insertions(+) create mode 100644 public/assets/images/layout/modal_header_icon03.svg create mode 100644 public/assets/images/sub/compliance_bx_icon.svg create mode 100644 public/assets/images/sub/compliance_check_icon.svg create mode 100644 public/assets/images/sub/compliance_quest_icon.svg create mode 100644 public/assets/images/sub/compliance_tip_icon.svg create mode 100644 public/assets/images/sub/compliance_x_icon.svg diff --git a/public/assets/images/layout/modal_header_icon03.svg b/public/assets/images/layout/modal_header_icon03.svg new file mode 100644 index 0000000..e15a12c --- /dev/null +++ b/public/assets/images/layout/modal_header_icon03.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/assets/images/sub/compliance_bx_icon.svg b/public/assets/images/sub/compliance_bx_icon.svg new file mode 100644 index 0000000..57c5593 --- /dev/null +++ b/public/assets/images/sub/compliance_bx_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/images/sub/compliance_check_icon.svg b/public/assets/images/sub/compliance_check_icon.svg new file mode 100644 index 0000000..4943e6f --- /dev/null +++ b/public/assets/images/sub/compliance_check_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/images/sub/compliance_quest_icon.svg b/public/assets/images/sub/compliance_quest_icon.svg new file mode 100644 index 0000000..b168463 --- /dev/null +++ b/public/assets/images/sub/compliance_quest_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/images/sub/compliance_tip_icon.svg b/public/assets/images/sub/compliance_tip_icon.svg new file mode 100644 index 0000000..6d7524c --- /dev/null +++ b/public/assets/images/sub/compliance_tip_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/assets/images/sub/compliance_x_icon.svg b/public/assets/images/sub/compliance_x_icon.svg new file mode 100644 index 0000000..1b6268c --- /dev/null +++ b/public/assets/images/sub/compliance_x_icon.svg @@ -0,0 +1,4 @@ + + + + From b4db26d80aaea3612530e36150b353836a4753c7 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 8 May 2025 18:00:57 +0900 Subject: [PATCH 5/7] fix: update EdgeProvider to correctly set back button visibility based on pathname --- src/providers/EdgeProvider.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/providers/EdgeProvider.tsx b/src/providers/EdgeProvider.tsx index 2ca2811..5c4e53c 100644 --- a/src/providers/EdgeProvider.tsx +++ b/src/providers/EdgeProvider.tsx @@ -55,6 +55,8 @@ export default function EdgeProvider({ children }: React.PropsWithChildren) { useEffect(() => { if (pathname === '/') { setBackBtn(false) + } else { + setBackBtn(true) } //사이드바 초기화 reset() From 06967d746ce21d35eec821c53dbdaa7a496c33ec Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Fri, 9 May 2025 13:53:33 +0900 Subject: [PATCH 6/7] refactor: streamline MS_SUITABLE model by removing redundant fields and add new BC_COMM_H and BC_COMM_L models for improved data structure --- prisma/schema.prisma | 94 ++++++++++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 34 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e11395a..3a511a3 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -19,73 +19,39 @@ model User { updated_at DateTime @updatedAt } -// 지붕재 적합성 정보 model MS_SUITABLE { - //일련번호 id Int @id @default(autoincrement()) - //제품명 product_name String @db.VarChar(200) - //제조업체명 manufacturer String? @db.VarChar(200) - //지붕재 roof_material String? @db.VarChar(100) - //금구형태(쇠붙이형) shape String? @db.VarChar(200) - //지지 기와 support_roof_tile String? @db.VarChar(2) - //지지 기와 메모 support_roof_tile_memo String? @db.VarChar(500) - //지지 금구 support_roof_bracket String? @db.VarChar(200) - //지지 금구 메모 support_roof_bracket_memo String? @db.VarChar(500) - //yg 앵커 yg_anchor String? @db.VarChar(200) - //yg 앵커 메모 yg_anchor_memo String? @db.VarChar(500) - //rg 지붕판 rg_roof_tile_part String? @db.VarChar(200) - //rg 지붕판 메모 rg_roof_tile_part_memo String? @db.VarChar(500) - //다이도헌트 지지 기와2 dido_hunt_support_tile_2 String? @db.VarChar(200) - //다이도헌트 지지 기와2 메모 dido_hunt_support_tile_2_memo String? @db.VarChar(500) - //타카시마 파워 베이스 takashima_power_base String? @db.VarChar(200) - //타카시마 파워 베이스 메모 takashima_power_base_memo String? @db.VarChar(500) - //타카시마용 금구 takashima_tile_bracket String? @db.VarChar(200) - //타카시마용 금구 메모 takashima_tile_bracket_memo String? @db.VarChar(500) - //슬레이트 금구4 slate_bracket_4 String? @db.VarChar(200) - //슬레이트 금구4 메모 slate_bracket_4_memo String? @db.VarChar(500) - //슬레이트 판금 금구(슬레이트, 싱글) slate_single_metal_bracket String? @db.VarChar(200) - //슬레이트 판금 금구 메모(슬레이트, 싱글) slate_single_metal_bracket_memo String? @db.VarChar(500) - //다이도헌트 짧은 트랙4 dido_hunt_short_rack_4 String? @db.VarChar(200) - //다이도헌트 짧은 트랙4 메모 dido_hunt_short_rack_4_memo String? @db.VarChar(500) - //타카시마 슬레이트 금구 takashima_slate_bracket_slate_single String? @db.VarChar(200) - //타카시마 슬레이트 금구 메모 takashima_slate_bracket_slate_single_memo String? @db.VarChar(500) - //df 판금 금구 df_metal_bracket String? @db.VarChar(200) - //df 판금 금구 메모 df_metal_bracket_memo String? @db.VarChar(500) - //슬레이트 판금 금구(금속 지붕) slate_metal_bracket String? @db.VarChar(200) - //슬레이트 판금 금구(금속 지붕) 메모 slate_metal_bracket_memo String? @db.VarChar(500) - //타카시마 슬레이트 금구(금속 지붕) takashima_slate_bracket_metal_roof String? @db.VarChar(200) - //타카시마 슬레이트 금구(금속 지붕) 메모 takashima_slate_bracket_metal_roof_memo String? @db.VarChar(500) created_at DateTime @default(now()) updated_at DateTime @updatedAt @@ -151,3 +117,63 @@ model SD_SERVEY_SALES_DETAIL_INFO { basic_info_id Int @unique basic_info SD_SERVEY_SALES_BASIC_INFO @relation(fields: [basic_info_id], references: [id]) } + +model BC_COMM_H { + HEAD_CD String @id(map: "PK_BC_COMM_H") @db.NVarChar(6) + HEAD_ID String @db.NVarChar(100) + HEAD_NM String @db.NVarChar(100) + HEAD_JP String @db.NVarChar(100) + HEAD_4TH String @db.NVarChar(100) + REF_CHR1 String @db.NVarChar(100) + REF_CHR2 String @db.NVarChar(100) + REF_CHR3 String @db.NVarChar(100) + REF_CHR4 String @db.NVarChar(100) + REF_CHR5 String @db.NVarChar(100) + REF_NUM1 String @db.NVarChar(100) + REF_NUM2 String @db.NVarChar(100) + REF_NUM3 String @db.NVarChar(100) + REF_NUM4 String @db.NVarChar(100) + REF_NUM5 String @db.NVarChar(100) + REMARKS String @db.NVarChar(200) + SAP_YN String @db.NVarChar(1) + STAT_CD String @db.NVarChar(1) + DEL_YN String @db.NVarChar(1) + REG_DT DateTime? @db.DateTime + REG_ID String @db.NVarChar(50) + UPT_DT DateTime? @db.DateTime + UPT_ID String @db.NVarChar(50) + QC_COMM_YN String? @default("N", map: "DF__BC_COMM_H__QC_CO__48CFD27E") @db.NVarChar(1) + BC_COMM_L BC_COMM_L[] + + @@index([HEAD_ID], map: "BC_COMM_H_HEAD_ID_IDX") +} + +model BC_COMM_L { + HEAD_CD String @db.NVarChar(6) + CODE String @db.NVarChar(50) + READ_CD String? @db.NVarChar(50) + CODE_NM String? @db.NVarChar(100) + CODE_JP String? @db.NVarChar(100) + CODE_4TH String? @db.NVarChar(100) + REF_CHR1 String? @db.NVarChar(150) + REF_CHR2 String? @db.NVarChar(150) + REF_CHR3 String? @db.NVarChar(150) + REF_CHR4 String? @db.NVarChar(150) + REF_CHR5 String? @db.NVarChar(150) + REF_NUM1 Decimal? @db.Decimal(22, 5) + REF_NUM2 Decimal? @db.Decimal(22, 5) + REF_NUM3 Decimal? @db.Decimal(22, 5) + REF_NUM4 Decimal? @db.Decimal(22, 5) + REF_NUM5 Decimal? @db.Decimal(22, 5) + PRIORITY Decimal? @db.Decimal(3, 0) + REF_CNT String? @db.NVarChar(5) + STAT_CD String? @db.NVarChar(1) + DEL_YN String? @db.NVarChar(1) + REG_DT DateTime? @db.DateTime + REG_ID String? @db.NVarChar(50) + UPT_DT DateTime? @db.DateTime + UPT_ID String? @db.NVarChar(50) + BC_COMM_H BC_COMM_H @relation(fields: [HEAD_CD], references: [HEAD_CD], onUpdate: NoAction, map: "FK_BC_COMM_L") + + @@id([HEAD_CD, CODE], map: "PK_BC_COMM_L") +} From a6702f52fc1c779d9a22a5a869fd79ba6a4cdc19 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Fri, 9 May 2025 14:44:07 +0900 Subject: [PATCH 7/7] feat: add new sample page with various input components and styling for enhanced user interaction --- src/app/sample/page.tsx | 240 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 src/app/sample/page.tsx diff --git a/src/app/sample/page.tsx b/src/app/sample/page.tsx new file mode 100644 index 0000000..c4c30d3 --- /dev/null +++ b/src/app/sample/page.tsx @@ -0,0 +1,240 @@ +'use client' + +import { useState } from 'react' + +export default function page() { + const [fileName, setFileName] = useState(null) //file name value + + return ( + <> +
+
+

Input

+
+ + + + + + +
+ + setFileName(e.target.files?.[0] ?? null)} /> +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+

Button

+
+ + + + + + + + + + + + + + +
+
+
+

Check Box

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+

Radio Button

+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+

Toggle Button

+
+
+ +
+
+ +
Q.PARTNERS
+
+
+
+
+

Select Box

+
+ + +
+ + + +
+
+
+
+

TextArea

+
+ + +
+
+ +
+ + ) +}