Просмотр исходного кода

Merge branch 'develop' of http://112.172.147.34:4936/style24/style24.admin into develop

jsshin 5 лет назад
Родитель
Сommit
64d8955285

+ 47 - 1
src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -746,11 +746,16 @@ public class TsaDisplayController extends TsaBaseController {
 	 * @since 2021. 3. 5
 	 */
 	@GetMapping("/lookbook/banner/popup/form")
-	public ModelAndView mainMultiContentsPopupForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "lookbookSq", required = false) Integer lookbookSq) {
+	public ModelAndView lookbookBannerPopupForm(@RequestParam(value = "mode") String mode, @RequestParam(value = "lookbookSq", required = false) Integer lookbookSq) {
 		ModelAndView mav = new ModelAndView();
 		mav.addObject("mode", mode);
 		mav.addObject("lookbookSq", lookbookSq);
 		mav.addObject("brandGroupList", rendererService.getSelfBrandGroupList());
+
+		if(!"".equals(lookbookSq)){
+			mav.addObject("lookbookMstInfo", coreLookbookService.getLookbookMstInfo(lookbookSq));
+			mav.addObject("lookbookBannerList", coreLookbookService.getLookbookBannerDetailList(lookbookSq));
+		}
 		mav.setViewName("display/LookbookBannerPopupForm");
 		return mav;
 	}
@@ -804,4 +809,45 @@ public class TsaDisplayController extends TsaBaseController {
 		coreLookbookService.deleteLookbook(lookbook);
 		return super.ok(message.getMessage("SUCC_0009"));
 	}
+
+	/**
+	 * 룩북 배너 피커 팝업
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 9
+	 */
+	@GetMapping("/lookbook/banner/picker/popup/form")
+	public ModelAndView lookbookBannerPickerForm(@RequestParam(value = "lookbookbSq") Integer lookbookbSq, @RequestParam(value = "imgNm") String imgNm) {
+		log.info("lookbookbSq>>{}",lookbookbSq);
+		log.info("imgNm>>{}",imgNm);
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("lookbookbSq", lookbookbSq);
+		mav.addObject("imgNm", imgNm);
+		mav.addObject("lookbookBannerPickerList", coreLookbookService.getLookbookBannerPickerList(lookbookbSq));
+
+		if(coreLookbookService.getLookbookBannerPickerList(lookbookbSq).size() > 0){
+			mav.addObject("mode", "U");
+		}else{
+			mav.addObject("mode", "N");
+		}
+
+		mav.setViewName("display/LookbookBannerPickerPopupForm");
+		return mav;
+	}
+
+	/**
+	 * 룩북 배너 피커 등록/수정
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 3. 9
+	 */
+	@PostMapping("/lookbook/banner/picker/save")
+	@ResponseBody
+	public GagaResponse saveLookbookPicker(@RequestBody LookbookGoods lookbookGoods) {
+		lookbookGoods.setRegNo(TsaSession.getInfo().getUserNo());
+		lookbookGoods.setUpdNo(TsaSession.getInfo().getUserNo());
+		coreLookbookService.saveLookbookPicker(lookbookGoods);
+		return super.ok(message.getMessage("SUCC_0001"));
+	}
+
 }

+ 240 - 0
src/main/webapp/WEB-INF/views/display/LookbookBannerPickerPopupForm.html

