Kaynağa Gözat

메인전시관리 개발중 임시커밋

bin2107 5 yıl önce
ebeveyn
işleme
807073d9ec

+ 29 - 0
src/main/java/com/style24/admin/biz/service/TsaDisplayService.java

@@ -531,6 +531,27 @@ public class TsaDisplayService {
 		int ind = 1;
 		for (Contents contents : contentsList) {
 			if (contents != null && contents.getDispStdt() != null && !contents.getDispStdt().equals("")) {
+				// 브랜드 이미지 변경이 일어났을 경우
+				String brandGroupImg = contents.getBrandGroupImg();
+				if(brandGroupImg != null && !brandGroupImg.equals("")){
+					String imgInd = "01";
+					String bannerUploadPath = env.getProperty("upload.default.target.path");
+					bannerUploadPath = bannerUploadPath + "/display/";
+					String yearMonth = GagaDateUtil.getToday().substring(0, 6);
+					bannerUploadPath = GagaFileUtil.getConcatenationPath(bannerUploadPath, "contents/brand");
+					File newFile = new File(GagaFileUtil.getConcatenationPath(bannerUploadPath, brandGroupImg));
+					bannerUploadPath = GagaFileUtil.getConcatenationPath(bannerUploadPath, yearMonth);
+					String newFilename = "BRAND_" + GagaDateUtil.getTodayDateTime() + "_" + imgInd + "." + StringUtils.getFilenameExtension(brandGroupImg);
+					File uniqueFile = GagaFileUtil.getUniqueFile(new File(GagaFileUtil.getConcatenationPath(bannerUploadPath, newFilename)));
+					// Rename a file
+					File path = new File(bannerUploadPath);
+					if (!path.exists()) {
+						path.mkdir();
+					}
+					newFile.renameTo(uniqueFile);
+					contents.setBrandGroupImg("/contents/brand/" + yearMonth + "/" + newFilename);
+				}
+
 				int cnt = 1;
 				for (String newImgFile : contents.getNewImgFileArr()) {
 					//이미지 변경이 일어났을 경우
@@ -561,6 +582,14 @@ public class TsaDisplayService {
 							contents.setImgPath3("/contents/" + yearMonth + "/" + newFilename);
 						} else if (cnt == 4) {
 							contents.setImgPath4("/contents/" + yearMonth + "/" + newFilename);
+						} else if (cnt == 5) {
+							contents.setImgPath5("/contents/" + yearMonth + "/" + newFilename);
+						} else if (cnt == 6) {
+							contents.setImgPath6("/contents/" + yearMonth + "/" + newFilename);
+						} else if (cnt == 7) {
+							contents.setImgPath7("/contents/" + yearMonth + "/" + newFilename);
+						} else if (cnt == 8) {
+							contents.setImgPath4("/contents/" + yearMonth + "/" + newFilename);
 						}
 						ind++;
 

+ 18 - 0
src/main/java/com/style24/admin/biz/web/TsaDisplayController.java

@@ -619,4 +619,22 @@ public class TsaDisplayController extends TsaBaseController {
 		return displayService.getCategory4srch(category);
 	}
 
+	/**
+	 * 메인전시 컨텐츠 멀티 수정 팝업
+	 * @return
+	 * @author bin2107
+	 * @since 2021. 2. 24
+	 */
+	@GetMapping("/main/multicontents/popup/form")
+	public ModelAndView mainMultiContentsPopupForm(@RequestParam(value = "cateNo") String cateNo, @RequestParam(value = "contentsLoc") String contentsLoc) {
+		ModelAndView mav = new ModelAndView();
+		mav.addObject("cateNo", cateNo);
+		mav.addObject("contentsLoc", contentsLoc);
+		mav.addObject("contentsDesc", displayService.getContentsDesc(contentsLoc));
+		mav.addObject("contentsLocList", rendererService.getAvailCommonCodeList("G028"));
+		mav.addObject("contentsTitle", displayService.getContentsTitle(cateNo,contentsLoc));
+		mav.setViewName("display/MainMultiContentsPopupForm");
+		return mav;
+	}
+
 }

+ 11 - 0
src/main/java/com/style24/persistence/domain/Contents.java

@@ -22,10 +22,18 @@ public class Contents extends TscBaseDomain {
     private String imgPath2;
     private String imgPath3;
     private String imgPath4;
+    private String imgPath5;
+    private String imgPath6;
+    private String imgPath7;
+    private String imgPath8;
     private String strVar1;
     private String strVar2;
     private String strVar3;
     private String strVar4;
+    private String strVar5;
+    private String strVar6;
+    private String strVar7;
+    private String strVar8;
     private String strTitle1;
     private String strTitle2;
     private String strTitle3;
@@ -34,6 +42,9 @@ public class Contents extends TscBaseDomain {
     private String subText2;
     private String subText3;
     private String subText4;
+    private String brandGroupNo;
+    private String brandGroupImg;
+    private String mdTitle;
     private String useYn;
     private String contentsTitle;
 

+ 55 - 0
src/main/java/com/style24/persistence/mybatis/shop/TsaDsiplay.xml

@@ -1277,10 +1277,18 @@
 			 , IMG_PATH2
 			 , IMG_PATH3
 			 , IMG_PATH4
+			 , IMG_PATH5
+			 , IMG_PATH6
+			 , IMG_PATH7
+			 , IMG_PATH8
 			 , STR_VAR1
 			 , STR_VAR2
 			 , STR_VAR3
 			 , STR_VAR4
+			 , STR_VAR5
+			 , STR_VAR6
+			 , STR_VAR7
+			 , STR_VAR8
 			 , STR_TITLE1
 			 , STR_TITLE2
 			 , STR_TITLE3
@@ -1289,6 +1297,9 @@
 			 , SUB_TEXT2
 			 , SUB_TEXT3
 			 , SUB_TEXT4
+			 , BRAND_GROUP_NO
+			 , BRAND_GROUP_IMG
+			 , MD_TITLE
 			 , USE_YN
 			 , REG_NO
 			 , REG_DT
@@ -1324,10 +1335,18 @@
 			, IMG_PATH2
 			, IMG_PATH3
 			, IMG_PATH4
+			, IMG_PATH5
+			, IMG_PATH6
+			, IMG_PATH7
+			, IMG_PATH8
 			, STR_VAR1
 			, STR_VAR2
 			, STR_VAR3
 			, STR_VAR4
+			, STR_VAR5
+			, STR_VAR6
+			, STR_VAR7
+			, STR_VAR8
 			, STR_TITLE1
 			, STR_TITLE2
 			, STR_TITLE3
@@ -1336,6 +1355,9 @@
 			, SUB_TEXT2
 			, SUB_TEXT3
 			, SUB_TEXT4
+			, BRAND_GROUP_NO
+			, BRAND_GROUP_IMG
+			, MD_TITLE
 			, USE_YN
 			, REG_NO
 			, REG_DT
@@ -1355,10 +1377,18 @@
 			,#{imgPath2}
 			,#{imgPath3}
 			,#{imgPath4}
+			,#{imgPath5}
+			,#{imgPath6}
+			,#{imgPath7}
+			,#{imgPath8}
 			,#{strVar1}
 			,#{strVar2}
 			,#{strVar3}
 			,#{strVar4}
+			,#{strVar5}
+			,#{strVar6}
+			,#{strVar7}
+			,#{strVar8}
 			,#{strTitle1}
 			,#{strTitle2}
 			,#{strTitle3}
@@ -1367,6 +1397,9 @@
 			,#{subText2}
 			,#{subText3}
 			,#{subText4}
+			,#{brandGroupNo}
+			,#{brandGroupImg}
+			,#{mdTitle}
 			,#{useYn}
 			,#{regNo}
 			,NOW()
@@ -1402,10 +1435,18 @@
 			, IMG_PATH2
 			, IMG_PATH3
 			, IMG_PATH4
+			, IMG_PATH5
+			, IMG_PATH6
+			, IMG_PATH7
+			, IMG_PATH8
 			, STR_VAR1
 			, STR_VAR2
 			, STR_VAR3
 			, STR_VAR4
+			, STR_VAR5
+			, STR_VAR6
+			, STR_VAR7
+			, STR_VAR8
 			, STR_TITLE1
 			, STR_TITLE2
 			, STR_TITLE3
@@ -1414,6 +1455,9 @@
 			, SUB_TEXT2
 			, SUB_TEXT3
 			, SUB_TEXT4
+			, BRAND_GROUP_NO
+			, BRAND_GROUP_IMG
+			, MD_TITLE
 			, USE_YN
 			, REG_NO
 			, REG_DT
@@ -1432,10 +1476,18 @@
 			 , IMG_PATH2
 			 , IMG_PATH3
 			 , IMG_PATH4
+			 , IMG_PATH5
+			 , IMG_PATH6
+			 , IMG_PATH7
+			 , IMG_PATH8
 			 , STR_VAR1
 			 , STR_VAR2
 			 , STR_VAR3
 			 , STR_VAR4
+			 , STR_VAR5
+			 , STR_VAR6
+			 , STR_VAR7
+			 , STR_VAR8
 			 , STR_TITLE1
 			 , STR_TITLE2
 			 , STR_TITLE3
@@ -1444,6 +1496,9 @@
 			 , SUB_TEXT2
 			 , SUB_TEXT3
 			 , SUB_TEXT4
+			 , BRAND_GROUP_NO
+			 , BRAND_GROUP_IMG
+			 , MD_TITLE
 			 , USE_YN
 			 , #{regNo}
 			 , NOW()

+ 7 - 1
src/main/webapp/WEB-INF/views/display/MainListForm.html

@@ -560,7 +560,13 @@
 			cateNo = $("#searchForm select[name=cate2No]").val().split(',')[0];
 		}
 		var contentsLoc = $(obj).closest("td").find('input:hidden[name="contentsLoc"]').val();
-		cfnOpenMainContentsPopup(cateNo, contentsLoc);
+
+		// 브랜드픽, MD추천 다른 팝업 사용
+		if(contentsLoc=='SMM007'||contentsLoc=='SMM010'){
+			cfnOpenMainMultiContentsPopup(cateNo, contentsLoc);
+		}else{
+			cfnOpenMainContentsPopup(cateNo, contentsLoc);
+		}
 	}
 
 	/**

+ 562 - 0
src/main/webapp/WEB-INF/views/display/MainMultiContentsPopupForm.html

@@ -0,0 +1,562 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : MainMultiContentsPopupForm.html
+ * @desc    : 메인전시 컨텐츠 멀티 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.2.24    bin2107     최초 작성
+ *******************************************************************************
+ -->
+	<div class="modalPopup" data-width="1400" >
+		<div class="panelStyle">
+			<div class="panelTitle">
+				<h2 id="multiPopTitle" th:text="${contentsLoc}">Multi</h2>
+				<button type="button" class="close" onclick="fnMainMultiContentsPopupFormClose()"><i class="fa fa-times"></i></button>
+			</div>
+			<div class="panelContent">
+				<ul class="panelBar">
+					<li class="aL">
+						<span class="cBlue">* 상단으로 드래그&amp;드랍하여 순서 변경 가능합니다.</span>
+					</li>
+					<li class="aR">
+						<button type="button" class="btn btn btn-base btn-sm" th:if="${contentsLoc == 'SMM007'}" onclick="fnAddBrand(this);">브랜드 추가</button> <!--id="btnBrandAddRow"-->
+						<button type="button" class="btn btn btn-base btn-sm" th:if="${contentsLoc == 'SMM010'}" id="btnContentsAddRow">컨텐츠 추가</button>
+						<button type="button" class="btn btn btn-dark btn-sm" id="btnMultiPopSave">임시저장</button>
+						<input type="hidden" name="uploadDefaultUrlMultiPop" id="uploadDefaultUrlMultiPop" th:value="${@environment.getProperty('upload.image.view') + '/display/contents/'}"/>
+						<input type="hidden" name="uploadDefaultBrandUrlPop" id="uploadDefaultBrandUrlPop" th:value="${@environment.getProperty('upload.image.view') + '/display/contents/brand/'}"/>
+						<input type="hidden" name="uploadDefaultPlanUrlPop" id="uploadDefaultPlanUrlPop" th:value="${@environment.getProperty('upload.image.view') + '/display/contents/plan/'}"/>
+					</li>
+				</ul>
+			</div>
+			<form name="multiContentsTitleForm" id="multiContentsTitleForm" style="width:1170px; overflow:auto; display: none;">
+				<table class="frmStyle">
+					<colgroup>
+						<col style="width:10%;"/>
+						<col style="width:90%;"/>
+					</colgroup>
+					<tr>
+						<th>컨텐츠 타이틀</th>
+						<td><input type="text" name="contentsTitle" style="width:50%;" maxlength="40" required="required" data-valid-name="컨텐츠타이틀" th:value="${contentsTitle}"></td>
+					</tr>
+				</table>
+			</form>
+			<form style="height:600px; width:1370px; overflow:auto;" id="multiPopSortable">
+				<input type="hidden" name="mdTitle">
+			</form>
+		</div>
+	</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var cateNo = [[${cateNo}]];
+	var contentsLoc = [[${contentsLoc}]];
+	var contentsTitle = [[${contentsTitle}]];
+	var contentsLocArr = gagajf.convertToArray([[${contentsLocList}]]);
+	var tdWidth = $("#sortable").find("td").width();
+	var tdDeleteWidth = parseInt(tdWidth/11, 10);
+	tdWidth = tdWidth - tdDeleteWidth;
+
+	/**
+	 * 컨텐츠 미리보기 리스트
+	 */
+	var fnGetMultiContentsPreviewList = function (){
+		$("#multiPopSortable").html('');
+		$("#multiPopSortable").html('');
+		var data = {cateNo : cateNo
+			,contentsLoc : contentsLoc
+		};
+		var jsonData = JSON.stringify(data);
+		gagajf.ajaxJsonSubmit('/display/contents/preview/list', jsonData, fnCreatePopLayout);
+	}
+
+	var fnCreatePopLayout = function (result){
+		var html = '';
+		for(var i=0; i<result.length; i++){
+			var dispStdt = result[i].dispStdt.split(" ");
+			var dispEddt = result[i].dispEddt.split(" ");
+			var brandGroupImg = result[i].brandGroupImg;
+			html += '<table class="frmStyle" style="margin-bottom:30px">';
+			html += '<colgroup>';
+			html += '<col style="width:10%;"/>';
+			html += '<col style="width:55%;"/>';
+			html += '<col/>';
+			html += '</colgroup>';
+			html += '<thead><tr><th>전시일시</th><td><input name="dispStdt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출시작일" data-valid-type="calendar" value="'+dispStdt[0]+'"/>';
+			html += '<select name="stTimeHour" required="required" data-valid-name="노출기간 시작시간">';
+			html += fnCreateTimeOption(24, dispStdt[1].split(":")[0]);
+			html += '</select>';
+			html += '<select name="stTimeMin" required="required" data-valid-name="노출기간 시작시간">';
+			html += fnCreateTimeOption(60, dispStdt[1].split(":")[1]);
+			html += '</select>';
+			html += '<span> ~ </span>';
+			html += '<input name="dispEddt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출종료일" data-valid-type="calendar" value="'+dispEddt[0]+'"/>';
+			html += '<select name="edTimeHour" required="required" data-valid-name="노출기간 종료시간">';
+			html += fnCreateTimeOption(24, dispEddt[1].split(":")[0]);
+			html += '</select>';
+			html += '<select name="edTimeMin" required="required" data-valid-name="노출기간 종료시간">';
+			html += fnCreateTimeOption(60, dispEddt[1].split(":")[1]);
+			html += '</select>';
+			html += '<input name="dispOrd" type="text" class="w80"placeholder="전시순서" style="margin-left:5px; text-align:center"/>';
+			html += '</td>';
+			html += '<td class="aL"><button type="button" class="btn btn-base btn-lg" onclick="fnAddPlanRow(this);">기획전/배너추가</button>';
+			//html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddGoodsRow(this);">상품추가</button>';
+			html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteBrandRow(this);">삭제</button></td>';
+			html += '</tr>';
+			html += '<tr>';
+			html += '<th>브랜드코드</th>';
+			html += '<td colspan="3"><input type="text" name="brandGroupNo" style="width:30%;" value="'+result[i].brandGroupNo+'">';
+			html += '<button type="button" class="btn btnRight btn-success btn-lg" onclick="fnGetBrandGroup();">브랜드조회</button>';
+			html += '</td>';
+			html += '</tr>';
+			html += '<tr name="brandImgRow">';
+			html += '<th>브랜드이미지</th>';
+			html += '<td colspan="3">';
+			html += '	<div class="uFile w300">';
+			html += '		<input id="brandFile_'+i+'" name="file" type="file" class="uFileInput w300" onchange="fnBrandImgFileUpload(this, '+i+')">';
+			html += '		<label for="brandFile_'+i+'" class="uFileLabel">파일선택</label>';
+			html += '		<input type="hidden" name="brandImgPath" value="'+result[i].brandGroupImg+'">';
+			html += '		<input type="hidden" name="brandNewImgFile" value="">';
+			html += '	</div>';
+			html += '	<div id="brandImgViewPop_'+i+'" class=';
+			if (brandGroupImg != '') {
+				html += '"on">';
+			} else {
+				html += '"off">';
+			}
+			html += '	<img id="brandPreViewUrlPop_'+i+'" src="" style="height:100px; max-width:500px;" onclick="cfnOpenImagePreViewPopup(\'brandPreViewUrlPop\',$(this).attr(\'src\'));"/>';
+			html += '	</div>';
+			html += '</td>';
+			html += '</tr>';
+			html += '</thead><tbody></tbody>';
+			for(var j=1; j<8; j++){
+				var imgPath = eval("result["+i+"].imgPath" + j);
+				if(imgPath!=null && imgPath!='null' && imgPath!='' ){
+					html += fnAddPlanRow(imgPath);
+				}
+			}
+			html += '</tbody></table>';
+		}
+		$("#multiPopSortable").append(html);
+		$("#multiPopSortable").sortable();
+		$('.schDate').datepicker("destroy");
+		$('.schDate').datepicker({
+			changeMonth: true,
+			changeYear: true,
+			defaultDate: $('.schDate').val()
+		});
+	}
+
+	/**
+	 * 브랜드 추가 버튼
+	 */
+	var brandIdx = 0;
+	var fnAddBrand = function (param) {
+		var src = '';
+		var imgPath = '';
+		if (typeof param != 'object') {
+			src = $("#uploadDefaultBrandUrlPop").val().replace('/contents/brand', '') + param;
+			imgPath = param;
+		}
+
+		var html = '<table class="frmStyle" style="margin-bottom:30px">';
+		html += '<colgroup>';
+		html += '<col style="width:10%;"/>';
+		html += '<col style="width:55%;"/>';
+		html += '<col/>';
+		html += '</colgroup>';
+		html += '<thead><tr><th>전시일시</th><td><input name="dispStdt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출시작일" data-valid-type="calendar"/>';
+		html += '<select name="stTimeHour" required="required" data-valid-name="노출기간 시작시간">';
+		html += fnCreateTimeOption(24);
+		html += '</select>';
+		html += '<select name="stTimeMin" required="required" data-valid-name="노출기간 시작시간">';
+		html += fnCreateTimeOption(60);
+		html += '</select>';
+		html += '<span> ~ </span>';
+		html += '<input name="dispEddt" type="text" class="w80 schDate" maxlength="10" required="required" data-valid-name="노출종료일" data-valid-type="calendar"/>';
+		html += '<select name="edTimeHour" required="required" data-valid-name="노출기간 종료시간">';
+		html += fnCreateTimeOption(24, 23);
+		html += '</select>';
+		html += '<select name="edTimeMin" required="required" data-valid-name="노출기간 종료시간">';
+		html += fnCreateTimeOption(60, 59);
+		html += '</select>';
+		html += '<input name="dispOrd" type="text" class="w80" placeholder="전시순서" style="margin-left:5px; text-align:center"/>';
+		html += '</td>';
+		html += '<td class="aL"><button type="button" class="btn btn-base btn-lg" onclick="fnAddPlanRow(this);">기획전/배너추가</button>';
+		//html += '<button type="button" class="btn btn-base btn-lg" onclick="fnAddGoodsRow(this);">상품추가</button>';
+		html += '<button type="button" class="btn btn-danger btn-lg" onclick="fnDeleteBrandRow(this);">삭제</button></td>';
+		html += '</tr>';
+		html += '<tr>';
+		html += '<th>브랜드코드</th>';
+		html += '<td colspan="3"><input type="text" name="brandGroupNo" style="width:30%;">';
+		html += '<button type="button" class="btn btnRight btn-success btn-lg" onclick="fnGetBrandGroup();">브랜드조회</button>';
+		html += '</td>';
+		html += '</tr>';
+		html += '<tr name="brandImgRow">';
+		html += '<th>브랜드이미지</th>';
+		html += '<td colspan="3">';
+		html += '	<div class="uFile w300">';
+		html += '		<input id="brandFile_' + brandIdx + '" name="file" type="file" class="uFileInput w300" onchange="fnBrandImgFileUpload(this, ' + brandIdx + ')">';
+		html += '		<label for="brandFile_' + brandIdx + '" class="uFileLabel">파일선택</label>';
+		html += '		<input type="hidden" name="brandImgPath" value="' + imgPath + '">';
+		html += '		<input type="hidden" name="brandNewImgFile" value="">';
+		html += '	</div>';
+		html += '	<div id="brandImgViewPop_' + brandIdx + '" class=';
+		if (src != '') {
+			html += '"on">';
+		} else {
+			html += '"off">';
+		}
+		html += '	<img id="brandPreViewUrlPop_' + brandIdx + '" src="" style="height:100px; max-width:500px;" onclick="cfnOpenImagePreViewPopup(\'brandPreViewUrlPop\',$(this).attr(\'src\'));"/>';
+		html += '	</div>';
+		html += '</td>';
+		html += '</tr>';
+		html += '</thead><tbody></tbody></table>';
+
+		brandIdx++;
+		$("#multiPopSortable").prepend(html);
+		$("#multiPopSortable").sortable();
+		$('.schDate').datepicker("destroy");
+		$('.schDate').datepicker({
+			changeMonth: true,
+			changeYear: true,
+			defaultDate: $('.schDate').val()
+		});
+	}
+
+	/**
+	 * 브랜드 이미지 첨부
+	 */
+	var fnBrandImgFileUpload = function (obj, ind){
+		var file = obj.files[0];
+		file.name = 'test';
+		if (typeof(file) == 'undefined'){
+			return;
+		}
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/contents/brand/'
+				, file
+				, function(result) {
+					$(obj).closest('div').find('input:hidden[name=brandNewImgFile]').val(result.newFileName);
+					$("#brandPreViewUrlPop_"+ind).attr('src', $("#uploadDefaultBrandUrlPop").val()+result.newFileName);
+					$("#brandImgViewPop_"+ind).removeClass("off").addClass("on");
+				}
+				, 'image'
+		);
+	}
+
+	/**
+	 * 브랜드그룹 조회
+	 */
+	var fnGetBrandGroup = function (){
+		console.log('fnGetBrandGroup');
+		cfnOpenBrandGroupListPopup("callBackBrandGroup", "S", "S");
+	}
+
+	var callBackBrandGroup = function (result){
+		$("#multiPopSortable input[name=brandGroupNo]").val(result[0].brandGroupNo);
+	}
+
+	/**
+	 * 기획전/배너 추가
+	 */
+	var planImgIndex = 0;
+	var fnAddPlanRow = function (param){
+		var src = '';
+		var imgPath = '';
+		if(typeof param!='object'){
+			src = $("#uploadDefaultPlanUrlPop").val().replace('/contents/plan/', '')+param;
+			imgPath = param;
+		}
+		var html = '<tr name="planRow">';
+		html += '<th>기획전/배너<br>링크/이미지</th>';
+		html += '<td><input type="text" name="planLink" id="planLink'+planImgIndex+'"></td>';
+		html += '<td><div class="uFile w300">';
+		html += '<input id="planFile_'+planImgIndex+'" name="file" type="file" class="uFileInput w300" onchange="fnPlanFileUpload(this, '+planImgIndex+')"/>';
+		html += '<label for="planFile_'+planImgIndex+'" class="uFileLabel">파일선택</label>';
+		html += '<input type="hidden" name="planImgPath" value="'+imgPath+'"/>';
+		html += '<input type="hidden" name="planNewImgFile" value="" />';
+		html += '</div>';
+		html += '<div id="planImgViewPop_'+planImgIndex+'" class=';
+		if(src!=''){
+			html += '"on">';
+		}else{
+			html += '"off">';
+		}
+		html += '<img id="planPreViewUrlPop_'+planImgIndex+'" src="'+src+'" style="height:100px; max-width:500px;"  onclick="cfnOpenImagePreViewPopup(\'planPreimgViewPop\',$(this).attr(\'src\'));"/>';
+		html += '</div></td>';
+		html += '<td class="aL"><button type="button" class="btn icn" onclick="fnDeleteTrRow(this);"><i class="fa fa-times" aria-hidden="true"></i></button></td>';
+		html += '</tr>';
+		if(typeof param == 'object'){
+			if($(param).closest("table").find("tbody").find("tr[name=planRow]").length>4){
+				mcxDialog.alert("기획전/배너는 5개까지 등록 가능합니다");
+				return;
+			}
+			planImgIndex++;
+			$(param).closest("table").find("tbody").append(html);
+		}else{
+			planImgIndex++;
+			return html;
+		}
+	}
+
+	// 기획전/배너 파일첨부
+	var fnPlanFileUpload = function (obj, ind){
+		var file = obj.files[0];
+		file.name = 'test';
+		if (typeof(file) == 'undefined'){
+			return;
+		}
+		// 파일 업로드
+		gagajf.ajaxFileUpload('/common/file/upload?subDir=/display/contents/plan'
+				, file
+				, function(result) {
+					$(obj).closest('div').find('input:hidden[name=planNewImgFile]').val(result.newFileName);
+					$("#planPreViewUrlPop_"+ind).attr('src', $("#uploadDefaultPlanUrlPop").val()+result.newFileName);
+					$("#planImgViewPop_"+ind).removeClass("off").addClass("on");
+				}
+				, 'image'
+		);
+	}
+
+
+	// 컨텐츠 행삭제
+	var fnDeleteBrandRow = function (obj){
+		$(obj).closest("table").remove();
+	}
+
+	// 행삭제
+	var fnDeleteTrRow = function (obj){
+		$(obj).closest("tr").remove();
+	}
+
+	// 컨텐츠 추가 날짜 설정
+	var fnCreateTimeOption = function(val, sel) {
+		var html = '';
+		for(var i=0; i<val; i++){
+			var time = 0;
+			if(i<10){
+				time = '0'+i;
+			}else {
+				time = i;
+			}
+			var select = false;
+			if(sel==time){
+				select = true;
+			}
+			if(val==24){
+				time += '시';
+			}else if(val==60){
+				time += '분';
+			}
+			html += '<option value="'+time+'"';
+			if(select){
+				html += 'selected="selected"';
+			}
+			html += '>'+time+'</option>';
+		}
+		return html;
+	}
+
+	// 창닫기
+	var fnMainMultiContentsPopupFormClose = function (){
+		uifnPopupClose('popupMainMultiContents');
+	}
+
+	/**
+	 * 임시저장
+	 */
+	var dataArr = [];
+	$("#btnMultiPopSave").on("click", function(){
+		if(!gagajf.checkRequired("#multiPopSortable")){
+			return;
+		}
+		if(!gagajf.checkRequired("#multiContentsTitleForm")){
+			return;
+		}
+		var titleBool = true;
+		$("#multiPopSortable").find('input[name=title]').each(function(idx, title) {
+			if ($(title).val()==''){
+				titleBool = false;
+				$(title).focus();
+				gagajf.alertMessage($(title), 'input');
+				return;
+			}
+		});
+		if(!titleBool){
+			return false;
+		}
+		dataArr = [];
+		$("#multiPopSortable table").each(function(){
+			var newImgFileArr = [];
+			var imgPath1 = '';
+			var imgPath2 = '';
+			var imgPath3 = '';
+			var imgPath4 = '';
+			var imgPath5 = '';
+			var imgPath6 = '';
+			var imgPath7 = '';
+			var imgPath8 = '';
+			var strVar1 = '';
+			var strVar2 = '';
+			var strVar3 = '';
+			var strVar4 = '';
+			var strVar5 = '';
+			var strVar6 = '';
+			var strVar7 = '';
+			var strVar8 = '';
+			var strTitle1 = '';
+			var strTitle2 = '';
+			var strTitle3 = '';
+			var strTitle4 = '';
+			var subText1 = '';
+			var subText2 = '';
+			var subText3 = '';
+			var subText4 = '';
+			var i = 1;
+			$(this).find('input[name=planImgPath]').each(function(){
+				eval("imgPath" + i + "='"+$(this).val()+"'");
+				i++;
+			});
+			$(this).find('input[name=planNewImgFile]').each(function(){
+				newImgFileArr.push($(this).val());
+			});
+			i = 1;
+			$(this).find('input[name=planLink]').each(function(){
+				_mall = [[${@environment.getProperty('domain.front')}]];
+				var val = $(this).val();
+				val = val.replace('https:'+_mall, '');
+				val = val.replace('http:'+_mall, '');
+				val = val.replace(_mall, '');
+				eval("strVar" + i + "='"+val+"'");
+				i++;
+			});
+
+			var dispStdt = $(this).find("[name=dispStdt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=stTimeHour]").val().replace('시', '') + "" +$(this).find("[name=stTimeMin]").val().replace('분', '') + "00";
+			var dispEddt = $(this).find("[name=dispEddt]").val().replace(/[^0-9]/g, '') + "" +$(this).find("[name=edTimeHour]").val().replace('시', '') + "" +$(this).find("[name=edTimeMin]").val().replace('분', '') + "59";
+
+			var dispOrd = $(this).find("[name=dispOrd]").val();
+
+			var brandGroupNo = $(this).find("[name=brandGroupNo]").val();
+			var brandGroupImg = $(this).find("[name=brandNewImgFile]").val();
+			var mdTitle = $(this).find("[name=mdTitle]").val();
+
+			var data = {cateNo : cateNo
+				, contentsLoc : contentsLoc
+				, dispStdt : dispStdt
+				, dispEddt : dispEddt
+				, newImgFileArr : newImgFileArr
+				, imgPath1 : imgPath1
+				, imgPath2 : imgPath2
+				, imgPath3 : imgPath3
+				, imgPath4 : imgPath4
+				, imgPath5 : imgPath5
+				, imgPath6 : imgPath6
+				, imgPath7 : imgPath7
+				, imgPath8 : imgPath8
+				, strVar1 : strVar1
+				, strVar2 : strVar2
+				, strVar3 : strVar3
+				, strVar4 : strVar4
+				, strVar5 : strVar5
+				, strVar6 : strVar6
+				, strVar7 : strVar7
+				, strVar8 : strVar8
+				, strTitle1 : strTitle1
+				, strTitle2 : strTitle2
+				, strTitle3 : strTitle3
+				, strTitle4 : strTitle4
+				, subText1 : subText1
+				, subText2 : subText2
+				, subText3 : subText3
+				, subText4 : subText4
+				, brandGroupNo : brandGroupNo
+				, brandGroupImg : brandGroupImg
+				, mdTitle : mdTitle
+				, useYn : 'Y'
+				, dispOrd : dispOrd
+			};
+
+			dataArr.push(data);
+		});
+
+		if(dataArr.length==0){
+			var data = {cateNo : cateNo
+				, contentsLoc : contentsLoc
+			};
+			dataArr.push(data);
+		}else{
+			var dataArrSort = [];
+			dataArr.forEach(function(item, index){
+				if(dataArr[index].dispOrd>0){
+					for(var i=1; i<dataArr.length; i++){
+						if(i>index){
+							if(dataArr[index].dispOrd==dataArr[i].dispOrd){
+								dataArr[i].dispOrd = Number(dataArr[i].dispOrd) + 1;
+							}
+						}
+					}
+				}
+			});
+			dataArr.forEach(function(item, index){
+				if(dataArr[index].dispOrd != ''){
+					dataArrSort[dataArr[index].dispOrd-1] = item;
+				}
+			});
+			dataArr.forEach(function(item, index){
+				if(dataArr[index].dispOrd == ''){
+					var empty = false;
+					for(var i=0; i<dataArrSort.length; i++){
+						if(typeof dataArrSort[i] == 'undefined'){
+							dataArrSort[i] = item;
+							empty = true;
+							break;
+						}
+					};
+					if(!empty){
+						dataArrSort.push(item);
+					}
+				}
+			});
+			dataArr = dataArrSort;
+		}
+
+		var data = {
+			cateNo : cateNo
+			, contentsLoc : contentsLoc
+			, contentsTitle : $("#contentsTitleForm input[name=contentsTitle]").val()
+		}
+		dataArr.push(data);
+
+		var jsonData = JSON.stringify(dataArr);
+		mcxDialog.confirm('컨텐츠를 저장 하시겠습니까?', {
+			cancelBtnText: "취소",
+			sureBtnText: "확인",
+			sureBtnClick: function(){
+				gagajf.ajaxJsonSubmit('/display/contents/preview/save', jsonData, fnGetContentsPreviewList);
+			}
+		});
+	});
+
+	$(document).ready(function() {
+		$("#multiPopTitle").text("["+contentsLoc+"] "+gagaAgGrid.lookupValue(contentsLocArr, contentsLoc));
+
+		if(contentsLoc=='SMM007'||contentsLoc=='SMM010'){
+			$("#multiContentsTitleForm").show();
+		}else{
+			$("#multiContentsTitleForm").hide();
+		}
+
+		$("#multiPopSortable").disableSelection();
+		fnGetMultiContentsPreviewList();
+	});
+/*]]>*/
+</script>
+
+</html>

+ 9 - 9
src/main/webapp/ux/js/admin.popup.js

@@ -472,8 +472,8 @@ var cfnOpenGoodsQnaDetailPopup = function(counselSq) {
  * @since  : 2020/02/25
  * @author : sasa004
  */
-var cfnOpenMainContentsPopup = function(cateCd, contentsLoc) {
-	var actionUrl = "/display/main/contents/popup/form?cateCd="+cateCd+"&contentsLoc=" + contentsLoc;
+var cfnOpenMainContentsPopup = function(cateNo, contentsLoc) {
+	var actionUrl = "/display/main/contents/popup/form?cateNo="+cateNo+"&contentsLoc=" + contentsLoc;
 	uifnPopupClose('popupMainContents');
 	cfnOpenModalPopup(actionUrl, 'popupMainContents');
 }
@@ -877,15 +877,15 @@ var cfnOpenGoodsDispOrdChangePopup = function(callbackfun, params) {
 /**
  * @type   : function
  * @access : public
- * @desc   : 메인전시 컨텐츠 수정 팝업 오픈
+ * @desc   : 메인전시 컨텐츠 멀티 수정 팝업 오픈
  * <pre>
- *     cfnOpenMainContentsPopup(cateCd, contentsLoc);
+ *     cfnOpenMainMultiContentsPopup(cateCd, contentsLoc);
  * </pre>
- * @since  : 2021/02/23
+ * @since  : 2021/02/24
  * @author : bin2107
  */
-var cfnOpenMainContentsPopup = function(cateNo, contentsLoc) {
-	var actionUrl = "/display/main/contents/popup/form?cateNo="+cateNo+"&contentsLoc=" + contentsLoc;
-	//uifnPopClose('popupMainContents');
-	cfnOpenModalPopup(actionUrl, 'popupMainContents');
+var cfnOpenMainMultiContentsPopup = function(cateNo, contentsLoc) {
+	var actionUrl = "/display/main/multicontents/popup/form?cateNo="+cateNo+"&contentsLoc=" + contentsLoc;
+	//uifnPopClose('popupMainMultiContents');
+	cfnOpenModalPopup(actionUrl, 'popupMainMultiContents');
 }