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