@@ -0,0 +1,240 @@
+<!DOCTYPE html>
+<html lang="ko"
+	  xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : LookbookBannerPickerPopupForm.html
+ * @desc    : 룩북 배너 피커 팝업
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.03.09   bin2107     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1600" data-height="850">
+	<div class="panelStyle" style="overflow-y:scroll;">
+		<form id="lbBannerPickerForm" name="lbBannerPickerForm" action="#" th:action="@{'/display/lookbook/banner/picker/save'}" onsubmit="$('#btnSearch').trigger('click'); return false;">
+			<input type="hidden" id="lookbookbSq" name="lookbookbSq" th:value="${lookbookbSq}"/>
+			<div class="panelTitle">
+				<h2 th:text="${'룩북 피커' + (mode == 'N' ? '등록' : '상세')}"></h2>
+				<button type="button" class="close" onclick="uifnPopupClose('popupLookbookBannerPicker');"><i class="fa fa-times"></i></button>
+			</div>
+			<ul class="panelBar">
+				<li  class="right">
+					<button type="button" class="btn btnRight btn-success btn-lg" id="btnSavePicker">피커저장</button>
+				</li>
+			</ul>
+			<div id="pickerDiv">
+				<input type="hidden" name="uploadBannerUrl" id="uploadBannerUrl" th:value="${@environment.getProperty('upload.image.view') + '/display/lookbook/banner/'}"/>
+				<!-- posistion picker -->
+				<ul class="panelBar" id="pictureOffset"> <!--style="border-color: #dbdbdb;border-style: solid;border-width: 1px;"-->
+					<li>
+						<div class="picWrap">
+							<img id="bannerPreViewUrl" src="" class="picture" style="width:100%;"/>
+						</div>
+					</li>
+					<li>
+						<ul class="notice padB15">
+							<li>이미지를 클릭시 해당 위치의 <em>절대 좌표 값</em>을 가져옵니다.</li>
+						</ul>
+						<table class="frmStyle dataWrap">
+							<colgroup>
+								<col width="10%"/>
+								<col/>
+							</colgroup>
+						</table>
+					</li>
+				</ul>
+				<!-- //posistion picker -->
+			</div>
+		</form>
+	</div>
+</div>
+<script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var lookbookbSq = [[${lookbookbSq}]];
+	var imgNm = [[${imgNm}]];
+	var mode = [[${mode}]];
+	var lookbookBannerPickerList = [[${lookbookBannerPickerList}]];
+
+	var $pic = $("#pictureOffset .picWrap");
+	var absX = absY = 0; //위치 표시 단위(픽셀)
+	var relX = relY = 0; //위치 표시 단위(퍼센트)
+	var trIdx = 0;
+	var idx = 0; //원 안의 숫자 count
+	const picW = $pic.width(); //이미지 넓이
+	const picY = $pic.height(); //이미지 높이
+
+	$pic.on('click', function(e) {
+		absX = e.pageX - $(this).offset().left; //left(px)
+		absY = e.pageY - $(this).offset().top; //top(px)
+		relX = ((absX / picW) * 100).toFixed(2); //left(%) : 소수점 둘째자리까지 표현
+		relY = ((absY / picY) * 100).toFixed(2); //top(%) : 소수점 둘째자리까지 표현
+		trIdx = trIdx+1; //ID
+		idx = idx+1; //circle value
+
+		//원 안에 숫자 표현
+		let posTag = `<span data-id="${trIdx}" class="pos" style="left:${relX}%; top:${relY}%;"><i>${idx}</i></span>`;
+		$pic.append(posTag);
+
+		//테이블에 좌표정보 표현
+		let trTag = `<tr data-id="${trIdx}" class="pickerTr">
+						<th>${idx}</th>
+						<td>
+							<span>left <input type="text" name="xlim" value="${relX}" readonly="readonly"/><em class="per">%</em></span>
+							<span>top <input type="text" name="ylim" value="${relY}" readonly="readonly"/><em class="per">%</em></span>
+							<span>상품코드
+								<input type="text" name="goodsCd" readonly="readonly"/>
+								<button type="button" value="검색하기" class="btn btn-base btn-lg" onclick="fnSearchGoods(${idx});">상품조회</button>
+							</span>
+							<span class="btnDel"><button type="button" value="검색하기" class="btn btn-dark btn-lg" onclick="trDel(${trIdx}, ${idx})">삭제</button></span>
+						</td>
+					</tr>`;
+		$(".dataWrap").append(trTag);
+	});
+
+	/* 좌표 삭제 */
+	function trDel(trIdx, idx) {
+		mcxDialog.confirm( idx + " 번을 삭제하시겠습니까?", {
+			cancelBtnText: "취소",
+			sureBtnText: "삭제",
+			sureBtnClick: function(){
+				$( "[data-id="+trIdx+"]").remove();
+			}
+		});
+	};
+
+	/**
+	 * 상품조회
+	 */
+	var addRowIdx;
+	var fnSearchGoods = function (obj){
+		addRowIdx = obj;
+		cfnOpenGoodsPopup('fnAddLookbookBannerPickerGoods');
+	}
+
+	var fnAddLookbookBannerPickerGoods = function (result){
+		//console.log('result.goodsCd::::::::::'+result[0].goodsCd);
+		$("[data-id="+addRowIdx+"]").find("input[name=readGoodsCd]").val(result[0].goodsCd);
+		$("[data-id="+addRowIdx+"]").find("input[name=goodsCd]").val(result[0].goodsCd);
+		uifnPopupClose('popupGoods');
+	}
+
+	/**
+	 * 저장
+	 */
+	$("#btnSavePicker").on('click', function(){
+		//데이터 validation 체크
+		if(!dataValidation()){
+			return false;
+		}
+
+		var pickerList = [];
+		var pIdx = 0;
+		$(".pickerTr").each(function(){
+			var pickerInfo = {
+				xlim : $(this).find("input[name=xlim]").val()
+				,ylim : $(this).find("input[name=ylim]").val()
+				,goodsCd : $(this).find("input[name=goodsCd]").val()
+			};
+			pickerList.push(pickerInfo);
+			pIdx++;
+		});
+
+		mcxDialog.confirm('저장하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				var data = {
+					lookbookbSq : $('#lbBannerPickerForm input[name=lookbookbSq]').val()
+					,pickerList : pickerList
+					,delYn : 'N'
+					,mode : mode
+				};
+
+				var jsonData = JSON.stringify(data);
+				gagajf.ajaxJsonSubmit($('#lbBannerPickerForm').prop('action'), jsonData, fnPickerSaveCollback);
+			}
+		});
+	});
+
+	var fnPickerSaveCollback = function (){
+		uifnPopupClose('popupLookbookBannerPicker');
+	}
+
+	function dataValidation(){
+		$(".pickerTr").each(function (i){
+			if(gagajf.isNull($(this).find("input[name=xlim]").val())){
+				mcxDialog.alert((i+1)+'행의 left 값이 없습니다.');
+				return false;
+			}
+
+			if(gagajf.isNull($(this).find("input[name=ylim]").val())){
+				mcxDialog.alert((i+1)+'행의 top 값이 없습니다.');
+				return false;
+			}
+
+			if(gagajf.isNull($(this).find("input[name=goodsCd]").val())){
+				mcxDialog.alert((i+1)+'행의 상품코드 값이 없습니다.');
+				return false;
+			}
+		});
+		return true;
+	}
+
+	/**
+	 * picker list
+	 */
+	var fnCreateLookbookPickerList = function (){
+		if(lookbookBannerPickerList.length > 0){
+			for(let i=0; i<lookbookBannerPickerList.length; i++){
+				var picIdx = lookbookBannerPickerList[i].dispOrd;
+				var picX = lookbookBannerPickerList[i].xlim;
+				var picY = lookbookBannerPickerList[i].ylim;
+				var picGoodsCd = lookbookBannerPickerList[i].goodsCd;
+
+				var posTag = '<span data-id="'+picIdx+'" class="pos" style="left:'+picX+'%; top:'+picY+'%;"><i>'+picIdx+'</i></span>';
+				var html = '<tr data-id="'+picIdx+'" class="pickerTr">';
+				html += '<th>'+picIdx+'</th>';
+				html += '		<td>';
+				html += '			<span>left <input type="text" name="xlim" value="'+picX+'" readonly="readonly"/><em class="per">%</em></span>';
+				html += '	<span>top <input type="text" name="ylim" value="'+picY+'" readonly="readonly"/><em class="per">%</em></span>';
+				html += '	<span>상품코드';
+				html += '		<input type="text" name="goodsCd" readonly="readonly" value="'+picGoodsCd+'"/>';
+				html += '		<button type="button" value="검색하기" class="btn btn-base btn-lg" onclick="fnSearchGoods('+picIdx+');">상품조회</button>';
+				html += '	</span>';
+				html += '	<span class="btnDel"><button type="button" value="검색하기" class="btn btn-dark btn-lg" onclick="trDel('+picIdx+', '+picIdx+')">삭제</button></span>';
+				html += '		</td>';
+				html += '	</tr>';
+
+				trIdx = picIdx;
+				idx = picIdx;
+				$pic.append(posTag);
+				$(".dataWrap").append(html);
+			}
+		}
+	}
+
+	$(document).ready(function() {
+		var bannerImgPath = $("#lbBannerPickerForm input[name=uploadBannerUrl]").val().replace('/lookbook/banner/', '')+imgNm;
+		$("#lbBannerPickerForm #bannerPreViewUrl").attr('src', bannerImgPath);
+
+		// 상세/수정일때
+		if(mode != 'N'){
+			fnCreateLookbookPickerList();
+		}
+
+		//sortable Item List
+		/*$("#bannerDiv").sortable({
+			stop: function(event, ui) {
+				fnResetIdx();
+			}
+		});*/
+	});
+/*]]>*/
+</script>
+</html>

