diff --git a/src/main/webapp/resources/css/fims-login.css b/src/main/webapp/resources/css/fims-login.css new file mode 100644 index 00000000..3e6ba385 --- /dev/null +++ b/src/main/webapp/resources/css/fims-login.css @@ -0,0 +1,233 @@ +@charset "utf-8"; + +.login_bg { + background-color: white; + height: 100%; +} +.header_wrap .logo img{ + margin: 30px 0 0 45px; + display: inline-block; + width: 205px; +} +.login_text { + text-align: center; + max-width: 560px; + margin: 10px auto 0; +} +.login_text .l1 { + font-size: 70px; + color: #4d5769; + margin-top: 60px; + font-family: 'Public Sans'; +} +.login_text .l2 { + font-size: 18px; + color: #959595; + margin-top: 10px; + font-family: 'Public Sans'; +} +.login_text .l2 span{ + color: #006fbe; + font-weight: bold; +} +.login_text .input_wrap { + position: relative; + margin-top: 40px; + padding-right: 0px; +} +.login_text .input_wrap .typeText, +.login_text .input_wrap .typePassword { + display: inline-block; + padding: 0 0 0 30px; + height: 54px; + box-sizing: border-box; + border: 2px solid #828282; + background: #fff; + font-size: 20px; + font-family: 'Public Sans'; +} +.login_text .input_wrap input::placeholder { + color: rgba(205, 206, 206, 1); +} +.login_text .input_wrap input::-webkit-input-placeholder { + color: rgba(205, 206, 206, 1); +} +.login_text .input_wrap input:-ms-input-placeholder { + color: rgba(205, 206, 206, 1); +} + +.login_text .input_wrap .typeButton { + position: absolute; + top: 0; + right: 0; + width: 145px; + height: 100px; + color: #fff; + font-size: 17px; + background: #006fbe; + border: 1px solid #d9d9d9; + box-sizing: border-box; +} +.login_text .input_wrap2 { + text-align: right; + margin-top: 6px; + font-size: 13px; +} +.login_text .input_wrap2 label { + margin-right: 30px; +} +.login_text .input_wrap2 a{ + display: inline-block; + font-size: 14px; + font-family: 'Public Sans'; + font-weight: 700; + color: #959595; +} +.login_text .input_wrap2 a:hover { + text-decoration: underline; +} +.login_text .text_img img { + width : 160px; /* 2021.09.24 박소영 수정 as-is: width300px; */ +} +.login_text .main_img img { + width : 541px; + margin-top: 30px; +} +.login_bg a.line { + border-left: 2px solid #959595; + margin-left: 5px; + padding-left: 5px; + position: relative; +} +.login_bg a.line:before { + content: ''; + display: inline-block; + width: 2px; + height: 10px; + position: absolute; + left: -18px; + top: 2px; +} +.login_text .btn_wrap { + margin: 35px auto 40px; +} +.login_text .btn_wrap a{ + display: inline-block; + border: 1px solid #d9d9d9; + box-sizing: border-box; + background-color: #fff; + font-size: 17px; + height: 58px; + line-height: 58px; + width: 278px; +} +.login_text .btn_wrap a:hover { + background-color: #00a7ac; + border-color: #00a7ac; + color: #fff; +} +.login_text .btn_wrap .typeButton { + display: inline-block; + top: 0; + right: 0; + width: 80%; + height: 66px; + color: #fff; + font-size: 28px; + background: #004988; + border: 1px solid #d9d9d9; + box-sizing: border-box; + border-radius: 32px; + font-family: 'Public Sans'; + cursor: pointer; +} +/*2021.09.24 박소영 새로추가*/ +.login_text .btn_wrap .typeButton:hover{ + background: #0369c1; + transition: all 0.3s; +} + +.login_bg .footer_wrap { + background-color: #fff; + padding-top: 5px; + border-top: 1px solid #e5e5e4; +} +.login_bg .footer_inner { + max-width: 560px; + margin: 0 auto; + position: relative; +} +.login_bg .footer_inner strong { + position: absolute; + font-size: 15px; +} +.login_bg .login_info { + background-color: #4d5769; + padding-top: 18px; + box-sizing: border-box; + height: 60px; +} +.login_bg .login_info strong { + color: #fff; + line-height: 25px; +} +.login_bg .login_info .notice_slider{ + padding-left: 130px; + height: 25px; +} +.login_bg .login_info .notice_slider .bx-wrapper{ + background: none; + border: none; + box-shadow: none; + margin-bottom: 0; +} +.login_bg .login_info ul li { + color: #fff; + position: relative; + padding-right: 100px; + box-sizing: border-box; + height: 25px; + line-height: 25px; + font-size: 13px; +} +.login_bg .login_info ul li a { + color: #fff; + font-size: 13px; +} +.login_bg .login_info ul li span { + position: absolute; + right: 0; +} +.login_bg .login_info2 { + padding-top: 35px; + padding-bottom: 60px; +} +.login_bg .login_info2 strong{ + color: #2d2d2d; +} +.login_bg .login_info2 p { + padding-left: 130px; + font-size: 13px; + line-height: 20px; + margin-bottom: 15px; +} +.login_bg .login_info2 p span { + color: #008ef0; +} +.login_bg .login_info2 .info_link { + margin-top: 30px; +} +.login_bg .login_info2 .info_link a { + color: #2d2d2d; + padding-left: 25px; + background-repeat: no-repeat; + background-position: 0 0; + line-height: 18px; + font-weight: bold; + display: inline-block; +} + +.form-select.no-max-w { + max-width: none; +} + diff --git a/src/main/webapp/resources/css/fims.css b/src/main/webapp/resources/css/fims.css new file mode 100644 index 00000000..a475f5d7 --- /dev/null +++ b/src/main/webapp/resources/css/fims.css @@ -0,0 +1,555 @@ +@charset "UTF-8"; + +:root{ + --bs-font-sans-serif: "Noto Sans Korean", "Public Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; +} + +.btn { + --bs-btn-font-family: "Noto Sans Korean"; +} + +kbd { + background-color: #eee; + border-radius: 3px; + border: 1px solid #b4b4b4; + box-shadow: + 0 1px 1px rgba(0, 0, 0, 0.2), + 0 2px 0 0 rgba(255, 255, 255, 0.7) inset; + color: #333; + display: inline-block; + font-weight: 700; + line-height: 1; + padding: 2px 4px; + white-space: nowrap; +} + +.bg-top-checkbox { + background-color: #d9dee3; +} + +/* 필수 항목 캡션 */ +label.required:after, +.form-label.required:after, +.col-form-label.required:after { + content: '*'; + color: red; +} + +table.compress-cell-w > :not(caption) > * > * { + padding-left: 7px !important; + padding-right: 7px !important; +} +table.compress-cell-h > :not(caption) > * > * { + padding-top: 4px !important; + padding-bottom: 4px !important; +} + +table.compress-cell > :not(caption) > * > * { + padding-left: 7px !important; + padding-right: 7px !important; + padding-top: 4px !important; + padding-bottom: 4px !important; +} + + +.border-default { + border : black solid 1px !important; +} + + +select { + --pdf-red : rgb(255,0,0); + --pdf-green : rgb(0,255,0); + --pdf-blue : rgb(0,0,255); + --pdf-yellow : rgb(255,255,0); + --pdf-orange : rgb(255,128,0); + --pdf-yellow-green : rgb(128,255,0); + --pdf-cyan : rgb(0,255,255); + --pdf-green-cyan : rgb(0,255,128); + --pdf-cyan-blue : rgb(0,128,255); + --pdf-magenta : rgb(255,0,255); + --pdf-violet : rgb(128,0,255); + --pdf-deep-pink : rgb(255,0,128); + --pdf-white : rgb(255,255,255); + --pdf-light-grey : rgb(192,192,192); + --pdf-grey : rgb(160,160,160); + --pdf-dark-grey : rgb(96,96,96); + --pdf-black : rgb(0,0,0); +} + +.task-theme-pvs { background : rgba(66,76,157,0.4) !important; } +.task-theme-bpv { background : rgba(117,123,74,0.4) !important; } +.task-theme-eca { background : rgba(173,215,115,0.4) !important; } +.task-theme-dpv { background : rgba(238,199,177,0.4) !important; } +.task-theme-pes { background : rgba(239,122,115,0.4) !important } +.task-theme-dvs { background : rgba(162,225,221,0.4) !important } + +.fieldset-legend .fieldset-legend-content { + padding: 1.5rem; + font-size: .875rem; + background-color: #fff; + border: 1px solid #bcc5cd; + position: relative +} + +.fieldset-legend .fieldset-legend-content::before { + content: attr(data-label); + display: block; + position: absolute; + top: -8px; + left: 12px; + font-size : 15px!important; + font-weight: 600; + text-transform: uppercase; + background-color: inherit; + color: #a1acb8; + padding: 0 5px +} + +.wrapper-dashboard { + display: flex; + flex-flow: row wrap; + justify-content:center; + max-width:1400px; + padding: 0px; +} + +.wrapper-dashboard .card { + font-weight: bold; + padding : 7px; + margin : 7px; + flex-grow: 1; + flex-shrink: 1; +} +.wrapper-dashboard .card-header { + margin: 0; + padding: 3px; +} +.wrapper-dashboard .card-body { + margin: 0; + padding: 3px; + padding-bottom: 20px; +} +.wrapper-dashboard .card-footer { + border-top: 1px solid #d9dee3; + padding: 3px; +} + +.dashboard-total { + min-width : 300px; + max-width : 400px; + max-height : 150px; +} + +.dashboard-chart { + min-width : 500px; + max-width : 650px; +} + +@keyframes skeleton-loading-fill { + 0% { fill: #f2f2f2; } + 25% { fill: #c1c1c1; } + 50% { fill: #a1a1a1; } + 75% { fill: #c1c1c1; } + 100% { fill: #f2f2f2; } +} + +@keyframes skeleton-loading-color { + 0% { color: #f2f2f2; } + 25% { color: #c1c1c1; } + 50% { color: #a1a1a1; } + 75% { color: #c1c1c1; } + 100% { color: #f2f2f2; } +} + +svg.skeleton { + fill: rgba(0, 0, 0, 1); +} + +svg.skeleton, path.skeleton { + animation: skeleton-loading-fill 1s infinite; +} + +span.skeleton { + animation: skeleton-loading-color 1s infinite; +} + +@keyframes highlight { + 0% { background-color: #ffff99; } + 100% { background-color: #ffffff; } +} + +.highlight-once { + animation: highlight 0.4s; +} + + +.wrapper-list { + min-height: 760px; + overflow-y: auto; + padding: 10px; +} + +.wrapper-pop { + padding: 5px 20px 5px 20px; +} + + + +/** 버튼 */ +.btn-red { + --bs-btn-color: #fff; + --bs-btn-bg:#e60012; + + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg:#e60012; +} + +.btn-green { + --bs-btn-color: #fff; + --bs-btn-bg: #107c41; + + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg:#107c41; +} + +.btn-blue { + --bs-btn-color : #fff; + --bs-btn-bg : #1a71ff; + + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg:#1a71ff; +} + +.btn-lightgray { + --bs-btn-color:#474747; + --bs-btn-bg: #eee; + + --bs-btn-hover-color: #474747; + --bs-btn-hover-bg:#eee; +} + +.btn-darkgray { + --bs-btn-color: #fff; + --bs-btn-bg: #676767; + + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg:#676767; +} + +.btn-square { + aspect-ratio: 1 / 1 !important; +} + + +.btn-pagination { + border:1px solid #e1e1e1; + line-height: 0px; + border-radius: 7px; + background:#F5F5F5; + --bs-btn-disabled-bg: #F5F5F5; +} + +/** 길이,높이 설정 */ +.w-form-select { + width: max-content !important; + min-width: 6.25rem !important; + max-width: 16.25rem !important; +} + +.w-form-date { + width: 7.5rem !important; +} + +.w-automin { + min-width: auto !important; +} + + + + +.min-w-px-50 { + min-width: 50px; +} + +.min-w-px-300 { + min-width: 300px; +} + +.min-w-px-320 { + min-width: 320px; +} + +.min-w-px-350 { + min-width: 350px; +} + +.min-w-px-380 { + min-width: 380px; +} + +.min-w-px-400 { + min-width: 400px; +} + +.min-w-px-550 { + min-width: 550px; +} + +.min-w-px-700 { + min-width: 700px; +} + +.min-w-px-1400 { + min-width: 1400px; +} + + +.mw-px-50 { + max-width: 50px; +} + +.mw-px-100 { + max-width: 100px; +} + +.mw-px-150 { + max-width: 150px; +} + +.mw-px-250 { + max-width: 250px; +} + +.mw-px-300 { + max-width: 300px; +} + +.mw-px-1000 { + max-width: 1000px; +} + +.mw-px-1100 { + max-width: 1100px; +} + +.mw-px-1200 { + max-width: 1200px; +} + +.mh-px-100 { + max-height: 100px; +} + +.mh-px-150 { + max-height: 150px; +} + +.mh-px-200 { + max-height: 200px; +} + +.mh-px-250 { + max-height: 250px; +} + +.mh-px-300 { + max-height: 300px; +} + +.mh-px-350 { + max-height: 350px; +} + +.mh-px-400 { + max-height: 400px; +} + +.mh-px-450 { + max-height: 450px; +} + +.mh-px-500 { + max-height: 500px; +} + +.mh-px-550 { + max-height: 550px; +} + +.mh-px-580 { + max-height: 580px; +} + +.mh-px-600 { + max-height: 600px; +} + +.mh-px-650 { + max-height: 650px; +} + +.mh-px-700 { + max-height: 700px; +} + +.mh-px-750 { + max-height: 750px; +} + +.mh-px-800 { + max-height: 800px; +} + + +.min-w-max-c { + min-width: max-content; +} + + +/* 배경색, 외곽선 */ +.traffic { + +} +.cleanparking { + --program-border : 1px solid #B5B9BB; + --program-border-shadow : 0 0 0 1px inset #FCFFFF; + + --program-bg : #E3E6E8; + --program-title-bg : #EEC575; + --program-btn-bg : #F0F0F0; + --program-popup-bg : #E2E6E9; +} + +.cleanparking.green { + --program-title-bg : #ADD773; +} + +.border-program { + box-shadow: var(--program-border-shadow) !important; + border : var(--program-border) !important; +} + +.bg-program { + background-color: var(--program-bg) !important; +} + +.bg-program-btn { + background-color: var(--program-btn-bg) !important; +} + +.bg-program-popup { + background-color: var(--program-popup-bg)!important; +} + +.bg-program-title { + background-color: var(--program-title-bg) !important; +} + + + +.no-bgi { + background-image: none !important; +} + +select.no-bgi { + padding-inline-end: calc(0.9375rem - var(--bs-border-width)); +} + +/* pdf출력 설정 */ +select.option-style-select[data-option-style='FILL_STROKE']{ font-weight: bold; } + +select.option-style-select > option[value='FILL_STROKE']{ font-weight: bold; } + +select.option-style-select[data-option-style='gulimche']{ font-family: gulimche; } +select.option-style-select[data-option-style='gulim']{ font-family: gulim; } +select.option-style-select[data-option-style='batangche']{ font-family: batangche; } +select.option-style-select[data-option-style='batang']{ font-family: batang; } +select.option-style-select[data-option-style='dotumche']{ font-family: dotumche; } +select.option-style-select[data-option-style='dotum']{ font-family: dotum; } +select.option-style-select[data-option-style='gungsuhche']{ font-family: gungsuhche; } +select.option-style-select[data-option-style='gungsuh']{ font-family: gungsuh; } + +select.option-style-select > option[value='gulimche']{ font-family: gulimche; } +select.option-style-select > option[value='gulim']{ font-family: gulim; } +select.option-style-select > option[value='batangche']{ font-family: batangche; } +select.option-style-select > option[value='batang']{ font-family: batang; } +select.option-style-select > option[value='dotumche']{ font-family: dotumche; } +select.option-style-select > option[value='dotum']{ font-family: dotum; } +select.option-style-select > option[value='gungsuhche']{ font-family: gungsuhche; } +select.option-style-select > option[value='gungsuh']{ font-family: gungsuh; } + +select.option-style-select[data-option-style='RED']{ color: var(--pdf-red);background-color: var(--pdf-red); } +select.option-style-select[data-option-style='GREEN']{ color: var(--pdf-green);background-color: var(--pdf-green); } +select.option-style-select[data-option-style='BLUE']{ color: var(--pdf-blue);background-color: var(--pdf-blue); } +select.option-style-select[data-option-style='YELLOW']{ color: var(--pdf-yellow);background-color: var(--pdf-yellow); } +select.option-style-select[data-option-style='ORANGE']{ color: var(--pdf-orange);background-color: var(--pdf-orange); } +select.option-style-select[data-option-style='YELLOW_GREEN']{ color: var(--pdf-yellow-green);background-color: var(--pdf-yellow-green); } +select.option-style-select[data-option-style='CYAN']{ color: var(--pdf-cyan);background-color: var(--pdf-cyan); } +select.option-style-select[data-option-style='GREEN_CYAN']{ color: var(--pdf-green-cyan);background-color: var(--pdf-green-cyan); } +select.option-style-select[data-option-style='CYAN_BLUE']{ color: var(--pdf-cyan-blue);background-color: var(--pdf-cyan-blue); } +select.option-style-select[data-option-style='MAGENTA']{ color: var(--pdf-magenta);background-color: var(--pdf-magenta); } +select.option-style-select[data-option-style='VIOLET']{ color: var(--pdf-violet);background-color: var(--pdf-violet); } +select.option-style-select[data-option-style='DEEP_PINK']{ color: var(--pdf-deep-pink);background-color: var(--pdf-deep-pink); } +select.option-style-select[data-option-style='WHITE']{ color: var(--pdf-white);background-color: var(--pdf-white); } +select.option-style-select[data-option-style='LIGHT_GREY']{ color: var(--pdf-light-grey);background-color: var(--pdf-light-grey); } +select.option-style-select[data-option-style='GREY']{ color: var(--pdf-grey);background-color: var(--pdf-grey); } +select.option-style-select[data-option-style='DARK_GREY']{ color: var(--pdf-dark-grey);background-color: var(--pdf-dark-grey); } +select.option-style-select[data-option-style='BLACK']{ color: var(--pdf-black);background-color: var(--pdf-black); } + +select.option-style-select > option[value='RED']{ color: var(--pdf-red);background-color: var(--pdf-red); } +select.option-style-select > option[value='GREEN']{ color: var(--pdf-green);background-color: var(--pdf-green); } +select.option-style-select > option[value='BLUE']{ color: var(--pdf-blue);background-color: var(--pdf-blue); } +select.option-style-select > option[value='YELLOW']{ color: var(--pdf-yellow);background-color: var(--pdf-yellow); } +select.option-style-select > option[value='ORANGE']{ color: var(--pdf-orange);background-color: var(--pdf-orange); } +select.option-style-select > option[value='YELLOW_GREEN']{ color: var(--pdf-yellow-green);background-color: var(--pdf-yellow-green); } +select.option-style-select > option[value='CYAN']{ color: var(--pdf-cyan);background-color: var(--pdf-cyan); } +select.option-style-select > option[value='GREEN_CYAN']{ color: var(--pdf-green-cyan);background-color: var(--pdf-green-cyan); } +select.option-style-select > option[value='CYAN_BLUE']{ color: var(--pdf-cyan-blue);background-color: var(--pdf-cyan-blue); } +select.option-style-select > option[value='MAGENTA']{ color: var(--pdf-magenta);background-color: var(--pdf-magenta); } +select.option-style-select > option[value='VIOLET']{ color: var(--pdf-violet);background-color: var(--pdf-violet); } +select.option-style-select > option[value='DEEP_PINK']{ color: var(--pdf-deep-pink);background-color: var(--pdf-deep-pink); } +select.option-style-select > option[value='WHITE']{ color: var(--pdf-white);background-color: var(--pdf-white); } +select.option-style-select > option[value='LIGHT_GREY']{ color: var(--pdf-light-grey);background-color: var(--pdf-light-grey); } +select.option-style-select > option[value='GREY']{ color: var(--pdf-grey);background-color: var(--pdf-grey); } +select.option-style-select > option[value='DARK_GREY']{ color: var(--pdf-dark-grey);background-color: var(--pdf-dark-grey); } +select.option-style-select > option[value='BLACK']{ color: var(--pdf-black);background-color: var(--pdf-black); } + + +.modal-body-min { + min-height:10em; + min-width:30%; +} + + +.border-separator-y { + border-top:1px solid #dfdfdf; + border-bottom:1px solid #dfdfdf; +} + +.border-separator-t { + border-top:1px solid #dfdfdf; +} + +.border-separator-b { + border-bottom:1px solid #dfdfdf; +} + +.fit-contain { + object-fit: contain; +} + +body:not(.root-privacy-on) td.privacy-cell span:nth-child(1){ + display:block; +} + +body:not(.root-privacy-on) td.privacy-cell span:nth-child(2){ + display:none; +} + +body.root-privacy-on td.privacy-cell span:nth-child(1){ + display:none; +} +body.root-privacy-on td.privacy-cell span:nth-child(2){ + display:block; +} \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.eot new file mode 100644 index 00000000..7c274d92 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.otf new file mode 100644 index 00000000..ee8f9db8 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.woff new file mode 100644 index 00000000..0cb85829 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.woff2 new file mode 100644 index 00000000..288a5841 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Black.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.eot new file mode 100644 index 00000000..a3a402a4 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.otf new file mode 100644 index 00000000..936a25d5 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.woff new file mode 100644 index 00000000..5c994eec Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.woff2 new file mode 100644 index 00000000..8075f86c Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Bold.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.eot new file mode 100644 index 00000000..6087c592 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.otf new file mode 100644 index 00000000..97321713 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.woff new file mode 100644 index 00000000..117f89f2 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.woff2 new file mode 100644 index 00000000..5cd6b2cc Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-DemiLight.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.eot new file mode 100644 index 00000000..35e63faa Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.otf new file mode 100644 index 00000000..ecd67fad Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.woff new file mode 100644 index 00000000..6608beca Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.woff2 new file mode 100644 index 00000000..ff4d53d6 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Light.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.eot new file mode 100644 index 00000000..37b4540e Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.otf new file mode 100644 index 00000000..15c2009a Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.woff new file mode 100644 index 00000000..81b841aa Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.woff2 new file mode 100644 index 00000000..c452c23a Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Medium.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.eot new file mode 100644 index 00000000..8c6e3776 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.otf new file mode 100644 index 00000000..ce916b31 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.woff new file mode 100644 index 00000000..4c409263 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.woff2 new file mode 100644 index 00000000..838b3ce7 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Regular.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.eot b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.eot new file mode 100644 index 00000000..7060a94a Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.eot differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.otf b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.otf new file mode 100644 index 00000000..5cbef9b1 Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.otf differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.woff b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.woff new file mode 100644 index 00000000..ef6a254f Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.woff differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.woff2 b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.woff2 new file mode 100644 index 00000000..672ba55b Binary files /dev/null and b/src/main/webapp/resources/fonts/notoSansKr/NotoSans-Thin.woff2 differ diff --git a/src/main/webapp/resources/fonts/notoSansKr/fontface.css b/src/main/webapp/resources/fonts/notoSansKr/fontface.css new file mode 100644 index 00000000..001c0833 --- /dev/null +++ b/src/main/webapp/resources/fonts/notoSansKr/fontface.css @@ -0,0 +1,93 @@ +@charset "UTF-8"; + +/** Thin < Light < DemiLight < Regular < Medium < Black < Bold */ + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 100; + font-style: normal; + src: url("../notoSansKr/NotoSans-Thin.eot?") format("eot"), + url("../notoSansKr/NotoSans-Thin.otf") format("opentype"), + url("../notoSansKr/NotoSans-Thin.woff") format("woff"), + url("../notoSansKr/NotoSans-Thin.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 200; + font-style: normal; + src: url("../notoSansKr/NotoSans-Thin.eot?") format("eot"), + url("../notoSansKr/NotoSans-Thin.otf") format("opentype"), + url("../notoSansKr/NotoSans-Thin.woff") format("woff"), + url("../notoSansKr/NotoSans-Thin.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 300; + font-style: normal; + src: url("../notoSansKr/NotoSans-Light.eot?") format("eot"), + url("../notoSansKr/NotoSans-Light.otf") format("opentype"), + url("../notoSansKr/NotoSans-Light.woff") format("woff"), + url("../notoSansKr/NotoSans-Light.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 400; + font-style: normal; + src: url("../notoSansKr/NotoSans-DemiLight.eot?") format("eot"), + url("../notoSansKr/NotoSans-DemiLight.otf") format("opentype"), + url("../notoSansKr/NotoSans-DemiLight.woff") format("woff"), + url("../notoSansKr/NotoSans-DemiLight.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 500; + font-style: normal; + src: url("../notoSansKr/NotoSans-Regular.eot?") format("eot"), + url("../notoSansKr/NotoSans-Regular.otf") format("opentype"), + url("../notoSansKr/NotoSans-Regular.woff") format("woff"), + url("../notoSansKr/NotoSans-Regular.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 600; + font-style: normal; + src: url("../notoSansKr/NotoSans-Medium.eot?") format("eot"), + url("../notoSansKr/NotoSans-Medium.otf") format("opentype"), + url("../notoSansKr/NotoSans-Medium.woff") format("woff"), + url("../notoSansKr/NotoSans-Medium.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 700; + font-style: normal; + src: url("../notoSansKr/NotoSans-Medium.eot?") format("eot"), + url("../notoSansKr/NotoSans-Medium.otf") format("opentype"), + url("../notoSansKr/NotoSans-Medium.woff") format("woff"), + url("../notoSansKr/NotoSans-Medium.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 800; + font-style: normal; + src: url("../notoSansKr/NotoSans-Black.eot?") format("eot"), + url("../notoSansKr/NotoSans-Black.otf") format("opentype"), + url("../notoSansKr/NotoSans-Black.woff") format("woff"), + url("../notoSansKr/NotoSans-Black.woff2") format("woff2"); +} + +@font-face { + font-family: "Noto Sans Korean"; + font-weight: 900; + font-style: normal; + src: url("../notoSansKr/NotoSans-Black.eot?") format("eot"), + url("../notoSansKr/NotoSans-Black.otf") format("opentype"), + url("../notoSansKr/NotoSans-Black.woff") format("woff"), + url("../notoSansKr/NotoSans-Black.woff2") format("woff2"); +} \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/xit-icon.css b/src/main/webapp/resources/fonts/xit-icon.css new file mode 100644 index 00000000..3767cfb3 --- /dev/null +++ b/src/main/webapp/resources/fonts/xit-icon.css @@ -0,0 +1,102 @@ +@charset "UTF-8"; + +.xit-twenty::before { + content: url("./xit-icon/7seg20m.svg"); +} +.xit-fifty::before { + content: url("./xit-icon/7seg50m.svg"); +} + +.xit-korea-post::before { + content: url("./xit-icon/korea-post.svg"); +} + +.xit-org::before { + content: url("./xit-icon/org.svg"); +} + +.xit-sa::before { + content: url("./xit-icon/sa.svg"); +} + +.svg-cctv-fixed:before { + --bs-origin : url("../../file/modifySvg/고정형cctv.svg"); + --bs-active : url("../../file/modifySvg/고정형cctv.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/고정형cctv.svg?modify=alert"); +} + +.svg-cctv-drive:before { + --bs-origin : url("../../file/modifySvg/이동형cctv.svg"); + --bs-active : url("../../file/modifySvg/이동형cctv.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/이동형cctv.svg?modify=alert"); +} + +.svg-crackdown-road:before { + --bs-origin : url("../../file/modifySvg/도보단속.svg"); + --bs-active : url("../../file/modifySvg/도보단속.svg?modify=active"); + --bs-alert : url("../../../../file/modifySvg/도보단속.svg?modify=alert"); +} + +.svg-crackdown-minwon:before { + --bs-origin : url("../../file/modifySvg/민원(즉시단속).svg"); + --bs-active : url("../../file/modifySvg/민원(즉시단속).svg?modify=active"); + --bs-alert : url("../../file/modifySvg/민원(즉시단속).svg?modify=alert"); +} + +.svg-target-lvy:before { + --bs-origin : url("../../file/modifySvg/등록대상.svg"); + --bs-active : url("../../file/modifySvg/등록대상.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/등록대상.svg?modify=alert"); +} + +.svg-target-transfer:before { + --bs-origin : url("../../file/modifySvg/이첩대상.svg"); + --bs-active : url("../../file/modifySvg/이첩대상.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/이첩대상.svg?modify=alert"); +} + +.svg-sendstat-guide:before { + --bs-origin : url("../../file/modifySvg/계도장 발송현황.svg"); + --bs-active : url("../../file/modifySvg/계도장 발송현황.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/계도장 발송현황.svg?modify=alert"); +} + +.svg-sendstat-before:before { + --bs-origin : url("../../file/modifySvg/사전통보 발송현황.svg"); + --bs-active : url("../../file/modifySvg/사전통보 발송현황.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/사전통보 발송현황.svg?modify=alert"); +} + +.svg-sendstat-nop:before { + --bs-origin : url("../../file/modifySvg/고지서 발송현황.svg"); + --bs-active : url("../../file/modifySvg/고지서 발송현황.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/고지서 발송현황.svg?modify=alert"); +} + +.svg-opn-rcp:before { + --bs-origin : url("../../file/modifySvg/접수.svg"); + --bs-active : url("../../file/modifySvg/접수.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/접수.svg?modify=alert"); +} + +.svg-opn-decision:before { + --bs-origin : url("../../file/modifySvg/수용_미수용.svg"); + --bs-active : url("../../file/modifySvg/수용_미수용.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/수용_미수용.svg?modify=alert"); +} + +.svg-opn-selfdrop:before { + --bs-origin : url("../../file/modifySvg/자진취하.svg"); + --bs-active : url("../../file/modifySvg/자진취하.svg?modify=active"); + --bs-alert : url("../../file/modifySvg/자진취하.svg?modify=alert"); +} + +[class^=svg-]:before { + content : var(--bs-origin); +} +[class^=svg-].active-svg:before { + content : var(--bs-active); +} +[class^=svg-].alert-svg:before { + content : var(--bs-alert); +} \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/xit-icon/7seg20m.svg b/src/main/webapp/resources/fonts/xit-icon/7seg20m.svg new file mode 100644 index 00000000..2df729bb --- /dev/null +++ b/src/main/webapp/resources/fonts/xit-icon/7seg20m.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/xit-icon/7seg50m.svg b/src/main/webapp/resources/fonts/xit-icon/7seg50m.svg new file mode 100644 index 00000000..cd312d2c --- /dev/null +++ b/src/main/webapp/resources/fonts/xit-icon/7seg50m.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/xit-icon/korea-post.svg b/src/main/webapp/resources/fonts/xit-icon/korea-post.svg new file mode 100644 index 00000000..7e8d2894 --- /dev/null +++ b/src/main/webapp/resources/fonts/xit-icon/korea-post.svg @@ -0,0 +1,34 @@ + + + + diff --git a/src/main/webapp/resources/fonts/xit-icon/org.svg b/src/main/webapp/resources/fonts/xit-icon/org.svg new file mode 100644 index 00000000..f7e4e117 --- /dev/null +++ b/src/main/webapp/resources/fonts/xit-icon/org.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/resources/fonts/xit-icon/sa.svg b/src/main/webapp/resources/fonts/xit-icon/sa.svg new file mode 100644 index 00000000..3a072535 --- /dev/null +++ b/src/main/webapp/resources/fonts/xit-icon/sa.svg @@ -0,0 +1,935 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/html/inputRsnDialog.html b/src/main/webapp/resources/html/inputRsnDialog.html new file mode 100644 index 00000000..9c3f5d7e --- /dev/null +++ b/src/main/webapp/resources/html/inputRsnDialog.html @@ -0,0 +1,13 @@ +
+
+ +
+
\ No newline at end of file diff --git a/src/main/webapp/resources/html/searchAddr.html b/src/main/webapp/resources/html/searchAddr.html new file mode 100644 index 00000000..bba47504 --- /dev/null +++ b/src/main/webapp/resources/html/searchAddr.html @@ -0,0 +1,251 @@ +
+
+ + + + + + + +
+
+ +
+ +
+ +
+ + +
    +
+
+
+
+
+
+ + + +
+ + diff --git a/src/main/webapp/resources/img/login/loginDeco_02.png b/src/main/webapp/resources/img/login/loginDeco_02.png new file mode 100644 index 00000000..bf82eada Binary files /dev/null and b/src/main/webapp/resources/img/login/loginDeco_02.png differ diff --git a/src/main/webapp/resources/img/login/mainLogo_01.png b/src/main/webapp/resources/img/login/mainLogo_01.png new file mode 100644 index 00000000..ef6c39b0 Binary files /dev/null and b/src/main/webapp/resources/img/login/mainLogo_01.png differ diff --git a/src/main/webapp/resources/img/login/mainLogo_02.png b/src/main/webapp/resources/img/login/mainLogo_02.png new file mode 100644 index 00000000..69b27527 Binary files /dev/null and b/src/main/webapp/resources/img/login/mainLogo_02.png differ diff --git a/src/main/webapp/resources/img/user-circle-solid-24.svg b/src/main/webapp/resources/img/user-circle-solid-24.svg new file mode 100644 index 00000000..84d3257e --- /dev/null +++ b/src/main/webapp/resources/img/user-circle-solid-24.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/webapp/resources/js/fims/cmmn/customElements.js b/src/main/webapp/resources/js/fims/cmmn/customElements.js new file mode 100644 index 00000000..c4cec040 --- /dev/null +++ b/src/main/webapp/resources/js/fims/cmmn/customElements.js @@ -0,0 +1,301 @@ +/************************************************************************** +* doctx 탐지 +**************************************************************************/ +Element.prototype.detectDoctx = function(){ + + let parent = this.parentElement; + + if(parent == null){ + return null; + } + + if(parent.hasAttribute("data-doctx")){ + return parent.getAttribute("data-doctx"); + } + + return parent.detectDoctx(); +} + +/************************************************************************** +* 페이징 표시하는 SPAN +**************************************************************************/ +class PagingInfoSpan extends HTMLSpanElement { + constructor() { + super(); + } + + help(){ + PagingInfoSpan.help(); + } + static help(){ + console.log("클래스명 = PagingInfoSpan"); + console.log("is속성 = paging-info"); + console.log("PagingInfoSpan 페이징 정보를 표시하는 SPAN태그이다."); + } + + connectedCallback(){ + if(this.isConnected){ + let nm = this.getAttribute("name"); + let prefix = nm.substr(0,nm.indexOf("PagingInfo")) + + let doctx = this.getAttribute("data-ref-doctx"); + if(doctx == null){ + doctx = this.detectDoctx(); + } + if(doctx != null){ + this.setAttribute("data-ref-doctx", doctx); + this.id = prefix+"--"+doctx+"PagingInfo"; + } + } + } +} + +customElements.define("paging-info", PagingInfoSpan, { extends: "span" }); + + +/************************************************************************** +* name으로 참조하는 label +**************************************************************************/ +class NameLabel extends HTMLLabelElement { + constructor() { + super(); + } + + help(){ + NameLabel.help(); + } + static help(){ + console.log("클래스명 = NameLabel"); + console.log("is속성 = name-label"); + console.log("id가 아닌 name으로 참조하는 LABEL태그이다."); + } + + connectedCallback(){ + if(this.isConnected){ + + let doctx = this.getAttribute("data-ref-doctx"); + if(doctx == null){ + doctx = this.detectDoctx(); + } + if(doctx != null){ + this.setAttribute("data-ref-doctx", doctx); + if(this.getAttribute("for") != null && this.getAttribute("for").indexOf("--") == -1){ + this.htmlFor = this.getAttribute("for")+"--"+doctx; + } + } + } + } +} + +customElements.define("name-label", NameLabel, { extends: "label" }); + +/************************************************************************** +* name과 doctx로 id를 생성하는 SELECT +**************************************************************************/ +class IdSelect extends HTMLSelectElement { + constructor() { + super(); + } + + help(){ + IdSelect.help(); + } + static help(){ + console.log("클래스명 = IdSelect"); + console.log("is속성 = id-select"); + console.log("name과 doctx로 자신의 id를 생성하는 SELECT태그이다."); + } + + connectedCallback(){ + if(this.isConnected){ + let doctx = this.getAttribute("data-ref-doctx"); + if(doctx == null){ + doctx = this.detectDoctx(); + } + if(doctx != null){ + this.setAttribute("data-ref-doctx", doctx); + this.id = this.getAttribute("name")+"--"+doctx; + } + } + } +} + +customElements.define("id-select", IdSelect, { extends: "select" }); + +/************************************************************************** +* name과 doctx로 id를 생성하는 TEXTAREA +**************************************************************************/ +class IdTextArea extends HTMLTextAreaElement { + constructor() { + super(); + } + + help(){ + IdTextArea.help(); + } + static help(){ + console.log("클래스명 = IdTextArea"); + console.log("is속성 = id-textArea"); + console.log("name과 doctx로 자신의 id를 생성하는 TEXTAREA태그이다."); + } + + connectedCallback(){ + if(this.isConnected){ + let doctx = this.getAttribute("data-ref-doctx"); + if(doctx == null){ + doctx = this.detectDoctx(); + } + if(doctx != null){ + this.setAttribute("data-ref-doctx", doctx); + this.id = this.getAttribute("name")+"--"+doctx; + } + } + } +} + +customElements.define("id-textarea", IdTextArea, { extends: "textarea" }); + +/************************************************************************** +* name과 doctx로 id를 생성하는 INPUT +**************************************************************************/ +class IdInput extends HTMLInputElement { + constructor() { + super(); + } + + help(){ + IdInput.help(); + } + static help(){ + console.log("클래스명 = IdInput"); + console.log("is속성 = id-input"); + console.log("name과 doctx로 자신의 id를 생성하는 INPUT태그이다."); + } + + connectedCallback(){ + if(this.isConnected){ + let doctx = this.getAttribute("data-ref-doctx"); + if(doctx == null){ + doctx = this.detectDoctx(); + } + if(doctx != null){ + this.setAttribute("data-ref-doctx", doctx); + this.id = this.getAttribute("name")+"--"+doctx; + if(this.hasAttribute("list") && this.getAttribute("list").indexOf("--") == -1){ + this.setAttribute("list",this.getAttribute("list")+"--"+doctx); + } + } + } + } +} + +customElements.define("id-input", IdInput, { extends: "input" }); + +/************************************************************************** +* name과 doctx로 id를 생성하는 DATALIST +**************************************************************************/ +class IdDataList extends HTMLDataListElement { + constructor() { + super(); + } + + help(){ + IdDataList.help(); + } + static help(){ + console.log("클래스명 = IdDataList"); + console.log("is속성 = id-datalist"); + console.log("name과 doctx로 자신의 id를 생성하는 DATALIST태그이다."); + } + + + connectedCallback(){ + if(this.isConnected){ + let doctx = this.getAttribute("data-ref-doctx"); + if(doctx == null){ + doctx = this.detectDoctx(); + } + if(doctx != null){ + this.setAttribute("data-ref-doctx", doctx); + this.id = this.getAttribute("name")+"--"+doctx; + } + } + } +} + +customElements.define("id-datalist", IdDataList, { extends: "datalist" }); + + + +/************************************************************************** +* 중괄호 자동 추가 템플릿 +**************************************************************************/ +class CurlyBrackets extends HTMLTemplateElement { + constructor() { + super(); + + let curlyBracketsOpen = String.fromCharCode(123); //중괄호시작 + + let thisCon = this.content; + + let trs = thisCon.querySelectorAll("tr"); + + trs.forEach(function(node) { + let key = node.getAttribute("data-key"); + if(key != null && key != "" && key.indexOf(curlyBracketsOpen) == -1){ + node.setAttribute("data-key","{"+key+"}"); + } + let index = node.getAttribute("data-index"); + if(index != null && index != "" && index.indexOf(curlyBracketsOpen) == -1){ + node.setAttribute("data-index","{"+index+"}"); + } + }); + + let tds = thisCon.querySelectorAll("td"); + tds.forEach(function(node) { + if(node.getAttribute("onclick") != null && node.getAttribute("onclick") == ""){ + node.setAttribute("onclick","{onclick}"); + } + + if(node.getAttribute("ondblclick") != null && node.getAttribute("ondblclick") == ""){ + node.setAttribute("ondblclick","{ondblclick}"); + } + + if(node.childElementCount == 0){ + if(node.textContent.trim() != "" && node.textContent.indexOf(curlyBracketsOpen) == -1){ + node.textContent = "{"+node.textContent.trim()+"}"; + } + } + }); + + let tdCheckboxes = thisCon.querySelectorAll("td>input[type='checkbox']"); + tdCheckboxes.forEach(function(node) { + if(node.getAttribute("value") != null && node.getAttribute("value") != "" && node.getAttribute("value") != "on"){ + node.setAttribute("value","{"+node.getAttribute("value")+"}"); + } + if(node.getAttribute("onchange") != null && node.getAttribute("onchange") == ""){ + node.setAttribute("onchange","{onchange}"); + } + }); + + let tdRadios = thisCon.querySelectorAll("td>input[type='radio']"); + tdRadios.forEach(function(node) { + if(node.getAttribute("value") != null && node.getAttribute("value") != "" && node.getAttribute("value") != "on"){ + node.setAttribute("value","{"+node.getAttribute("value")+"}"); + } + if(node.getAttribute("onchange") != null && node.getAttribute("onchange") == ""){ + node.setAttribute("onchange","{onchange}"); + } + }); + } + + help(){ + CurlyBrackets.help(); + } + static help(){ + console.log("클래스명 = CurlyBrackets"); + console.log("is속성 = curly-brackets"); + console.log("그리드 렌더링시 중괄호가 빠진 부분을 자동으로 추가하는 TEMPLATE태그이다."); + } +} +customElements.define("curly-brackets", CurlyBrackets, { extends: "template" }); diff --git a/src/main/webapp/resources/js/fims/cmmn/fims-base.js b/src/main/webapp/resources/js/fims/cmmn/fims-base.js new file mode 100644 index 00000000..2966b4a4 --- /dev/null +++ b/src/main/webapp/resources/js/fims/cmmn/fims-base.js @@ -0,0 +1,519 @@ +if(window.help !== undefined){ + help.prototype.list.push("FimsFormFields 클래스 : FormFields클래스를 상속받은 FIMS프로젝트 내에서 사용하는 FormFields클래스"); + help.prototype.list.push("pageObject 객체 : HTML화면별 스크립트 모음"); + help.prototype.list.push("DoctxFinder 클래스 : DomQuery를 상속받은 클래스. pageObject객체의 내부 요소는 해당 클래스의 인스턴스이다."); +} + +/************************************************************************** +* FimsFormFields +**************************************************************************/ +class FimsFormFields extends FormFields { + + help(){ + FimsFormFields.help(); + } + + static help(){ + console.log("FimsFormFields 클래스 : FormFields클래스를 상속받은 FIMS프로젝트 내에서 사용하는 FormFields클래스"); + } + + /** + * form 에 json data set + * element tag에 data-fmt-type 으로 데이타 format이 지정된 경우 해당 포맷으로 출력 + * @param {object} formObj document.querySelector('form') + * @param {object} jsonData json type data + */ + set(ctrl,obj){ + + document.querySelectorAll(this.children).forEach(input => { + + let prop = input.getAttribute("data-map") + || input.name + || input.id; + if (!prop) return; + + let dataItem = obj instanceof DataItem, + value = dataItem ? obj.getValue(prop) : obj[prop]; + + if ("radio" == input.type) { + if (value && value == input.value) + input.checked = true; + } else if("checkbox" == input.type) { + if (value && value == input.value) + input.checked = ("Y" === value); + } else if(input.tagName == "SELECT") { + for(let option of input.options) { + if(option.value == value){ + option.selected = true; + } else { + option.selected = false; + } + } + } else { + if(value == null){ + value = ""; + } + // element data-fmt-type에 정의된 format 적용 + // dt - yyyy-mm-dd HH:mm:ss, day - yyyy-mm-dd, time - HH:mm:ss, number - #,### + if(input.dataset.fmtType){ + const fmtType = input.dataset.fmtType; + switch (fmtType) { + case 'dt' : + value = datetimeFormat.parse(value); + value = datetimeFormat.format(value); + break; + case 'day' : + value = dateFormat.parse(value); + value = dateFormat.format(value); + break; + case 'time' : + value = timeFormat.parse(value); + value = timeFormat.format(value); + break; + case 'number' : + value = numberFormat.parse(value); + value = numberFormat.format(value); + break; + default: + break; + } + } + if(input.name){ + if($(input).hasClass('form-date')){ + $(input).datepicker("setDate", value); + } else { + input.value = value; + } + + //보안모드 마스킹 항목 + if(input.tagName === 'INPUT' && input.id && input.classList.contains("privacy")){ + let maskVal = value.replace(/./g, "*"); + document.getElementById("mask-"+input.id).value = maskVal; + } + } + + } + }); + + + } + + get() { + let obj = {}; + document.querySelectorAll(this.children).forEach(input => { + if(input.tagName == "INPUT" || input.tagName == "SELECT" || input.tagName == "TEXTAREA"){ + let property = input.name || input.id; + let value = input.value; + if("radio" == input.type) { + if(input.checked) + obj[property] = value; + } else if("checkbox" == input.type) { + if(input.checked){ + if(obj[property]){ + obj[property] += ","+value; + } else { + obj[property] = value; + } + } + } else { + if(input.dataset.fmtType){ + const fmtType = input.dataset.fmtType; + switch (fmtType) { + case 'dt' : + value = value.replaceAll("-","").replaceAll(":","").replaceAll(" ",""); + break; + case 'day' : + value = value.replaceAll("-",""); + break; + case 'time' : + value = value.replaceAll(":",""); + break; + case 'number' : + value = value.replaceAll(",",""); + break; + default: + break; + + } + } + obj[property] = value; + } + } + }); + return obj; + } +} + +function newFimsFormFields(conf){ + return new FimsFormFields(conf); +} + +/************************************************************************** +* data-doctx,name 어트리뷰트로 찾기 +**************************************************************************/ +function newDoctxFinder(doctx){ + let finder = new DoctxFinder(doctx); + return finder; +} + +class DoctxFinder extends DomQuery { + constructor(doctx) { + super(); + this.setContainers("[data-doctx='"+doctx+"']"); + this.doctx = doctx; + } + + help(){ + console.log("현재 doctx = "+this.doctx); + DoctxFinder.help(); + } + static help(){ + console.log("클래스명 = DoctxFinder"); + console.log("newDoctxFinder(doctx명)로 인스턴스를 생성할 수 있다."); + console.log("클래스 메서드 목록"); + console.log("selectorn(요소이름) : 문자열 [data-doctx='설정된doctx'] [name='요소이름'] 을 반환한다."); + console.log("findn(요소이름) : data-doctx속성이 설정된doctx인 요소 내에서 name속성이 요소이름인 HTML요소를 반환한다."); + console.log("$findn(요소이름) : data-doctx속성이 설정된doctx인 요소 내에서 name속성이 요소이름인 제이쿼리 객체를 반환한다."); + console.log("selfElement() : data-doctx속성이 설정된doctx인 HTML요소를 반환한다."); + console.log("selfDlgId() : data-doctx속성이 설정된doctx인 HTML요소를 갖는 모달창의 id를 반환한다."); + console.log("refDlgId(모달창이름) : data-ref-doctx속성이 설정된doctx이고 name속성이 모달창이름인 모달창의 id를 반환한다."); + } + + selectorn(name){ + return this.selector("[name='"+name+"']"); + } + findn(name){ + return this.find("[name='"+name+"']"); + } + $findn(name){ + return $(document.querySelector("[data-doctx='"+this.doctx+"']")).find("[name='"+name+"']"); + } + + selfElement(){ + return document.querySelector("[data-doctx='"+this.doctx+"']"); + } + selfDlgId(){ + if($(this.selfElement()).parents(".modal").length > 0){ + return $(this.selfElement()).parents(".modal")[0].id; + } else { + return ""; + } + } + refDlgId(dlgName){ + if($(".modal[data-ref-doctx='"+this.doctx+"'][name='"+dlgName+"']").length > 0){ + return $(".modal[data-ref-doctx='"+this.doctx+"'][name='"+dlgName+"']")[0].id; + } else { + return ""; + } + } + +} + + +/************************************************************************** +* jquery.fn 커스텀 - UI요소 값 세팅 +**************************************************************************/ +$.fn.set = function(value) { + return this.each(function(){ + if($(this).hasClass('form-date')){ + if(value != null && value.length == 8 && value.indexOf("-") == -1){ + value = value.substring(0,4) + "-" + value.substring(4,6) + "-" + value.substring(6,8); + } + $(this).datepicker("setDate", value); + } else if($(this).hasClass('option-style-select')){ + $(this).val(value); + this.changeUI(); + } else if(this.type == "checkbox" || this.type == "radio"){ + if(this.value == value){ + $(this).prop("checked", true); + } else { + $(this).prop("checked", false); + } + } else { + if(this.dataset.fmtType == "number"){ + $(this).val(numberFormat.format(value)); + } else { + $(this).val(value); + } + } + }); +} + +/************************************************************************** +* Dataset 관련 적용 기능 +**************************************************************************/ +const Apply = { + fromDatasetControl : { + load : async function(control, pageNum){ + return new Promise((resolve, reject) => { + control.query.pageNum = pageNum; + if (!control.query.pageNum){ + control.query.pageNum = 1; + } + ajax.get({ + url:control.urls.load, + data:control.query, + success:(resp) => { + resolve(resp); + } + }); + }); + }, + reload : async function(control){ + return new Promise((resolve, reject) => { + var orgnQuery = Object.assign({}, control.query); + control.query.fetchSize = control.defaultFetchSize * control.query.pageNum; + control.query.pageNum = 1; + + ajax.get({ + url:control.urls.load, + data:control.query, + success:(resp) => { + control.query.pageNum = orgnQuery.pageNum; + control.query.fetchSize = orgnQuery.fetchSize; + resolve(resp); + } + }); + }); + } + }, + fromDataset : { + gridCheckbox : function(dataset, tbody, colIndex, checkedArr){ + + var keys = checkedArr.map(item => dataset.getKey(item)); + + $(tbody).find("tr").each(function() { + var cb = $(this).find("td").eq(colIndex).find(":checkbox"); + cb.prop("checked", keys.includes(cb.val())); + }); + + }, + gridButton : function(dataset, button, checkedArr){ + var keys = checkedArr.map(item => dataset.getKey(item)); + $(button).prop("disabled", keys.length < 1); + }, + currentRow : function(dataset, dataItem, tbody){ + if(!dataItem){ + return; + } + $(tbody).setCurrentRow(dataset.getKey(dataItem)); + }, + paging : function(dataset, resp, navUl, navSpan){ + + let id = navSpan.id; + let pf = id.substr(0,id.indexOf("PagingInfo")); + + $(navUl).setPagingInfo({ + list : dataset, + prefix : pf, + totalSize : resp["Total"] + }); + + }, + getTbody : function(dataset, found, notFound, replacer){ + var empty = dataset.empty; + var trs = empty ? notFound : dataset.inStrings(found, replacer); + return trs.join(); + }, + getTodoCurrent : function(dataset, beforeCurrent, columnName){ + + let di = null; + if(beforeCurrent == null){ + return null; + } + if(dataset.empty){ + return null; + } + + let filtered = dataset.getDataset("item").filter(item => item.data[columnName] == beforeCurrent.primaryKey); + if(filtered.length > 0){ + di = filtered[0]; + return di; + } + + let otherInfo; + if(beforeCurrent.arrayIndex > (dataset.length - 1)){ + di = dataset.getDataset("item")[dataset.length - 1]; + } else { + di = dataset.getDataset("item")[beforeCurrent.arrayIndex]; + } + + return di; + } + }, + toDataset : { + current : function(dataset, dataKey){ + dataset.setCurrent(dataKey, false); + }, + selection : function(dataset, checkbox, bool){ + + var parentEl = $(checkbox).parent()[0]; + var isTH = parentEl.tagName == "TH" ? true : false; + + if(isTH) { + var dataItems = dataset.getDataset("item"); + + for(var i=0; i < dataItems.length; i++){ + dataItems[i].select(bool); + } + } else { + var dataItem = dataset.getData(checkbox.value, "item"); + dataItem.select(bool); + } + }, + set : function(dataset, resp){ + dataset._byKeys = {}; + dataset._current = null; + resp = resp || {}; + var data = dataset._getDataItems(resp,{}); + + dataset._items = data.items; + dataset._byKeys = data.byKeys; + }, + add : function(dataset, resp){ + if (dataset.empty){ + this.set(dataset, resp); + return; + } + var state = dataset.state; + resp = resp || {}; + var data = dataset._getDataItems(resp,{}); + dataset._items = this._items.concat(data.items); + dataset._byKeys = { + ...this._byKeys, + ...data.byKeys + }; + } + } + +}; + +/************************************************************************** +* 그리드 관련 기능 +**************************************************************************/ +const GRID = { + fromResp : { + setPagingInfo : function(respList, respPaging, navUl, navSpan){ + let pagination = {}; + + let id = navSpan.id; + pagination.prefix = id.substr(0,id.indexOf("PagingInfo")); + + let dl = 0; + if(respList != null) { + dl = respList.length; + } + + let s = 0; + let ts = 0; + if(respPaging && respPaging.start) { + s = respPaging.start; + } + if(respPaging && respPaging.totalSize) { + ts = respPaging.totalSize; + } + pagination.totalSize = ts; + pagination.dataLength = s + dl; + + $(navUl).setPagingInfo(pagination); + } + }, + setCurrentRow : function(evTarget){ + if(evTarget instanceof HTMLTableCellElement){ + let tr = evTarget.parentElement; + let tbody = tr.parentElement; + + for (let sibling of tdElement.parentNode.children) { + sibling.classList.remove('current-row'); + } + tr.classList.add('current-row'); + } else if(evTarget instanceof HTMLTableRowElement){ + let tr = evTarget; + let tbody = tr.parentElement; + + for (let sibling of tdElement.parentNode.children) { + sibling.classList.remove('current-row'); + } + tr.classList.add('current-row'); + } + }, + checkbox : { + sync : function(checkboxElement, bool){ + var parentEl = $(checkboxElement).parent()[0]; + var isTH = parentEl.tagName == "TH" ? true : false; + var tr = $(checkboxElement).parents("tr"); + var siblingTag = isTH ? "TH" : "TD"; + var siblings = tr.find(siblingTag); + var checkboxColIndex = siblings.index(parentEl); + + var table = $(checkboxElement).parents("table"); + var thead = table.find("thead"); + var tbody = table.find("tbody"); + var trs = tbody.find("tr"); + + if(isTH) { + + trs.each(function(){ + $(this).find("td").eq(checkboxColIndex).find(":checkbox").prop("checked", bool); + }); + + } else { + var allChecked = false; + var cbLength = 0; + var checkedLength = 0; + + trs.each(function(){ + var cb = $(this).find("td").eq(checkboxColIndex).find(":checkbox"); + if(cb.length > 0){ + cbLength++; + if(cb.is(":checked")){ + checkedLength++; + }; + } + }); + + if(cbLength == checkedLength){ + allChecked = true; + } + + if(allChecked){ + thead.find(":checkbox").prop("checked", true); + } else { + thead.find(":checkbox").prop("checked", false); + } + + } + }, + countChecked : function(checkboxElement){ + + var parentEl = $(checkboxElement).parent()[0]; + var tr = $(checkboxElement).parents("tr").eq(0); + var table = $(checkboxElement).parents("table").eq(0); + + var checkboxColIndex = null; + if(parentEl.tagName == "TH"){ + var siblings = tr.find("TH"); + checkboxColIndex = siblings.index(parentEl); + } else if(parentEl.tagName == "TD"){ + var siblings = tr.find("TD"); + checkboxColIndex = siblings.index(parentEl); + } else { + return null; + } + + var tbody = table.find("tbody"); + var trs = tbody.find("tr"); + + var count = 0; + trs.each(function(){ + var cb = $(this).find("td").eq(checkboxColIndex).find(":checkbox"); + if(cb.length > 0){ + if(cb.is(":checked")) { + count++; + } + } + }); + return count; + } + } +}; diff --git a/src/main/webapp/resources/js/fims/cmmn/fims-componentization.js b/src/main/webapp/resources/js/fims/cmmn/fims-componentization.js new file mode 100644 index 00000000..426279f0 --- /dev/null +++ b/src/main/webapp/resources/js/fims/cmmn/fims-componentization.js @@ -0,0 +1,230 @@ +if(window.help !== undefined){ + help.prototype.list.push("FimsComponentization 클래스 : 특정 HTML요소에 기능을 추가할 수 있다."); +} + +class FimsComponentization { + + static help(){ + console.log("fnMakeSpinnerSelect(셀렉트박스,이전버튼,다음버튼) : 특정 셀렉트박스를 버튼클릭으로 옵션 선택 가능한 셀렉트박스로 만든다."); + console.log("fnMakeOptionStyleSelect(셀렉트박스) : 특정 셀렉트박스를 선택된 옵션의 스타일이 적용된 셀렉트박스로 만든다."); + console.log("fnMakeRowSpinner(테이블row,up버튼,down버튼,스크롤컨테이너,validator) : 특정 테이블을 행 위치 이동이 가능한 테이블로 만든다."); + console.log("fnMakeSingleImageViewer(img태그,fileInput태그,파일경로속성명,파일이름속성명) : 특정 이미지 태그를 단일 업로드 이미지 뷰어로 만든다."); + } + + /************************************************************************** + * 특정 셀렉트박스를 버튼클릭으로 옵션 선택 가능한 셀렉트박스로 만든다. + **************************************************************************/ + static fnMakeSpinnerSelect(selectEl, prevBtnEl, nextBtnEl){ + + $(selectEl).on("animationend", function(){ + $(selectEl).removeClass("highlight-once"); + }); + $(prevBtnEl).on("click", function(){ + var selected = $(selectEl).find("option:selected"); + var prev = selected.prev(); + if(prev.length >= 1){ + $(selectEl).val(prev.val()); + } else { + $(selectEl).addClass("highlight-once"); + } + }); + $(nextBtnEl).on("click", function(){ + var selected = $(selectEl).find("option:selected"); + var next = selected.next(); + if(next.length >= 1){ + $(selectEl).val(next.val()); + } else { + $(selectEl).addClass("highlight-once"); + } + }); + } + + /************************************************************************** + * 특정 셀렉트박스를 선택된 옵션의 스타일이 적용된 셀렉트박스로 만든다. + **************************************************************************/ + static fnMakeOptionStyleSelect(selectEl){ + $(selectEl).addClass("option-style-select"); + + selectEl.changeUI = function(){ + + var selected = $(this).find("option:selected"); + + if(selected.length <= 0){ + selectEl.dataset.optionStyle = ""; + selectEl.title = ""; + return; + } + + selectEl.dataset.optionStyle = selected.val(); + selectEl.title = selected[0].title; + }; + + $(selectEl).on("change", function(){ + selectEl.changeUI(); + }); + + selectEl.changeUI(); + } + + /************************************************************************** + * 특정 테이블을 행 위치 이동 가능한 테이블로 만든다. + **************************************************************************/ + static fnMakeRowSpinner(tableRowEl, upBtnEl, downBtnEl, scrollEl, validFunc){ + + if(validFunc != undefined && validFunc != null){ + tableRowEl.validForComponent = validFunc; + } else { + tableRowEl.validForComponent = function(eventInfo){ + return true; + }; + } + + $(upBtnEl).on("click", function(){ + var tbody = $(tableRowEl).parent(); + + var theadHeight = $(scrollEl).find("thead").outerHeight(); + var scrollElStart = $(scrollEl).offset().top + theadHeight; + var scrollElHeight = $(scrollEl).height() - theadHeight - VERTICAL_SCROLL_HEIGHT; + var scrollMiddle = scrollElStart + (scrollElHeight/2); + + if($(tableRowEl).index() == 0){ + return; + } + + var beforeIndex = $(tableRowEl).index() - 1; + var beforeTr = $(tbody).find("tr").eq(beforeIndex); + + + var eventInfo = { + clickedButtonType : "up", + currentRow : tableRowEl, + siblingRow : beforeTr + }; + if(!tableRowEl.validForComponent(eventInfo)){ + return; + } + + + var rowStart = beforeTr.offset().top; + var rowHeight = beforeTr.outerHeight(); + var rowMiddle = rowStart+(rowHeight/2); + + beforeTr.before(tableRowEl); + + if(rowMiddle < scrollMiddle){ + var move = scrollMiddle - rowMiddle; + $(scrollEl).scrollTop($(scrollEl).scrollTop() - move); + } + + $(tbody).find("tr").removeClass("current-row"); + $(tableRowEl).addClass("current-row"); + }); + + $(downBtnEl).on("click", function(){ + var tbody = $(tableRowEl).parent(); + + var theadHeight = $(scrollEl).find("thead").outerHeight(); + var scrollElStart = $(scrollEl).offset().top + theadHeight; + var scrollElHeight = $(scrollEl).height() - theadHeight - VERTICAL_SCROLL_HEIGHT; + var scrollMiddle = scrollElStart + (scrollElHeight/2); + + if($(tableRowEl).index() == ($(tbody).children().length) - 1){ + return; + } + + var afterIndex = $(tableRowEl).index() + 1; + var afterTr = $(tbody).find("tr").eq(afterIndex); + + + var eventInfo = { + clickedButtonType : "down", + currentRow : tableRowEl, + siblingRow : afterTr + }; + if(!tableRowEl.validForComponent(eventInfo)){ + return; + } + + + var rowStart = afterTr.offset().top; + var rowHeight = afterTr.outerHeight(); + var rowMiddle = rowStart+(rowHeight/2); + + afterTr.after(tableRowEl); + + if(rowMiddle > scrollMiddle){ + var move = rowMiddle - scrollMiddle; + $(scrollEl).scrollTop($(scrollEl).scrollTop() + move); + } + + $(tbody).find("tr").removeClass("current-row"); + $(tableRowEl).addClass("current-row"); + }); + + + } + + /************************************************************************** + * 특정 이미지 태그를 단일 업로드 이미지 뷰어로 만든다. + **************************************************************************/ + static fnMakeSingleImageViewer(imgEl, fileInputEl, dataAttributeForFilePath, dataAttributeForFileName){ + + $(imgEl).on("click", function(){ + $(fileInputEl).click(); + }); + + $(fileInputEl).on("change", function(){ + + if(this.files != null && this.files.length > 0){ + $(imgEl).attr("alt", this.files[0].name); + $(imgEl).attr("src", (window.URL || window.webkitURL).createObjectURL(this.files[0])); + + } else { + + var orgnName = $(imgEl).attr("data-"+dataAttributeForFileName); + var orgnPath = $(imgEl).attr("data-"+dataAttributeForFilePath); + + if(orgnPath != undefined && orgnPath != null && orgnPath != ""){ + $(imgEl).attr("alt", orgnName); + $(imgEl).attr("src", orgnPath); + } else { + $(imgEl).attr("alt", "파일이 없습니다."); + $(imgEl).attr("src", "/webjars/applib/img/no-image.svg"); + } + + } + + }); + } + + static getBrowserName() { + var agent = navigator.userAgent.toUpperCase(); + if (agent.indexOf('TRIDENT') >= 0) { + return 'IE'; + } else if (agent.indexOf('FIREFOX') >= 0) { + return 'FIREFOX'; + } else if (agent.indexOf('EDG') >= 0) { + return 'EDGE'; + } else if (agent.indexOf('CHROME') >= 0) { + return 'CHROME'; + } else if (agent.indexOf('SAFARI') >= 0) { + return 'SAFARI'; + } else { + return ''; + } + } +} + +const BROWSER_NAME = FimsComponentization.getBrowserName(); +var VERTICAL_SCROLL_HEIGHT = 14; +switch(BROWSER_NAME){ + case "EDGE" : + VERTICAL_SCROLL_HEIGHT = 14; + break; + case "FIREFOX" : + VERTICAL_SCROLL_HEIGHT = 15; + break; + case "CHROME" : + VERTICAL_SCROLL_HEIGHT = 15; + break; +} \ No newline at end of file diff --git a/src/main/webapp/resources/js/fims/cmmn/fims-support.js b/src/main/webapp/resources/js/fims/cmmn/fims-support.js new file mode 100644 index 00000000..1f1ad78d --- /dev/null +++ b/src/main/webapp/resources/js/fims/cmmn/fims-support.js @@ -0,0 +1,555 @@ +if(window.help !== undefined){ + help.prototype.list.push("FimsSupport 클래스 : FIMS프로젝트 내에서 공통적으로 사용할 수 있는 기능 지원"); + help.prototype.list.push("FimsPagingSupport 클래스 : 스크롤 페이징 정보 표시 지원"); +} + +/************************************************************************** +* FimsSupport +**************************************************************************/ +class FimsSupport { + + static help(){ + console.log("메소드 목록"); + console.log("fnMenualDownload() : 메뉴얼 다운로드"); + console.log("mappingButtonAndMenu(버튼id, 메뉴이름) : 버튼과 메뉴를 매핑한다."); + console.log("fnDownsizeToggle(th객체) : 테이블 컬럼 축소 여부 변경"); + console.log("fnDownsizeCheck(html테이블객체) : 테이블 렌더링 후 축소 처리할 컬럼 확인"); + console.log("countCrdnByVhrno(차량번호, 업무구분코드, 시군구코드) : 차량번호로 단속 건수 조회"); + console.log("countCvlcptDscsnByVhrno(차량번호, 업무구분코드, 시군구코드) : 차량번호로 민원상담 건수 조회"); + console.log("getVhclInfo(시군구코드, 차량번호, 기준일자) : 시군구코드, 차량번호, 기준일자로 차적 조회"); + console.log("getVhclDisabledParkingInfo(차량번호) : 장애인 차량여부 조회"); + console.log("searchFromGridTitle(키워드영문명, 키워드한글명, 메인옵션, 추가옵션) : 그리드의 특정 열 값을 키워드로 자료 조회"); + console.log("renderForTask(렌더링영역객체, 업무class속성명) : 업무구분별 화면 렌더링"); + console.log("registShortcutKey() : 단축키 등록"); + console.log("getActiveRootTabArea() : 현재 활성화된 최상위 탭 영역을 반환한다."); + console.log("fnJsonToFormData(json,배열이름) : son객체 안의 jsonArray를 FormData형식의 키로 치환한다."); + console.log("fnJsonArrayToFormData(json배열,배열이름) : jsonArray를 FormData형식의 키를 갖는 json으로 치환한다."); + console.log("getCellDefsForPrivacyCell(TD태그의 제이쿼리 객체) : 엑셀다운로드시 개인정보 포함된 셀의 컬럼명을 추출하는 함수"); + console.log("openPDF(blob객체,새 창 이름) : PDF파일 미리보기 창 열기"); + console.log("fnProgress(sse키, progress팝업화면 내용, progress응답시 처리 메소드) : 프로그레스바 표시"); + } + + /************************************************************************** + * 메뉴얼 다운로드 + **************************************************************************/ + static fnMenualDownload(){ + var filenameInHeader = ""; + + fetch(wctx.url("/file/downloadMenual.do")) + .then((response) => { + var header = response.headers.get('Content-Disposition'); + console.log(header); + var parts = header.split(';'); + filenameInHeader = parts[1].split('=')[1]; + if(filenameInHeader.startsWith("\"") && filenameInHeader.endsWith("\"")){ + filenameInHeader = filenameInHeader.substring(1,filenameInHeader.length-1); + } + filenameInHeader = decodeURIComponent(filenameInHeader); + return response.blob(); + }) + .then((blob) => { + + var URL = window.URL || window.webkitURL; + var downloadUrl = URL.createObjectURL(blob); + + var a = document.createElement("a"); + a.href = downloadUrl; + a.download = filenameInHeader; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + + }); + + } + + /************************************************************************** + * 버튼과 메뉴를 매핑한다. + **************************************************************************/ + static mappingButtonAndMenu(buttonId, menuNm){ + $("#"+buttonId).on( "click", function() { + $("#menus").find("div[data-i18n='"+menuNm+"']").parent("a").trigger("click"); + }); + } + + /************************************************************************** + * 테이블 컬럼 축소 여부 변경 + **************************************************************************/ + static fnDownsizeToggle(thObj) { + + $(thObj).toggleClass("downsize"); + + var thIndex = $(thObj).index(); + + var setValue = ""; + if($(thObj).hasClass("downsize")){ + setValue = "160px"; + } + + var tbody = $(thObj).parent("tr").parent("thead").next("tbody"); + if(tbody.length < 1){ + return; + } + + var trs = tbody.find("tr"); + + if(trs.length < 1){ + return; + } + + if(trs.length == 1 && trs.find("td").length <= 1){ + return; + } + + trs.each(function(){ + $(this).find("td:eq("+thIndex+")").css("max-width",setValue); + }); + + } + + /************************************************************************** + * 테이블 렌더링 후 축소 처리할 컬럼 확인 + **************************************************************************/ + static fnDownsizeCheck(tableObj) { + $(tableObj).find("thead tr th").each(function(){ + var thIndex = $(this).index(); + if($(this).hasClass("downsize")){ + var trs = $(this).parent("tr").parent("thead").next("tbody").find("tr"); + trs.each(function(){ + $(this).find("td:eq("+thIndex+")").css("max-width","160px"); + }); + } + }); + } + + /************************************************************************** + * 차량번호로 단속 건수 조회 + **************************************************************************/ + static async countCrdnByVhrno(vhrno, taskSeCd, sggCd){ + return new Promise((resolve, reject) => { + json.get({ + url: wctx.url("/"+taskSeCd+"/crdn/crdn06/010/nocs.do"), + data: { + vhrno : vhrno, + taskSeCd : taskSeCd, + sggCd : sggCd + }, + success: function(resp, textStatus, jqXHR) { + resolve(resp); + }, + error: function(jqXHR, textStatus, error) { + } + }); + }); + } + + /************************************************************************** + * 차량번호로 민원상담 건수 조회 + **************************************************************************/ + static async countCvlcptDscsnByVhrno(vhrno, taskSeCd, sggCd){ + return new Promise((resolve, reject) => { + json.get({ + url: wctx.url("/"+taskSeCd+"/sprt/sprt04/010/nocs.do"), + data: { + vhrno : vhrno, + taskSeCd : taskSeCd, + sggCd : sggCd + }, + success: function(resp, textStatus, jqXHR) { + resolve(resp); + }, + error: function(jqXHR, textStatus, error) { + } + }); + }); + } + + /************************************************************************** + * 시군구코드, 차량번호, 기준일자로 차적 조회 + **************************************************************************/ + static async getVhclInfo(sggCd, vhrno, levy_stdde){ + return new Promise((resolve, reject) => { + json.post({ + url: wctx.url("/payer/vehicle.do"), + data: { + sggCd : sggCd, + vhrno : vhrno, + levy_stdde : levy_stdde + }, + success: function(resp, textStatus, jqXHR) { + resolve(resp); + }, + error: function(jqXHR, textStatus, error) { + } + }); + }); + }; + + /************************************************************************** + * 장애인 차량여부 조회 + **************************************************************************/ + static async getVhclDisabledParkingInfo(vhrno){ + return new Promise((resolve, reject) => { + json.get({ + url: wctx.url("/intf/disabledParking/parkingInfo"), + data: { + vehicleNo : vhrno + }, + success: function(resp, textStatus, jqXHR) { + resolve(resp); + }, + error: function(jqXHR, textStatus, error) { + } + }); + }); + } + + /************************************************************************** + * 그리드의 특정 열 값을 키워드로 자료 조회 + **************************************************************************/ + static searchFromGridTitle(byValue, byOutputValue, mainOption, subOption){ + var tr = event.target.parentElement; + + if($(tr).attr("data-search-target") == null || $(tr).attr("data-search-target") == ""){ + + var trDataset = tr.dataset; + + var byElementId = trDataset.by; + var byOutputElementId = trDataset.byOutput; + var mainOptionElementId = trDataset.mainOption; + var subOptionElementId = trDataset.subOption; + + document.getElementById(byElementId).value = StringSupport.snakeToCamel(byValue); + document.getElementById(byOutputElementId).value = byOutputValue; + + document.getElementById(mainOptionElementId).value = mainOption; + document.getElementById(subOptionElementId).value = subOption; + } else { + + let byEl = $($(tr).attr("data-search-target")).find("[name='by']")[0]; + let byOutputEl = $($(tr).attr("data-search-target")).find("[name='byOutput']")[0]; + let mainOptionEl = $($(tr).attr("data-search-target")).find("[name='mainOption']")[0]; + let subOptionEl = $($(tr).attr("data-search-target")).find("[name='subOption']")[0]; + + byEl.value = StringSupport.snakeToCamel(byValue); + byOutputEl.value = byOutputValue; + mainOptionEl.value = mainOption; + subOptionEl.value = subOption; + } + + } + + /************************************************************************** + * 업무구분별 화면 렌더링 + **************************************************************************/ + static renderForTask(areaId, taskClass){ + var slotAreas; + if(typeof areaId == "string"){ + slotAreas = $("#"+areaId).find("[slot]"); + } else { + slotAreas = $(areaId).find("[slot]"); + } + + slotAreas.each(function(){ + if($(this).hasClass("if-empty-col0")){ + if(!isEmpty($(this).attr("data-original-col-size"))){ + let colSize = $(this).attr("data-original-col-size"); + $(this).removeClass("col-0"); + $(this).addClass(colSize); + $(this).attr("data-original-col-size",""); + } + } + }); + + slotAreas.each(function(){ + var tempHtml = ""; + $(this).find("template").each(function(){ + tempHtml += this.cloneNode(true).outerHTML; + }); + + var taskTemplate = $(this).find("template."+taskClass); + if(taskTemplate.length < 1){ + this.innerHTML = tempHtml; + return; + } + + var inHtml = $(taskTemplate[0].content).find("slot")[0].innerHTML; + this.innerHTML = tempHtml + inHtml; + + }); + + slotAreas.each(function(){ + if($(this).hasClass("if-empty-col0")){ + if($(this).children().not("template").length == 0){ + let colSize = ""; + for(let col of BOOTSTRAP_COLS){ + if($(this).hasClass(col)){ + colSize = col; + break; + } + } + + $(this).attr("data-original-col-size", colSize); + $(this).removeClass(colSize); + $(this).addClass("col-0"); + } + } + }); + } + + /************************************************************************** + * 단축키 등록 + **************************************************************************/ + static registShortcutKey(){ + document.addEventListener('keydown', (event) => { + + var RESERVED_FUNCTION_KEYS = ["F1","F2","F3","F4","F6","F7","F8","F9","F10","F11","PageDown","PageUp"]; + var KEYS_FOR_GLOBAL = ["F9","F10","F11"]; + + if(RESERVED_FUNCTION_KEYS.includes(event.key)){ + + event.preventDefault(); + + var activeBasckdropYn = FimsSupport.isActiveBackdrop(); + + var curArea = FimsSupport.getCurrentAreaForShortcutKey(); + + if(KEYS_FOR_GLOBAL.includes(event.key)){ //전역 기능 + + if(event.key == "F9"){ + if($("#securityMode--top").is(":checked")){ + $("#securityMode--top").prop("checked", false); + fn_securityModeToggle(false); + } else { + $("#securityMode--top").prop("checked", true); + fn_securityModeToggle(true); + } + + } + + if(event.key == "F10"){ + if($("#photoMask--top").is(":checked")){ + $("#photoMask--top").prop("checked", false); + fn_photoMask(false); + } else { + $("#photoMask--top").prop("checked", true); + fn_photoMask(true); + } + + } + + if(!activeBasckdropYn){ + //TODO : do something + } + + } else { //페이지별,다이얼로그별 버튼 + + if(curArea != null){ + + var targetButton = $(curArea).find("button.btn-"+event.key); + + if(targetButton.length == 1){ + targetButton.click(); + } else { + if(targetButton.length > 1){ + debug('단축키 버튼 중복 : ' + targetButton.length + "개"); + } + } + + } + + } + + return false; + } + }); + } + + //단축키 기능이 사용될 영역을 반환한다. + static getCurrentAreaForShortcutKey(){ + + if(FimsSupport.isActiveBackdrop()){ + return AppSupport.getLastOpenDialog(); + } else { + return FimsSupport.getActiveRootTabArea(); + } + + return null; + } + + //현재 활성화된 최상위 탭 영역을 반환한다. + static getActiveRootTabArea(){ + return $("#main-tab-content").children(".active")[0]; + } + + + //백드롭 영역 활성화 여부를 반환한다. + static isActiveBackdrop(){ + + if($("div.modal-backdrop").length < 1){ + return false; + } + + var isActiveYn = false; + $("div.modal-backdrop").each(function(){ + if($(this).hasClass("show")){ + isActiveYn = true; + }; + }); + + return isActiveYn; + } + + + /** + * json객체 안의 jsonArray를 FormData형식의 키로 치환한다. + * @return FormData형식의 키를 갖는 json + */ + static fnJsonToFormData(originalJson, arrayName){ + if(originalJson[arrayName] == undefined){ + return originalJson; + } else { + var newObj = {}; + + var array = originalJson[arrayName]; + for(var i=0; i"+progressContent+"", + css: { backgroundColor: "lightgrey", padding : "10px" } + }); + }; + + eventSource.onerror = function(e) { + $.unblockUI(); + }; + + eventSource.onmessage = function(e) { + if (e.data == 'FIN'){ + eventSource.close(); + $.unblockUI(); + } else { + progressEvent(e.data); + } + }; + } +} + +const SSE_SUBSCRIBE_URL = wctx.url("/subscribe.do"); + +const BOOTSTRAP_COLS = [ + "col-1","col-2","col-3","col-4","col-5","col-6","col-7","col-8","col-9","col-10","col-11","col-12", + "col-sm-1","col-sm-2","col-sm-3","col-sm-4","col-sm-5","col-sm-6","col-sm-7","col-sm-8","col-sm-9","col-sm-10","col-sm-11","col-sm-12", + "col-md-1","col-md-2","col-md-3","col-md-4","col-md-5","col-md-6","col-md-7","col-md-8","col-md-9","col-md-10","col-md-11","col-md-12", + "col-lg-1","col-lg-2","col-lg-3","col-lg-4","col-lg-5","col-lg-6","col-lg-7","col-lg-8","col-lg-9","col-lg-10","col-lg-11","col-lg-12", + "col-xl-1","col-xl-2","col-xl-3","col-xl-4","col-xl-5","col-xl-6","col-xl-7","col-xl-8","col-xl-9","col-xl-10","col-xl-11","col-xl-12", + "col-xxl-1","col-xxl-2","col-xxl-3","col-xxl-4","col-xxl-5","col-xxl-6","col-xxl-7","col-xxl-8","col-xxl-9","col-xxl-10","col-xxl-11","col-xxl-12" +]; + + +/************************************************************************** +* FimsPagingSupport +**************************************************************************/ +class FimsPagingSupport extends PagingSupport { + constructor(conf) { + if(conf.ctrl == null){ + conf.ctrl = new DatasetControl({}); + } + super(conf); + + if(conf.doq != null){ + this._doq = conf.doq; + } + } + + setPagingInfo(option) { + + let pagination = {}; + let List; + let Paging; + if(this.prefix == null || this.prefix == ""){ + let c = this.linkContainer; + pagination.prefix = c.substr(7, c.length-15); + List = "List"; + Paging = "Paging"; + } else { + pagination.prefix = this.prefix; + List = pagination.prefix+"List"; + Paging = pagination.prefix+"Paging"; + } + + let dl = 0; + if(option && option[List]) { + dl = option[List].length; + } + + let s = 0; + let ts = 0; + if(option && option[Paging] && option[Paging].start) { + s = option[Paging].start; + } + if(option && option[Paging] && option[Paging].totalSize) { + ts = option[Paging].totalSize; + } + pagination.totalSize = ts; + pagination.dataLength = s + dl; + + $(this.doq.selector(this.linkContainer)).setPagingInfo(pagination); + } +} + +function newFimsPagingSupport(conf){ + return new FimsPagingSupport(conf); +} \ No newline at end of file diff --git a/src/main/webapp/resources/js/fims/ogdp/ogdp01010.js b/src/main/webapp/resources/js/fims/ogdp/ogdp01010.js new file mode 100644 index 00000000..e69de29b diff --git a/src/main/webapp/resources/js/fims/ogdp/ogdp02010.js b/src/main/webapp/resources/js/fims/ogdp/ogdp02010.js new file mode 100644 index 00000000..0606aa54 --- /dev/null +++ b/src/main/webapp/resources/js/fims/ogdp/ogdp02010.js @@ -0,0 +1,16 @@ +function newOgdp02020Control(page, doctx = ""){ + page.ctrl = new DatasetControl({ + dataGetter : obj => obj["List"], + appendData:true, + keys : ["DEPT_CD"], + urls : { + load : wctx.url("/ogdp/getDeptStngList.do"), + getInfo : wctx.url("/ogdp/getDeptStngInfo.do") + }, + formats: { + REG_DT : datetimeFormat, + MDFCN_DT : datetimeFormat + } + }); + return page.ctrl; +} \ No newline at end of file diff --git a/src/main/webapp/resources/js/fims/ogdp/ogdp02020.js b/src/main/webapp/resources/js/fims/ogdp/ogdp02020.js new file mode 100644 index 00000000..ab54128e --- /dev/null +++ b/src/main/webapp/resources/js/fims/ogdp/ogdp02020.js @@ -0,0 +1,13 @@ +function newOgdp02010Control(page, doctx = ""){ + page.ctrl = new DatasetControl({ + dataGetter : obj => obj["List"], appendData : true, + keymapper : info => info ? info.DEPT_CD : "", + urls : { + update : wctx.url("/ogdp/updateDeptStng.do") + }, + formats: { + + } + }); + return page.ctrl; +} \ No newline at end of file