From f7ccb78b31fb8ab7e02fdb050ff98aa4ef935e5a Mon Sep 17 00:00:00 2001 From: chpark Date: Wed, 15 Oct 2025 18:19:04 +0900 Subject: [PATCH] =?UTF-8?q?=EB=94=94=EC=9E=90=EC=9D=B8=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/contractMgmt/supplyRegistPopUp.jsp | 2 +- WebContent/css/basic_new.css | 779 ++++++++++++++++++ WebContent/init_new.jsp | 165 ++++ 3 files changed, 945 insertions(+), 1 deletion(-) create mode 100644 WebContent/css/basic_new.css create mode 100644 WebContent/init_new.jsp diff --git a/WebContent/WEB-INF/view/contractMgmt/supplyRegistPopUp.jsp b/WebContent/WEB-INF/view/contractMgmt/supplyRegistPopUp.jsp index 2a8b071..fcea563 100644 --- a/WebContent/WEB-INF/view/contractMgmt/supplyRegistPopUp.jsp +++ b/WebContent/WEB-INF/view/contractMgmt/supplyRegistPopUp.jsp @@ -2,7 +2,7 @@ <%@ page import="com.pms.common.utils.*"%> <%@ page import="java.util.*" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> -<%@include file= "/init.jsp" %> +<%@include file= "/init_new.jsp" %> diff --git a/WebContent/css/basic_new.css b/WebContent/css/basic_new.css new file mode 100644 index 0000000..274934b --- /dev/null +++ b/WebContent/css/basic_new.css @@ -0,0 +1,779 @@ +/* Modern PLM System CSS - 2025 Redesign */ +/* 깔끔하고 전문적인 업무용 시스템 디자인 */ + +:root { + --primary-color: #3b82f6; + --primary-hover: #2563eb; + --primary-light: #dbeafe; + --secondary-color: #64748b; + --success-color: #10b981; + --danger-color: #ef4444; + --warning-color: #f59e0b; + --background: #f8fafc; + --surface: #ffffff; + --border-color: #e2e8f0; + --text-primary: #1e293b; + --text-secondary: #64748b; + --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); + --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); + --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); + --radius-sm: 6px; + --radius-md: 8px; + --radius-lg: 12px; +} + +/* 기본 바디 스타일 - 깔끔한 배경 */ +body { + background: var(--background); + min-height: 100vh; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Noto Sans KR', Roboto, 'Helvetica Neue', Arial, sans-serif; + color: var(--text-primary); + line-height: 1.6; + margin: 0; + padding: 20px; +} + +/* 부드러운 페이드인 애니메이션 */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +/* 메인 섹션 스타일 */ +section, aside { + background: var(--surface); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + margin: 0 auto 20px; + padding: 0; + box-shadow: var(--shadow-sm); + max-width: 1200px; + animation: fadeIn 0.3s ease-out; +} + +/* 팝업 최소 너비 설정 */ +.business_popup_min_width { + min-width: 800px; +} + +/* 날짜 입력 필드 스타일 */ +.date_icon { + background: var(--surface) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E") no-repeat right 6px center; + background-size: 12px; + padding-right: 26px !important; + cursor: pointer; +} + +/* 페이지 제목 스타일 - 파란 배경 (모든 방식으로 최우선 적용) */ +html body section .plm_menu_name h2, +html body .plm_menu_name h2, +body section .plm_menu_name h2, +body .plm_menu_name h2, +section .plm_menu_name h2, +div.plm_menu_name h2, +.plm_menu_name > h2, +.plm_menu_name h2 { + background: #3b82f6 !important; + background-color: #3b82f6 !important; + background-image: linear-gradient(135deg, #4285f4 0%, #3b82f6 100%) !important; + color: #ffffff !important; + padding: 16px 24px !important; + margin: 0 !important; + font-size: 16px !important; + font-weight: 600 !important; + border: none !important; + border-bottom: none !important; + border-top: none !important; + border-left: none !important; + border-right: none !important; + border-radius: 12px 12px 0 0 !important; + display: flex !important; + align-items: center !important; + position: relative !important; + box-shadow: 0 2px 8px rgba(59, 130, 246, 0.15) !important; +} + +html body section .plm_menu_name h2 span, +html body .plm_menu_name h2 span, +body section .plm_menu_name h2 span, +body .plm_menu_name h2 span, +section .plm_menu_name h2 span, +div.plm_menu_name h2 span, +.plm_menu_name > h2 > span, +.plm_menu_name h2 > span, +.plm_menu_name h2 span { + display: flex !important; + align-items: center !important; + gap: 0 !important; + flex: 1 !important; + color: #ffffff !important; + background: transparent !important; + background-color: transparent !important; +} + +/* 섹션 제목 스타일 - 중간 영역의 서브 타이틀 */ +#businessPopupFormWrap h4 { + background: white; + color: var(--text-primary); + padding: 8px 28px; + margin: 0; + font-size: 15px; + font-weight: 600; + border-bottom: 2px solid #e2e8f0; + border-left: none; + display: flex; + align-items: center; + position: relative; +} + +#businessPopupFormWrap h4 span { + display: flex; + align-items: center; + gap: 8px; + flex: 1; +} + +#businessPopupFormWrap h4 span::before { + content: '📋'; + font-size: 18px; + flex-shrink: 0; +} + +/* 헤더에 닫기 버튼이 있는 경우를 위한 스타일 */ +.plm_menu_name h2 .close-btn { + position: absolute; + right: 20px; + top: 50%; + transform: translateY(-50%); + background: rgba(255, 255, 255, 0.2); + border: none; + color: white; + width: 32px; + height: 32px; + border-radius: 6px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + font-size: 18px; + transition: all 0.2s ease; + backdrop-filter: blur(10px); +} + +.plm_menu_name h2 .close-btn:hover { + background: rgba(255, 255, 255, 0.3); +} + +/* 팝업 폼 래퍼 */ +#businessPopupFormWrap { + padding: 0; +} + +/* 테이블 스타일 - 현대적이고 깔끔하게 */ +.pmsPopupForm { + width: 100%; + margin: 0; + table-layout: fixed; + background: var(--surface); + border: none; + border-radius: 0; + box-shadow: none; + border-collapse: separate; + border-spacing: 0; +} + +.pmsPopupForm tr { + height: auto; +} + +.pmsPopupForm td { + height: auto; + font-size: 11px; + padding: 6px 12px; /* 8px에서 6px로 더욱 압축 */ + border-bottom: 1px solid var(--border-color); + vertical-align: middle; +} + +.pmsPopupForm tr:last-child td { + border-bottom: none; +} + +/* 라벨 셀 스타일 - 심플하고 읽기 쉽게 */ +.input_title { + background: #f8fafc; + color: var(--text-primary); + border-right: 1px solid var(--border-color); + font-weight: 600; + position: relative; + padding: 20px 24px; +} + +.input_title label { + color: var(--text-primary); + font-weight: 600; + font-size: 14px; + display: flex; + align-items: center; + justify-content: flex-end; + text-align: right; +} + +/* 필수 항목 표시 제거 */ +/* .input_title label::after { + content: '*'; + color: var(--danger-color); + margin-left: 4px; + font-weight: 700; +} */ + +.input_sub_title { + background: var(--surface); + color: var(--text-secondary); + font-weight: 500; + font-size: 13px; +} + +.input_title_b { + background: #eff6ff; + color: var(--primary-color); + border-right: 1px solid var(--border-color); + font-weight: 600; + padding: 20px 24px; +} + +/* 입력 필드 스타일 - 최소 크기로 압축 (16px) */ +.pmsPopupForm input[type="text"], +.pmsPopupForm input[type="number"], +.pmsPopupForm select { + width: 100%; + height: 16px !important; /* 20px에서 16px로 축소 */ + line-height: 14px !important; /* 텍스트 세로 정렬 */ + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 0 6px !important; + font-size: 11px !important; + color: var(--text-primary); + background: var(--surface); + transition: all 0.2s ease; + font-family: inherit; + vertical-align: middle; +} + +/* 셀렉트 박스 전용 스타일 */ +.pmsPopupForm select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3E%3Cpath fill='%2364748b' d='M4 6L0 2h8z'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 6px center; + background-size: 7px; + padding-right: 22px !important; + cursor: pointer; +} + +.pmsPopupForm input[type="text"]:hover, +.pmsPopupForm input[type="number"]:hover, +.pmsPopupForm select:hover { + border-color: var(--secondary-color); + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.05); +} + +.pmsPopupForm input[type="text"]:focus, +.pmsPopupForm input[type="number"]:focus, +.pmsPopupForm select:focus { + border-color: var(--primary-color); + outline: none; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); + background: var(--surface); +} + +.pmsPopupForm input[type="text"]:disabled, +.pmsPopupForm input[type="number"]:disabled, +.pmsPopupForm select:disabled { + background: #f1f5f9; + color: var(--text-secondary); + cursor: not-allowed; +} + +/* 텍스트영역 스타일 - 여러 페이지 통합 지원 */ +.pmsPopupForm textarea, +.pmsPopuptable textarea { + width: 100%; + min-height: 60px; + border: 1px solid var(--border-color); + border-radius: 4px; + padding: 8px; + font-size: 11px; + color: var(--text-primary); + background: var(--surface); + resize: vertical; + transition: all 0.2s ease; + font-family: inherit; + line-height: 1.5; +} + +.pmsPopupForm textarea:hover, +.pmsPopuptable textarea:hover { + border-color: var(--secondary-color); + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.05); +} + +.pmsPopupForm textarea:focus, +.pmsPopuptable textarea:focus { + border-color: var(--primary-color); + outline: none; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1); +} + +/* 체크박스 스타일 */ +.pmsPopupForm input[type="checkbox"], +.pmsPopuptable input[type="checkbox"] { + width: 16px; + height: 16px; + accent-color: var(--primary-color); + cursor: pointer; + margin: 0 4px 0 0; +} + +/* 버튼 래퍼 */ +.btn_wrap { + margin: 0; + padding: 24px 32px; + border-top: 1px solid var(--border-color); + background: #fafbfc; + border-radius: 0 0 var(--radius-lg) var(--radius-lg); +} + +.plm_btn_wrap_center { + display: flex; + justify-content: center; + gap: 12px; +} + +/* 버튼 스타일 - 깔끔하고 명확하게 */ +.plm_btns { + height: 42px; + border-radius: var(--radius-md); + background: var(--primary-color); + color: white; + cursor: pointer; + font-size: 14px; + border: none; + padding: 0 24px; + font-weight: 600; + transition: all 0.2s ease; + box-shadow: var(--shadow-sm); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 6px; + margin: 0; + float: none; +} + +.plm_btns:hover { + background: var(--primary-hover); + box-shadow: var(--shadow-md); + transform: translateY(-1px); +} + +.plm_btns:active { + transform: translateY(0); + box-shadow: var(--shadow-sm); +} + +/* 닫기 버튼은 세컨더리 스타일 */ +#btn_close { + background: white; + color: var(--text-primary); + border: 1.5px solid var(--border-color); +} + +#btn_close:hover { + background: #f8fafc; + border-color: var(--secondary-color); +} + +/* 메인 액션 버튼 */ +.btns { + height: 44px; + border-radius: var(--radius-md); + background: var(--primary-color); + color: white; + cursor: pointer; + font-size: 15px; + border: none; + padding: 0 28px; + font-weight: 600; + transition: all 0.2s ease; + box-shadow: var(--shadow-md); + display: inline-flex; + align-items: center; + justify-content: center; + gap: 8px; + margin: 0 6px; +} + +.btns:hover { + background: var(--primary-hover); + box-shadow: var(--shadow-lg); + transform: translateY(-2px); +} + +.btns:active { + transform: translateY(0); + box-shadow: var(--shadow-md); +} + +/* 테이블 스타일 */ +.plm_table_wrap { + width: 100%; + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + overflow: hidden; + margin-bottom: 20px; + background: var(--surface); + box-shadow: var(--shadow-sm); +} + +.plm_table { + width: 100%; + table-layout: fixed; + border-collapse: collapse; + background: var(--surface); + text-align: center; + font-size: 14px; +} + +.plm_table .plm_thead { + background: #f8fafc; + color: var(--text-primary); + font-weight: 600; + border-bottom: 2px solid var(--border-color); +} + +.plm_table .plm_thead td { + border-right: 1px solid var(--border-color); + padding: 14px 12px; + font-weight: 600; + font-size: 14px; +} + +.plm_table .plm_thead td:last-child { + border-right: none; +} + +.plm_table td { + height: auto; + border-bottom: 1px solid var(--border-color); + border-right: 1px solid var(--border-color); + padding: 12px; + vertical-align: middle; +} + +.plm_table td:last-child { + border-right: none; +} + +.plm_table tr:hover td { + background: #f8fafc; +} + +.plm_table tr:last-child td { + border-bottom: none; +} + +.plm_table td a { + color: var(--primary-color); + text-decoration: none; + font-weight: 500; + transition: color 0.2s ease; +} + +.plm_table td a:hover { + color: var(--primary-hover); + text-decoration: underline; +} + +/* 스크롤 테이블 */ +.plm_scroll_table { + max-height: 400px; + overflow-y: auto; + border-top: 1px solid var(--border-color); +} + +.plm_scroll_table::-webkit-scrollbar { + width: 10px; +} + +.plm_scroll_table::-webkit-scrollbar-track { + background: #f8fafc; +} + +.plm_scroll_table::-webkit-scrollbar-thumb { + background: var(--secondary-color); + border-radius: 5px; +} + +.plm_scroll_table::-webkit-scrollbar-thumb:hover { + background: var(--text-primary); +} + +/* Select2 스타일 조정 - 16px로 통일 */ +.select2-container--default .select2-selection--single { + border: 1px solid var(--border-color) !important; + border-radius: 4px !important; + height: 16px !important; /* 입력 필드와 동일하게 16px */ + display: flex !important; + align-items: center !important; + background: var(--surface); + transition: all 0.2s ease; +} + +.select2-container--default .select2-selection--single:hover { + border-color: var(--secondary-color) !important; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.05); +} + +.select2-container--default .select2-selection--single:focus, +.select2-container--default.select2-container--open .select2-selection--single { + border-color: var(--primary-color) !important; + box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1) !important; + outline: none !important; +} + +.select2-container--default .select2-selection--single .select2-selection__rendered { + line-height: 14px !important; /* 텍스트 세로 정렬 */ + padding-left: 6px !important; + padding-right: 22px !important; + color: var(--text-primary) !important; + font-size: 11px !important; +} + +.select2-container--default .select2-selection--single .select2-selection__placeholder { + color: var(--text-secondary) !important; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow { + height: 14px !important; + right: 4px !important; + top: 1px !important; +} + +.select2-container--default .select2-selection--single .select2-selection__arrow b { + border-color: var(--text-secondary) transparent transparent transparent !important; + border-width: 3px 3px 0 3px !important; + margin-left: -3px !important; + margin-top: -1px !important; +} + +/* Select2 드롭다운 스타일 */ +.select2-container--default .select2-results__option { + padding: 4px 6px !important; + font-size: 11px !important; +} + +.select2-container--default .select2-results__option--highlighted[aria-selected] { + background-color: var(--primary-light) !important; + color: var(--primary-color) !important; +} + +.select2-dropdown { + border: 1px solid var(--border-color) !important; + border-radius: 4px !important; + box-shadow: var(--shadow-lg) !important; +} + +.select2-search--dropdown .select2-search__field { + border: 1px solid var(--border-color) !important; + border-radius: 3px !important; + padding: 3px 5px !important; + font-size: 11px !important; +} + +.select2-search--dropdown .select2-search__field:focus { + border-color: var(--primary-color) !important; + outline: none !important; +} + +/* 알림 메시지 스타일 */ +.success-message { + background: #f0fdf4; + color: #166534; + border: 1px solid #bbf7d0; + border-left: 4px solid var(--success-color); + padding: 14px 18px; + border-radius: var(--radius-md); + margin: 16px 0; + font-weight: 500; + display: flex; + align-items: center; + gap: 10px; +} + +.success-message::before { + content: '✓'; + font-weight: bold; + font-size: 18px; +} + +.error-message { + background: #fef2f2; + color: #991b1b; + border: 1px solid #fecaca; + border-left: 4px solid var(--danger-color); + padding: 14px 18px; + border-radius: var(--radius-md); + margin: 16px 0; + font-weight: 500; + display: flex; + align-items: center; + gap: 10px; +} + +.error-message::before { + content: '⚠'; + font-weight: bold; + font-size: 18px; +} + +.warning-message { + background: #fffbeb; + color: #92400e; + border: 1px solid #fde68a; + border-left: 4px solid var(--warning-color); + padding: 14px 18px; + border-radius: var(--radius-md); + margin: 16px 0; + font-weight: 500; + display: flex; + align-items: center; + gap: 10px; +} + +.warning-message::before { + content: 'ⓘ'; + font-weight: bold; + font-size: 18px; +} + +/* 로딩 상태 */ +.loading-state { + opacity: 0.6; + pointer-events: none; + position: relative; +} + +.loading-state::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 24px; + height: 24px; + margin: -12px 0 0 -12px; + border: 3px solid var(--primary-light); + border-top-color: var(--primary-color); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* 반응형 디자인 */ +@media (max-width: 768px) { + body { + padding: 10px; + } + + .pmsPopupForm td { + display: block; + width: 100%; + padding: 12px 16px; + } + + .input_title { + border-right: none; + border-bottom: none; + padding: 12px 16px 8px; + } + + .input_title label { + justify-content: flex-start; + text-align: left; + } + + .pmsPopupForm tr td:last-child { + border-bottom: 1px solid var(--border-color); + } + + .plm_btn_wrap_center { + flex-direction: column; + } + + .plm_btns, .btns { + width: 100%; + } + + #businessPopupFormWrap h4, + .plm_menu_name h2 { + padding: 16px 20px; + font-size: 18px; + } + + .btn_wrap { + padding: 16px 20px; + } +} + +/* 접근성 향상 */ +*:focus-visible { + outline: 2px solid var(--primary-color); + outline-offset: 2px; +} + +/* 다크모드 지원 (선택사항) */ +@media (prefers-color-scheme: dark) { + :root { + --background: #0f172a; + --surface: #1e293b; + --border-color: #334155; + --text-primary: #f1f5f9; + --text-secondary: #94a3b8; + } + + .input_title { + background: #1e293b; + } + + .btn_wrap { + background: #1e293b; + } +} + +/* 프린트 스타일 */ +@media print { + body { + background: white; + } + + section, aside { + box-shadow: none; + border: 1px solid #ddd; + } + + .btn_wrap, + .plm_btns, + .btns { + display: none; + } +} \ No newline at end of file diff --git a/WebContent/init_new.jsp b/WebContent/init_new.jsp new file mode 100644 index 0000000..6ff5a26 --- /dev/null +++ b/WebContent/init_new.jsp @@ -0,0 +1,165 @@ +<%@page import="com.pms.common.utils.*"%> +<%@page import="com.pms.common.bean.PersonBean" %> + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> + +<% +boolean isLoggedIn = SessionManager.hasSession(session); +boolean isAdmin = false; + +String connectUserId = ""; +String connectUserDeptCode = ""; +String connectUserName = ""; +String connectUserDeptName = ""; +String partnerCd = ""; +if(!isLoggedIn){ + out.write(""); + out.write(""); +}else{ + PersonBean initPerson = null; + initPerson = (PersonBean)session.getAttribute(Constants.PERSON_BEAN); + connectUserId = CommonUtils.checkNull(initPerson.getUserId()); + connectUserDeptCode = CommonUtils.checkNull(initPerson.getDeptCode()); + connectUserName = CommonUtils.checkNull(initPerson.getUserName()); + connectUserDeptName = CommonUtils.checkNull(initPerson.getDeptName()); + partnerCd = CommonUtils.checkNull(initPerson.getPartner_cd()); + + if("plm_admin".equals(connectUserId)){ + isAdmin = true; + } + +} +pageContext.setAttribute("newLineChar", "\n"); +%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
loading
+
+

+