+ 151 - 21
src/main/webapp/WEB-INF/views/display/LookbookBannerPopupForm.html

@@ -95,8 +95,8 @@
 						</td>
 						<th>노출여부<i class="required" title="필수"></i></th>
 						<td>
-							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y" checked="checked"/>Y</label>
-							<label class="rdoBtn"><input type="radio" name="dispYn" value="N">N</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="Y"/>Y</label>
+							<label class="rdoBtn"><input type="radio" name="dispYn" value="N" checked="checked">N</label>
 						</td>
 					</tr>
 					<tr>
@@ -105,9 +105,9 @@
 							<div class="uFile w300">
 								<input id="file" name="file" type="file" class="uFileInput w300"/>
 								<label for="file" class="uFileLabel">파일선택</label>
-								<input type="hidden" name="orgTnfileNm"/>
-								<input type="hidden" name="sysTnfileNm"/>
-								<input type="hidden" name="newSysTnfileNm"/>
+								<input type="hidden" name="orgTnfileNm" value=""/>
+								<!--<input type="hidden" name="sysTnfileNm"/>-->
+								<input type="hidden" name="newSysTnfileNm" value=""/>
 							</div>
 							<input type="hidden" name="uploadDefaultUrl" id="uploadDefaultUrl" th:value="${@environment.getProperty('upload.image.view') + '/display/lookbook/thumbnail/'}"/>
 							<div id="imgView" class="off">
