초기소스

This commit is contained in:
jazz
2025-10-29 17:08:05 +09:00
parent e531aa9540
commit 439a379a02
7551 changed files with 1234427 additions and 3 deletions

View File

@@ -0,0 +1,892 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : BannerC.jsp
Description : 공통상품배너 등록
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-06-14 전일찬 최초생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GC ONE 관리자</title>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
<script src="<c:url value='/js/fileupload_comm.js'/>"></script>
</head>
<script>
$(document).ready(function () {
$('input[name="goodsApplcDvCd"]:checked').click();
fn_set_date('datepicker_1', 'datepicker_2');
/* 카테고리 조회 이벤트 */
$(document).on('click', '.category-select', function () {
const upperCtgryId = $(this).val(); // 상위카테고리
const currCtgryDepth = $(this).attr('id').replace('ctgryDepth', '');
const targetDepth = (parseInt(currCtgryDepth) + 1);
const targetCtgryId = 'ctgryDepth' + targetDepth;
if (fn_is_empty(upperCtgryId)) {
for (let i = targetDepth; i < 5; i++) {
$('#section01').find('#ctgryDepth' + i).empty();
}
} else {
fn_get_goods_ctgry(upperCtgryId, targetCtgryId);
}
// 1차 카테고리 선택 하위 비우기
if (currCtgryDepth == 1) {
for (let i = 2; i < 5; i++) {
$('#section01').find('#ctgryDepth' + i).empty();
}
}
// 2차 카테고리 선택 하위 비우기
if (currCtgryDepth == 2) {
for (let i = 3; i < 5; i++) {
$('#section01').find('#ctgryDepth' + i).empty();
}
}
// 3차 카테고리 선택 하위 비우기
if (currCtgryDepth == 3) {
for (let i = 4; i < 5; i++) {
$('#section01').find('#ctgryDepth' + i).empty();
}
}
$('#section01').find('#ctgryId').val(upperCtgryId);
});
/* 카테고리 선택 이벤트 */
$('#selectCategoriesBtn').on('click', function (event) {
event.preventDefault();
const target = event.target;
let selectedCategories = [];
const depth1Selected = $('#ctgryDepth1 option:selected');
const depth2Selected = $('#ctgryDepth2 option:selected');
const depth3Selected = $('#ctgryDepth3 option:selected');
const depth4Selected = $('#ctgryDepth4 option:selected');
if (depth4Selected.length > 0) {
depth4Selected.each(function () {
let categoryPath = depth1Selected.text() + ' > ' + depth2Selected.text() + ' > ' + depth3Selected.text() + ' > ' + $(this).text();
let ctgryId = $(this).val();
selectedCategories.push({ path: categoryPath, id: ctgryId });
});
} else if (depth3Selected.length > 0) {
depth3Selected.each(function () {
let categoryPath = depth1Selected.text() + ' > ' + depth2Selected.text() + ' > ' + $(this).text();
let ctgryId = $(this).val();
selectedCategories.push({ path: categoryPath, id: ctgryId });
});
} else if (depth2Selected.length > 0) {
depth2Selected.each(function () {
let categoryPath = depth1Selected.text() + ' > ' + $(this).text();
let ctgryId = $(this).val();
selectedCategories.push({ path: categoryPath, id: ctgryId });
});
} else if (depth1Selected.length > 0) {
depth1Selected.each(function () {
let categoryPath = $(this).text();
let ctgryId = $(this).val();
selectedCategories.push({ path: categoryPath, id: ctgryId });
});
}
// 선택한 카테고리를 테이블에 추가
let $tableBody = $('#selectedCategoriesTable tbody');
// $tableBody.empty(); // 기존 내용을 지움
selectedCategories.forEach((category, index) => {
let $row = $('<tr></tr>');
let $radioTd = $('<td></td>');
let $radioDiv = $('<div>적용</div>');
let $radioInput = $('<input type="hidden" id="r-' + index + '" name="reprsntCtgryId" value="' + category.id + '">');
$radioDiv.append($radioInput) // .append($radioLabel);
$radioTd.append($radioDiv);
let $categoryTd = $('<td class="left"></td>').text(category.path).attr('data-value', category.id);
let $deleteTd = $('<td></td>');
let $deleteBtn = $('<button class="circle-btn delete"><span class="visually-hidden">삭제</span></button>');
$deleteTd.append($deleteBtn);
$row.append($radioTd).append($categoryTd).append($deleteTd);
$tableBody.append($row);
// 마지막 항목을 기본으로 선택
if (index === index) {
$radioInput.prop('checked', true);
}
// 삭제 버튼에 클릭 이벤트 추가
$deleteBtn.on('click', function () {
$(this).closest('tr').remove();
});
});
});
});
/* ********************************************************
* 카테고리 조회 AJAX
******************************************************** */
const fn_get_goods_ctgry = function(upperCtgryId, targetCtgryId) {
$.ajax({
type : 'post',
url : '<c:url value="/admin/sys/ctgry/selectGoodsCategoryList"/>',
data : {
'upperCtgryId': upperCtgryId
},
success : function(data) {
if (data.resBody != null) {
const result = JSON.parse(data.resBody.result);
const goodsCategoryList = result.goodsCategoryList;
if (goodsCategoryList.length > 0) {
$('#section01').find('#' + targetCtgryId).empty();
for (let i=0; i < goodsCategoryList.length; i++) {
const goodsCategory = goodsCategoryList[i];
$('#section01').find('#' + targetCtgryId).append('<option value="' + goodsCategory.ctgryId + '">' + goodsCategory.ctgryNm + '</option>');
}
$('#section01').find('#' + targetCtgryId).niceSelect('update');
}
}
}
});
}
/* ********************************************************
* 숫자만 허용
******************************************************** */
function fn_num_validateInput(input) {
var regex = /[^0-9]/g;
input.value = input.value.replace(regex, '');
input.value = input.value.toUpperCase();
}
/* ********************************************************
* 수정폼 이동
******************************************************** */
const fn_move_dtl_uptpage = function (Innb) {
const url = '<c:url value="/mngr/goods/banner/selectBannerDtlForm"/>';
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#bannerInnb').val(Innb);
$('#listForm').submit();
};
/* ********************************************************
* 목록 조회
******************************************************** */
const fn_select_list = function () {
const url = '<c:url value="/mngr/goods/banner/selectBannerListR"/>';
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#listForm').submit();
};
/* ********************************************************
* 등록 AJAX
******************************************************** */
const fn_regist = function () {
const url = '<c:url value="/mngr/goods/banner/insertBanner"/>';
const formData = new FormData();
$('#listForm').serializeArray().forEach(function (item) {
formData.append(item.name, item.value);
});
//카테고리 저장
let ctgryIdList = []
$('[name=reprsntCtgryId]').each(function () {
ctgryIdList.push( $(this).val())
});
formData.append('ctgryIdList', ctgryIdList);
//선정구분
formData.append('goodsApplcDvCd', $('input[name="goodsApplcDvCd"]:checked').val())
if($('#datepicker_1').val() != null){
var combinedValue = $('#datepicker_1').val() + 'T' + $('#expsrBgnTime').val();
formData.append('expsrBgnDt', combinedValue);
}
if($('#datepicker_2').val() != null) {
combinedValue = $('#datepicker_2').val() + 'T' + $('#expsrEndTime').val();
formData.append('expsrEndDt', combinedValue);
}
//파일데이터 - multiple로 배열저장된 값을 files로 셋팅
let fileAt = 'N';
$.each(filesTempArr, function(i, file){
if(file.upload != 'disable'){
formData.append('files', file);
}
if(!fn_is_empty(file)){
fileAt='Y'
}
});
if(fileAt==='N'){
alert('공통상품배너 이미지를 등록해주세요');
return false;
}
let goodsIdArr = [];
$('input[name=relatedGoodsId]').each(function (i) {
goodsIdArr.push($("input[name='relatedGoodsId']").eq(i).attr("value"));
})
formData.append('goodsIds', goodsIdArr);
if (confirm('공통상품배너를 <spring:message code="confirm.common.insert"/>')) {
$.ajax({
type: 'post',
enctype: 'multipart/form-data',
url: url,
data: formData,
contentType: false,
processData: false,
success: function (data) {
let str = JSON.parse(data.resBody.result);
if (str.result === 'success') {
alert('<spring:message code="success.common.insert"/>');
//등록 후 수정화면으로 이동
fn_move_dtl_uptpage(str.bannerInnb);
} else {
alert('<spring:message code="fail.common.insert"/>');
}
}
});
}
};
/* ********************************************************
* 상품 검색 팝업 배열 값 불러오기
******************************************************** */
var selected = [];
function fn_select_goods_search() {
selected = [];
$('#appendList tr').each(function() {
const goodsId = $(this).attr('id').replace('choiseListId', '');
const goodsImg = $(this).find('input[name="goodsImgCours"]').val();
const goodsNm = $(this).find('input[name="goodsNm"]').val();
const goodsPrice = $(this).find('input[name="slepric"]').val();
const goodsSttusNm = $(this).find('input[name="goodsSttusNm"]').val();
const expsrNm = $(this).find('input[name="expsrNm"]').val();
selected.push({
goodsId: goodsId,
goodsImg: goodsImg,
goodsNm: goodsNm,
goodsPrice: goodsPrice,
goodsSttusNm: goodsSttusNm,
expsrNm: expsrNm
});
});
// 각 화면에 맞춰서 HTML 변경 START
var tableBody = $("#parentGoodsContainer");
tableBody.empty();
selected.forEach((good, index) => {
var productHtml = `
<div class="product-group__item">
<input type="hidden" id="relatedGoodsId" name="relatedGoodsId" value="` + good.goodsId+ `">
<span class="product-group__item-number">` + (index + 1) + `</span>
<div class="product-group__image">
<img src="` + good.goodsImg+ `" onerror="this.src='/mngr/images/image_placeholder.png'" width="140" alt="` + good.goodsNm+ `">
</div>
<div class="product-group__description">
<p>` + good.goodsNm+ `</p>
<p class="product-group__description-price">` + fn_format_comma(good.goodsPrice)+ `원</p>
</div>
</div>
`;
tableBody.append(productHtml);
});
// 각 화면에 맞춰서 HTML 변경 END
fn_close_modal('product-search');
}
/* ********************************************************
* 상품 검색 팝업 > 상품 목록 조회
******************************************************** */
const fn_goods_search_popup_list = function (pageIndex,selected) {
let dataStr;
if (!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
$('#popupListForm').find('input[name=pageIndex]').eq(0).val(pageIndex);
const popupListForm = $("#popupListForm").serialize();
$.ajax({
type: "post",
url: "<c:url value="/mngr/goods/goodsmngr/selectGoodsSrchPopupList"/>",
data: popupListForm,
success: function (resultHtml) {
$('#goodsList').empty();
$('#goodsList').html(resultHtml);
}
});
}
//관련 상품 검색 모달
const fn_open_search_modal = function (modalDivSltr, modalSlrt, url, param, callback) {
let submitType = 'GET';
//파라미터가 있을 경우 POST처리
if (!param) {
submitType = 'POST';
}
$.ajax({
type: submitType,
url: url,
data: param,
success: function (data) {
//callback함수가 없을 경우 default로 지정된 영역에 모달팝업 화면을 교체하고 화면 로딩
if (!callback) {
$(modalSlrt).remove();
$(modalDivSltr).html(data);
//최초오픈시에 관련상품 정보 있을 경우 실행
if(custom_open_modal_cnt === 0){
var tableBody = $("#appendList");
const cdnurl = $('#cdnurl').val()
selectedDtl.forEach((good, index) => {
var row = `
<tr id="choiseListId` +good.goodsId + `" class="draggable" ondblclick="fn_remove_append_goods_list(this)">
<td class="text-left">
<input type="hidden" id="goodsInnb" name="goodsInnb" value="` + good.goodsId + `"/>
<input type="hidden" id="goodsImgCours" name="goodsImgCours" value="`+cdnurl + good.goodsImg + `"/>
<input type="hidden" id="goodsNm" name="goodsNm" value="` + good.goodsNm + `"/>
<input type="hidden" id="slepric" name="slepric" value="` + good.goodsPrice + `"/>
<input type="hidden" id="goodsSttusNm" name="goodsSttusNm" value="` + good.goodsSttusNm + `"/>
<input type="hidden" id="expsrNm" name="expsrNm" value="` + good.expsrNm + `"/>
<div class="product-search-box__product">
<img src="`+cdnurl + good.goodsImg+ `"
onerror="this.src='<c:url value="/mngr/images/image_placeholder.png"/>'"
alt="` +good.goodsNm+ `" width="64">
` +good.goodsNm+ `
</div>
</td>
<td>` +fn_format_comma(good.goodsPrice)+ `</td>
<td>` +good.goodsSttusNm+ '(' + good.expsrNm + ')' +`</td>
</tr>
`;
tableBody.append(row);
});
custom_open_modal_cnt++;
}
$(modalSlrt).modal();
} else {
callback(data);
}
}
});
}
let custom_open_modal_cnt = 0;
//현재 등록된 관련 상품 정보
let selectedDtl = [];
const fn_custom_open_modal = (modalDivSltr, modalSlrt, url, param, callback) => {
selectedDtl = [];
if(custom_open_modal_cnt === 0){
$('.product-group__item').each(function() {
const goodsId = $(this).find('input[name="relatedGoodsId"]').val();
const goodsImg = $(this).find('input[name="relatedGoodsImg"]').val();
const goodsNm = $(this).find('input[name="relatedGoodsNm"]').val();
const goodsPrice = $(this).find('input[name="relatedGoodsPrice"]').val();
const goodsSttusNm = $(this).find('input[name="goodsSttusNm"]').val();
const expsrNm = $(this).find('input[name="expsrNm"]').val();
selectedDtl.push({
goodsId: goodsId,
goodsImg: goodsImg,
goodsNm: goodsNm,
goodsPrice: goodsPrice,
goodsSttusNm: goodsSttusNm,
expsrNm: expsrNm
});
});
}
fn_open_search_modal(modalDivSltr, modalSlrt, url, param, callback);
}
/* ********************************************************
* file button show / file infor hide
******************************************************** */
const fn_delete_imgFile = (obj, shopCd, menuGb, orderParam) => {
$('#divInfor-1').hide();
$("#imgPreview").empty(); //이미지 삭제
$('#divFile-1').show();
}
/* ********************************************************
* file button hide / file infor show
******************************************************** */
const fn_add_imgFile = (event, orderParam) => {
customAddFiles(event, orderParam)
}
/* ********************************************************
* custom file function
******************************************************** */
function customAddFiles(event, mode){
customAddFilesObj(event, mode,"fileList");
}
function customAddFilesObj(event, mode, objId){
if(!($(event.target).is('[multiple]'))) filesTempArr.splice(0, filesTempArr.length);
var files = event.target.files;
var filesArr = Array.prototype.slice.call(files); //file객체 array추가
var filesArrLen = filesArr.length;
var filesTempArrSize = filesTempArr.length*1;
const sopmalCd = $('#sopmalCd').val()
let obj = $('#'+objId);
if (mode === 1 && filesArrLen > 1) {
alert("파일은 한개만 첨부할 수 있습니다.");
return false;
}
var templist = '';
let prviewHtml = '';
for(var i=0; i<filesArrLen; i++){
filesTempArr.push(filesArr[i]); //임시배열에 저장
if($(event.target).is('[multiple]')){
const size = i+filesTempArrSize;
let reader = new FileReader();
let file = filesArr[i];
templist ="<li id='temp"+size+"'>"
+"<a href='#' onclick='downloadFile(this, "+(i+filesTempArrSize)+");'>"
+ "<i class='icon icon_file-list mr-2'></i>"
+ "<span class='file-list__item-title'>"+ filesArr[i].name + "</span>"
+"</a>"
+`<button type='button' class='file-list__delete' onclick="deleteFile(this,'\${sopmalCd}','BANR',\${size}); fn_delete_imgFile();"/>`;
+"</li>";
obj.append(templist);
//추가 되면 이미지 보이게
if ($(".file-list__delete")) {
reader.onload = function (e) {
prviewHtml = `<img src="\${e.target.result}" onerror="this.src='/mngr/images/image_placeholder.png'"/>`;
$("#imgPreview").html(prviewHtml);
}
reader.readAsDataURL(file);
}
}
}
$('#divInfor-1').show();
$('#divFile-1').hide();
return true;
}
</script>
<body>
<%@ include file="/WEB-INF/views/comm/mngr/Header.jsp"%>
<main class="main">
<%@ include file="/WEB-INF/views/comm/mngr/Left.jsp"%>
<div class="content">
<div class="content__inner">
<button class="side-nav__fold"><span class="visually-hidden">좌측메뉴 펼치기/닫기</span></button>
<div class="page-title">
<h2 class="page-title__title">공통상품배너 등록</h2>
<div class="page-title__btn-container">
<button onclick="fn_select_list()" onkeypress="this.onclick" class="btn outline"><spring:message code="button.list"/></button>
<button class="btn primary" onclick="fn_regist();"><spring:message code="button.save"/></button>
</div>
</div>
<section class="content-section">
<form id="listForm" method="post" action="<c:url value="/mngr/goods/banner/insertBanner"/>" enctype="multipart/form-data">
<input type="hidden" id="bannerInnb" name="bannerInnb" value=""/>
<input type="hidden" id="sopmalCd" name="sopmalCd" value="<c:out value="${ resultMap.BOBannerVO.sopmalCd }"/>"/>
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value="${ resultMap.BOBannerVO.pageIndex }"/>"/>
<input type="hidden" id="pageUnit" name="pageUnit" value="<c:out value="${ resultMap.BOBannerVO.pageUnit }"/>"/>
<h3 class="content-section__title">공통상품배너 등록</h3>
<spring:eval expression="@environment.getProperty('spring.servlet.multipart.max-file-size')" var="maxFileSize"/>
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<input type="hidden" id="orginlFilNm" name="orginlFilNm" value=""/>
<div class="table-wrapper">
<table class="table">
<colgroup>
<col style="width: 12%;">
<col style="width: auto;">
</colgroup>
<tbody>
<tr>
<th>공통상품배너명<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text xl" type="text" name="bannerNm" id="bannerNm"
title="공통상품배너 제목" maxlength="30">
</div>
</td>
</tr>
<tr>
<th>공통상품배너타입<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<c:forEach items="${ resultMap.expsrlcDvList }" var="edList" varStatus="edListStatus">
<div class="custom-radio">
<input type="radio" id="r-<c:out value="${edListStatus.count}"/>" name="expsrlcDv" value="<c:out value="${edList.cd}"/>" <c:if test="${edListStatus.first}">checked</c:if>>
<label for="r-<c:out value="${edListStatus.count}"/>"><c:out value="${edList.cdNm}"/></label>
</div>
</c:forEach>
</div>
</div>
</td>
</tr>
<tr>
<th>노출 관리<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<c:forEach items="${ resultMap.expsrlcDvCdList }" var="edcList" varStatus="edcListStatus">
<div class="custom-radio">
<input type="radio" id="r-<c:out value="${(edcListStatus.count)+2}"/>" name="expsrlcDvCd" value="<c:out value="${edcList.cd}"/>" <c:if test="${edcListStatus.first}">checked</c:if>>
<label for="r-<c:out value="${(edcListStatus.count)+2}"/>"><c:out value="${edcList.cdNm}"/></label>
</div>
</c:forEach>
<div class="td-inner">
<input type="text" id="datepicker_1" name="datepicker_1" class="datepicker" title="시작 날짜 선택"
autocomplete="off" required="required">
<div class="timepicker-container">
<input type="text" class="bs-timepicker" title="시작 시간 설정"
id="expsrBgnTime" name="expsrBgnTime" value="00:00">
</div>
<span class="tilde">~</span>
<input type="text" id="datepicker_2" name="datepicker_2" class="datepicker" title="종료 날짜 선택"
autocomplete="off" required="required">
<div class="timepicker-container">
<input type="text" class="bs-timepicker" title="종료 시간 설정"
id="expsrEndTime" name="expsrEndTime" value="00:00">
</div>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>공통상품배너 파일<span class="red-7">*</span></th>
<td>
<div class="td-inner vertical">
<div class="manage-btn-container fileInfor" id="divInfor-1">
<ul class="file-list" id="fileList">
</ul>
</div>
<div class="manage-btn-container" id="divFile-1">
<div class="input-file">
<spring:eval expression="@environment.getProperty('mngrfo.common.fileupload.extensions.images')" var="acceptFileExtensions"/>
<input type="file" id="fileUpload" name="files" title="아이콘파일" accept="<c:out value="${ acceptFileExtensions }"/>" multiple="multiple" onchange="fn_add_imgFile(event, 1);">
<label for="fileUpload">파일선택</label>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>이미지 보기</th>
<td>
<div class="td-inner" id="imgPreview">
</div>
</td>
</tr>
<tr>
<th>공통상품배너연결URL<span class="red-7">*</span></th>
<td>
<div class="td-inner">
<input class="input-text full" type="text" name="bannerUrl" id="bannerUrl"
title="공통상품배너연결URL" maxlength="3000">
</div>
</td>
</tr>
</tbody>
</table>
</div>
</form>
</section>
<%-- 이벤트 대상 --%>
<section class="content-section">
<h3 class="content-section__title">공통상품배너 연결 상품</h3>
<div class="table-wrapper">
<table class="table">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr class=".disabledTr">
<th>선정 기준</th>
<td>
<div class="td-inner">
<div class="custom-radio-container radio-tab-trigger" data-radiotab="radio-tab-01" id="radioGoodsCtgryLmttDv">
<c:forEach var="codeList" items="${ resultMap.goodsCtgryLmttDvCdList }" varStatus="">
<div class="custom-radio">
<input type="radio" id="<c:out value="${ codeList.cdNm }"/><c:out value="${ codeList.cd}" />" name="goodsApplcDvCd" value="<c:out value="${ codeList.cd}" />"
<c:if test="${ '01' eq codeList.cd }">checked="checked"</c:if>
<c:choose>
<c:when test="${ codeList.cd eq '01'}">
onclick="fn_ui_showHide('', '.notall', 'Y');"
</c:when>
<c:when test="${ codeList.cd eq '02' || codeList.cd eq '04'}">
onclick="fn_ui_showHide('#catgrySelctDiv', '#goodsSelctDiv', 'Y');"
</c:when>
<c:when test="${ codeList.cd eq '03' || codeList.cd eq '05'}">
onclick="fn_ui_showHide('#goodsSelctDiv', '#catgrySelctDiv', 'Y');"
</c:when>
</c:choose>
/>
<label for="<c:out value="${ codeList.cdNm }"/><c:out value="${ codeList.cd}" />"><c:out value="${ codeList.cdNm}" /></label>
</div>
</c:forEach>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div class="table-wrapper notall" id="catgrySelctDiv">
<div class="table-wrapper" id="section01">
<table class="table">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>카테고리 선택</th>
<td>
<div class="td-inner">
<div class="table-wrapper">
<table class="table vertical">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th>1차 카테고리</th>
<th>2차 카테고리</th>
<th>3차 카테고리</th>
<th>4차 카테고리</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<select class="category-select" multiple
id="ctgryDepth1" title="1차 카테고리">
<c:forEach items="${resultMap.goodsCategoryList}"
var="goodsCategory"
varStatus="status">
<option value="${goodsCategory.ctgryId}">${goodsCategory.ctgryNm}</option>
</c:forEach>
</select>
</td>
<td>
<select class="category-select" multiple id="ctgryDepth2"
title="2차 카테고리">
</select>
</td>
<td>
<select class="category-select" multiple
id="ctgryDepth3" title="3차 카테고리">
</select>
</td>
<td>
<select class="category-select" multiple
id="ctgryDepth4" title="4차 카테고리">
</select>
</td>
</tr>
</tbody>
</table>
<div class="form-control-container mt-10">
<div class="left"></div>
<div class="center">
<button class="btn primary" id="selectCategoriesBtn">선택</button>
</div>
<div class="right">
</div>
</div>
</div>
</div>
</td>
</tr>
<tr>
<th>선택한 카테고리</th>
<td>
<div class="td-inner">
<div class="table-wrapper">
<table class="table vertical" id="selectedCategoriesTable">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 100px;">
<col style="width: auto;">
<col style="width: 200px;">
</colgroup>
<thead>
<tr>
<th>구분</th>
<th>카테고리</th>
<th>삭제</th>
</tr>
</thead>
<tbody>
<!-- 선택한 카테고리들이 여기에 추가됩니다 -->
</tbody>
</table>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="content-fold__content table-wrapper notall" id="goodsSelctDiv">
<div class="table-wrapper">
<table class="table">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>
<div>
<span class="ml-10">상품</span>
<br>
<a onclick="fn_open_modal('#modalDiv','#product-search','/mngr/goods/goodsmngr/selectGoodsSrchPopupForm',{'goodsKndCd':'01'}); return false;"
class="btn xsm primary mt-5">검색</a>
</div>
</th>
<td>
<div class="td-inner">
<div id="parentGoodsContainer" class="product-group">
<!-- 여기에 선택한 상품 정보가 추가됩니다 -->
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!--
<section id="section2" class="content-section content-scroll-detect content-fold">
<div class="content-fold__header">
<h3 class="content-section__title">공통상품배너 연결 상품</h3>
</div>
<div class="content-fold__content">
<div class="table-wrapper">
<table class="table">
<caption>해당 테이블에 대한 설명</caption>
<colgroup>
<col style="width: 12%;">
<col>
</colgroup>
<tbody>
<tr>
<th>
<div>
<span class="ml-10">상품</span>
<br>
<a href="#" onclick="fn_open_modal('#modalDiv','#product-search','/mngr/goods/goodsmngr/selectGoodsSrchPopupForm',{'goodsKndCd':'01'}); return false;"
class="btn xsm primary mt-5">검색</a>
</div>
</th>
<td>
<div class="td-inner">
<div id="parentGoodsContainer" class="product-group">
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</section> -->
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
<div id="modalDiv"></div>
</main>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,285 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%--
Class Name : BannerListR.jsp
Description : 공통상품배너 목록조회 화면
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-06-14 전일찬 최초생성
--%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>GC ONE 관리자</title>
<%@ include file="/WEB-INF/views/comm/mngr/Include.jsp"%>
</head>
<script>
$(document).ready(function () {
});
/* ********************************************************
* 목록 조회
******************************************************** */
const fn_select_list = function(pageIndex, pageUnit) {
let dataStr;
if(!pageIndex) {
$('#pageIndex').val(1);
} else {
$('#pageIndex').val(pageIndex);
}
if(!pageUnit) {
dataStr = $('#listForm').serialize();
} else {
if($('#pageUnit').length){
$('#pageUnit').val(pageUnit);
dataStr = $('#listForm').serialize();
} else {
dataStr = $('#listForm').serialize()+'&pageUnit='+pageUnit;
}
}
let params = '&pageIndex=' + pageIndex + '&pageUnit=' + pageUnit;
$.ajax({
type: 'post',
url : '<c:url value="/mngr/goods/banner/selectBannerListR"/>',
data : dataStr,
success:function(data) {
const startIndex = data.lastIndexOf('<div id="pageDiv">') + '<div id="pageDiv">'.length;
const endIndex = data.lastIndexOf("</section>");
$('#pageDiv').html(data.substring(startIndex, endIndex));
}
});
}
/* ********************************************************
* 등록폼 이동
******************************************************** */
const fn_move_regpage = function() {
const url = '<c:url value="/mngr/goods/banner/selectBannerRegistForm"/>';
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#listForm').submit();
};
/* ********************************************************
* 수정폼 이동
******************************************************** */
const fn_move_dtl_uptpage = function(bannerInnb) {
const url = '<c:url value="/mngr/goods/banner/selectBannerDtlForm"/>';
$('#listForm').attr('action', url);
$('#listForm').attr('method', 'post');
$('#bannerInnb').val(bannerInnb);
$('#listForm').submit();
}
/* ********************************************************
* 삭제 AJAX
******************************************************** */
const fn_delete = function(bannerInnb, linkGoods, linkCtgry) {
console.log(linkGoods);
if(parseInt(linkGoods) > 0){
alert('해당 공통상품배너와 연결된 상품이 있어 삭제 할 수 없습니다.')
return false;
}
if(parseInt(linkCtgry) > 0){
alert('해당 공통상품배너와 연결된 카테고리가 있어 삭제 할 수 없습니다.')
return false;
}
const url = '<c:url value="/mngr/goods/banner/deleteBanner"/>';
if(confirm('공통상품배너를 <spring:message code="confirm.common.delete"/>')) {
$.ajax({
type: 'post',
url: url,
data: { 'bannerInnb' : bannerInnb },
success: function (data) {
let str = JSON.parse(data.resBody.result);
if(str.result==='success'){
alert('<spring:message code="success.common.delete"/>');
fn_select_list(1);
} else if(str.result==='hasGoods'){
alert('연결 중인 상품이 존재합니다. 수정 후 다시 시도해 주세요.')
} else {
alert('<spring:message code="fail.common.delete"/>');
}
}
});
history.replaceState({}, null, location.pathname);
}
};
//배너 순서수정
$(document).on('click', '#updateBannerOrdrBtn', function () {
let bannerOrdrList = [];
$('#ordrListForm input[name="bannerInnb"]').each(function () {
const data = {
'bannerInnb' : $(this).val(),
'bannerOrdr' : $(this).closest('tr').index()+1,
'expsrlcDv' : $(this).siblings('input[name="expsrlcDv"]').val(),
'sopmalCd' : $(this).siblings('input[name="sopmalCd"]').val()
}
bannerOrdrList.push(data);
})
if (confirm(`공통상품배너 순서을(를) <spring:message code="confirm.common.update"/>`)) {
$.ajax({
type: 'post',
url : '<c:url value="/mngr/goods/banner/updateBannerOrdr"/>',
contentType: "application/json",
data : JSON.stringify(bannerOrdrList),
dataType: 'json',
success:function(data) {
const result = JSON.parse(data.resBody.result).result
if(result ==='success'){
alert('<spring:message code="success.common.update"/>');
fn_close_modal('bannerOrdrPopupR')
}
}
});
}
})
</script>
<body>
<%@ include file="/WEB-INF/views/comm/mngr/Header.jsp"%>
<%-- <c:import url="/comm/mngr/header"/> --%>
<main class="main">
<%@ include file="/WEB-INF/views/comm/mngr/Left.jsp"%>
<%-- <c:import url="/comm/mngr/left"/> --%>
<div class="content">
<div class="content__inner">
<button class="side-nav__fold"><span class="visually-hidden">좌측메뉴 펼치기/닫기</span></button>
<div class="page-title">
<h2 class="page-title__title">공통상품배너 목록</h2>
<div class="page-title__btn-container">
<button class="btn xsm primary outline" onclick="fn_open_modal('#bannerOrdrDiv','#bannerOrdrPopupR', '/mngr/goods/banner/selectBannerOrdrPopup')" id="#bannerOrdrPopup">공통상품배너 순서<spring:message code="button.update"/></button>
<button onclick="fn_move_regpage()" class="btn xsm primary">공통상품배너 <spring:message code="button.insert"/></button>
</div>
</div>
<form id='listForm' name="listForm" method="post" action="<c:url value="/mngr/goods/banner/selectBannerListR"/>">
<input type="hidden" id="bannerInnb" name="bannerInnb" value=""/>
<input type="hidden" id="pageIndex" name="pageIndex" value="<c:out value="${ resultMap.BOBannerVO.pageIndex }"/>"/>
<section class="content-section">
<div class="form-control-container">
<div class="left">
<div class="search-number">
<span class="search-number__text">총 <strong><c:out value="${ resultMap.paginationInfo.totalRecordCount }"/></strong>건</span>
</div>
</div>
<div class="center">
</div>
<div class="right">
<div class="select-box">
<select id="pageUnit" name="pageUnit" title="페이지당 출력될 목록건수" onchange="fn_select_list(1);">
<c:forEach items="${ resultMap.paginationInfo.pageUnitArr }" var="pageUnit" varStatus="pageUnitStatus">
<option value="<c:out value="${ pageUnit }"/>" <c:if test="${ resultMap.paginationInfo.recordCountPerPage eq pageUnit}">selected="selected"</c:if>><c:out value="${ pageUnit }"/>개씩</option>
</c:forEach>
</select>
</div>
</div>
</div>
<hr class="spacing">
<div id="pageDiv">
<div class="table-wrapper">
<table class="table vertical">
<colgroup>
<col style="width: 7%;">
<col style="width: auto;">
<col style="width: 16%;">
<col style="width: 7%;">
<col style="width: 10%;">
<col style="width: 10%;">
<%-- <col style="width: 7%;">--%>
<%-- <col style="width: 12%">--%>
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>생성일</th>
<th>상태</th>
<th>공통상품배너 위치</th>
<%-- <th>연결 상품</th>--%>
<%-- <th>연결 카테고리</th>--%>
<th>관리</th>
</tr>
</thead>
<tbody>
<c:choose>
<c:when test="${ not empty resultMap.list }">
<c:forEach items="${ resultMap.list }" var="list" varStatus="status">
<tr>
<td><c:out value="${resultMap.paginationInfo.totalRecordCount - list.rnum + 1 }"/></td>
<td class="left"><c:out value="${list.bannerNm}"/></td>
<td><c:out value="${list.registDe}"/></td>
<c:forEach items="${ resultMap.expsrlcDvCdList }" var="edcList" varStatus="edcListStatus">
<c:if test="${ list.expsrlcDvCd eq edcList.cd}">
<td><c:out value="${edcList.cdNm}"/></td>
</c:if>
</c:forEach>
<c:forEach items="${ resultMap.expsrlcDvList }" var="edList" varStatus="edListStatus">
<c:if test="${ list.expsrlcDv eq edList.cd}">
<td><c:out value="${edList.cdNm}"/></td>
</c:if>
</c:forEach>
<%-- <td><c:out value="${list.goodsCnt}"/> 개</td>--%>
<%-- <td><c:out value="${list.ctgryCnt}"/> 개</td>--%>
<td>
<div class="manage-btn-container">
<button class="btn xsm primary outline" onclick="fn_move_dtl_uptpage('<c:out value="${list.bannerInnb}"/>')"><spring:message code="button.update"/></button>
<button class="btn xsm dark" onclick="fn_delete('<c:out value="${list.bannerInnb}"/>', '<c:out value="${list.goodsCnt}"/>', '<c:out value="${list.ctgryCnt}"/>')"><spring:message code="button.delete"/></button>
</div>
</td>
</tr>
</c:forEach>
</c:when>
<c:otherwise>
<tr>
<td colspan="100%"><spring:message code="common.nodata"/></td>
</tr>
</c:otherwise>
</c:choose>
</tbody>
</table>
</div>
<div class="pagination__container">
<ui:pagination paginationInfo="${resultMap.paginationInfo}" type="image" jsFunction="fn_select_list"/>
</div>
</div>
</section>
</form>
<button class="scroll-to-top"><span class="visually-hidden">위로가기</span></button>
</div>
</div>
</main>
</body>
<%--배너순서지정--%>
<div id="bannerOrdrDiv"></div>
</html>

View File

@@ -0,0 +1,134 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="ui" uri="http://www.winbit.kr/ctl/ui" %>
<%@ taglib prefix="f" uri="/WEB-INF/tlds/f.tld" %>
<%--
Class Name : BannerOrdrPopupR.jsp
Description : 배너 순서지정 팝업
Modification Information
수정일 수정자 수정내용
------- -------- ---------------------------
2024-10-18 유재현 최초 생성
--%>
<script>
$(document).ready(function () {
if ($(".table.draggable").length > 0) {
$(".table.draggable").tableDnD({
onDragClass: "dragging",
});
}
});
</script>
<div id="bannerOrdrPopupR" class="modal" style="max-width: 600px;">
<div class="modal-header">
<h4>공통상품배너 순서수정</h4>
</div>
<div class="modal-content">
<form id="ordrListForm" name="ordrListForm">
<h4 class="page-title__title">상단</h4>
<div>
<div class="table-wrapper">
<table class="table vertical draggable">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 20%;">
<col style="width: auto;">
</colgroup>
<thead>
<tr>
<th>순서</th>
<th>배너명</th>
</tr>
</thead>
<tbody>
<c:forEach var="bannerOrdr" items="${resultMap.bannerOrdrList }" varStatus="status">
<c:if test="${bannerOrdr.expsrlcDv eq '01'}">
<tr>
<td>
<div class="draggable-icon-container">
<i class="icon icon_draggable"></i>
<span class="visually-hidden">순서 바꾸기</span>
</div>
</td>
<td><c:out value="${bannerOrdr.bannerNm }"/>
<input type="hidden" name="expsrlcDv" value="${bannerOrdr.expsrlcDv }"/>
<input type="hidden" name="bannerInnb" value="${bannerOrdr.bannerInnb}" />
<input type="hidden" name="sopmalCd" value="${bannerOrdr.sopmalCd}"/>
</td>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<input type="hidden" name="bannerOrdr" value="${bannerOrdr.bannerOrdr}" />
</div>
</div>
</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
</div>
</div>
<h4 class="page-title__title">하단</h4>
<div>
<div class="table-wrapper">
<table class="table vertical draggable">
<caption>해당 테이블에 대한 설명</caption>
<!-- 각 열 width 설정 -->
<colgroup>
<col style="width: 20%;">
<col style="width: auto;">
</colgroup>
<thead>
<tr>
<th>순서</th>
<th>배너명</th>
</tr>
</thead>
<tbody>
<c:forEach var="bannerOrdr" items="${resultMap.bannerOrdrList }" varStatus="status">
<c:if test="${bannerOrdr.expsrlcDv eq '02'}">
<tr>
<td>
<div class="draggable-icon-container">
<i class="icon icon_draggable"></i>
<span class="visually-hidden">순서 바꾸기</span>
</div>
</td>
<td><c:out value="${bannerOrdr.bannerNm }"/>
<input type="hidden" name="expsrlcDv" value="${bannerOrdr.expsrlcDv }"/>
<input type="hidden" name="bannerInnb" value="${bannerOrdr.bannerInnb}" />
<input type="hidden" name="sopmalCd" value="${bannerOrdr.sopmalCd}"/>
</td>
<td>
<div class="td-inner">
<div class="custom-radio-container">
<input type="hidden" name="bannerOrdr" value="${bannerOrdr.bannerOrdr}" />
</div>
</div>
</td>
</tr>
</c:if>
</c:forEach>
</tbody>
</table>
</div>
</div>
<div class="page-title__btn-container" style=" justify-content : center;">
<button type="button" class="btn xsm primary" id="updateBannerOrdrBtn"><spring:message code="button.update"/></button>
</div>
</form>
</div>
</div>