@@ -128,6 +128,10 @@
 </div>
 <script type="text/javascript" src="/ux/plugins/gaga/gaga.paging.js?v=2019072202"></script>
 <script th:inline="javascript">
+/*<![CDATA[*/
+	var mode = [[${mode}]];
+	var lookbookMstInfo = [[${lookbookMstInfo}]];
+	var lookbookBannerList = [[${lookbookBannerList}]];
 
 	var bannerIdx = 0;
 	$("#btnAddBanner").on('click', function(){
@@ -141,11 +145,12 @@
 		html += '		<col style="width:5%"/>';
 		html += '	</colgroup>';
 		html += '	<thead>';
-		html += '		<tr>';
+		html += fnAddBannerImgRow();
+		/*html += '		<tr>';
 		html += '			<th>배너이미지</th>';
 		html += '			<td>';
 		html += '				<div class="uFile w300">';
-		html += '					<input id="bannerFile'+bannerIdx+'" name="file" type="file" class="uFileInput w300" onchange="fnBannerImgFileUpload(this, ' + bannerIdx + ')"">';
+		html += '					<input id="bannerFile'+bannerIdx+'" name="file" type="file" class="uFileInput w300" onchange="fnBannerImgFileUpload(this, ' + bannerIdx + ');">';
 		html += '					<label for="bannerFile'+bannerIdx+'" class="uFileLabel">파일선택</label>';
 		html += '					<input type="hidden" name="bannerImgPath" value="">';
 		html += '					<input type="hidden" name="bannerNewImgFile" value="">';
@@ -156,8 +161,10 @@
 		html += '			</td>';
 		html += '			<th>이미지설명</th>';
 		html += '			<td><textarea class="textareaR4" name="imgDesc" id="imgDesc'+bannerIdx+'"></textarea></td>';
-		html += '			<td><input name="dispOrd" type="text" class="w80" placeholder="전시순서" style="margin-left:5px; text-align:center"/><button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteBanner(this);">삭제</button></td>';
-		html += '		</tr>';
+		html += '			<td><input name="dispOrd" type="text" class="w80" placeholder="전시순서" style="margin-left:5px; text-align:center"/>';
+		//html += '			<button type="button" class="btn btn-success btn-lg" onclick="fnAddPicker(this);">피커추가</button>';
+		html += '			<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteBanner(this);">삭제</button></td>';
+		html += '		</tr>';*/
 		html += '	</thead>';
 		html += '</table>';
 
@@ -183,6 +190,7 @@
 		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/lookbook/banner/'
 				, file
 				, function(result) {
+					$(obj).closest('div').find('input:hidden[name=bannerImgPath]').val(result.oldFileName);
 					$(obj).closest('div').find('input:hidden[name=bannerNewImgFile]').val(result.newFileName);
 					$("#lbBannerForm #bannerPreViewUrl_"+idx).attr('src', $("#lbBannerForm #uploadDefaultBannerUrlPop").val()+result.newFileName);
 					$("#lbBannerForm #bannerImgView_"+idx).removeClass("off").addClass("on");
@@ -191,13 +199,6 @@
 		);
 	}
 
-	var fnResetIdx = function (){
-		$(".bannerTableC").each(function (i){
-			$(this).attr('id','bannerTable'+i);
-			$(this).find("input[name=dispOrd]").val(i+1);
-		});
-	}
-
 	/**
 	 * 저장
 	 */
@@ -212,8 +213,7 @@
 			return false;
 		}
 
-		var orgTnfileNm = $('#lbBannerForm input[name=sysTnfileNm]').val();
-		var sysTnfileNm = $('#lbBannerForm input[name=sysTnfileNm]').val();
+		var orgTnfileNm = $('#lbBannerForm input[name=orgTnfileNm]').val();
 		var newSysTnfileNm = $('#lbBannerForm input[name=newSysTnfileNm]').val();
 
 		var fromDate = $('#lbBannerForm input[name=lbDispStdt]').val().replace(/[^0-9]/g, '')+$('#lbBannerForm #lbStTimeHour').val()+$('#lbBannerForm #lbStTimeMin').val()+'00';
@@ -224,7 +224,7 @@
 		var bannerIndex=0;
 		$(".bannerTableC").each(function (){
 			var bannerInfo = {
-				orgFileNm : $(this).find("input[name=bannerNewImgFile]").val()
+				orgFileNm : $(this).find("input[name=bannerImgPath]").val()
 				,sysFileNm : $(this).find("input[name=bannerNewImgFile]").val()
 				,imgDesc : $(this).find("textarea[name=imgDesc]").val()
 				,dispOrd : $(this).find("input[name=dispOrd]").val()
@@ -247,11 +247,11 @@
 					,dispEddt : toDate
 					,dispYn : $('#lbBannerForm input[name=dispYn]:checked').val()
 					,orgTnfileNm : orgTnfileNm
-					,sysTnfileNm : sysTnfileNm
 					,newSysTnfileNm : newSysTnfileNm
 					,mainDispYn : 'N'
 					,dispOrd : 1
 					,bannerList : bannerList
+					,mode : mode
 				};
 
 				var jsonData = JSON.stringify(data);
@@ -288,7 +288,7 @@
 		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/lookbook/thumbnail'
 				, file
 				, function(result) {
-					$('#lbBannerForm input[name=sysTnfileNm]').val(result.oldFileName);
+					$('#lbBannerForm input[name=orgTnfileNm]').val(result.oldFileName);
 					$('#lbBannerForm input[name=newSysTnfileNm]').val(result.newFileName);
 					$("#lbBannerForm #bannerPreViewUrl").attr('src', $("#lbBannerForm #uploadDefaultUrl").val()+result.newFileName);
 					$("#lbBannerForm #imgView").removeClass("off").addClass("on");
@@ -304,7 +304,136 @@
 		}
 	});
 
+	/**
+	 * 배너 리스트
+	 */
+	var fnCreateLookbookLayout = function (){
+		//마스터정보 셋팅
+		var dispStdt = lookbookMstInfo.dispStdt.split(" ");
+		var dispStTime = dispStdt[1].replace(/[^0-9]/g, '');
+		var dispEddt = lookbookMstInfo.dispEddt.split(" ");
+		var dispEdTime = dispEddt[1].replace(/[^0-9]/g, '');
+		$("#lbBannerForm input[name=lbDispStdt]").val(dispStdt[0]);
+		$("#lbBannerForm #lbStTimeHour").val(dispStTime.substr(0,2));
+		$("#lbBannerForm #lbStTimeMin").val(dispStTime.substr(2,2));
+		$("#lbBannerForm input[name=lbDispEddt]").val(dispEddt[0]);
+		$("#lbBannerForm #lbEdTimeHour").val(dispEdTime.substr(0,2));
+		$("#lbBannerForm #lbEdTimeMin").val(dispEdTime.substr(2,2));
+		$("#lbBannerForm input[name=title]").val(lookbookMstInfo.title);
+		$("#lbBannerForm select[name=brandCd]").val(lookbookMstInfo.brandCd);
+		$('input:radio[name="dispYn"]:radio[value='+lookbookMstInfo.dispYn+']').prop('checked', true);
+		var tnImgPath = lookbookMstInfo.sysTnfileNm;
+		var tnSrc = $("#uploadDefaultUrl").val().replace('/lookbook/thumbnail/', '');
+		tnSrc = tnSrc + tnImgPath;
+		$("#lbBannerForm input[name=orgTnfileNm]").val(tnImgPath);
+		$("#lbBannerForm #bannerPreViewUrl").attr('src', tnSrc);
+		$("#lbBannerForm #imgView").removeClass("off").addClass("on");
+
+		if(lookbookBannerList.length > 0){
+			for(let i=0; i<lookbookBannerList.length; i++){
+				var html = '';
+				var imgPath = lookbookBannerList[i].sysFileNm;
+				var src = $("#uploadDefaultBannerUrlPop").val().replace('/lookbook/banner/', '');
+				src = src + imgPath;
+				html += '<table class="frmStyle bannerTableC" id="bannerTable'+i+'">';
+				html += '	<input type="hidden" name="lookbookbSq" value="'+lookbookBannerList[i].lookbookbSq+'">';
+				html += '	<colgroup>';
+				html += '		<col style="width:10%"/>';
+				html += '		<col style="width:30%"/>';
+				html += '		<col style="width:10%"/>';
+				html += '		<col style="width:45%"/>';
+				html += '		<col style="width:5%"/>';
+				html += '	</colgroup>';
+				html += '	<thead>';
+				html += fnAddBannerImgRow(imgPath,lookbookBannerList[i].imgDesc,lookbookBannerList[i].dispOrd);
+				/*html += '		<tr>';
+				html += '			<th>배너이미지</th>';
+				html += '			<td>';
+				html += '				<div class="uFile w300">';
+				html += '					<input id="bannerFile'+i+'" name="file" type="file" class="uFileInput w300" onchange="fnBannerImgFileUpload(this, '+i+');">';
+				html += '					<label for="bannerFile'+i+'" class="uFileLabel">파일선택</label>';
+				html += '					<input type="hidden" name="bannerImgPath" value="'+imgPath+'">';
+				html += '					<input type="hidden" name="bannerNewImgFile" value="">';
+				html += '				</div>';
+				html += '				<div id="bannerImgView_'+i+'">';
+				html += '					<img id="bannerPreViewUrl_'+i+'" src="'+src+'" style="height:100px; max-width:500px;"/>';
+				html += '				</div>';
+				html += '			</td>';
+				html += '			<th>이미지설명</th>';
+				html += '			<td><textarea class="textareaR4" name="imgDesc" id="imgDesc'+i+'">'+lookbookBannerList[i].imgDesc+'</textarea></td>';
+				html += '			<td><input name="dispOrd" type="text" class="w80" placeholder="전시순서" style="margin-left:5px; text-align:center" value="'+lookbookBannerList[i].dispOrd+'"/>';
+				html += '				<button type="button" class="btn btn-success btn-lg" onclick="fnAddPicker(this);">피커추가</button>';
+				html += '				<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteBanner(this);">삭제</button></td>';
+				html += '		</tr>';*/
+				html += '	</thead>';
+				html += '</table>';
+
+				$("#bannerDiv").append(html);
+				$("#bannerDiv").sortable();
+				fnResetIdx();
+			}
+		}
+	}
+
+	var bannerImgRow = 0;
+	var fnAddBannerImgRow = function (param, imgdesc, dispord){
+		var src = '';
+		var imgPath = '';
+		var desc = '';
+		if(!gagajf.isNull(imgdesc)){
+			desc = imgdesc;
+		}
+		if(!gagajf.isNull(param) && typeof param!='object'){
+			src = $("#uploadDefaultBannerUrlPop").val().replace('/lookbook/banner/', '')+param;
+			imgPath = param;
+		}
+		var html = '';
+		html += '		<tr class="bannerImgTr">';
+		html += '			<th>배너이미지</th>';
+		html += '			<td>';
+		html += '				<div class="uFile w300">';
+		html += '					<input id="bannerFile'+bannerImgRow+'" name="file" type="file" class="uFileInput w300" onchange="fnBannerImgFileUpload(this, '+bannerImgRow+');">';
+		html += '					<label for="bannerFile'+bannerImgRow+'" class="uFileLabel">파일선택</label>';
+		html += '					<input type="hidden" name="bannerImgPath" value="'+imgPath+'">';
+		html += '					<input type="hidden" name="bannerNewImgFile" value="">';
+		html += '				</div>';
+		html += '				<div id="bannerImgView_'+bannerImgRow+'">';
+		html += '					<img id="bannerPreViewUrl_'+bannerImgRow+'" src="'+src+'" style="height:100px; max-width:500px;"/>';
+		html += '				</div>';
+		html += '			</td>';
+		html += '			<th>이미지설명</th>';
+		html += '			<td><textarea class="textareaR4" name="imgDesc" id="imgDesc'+bannerImgRow+'">'+desc+'</textarea></td>';
+		html += '			<td><input name="dispOrd" type="text" class="w80" placeholder="전시순서" style="margin-left:5px; text-align:center" value="'+dispord+'"/>';
+		html += '				<button type="button" class="btn btn-success btn-lg" onclick="fnAddPicker(this,\''+imgPath+'\');">피커추가</button>';
+		html += '				<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteBanner(this);">삭제</button></td>';
+		html += '		</tr>';
+		if(typeof param == 'object'){
+			bannerImgRow++;
+			$(param).closest("table").find("tbody").append(html);
+		}else{
+			bannerImgRow++;
+			return html;
+		}
+	}
+
+	var fnAddPicker = function (obj, imgpath){
+		var lookbookbSq = $(obj).closest("table").find("input[name=lookbookbSq]").val();
+		var imgNm = imgpath;
+		cfnOpenLookbookBannerPickerPopup(lookbookbSq,imgNm);
+	}
+
+	var fnResetIdx = function (){
+		$(".bannerTableC").each(function (i){
+			$(this).attr('id','bannerTable'+i);
+			$(this).find("input[name=dispOrd]").val(i+1);
+		});
+	}
+
 	$(document).ready(function() {
+		// 상세/수정일때
+		if(mode != 'N'){
+			fnCreateLookbookLayout();
+		}
 		//sortable Item List
 		$("#bannerDiv").sortable({
 			stop: function(event, ui) {
@@ -312,5 +441,6 @@
 			}
 		});
 	});
+/*]]>*/
 </script>
 </html>

+ 8 - 0
src/main/webapp/WEB-INF/views/display/LookbookListForm.html

@@ -156,6 +156,14 @@
 	let gridOptions = gagaAgGrid.getGridOptions(columnDefs);
 	gridOptions.rowSelection = "multiple";
 
+	// 셀 클릭 이벤트
+	gridOptions.onCellClicked = function(event) {
+		if (event.colDef.field == 'lookbookSq') {
+			// 룩북 상세
+			cfnOpenLookbookBannerPopup('U',event.data.lookbookSq);
+		}
+	}
+
 	// 등록 팝업
 	$("#btnReg").on('click', function(){
 		cfnOpenLookbookBannerPopup('N');

+ 1 - 1
src/main/webapp/WEB-INF/views/goods/GoodsDetailForm.html

@@ -158,7 +158,7 @@
 										</td>
 									</tr>
 									<tr>
-										<td rowspan="12">&nbsp;</td>
+										<td rowspan="13">&nbsp;</td>
 										<th>시즌<em class="required" title="필수"></em></th>
 										<td >
 											<select  name="seasonCd" id="seasonCd">

+ 5 - 5
src/main/webapp/WEB-INF/views/goods/GoodsImageForm.html

@@ -255,11 +255,11 @@
 		str = str + '<div class="panelContent">';
 		str = str + '<ul class="notice ">';
 		str = str + '<em><b>* 상품 이미지 파일명</b></em>';
-		str = str + '<li><b>상품메인컷</b> : 상품코드_<b>01</b>.jpg<em>(앞)</em>,상품코드_<b>02</b>.jpg<em>(뒤)</em></li>';
-		str = str + '<li><b>상품모델컷</b> : 상품코드_<b>M1</b>.jpg ~ 상품코드_<b>M5</b>.jpg</li>';
-		str = str + '<li><b>상품상세컷</b> : 상품코드_<b>D1</b>.jpg ~ 상품코드_<b>D5</b>.jpg</li>';
-		str = str + '<li><b>상품소재컷</b> : 상품코드_<b>S1</b>.jpg</li>';
-		str = str + '<li><b>상품라벨컷</b> : 상품코드_<b>L1</b>.jpg, (상품코드_<b>L2</b>.jpg)</li>';
+		str = str + '<li><b>상품메인컷</b> : 상품코드_색상코드_<b>01</b>.jpg<em>(앞)</em>,상품코드_색상코드_<b>02</b>.jpg<em>(뒤)</em></li>';
+		str = str + '<li><b>상품모델컷</b> : 상품코드_색상코드_<b>M1</b>.jpg ~ 상품코드_색상코드_<b>M5</b>.jpg</li>';
+		str = str + '<li><b>상품상세컷</b> : 상품코드_색상코드_<b>D1</b>.jpg ~ 상품코드_색상코드_<b>D5</b>.jpg</li>';
+		str = str + '<li><b>상품소재컷</b> : 상품코드_색상코드_<b>S1</b>.jpg</li>';
+		str = str + '<li><b>상품라벨컷</b> : 상품코드_색상코드_<b>L1</b>.jpg, (상품코드_색상코드_<b>L2</b>.jpg)</li>';
 		str = str + '</ul>';
 		str = str + '</div></div></div></div>';
 

+ 16 - 16
src/main/webapp/ux/css/admin.ui.css

@@ -861,22 +861,22 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none;}
 .noticeWrap .download a:visited{border-bottom:1px solid #999;color:#333;}
 
 /* 이미지 좌표값 가져오기 */
-.pictureOffset > li{vertical-align:top;}
-.pictureOffset > li:nth-of-type(1){width:700px;padding-right:20px;-webkit-user-select:none;user-select:none;}
-.pictureOffset .picWrap{overflow:hidden;position:relative;width:700px;height:700px;background-color:#ddd;}
-.pictureOffset .picWrap .picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:auto;height:auto;max-height:100%;max-width:100%;}
-.pictureOffset .dataWrap{min-width:727px;}
-.pictureOffset .dataWrap th{background:#e9f7ff;}
-.pictureOffset .dataWrap td{padding-left:20px;}
-.pictureOffset .dataWrap td input{margin:0 0 0 10px;}
-.pictureOffset .dataWrap td span{margin-right:30px;}
-.pictureOffset .dataWrap td span:nth-of-type(1) input{width:70px;}
-.pictureOffset .dataWrap td span .per{display:inline-block;padding-left:5px;line-height:30px;color:#777;font-size:13px;}
-.pictureOffset .dataWrap td span:nth-of-type(2) input{width:70px;}
-.pictureOffset .dataWrap td span:nth-of-type(3) input{width:120px;}
-.pictureOffset .dataWrap .btnDel{position:absolute;right:4px;margin-right:0;}
-.pictureOffset .pos{position:absolute;width:0px;height:0px;}
-.pictureOffset .pos i{overflow:hidden;position:absolute;left:0;top:0;transform:translate(-50%,-50%);width:40px;height:40px;line-height:1;color:#fff;font-size:20px;text-align:center;background-color:#fd4802;border-radius:100%;box-sizing:border-box;padding-top:10px;}
+#pictureOffset > li{vertical-align:top;}
+#pictureOffset > li:nth-of-type(1){width:700px;padding-right:20px;-webkit-user-select:none;user-select:none;}
+#pictureOffset .picWrap{overflow:hidden;position:relative;width:700px;height:700px;background-color:#ddd;}
+#pictureOffset .picWrap .picture{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:auto;height:auto;max-height:100%;max-width:100%;}
+#pictureOffset .dataWrap{min-width:727px;}
+#pictureOffset .dataWrap th{background:#e9f7ff;}
+#pictureOffset .dataWrap td{padding-left:20px;}
+#pictureOffset .dataWrap td input{margin:0 0 0 10px;}
+#pictureOffset .dataWrap td span{margin-right:30px;}
+#pictureOffset .dataWrap td span:nth-of-type(1) input{width:70px;}
+#pictureOffset .dataWrap td span .per{display:inline-block;padding-left:5px;line-height:30px;color:#777;font-size:13px;}
+#pictureOffset .dataWrap td span:nth-of-type(2) input{width:70px;}
+#pictureOffset .dataWrap td span:nth-of-type(3) input{width:120px;}
+#pictureOffset .dataWrap .btnDel{position:absolute;right:4px;margin-right:0;}
+#pictureOffset .pos{position:absolute;width:0px;height:0px;}
+#pictureOffset .pos i{overflow:hidden;position:absolute;left:0;top:0;transform:translate(-50%,-50%);width:40px;height:40px;line-height:1;color:#fff;font-size:20px;text-align:center;background-color:#fd4802;border-radius:100%;box-sizing:border-box;padding-top:10px;}
 
 /* 반응형:GNB 유저명,등급,로그아웃 --------------- */
 @media ( max-width:1370px ) {

+ 16 - 0
src/main/webapp/ux/js/admin.popup.js

@@ -915,4 +915,20 @@ var cfnOpenAfChannelPopup = function(callbackfun) {
 	} 
 		
 	cfnOpenModalPopup(actionUrl,'popupAfChannel');
+}
+
+/**
+ * @type   : function
+ * @access : public
+ * @desc   : 룩북 배너 피커 팝업 오픈
+ * <pre>
+ *     cfnOpenLookbookBannerPickerPopup(lookbookbSq,imgNm);
+ * </pre>
+ * @param  : lookbookbSq - 룩북 배너 일련번호 , imgNm - 이미지파일
+ * @since  : 2021/03/09
+ * @author : bin2107
+ */
+var cfnOpenLookbookBannerPickerPopup = function(lookbookbSq, imgNm) {
+	var actionUrl = "/display/lookbook/banner/picker/popup/form?lookbookbSq="+lookbookbSq+"&imgNm="+imgNm;
+	cfnOpenModalPopup(actionUrl, 'popupLookbookBannerPicker');
 }

+ 1 - 1
src/main/webapp/ux/plugins/gaga/gaga.validation.js

@@ -501,7 +501,7 @@ var gagajf = {
 	 * 사용) gagajf.replaceOneQuestionMark('#registerForm');
 	 */
 	replaceOneQuestionMark : function(formId) {
-		$(formId).find('input').each(function(idx, el) {
+		$(formId).find('input[type=text]').each(function(idx, el) {
 			$(el).val($(el).val().replace(/\?+/gi, "?"));
 		});