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

Merge branch 'develop' into eskim

eskim 5 лет назад
Родитель
Сommit
6a5e56f15f
46 измененных файлов с 811 добавлено и 1455 удалено
  1. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/Aflink.java
  2. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/Brand.java
  3. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/Color.java
  4. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/CommonCode.java
  5. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/DeliveryLoc.java
  6. 9 2
      style24.admin/src/main/java/com/style24/persistence/domain/Goods.java
  7. 2 3
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsImg.java
  8. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsNotiInfo.java
  9. 9 3
      style24.admin/src/main/java/com/style24/persistence/domain/GoodsSearch.java
  10. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/Itemkind.java
  11. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/Menu.java
  12. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/MenuAccessHst.java
  13. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/MenuRole.java
  14. 2 4
      style24.admin/src/main/java/com/style24/persistence/domain/NotiInfo.java
  15. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/Pos.java
  16. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/SellStore.java
  17. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/ShipCompany.java
  18. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/SupplyCompany.java
  19. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/User.java
  20. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/UserHst.java
  21. 2 2
      style24.admin/src/main/java/com/style24/persistence/domain/UserMenu.java
  22. 3 0
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml
  23. 2 2
      style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml
  24. 35 11
      style24.admin/src/main/webapp/WEB-INF/views/business/SupplyCompanyForm.html
  25. 118 2
      style24.admin/src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html
  26. 233 0
      style24.admin/src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html
  27. 0 735
      style24.admin/src/main/webapp/WEB-INF/views/system/BasicEnvsetForm.html
  28. 0 229
      style24.admin/src/main/webapp/WEB-INF/views/system/EnvsetHistoryForm.html
  29. 219 203
      style24.admin/src/main/webapp/WEB-INF/views/system/UserDetailForm.html
  30. 43 39
      style24.admin/src/main/webapp/ux/css/admin.ui.css
  31. 4 3
      style24.admin/src/main/webapp/ux/js/admin.popup.js
  32. 69 87
      style24.admin/src/main/webapp/ux/js/admin.ui.js
  33. 6 2
      style24.admin/src/main/webapp/ux/plugins/fullcalendar/fullcalendar-4.2.0.css
  34. 1 7
      style24.core/src/main/java/com/style24/persistence/TscBaseDomain.java
  35. 2 19
      style24.core/src/main/java/com/style24/persistence/domain/Envset.java
  36. 0 50
      style24.scm/src/main/java/com/style24/persistence/TssBaseDomain.java
  37. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/Brand.java
  38. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/Color.java
  39. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/CommonCode.java
  40. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/Menu.java
  41. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/MenuAccessHst.java
  42. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/MenuRole.java
  43. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/SupplyCompany.java
  44. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/User.java
  45. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/UserHst.java
  46. 2 2
      style24.scm/src/main/java/com/style24/persistence/domain/UserMenu.java

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Aflink.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Aflink extends TsaBaseDomain {
+public class Aflink extends TscBaseDomain {
 
 	private String afLinkCd;	// 제휴링크코드
 	private String afLinkNm;	// 제휴링크명

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Brand.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Brand extends TsaBaseDomain {
+public class Brand extends TscBaseDomain {
 
 //	//HTML
 //	private String cpnId;		//쿠폰ID

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Color.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Color extends TsaBaseDomain {
+public class Color extends TscBaseDomain {
 
 	private String colorCd;			// 색상코드
 	private String colorEnm;		// 색상영문명

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/CommonCode.java

@@ -1,7 +1,7 @@
 package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -13,7 +13,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class CommonCode extends TsaBaseDomain {
+public class CommonCode extends TscBaseDomain {
 
 	private String cdGb;
 	private String cd;

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/DeliveryLoc.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class DeliveryLoc extends TsaBaseDomain {
+public class DeliveryLoc extends TscBaseDomain {
 
 	private String delvLocCd;			// 출고처코드
 	private String delvLocNm;			// 출고처명

+ 9 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Goods.java

@@ -3,7 +3,8 @@ package com.style24.persistence.domain;
 import java.util.Collection;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -15,7 +16,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Goods extends TsaBaseDomain {
+public class Goods extends TscBaseDomain {
 
 	private String goodsCd;		//상품코드
 	private String brandCd;		//브랜드코드
@@ -135,4 +136,10 @@ public class Goods extends TsaBaseDomain {
 
 	private String notiList; // 고시항목
 	private String delvLocCd; // 고시항목
+
+	// Pagination
+	private TsaPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
 }

+ 2 - 3
style24.admin/src/main/java/com/style24/persistence/domain/GoodsImg.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -11,7 +11,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class GoodsImg extends TsaBaseDomain {
+public class GoodsImg extends TscBaseDomain {
 
 	private String goodsCd;
 	private String imgType;
@@ -39,5 +39,4 @@ public class GoodsImg extends TsaBaseDomain {
 	private String goodsImgPath;
 	private String col;
 
-
 }

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/GoodsNotiInfo.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class GoodsNotiInfo extends TsaBaseDomain {
+public class GoodsNotiInfo extends TscBaseDomain {
 
 	private String goodsCd;
 	private String niClsfCd;

+ 9 - 3
style24.admin/src/main/java/com/style24/persistence/domain/GoodsSearch.java

@@ -1,11 +1,11 @@
 package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TsaPageRequest;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
-
 /**
  * 상품 검색 Domain
  *
@@ -14,7 +14,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class GoodsSearch extends TsaBaseDomain {
+public class GoodsSearch extends TscBaseDomain {
 
 	private int startRow;
 	private int endRow;
@@ -96,4 +96,10 @@ public class GoodsSearch extends TsaBaseDomain {
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] conditionList;
 
+	// Pagination
+	private TsaPageRequest pageable;
+	private int pageNo = 1;
+	private int pageSize = 50;
+	private int pageUnit = 10;
+
 }

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Itemkind.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Itemkind extends TsaBaseDomain {
+public class Itemkind extends TscBaseDomain {
 
 	private String itemkindCd;		// 품목코드
 	private String itemkindNm;		// 품목명

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Menu.java

@@ -4,7 +4,7 @@ import java.util.Collection;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -18,7 +18,7 @@ import lombok.Data;
 @Data
 @JsonSerialize
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class Menu extends TsaBaseDomain {
+public class Menu extends TscBaseDomain {
 
 	public Menu() {
 

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/MenuAccessHst.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class MenuAccessHst extends TsaBaseDomain {
+public class MenuAccessHst extends TscBaseDomain {
 
 	private Integer menuAccessSq;
 	private String userNo;

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/MenuRole.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class MenuRole extends TsaBaseDomain {
+public class MenuRole extends TscBaseDomain {
 
 	private String roleCd;	// 권한코드
 	private String roleNm;	// 권한명

+ 2 - 4
style24.admin/src/main/java/com/style24/persistence/domain/NotiInfo.java

@@ -1,7 +1,7 @@
 package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -13,7 +13,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class NotiInfo extends TsaBaseDomain {
+public class NotiInfo extends TscBaseDomain {
 
 	private String supplyCompCd;
 	private String niClsfCd;
@@ -23,8 +23,6 @@ public class NotiInfo extends TsaBaseDomain {
 	private String niContent;
 	private Integer dispOrd;
 
-	private String crud;
-
 	@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
 	private String[] arrNiClsfCd;
 

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/Pos.java

@@ -2,7 +2,7 @@ package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -16,7 +16,7 @@ import lombok.Data;
 @Data
 @JsonSerialize
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class Pos extends TsaBaseDomain {
+public class Pos extends TscBaseDomain {
 
 	// 세션을 JSON 형식으로 레디스에 저장하려면 기본 생성자를 반드시 명시해야 한다
 	public Pos() {

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/SellStore.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class SellStore extends TsaBaseDomain {
+public class SellStore extends TscBaseDomain {
 
 	private String supplyCompCd;	// 공급업체코드
 	private String sellStoreCd;		// 판매매장코드

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/ShipCompany.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class ShipCompany extends TsaBaseDomain {
+public class ShipCompany extends TscBaseDomain {
 
 	private String shipCompCd;	// 배송업체코드
 	private String shipCompNm;	// 배송업체명

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/SupplyCompany.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class SupplyCompany extends TsaBaseDomain {
+public class SupplyCompany extends TscBaseDomain {
 
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/User.java

@@ -2,7 +2,7 @@ package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -16,7 +16,7 @@ import lombok.Data;
 @Data
 @JsonSerialize
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class User extends TsaBaseDomain {
+public class User extends TscBaseDomain {
 
 	// 세션을 JSON 형식으로 레디스에 저장하려면 기본 생성자를 반드시 명시해야 한다
 	public User() {

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/UserHst.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class UserHst extends TsaBaseDomain {
+public class UserHst extends TscBaseDomain {
 
 	private Integer chgHstSq;	// 변경이력일련번호
 	private Integer userNo;		// 사용자번호

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/domain/UserMenu.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TsaBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class UserMenu extends TsaBaseDomain {
+public class UserMenu extends TscBaseDomain {
 
 	private Integer userNo;	// 사용자번호
 	private String menuId;	// 메뉴ID

+ 3 - 0
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaBusiness.xml

@@ -49,6 +49,9 @@
 			AND    UPPER(OWNER_NM) LIKE CONCAT('%',UPPER(#{searchTxt}),'%')
 			</if>
 		</if>
+		<if test="econtractYn != null and econtractYn != ''">
+		AND    ECONTRACT_YN = #{econtractYn}
+		</if>
 	</select>
 	
 	<!-- 공급업체 생성 -->

+ 2 - 2
style24.admin/src/main/java/com/style24/persistence/mybatis/shop/TsaEnvset.xml

@@ -53,8 +53,8 @@
 		     , STR_SET_VAL6
 		     , STR_SET_VAL7
 		     , STR_SET_VAL8
-		     , REG_NO
-		     , DATE_FORMAT(REG_DT, '%Y%m%d%H%i%S') AS REG_DT
+		     , FN_GET_USER_NM(REG_NO)             AS REG_NM
+		     , DATE_FORMAT(REG_DT,'%Y%m%d%H%i%S') AS REG_DT
 		FROM   TB_ENVSET
 		WHERE  SITE_CD = #{siteCd}
 		AND    ENVSET_TYPE = #{envsetType}

+ 35 - 11
style24.admin/src/main/webapp/WEB-INF/views/business/SupplyCompanyForm.html

@@ -31,7 +31,9 @@
 				<table class="frmStyle" aria-describedby="검색조건">
 					<colgroup>
 						<col style="width:10%;"/>
-						<col style="width:40%;"/>
+						<col style="width:30%;"/>
+						<col style="width:10%;"/>
+						<col style="width:20%;"/>
 						<col style="width:10%;"/>
 						<col/>
 					</colgroup>
@@ -51,6 +53,14 @@
 								<option th:if="${supplyStatList}" th:each="oneData, status : ${supplyStatList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
 							</select>
 						</td>
+						<th>전자계약여부</th>
+						<td>
+							<select name="econtractYn">
+								<option value="">[전체]</option>
+								<option value="Y">[Y] Yes</option>
+								<option value="N">[N] No</option>
+							</select>
+						</td>
 					</tr>
 				</table>
 				
@@ -103,8 +113,8 @@
 						</td>
 						<th>사업자구분<i class="required" title="필수"></i></th>
 						<td>
-							<label class="rdoBtn"><input type="radio" name="bizGb" id="bizGb" value="C" checked="checked"/>법인<span></span></label>
-							<label class="rdoBtn"><input type="radio" name="bizGb" id="bizGb" value="P"/>개인<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="C" checked="checked"/>법인<span></span></label>
+							<label class="rdoBtn"><input type="radio" name="bizGb" value="P"/>개인<span></span></label>
 						</td>
 						<th>사업자등록번호<i class="required" title="필수"></i></th>
 						<td>
@@ -277,9 +287,13 @@
 			headerName: "사업자구분", field: "bizGb", width: 100, cellClass: 'text-center',
 			valueGetter: function (params) { return params.data.bizGb == 'C' ? '법인' : '개인'; }
 		},
-		{ headerName: "사업장자록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
-		{ headerName: "업종", field: "bizKind", width: 200, cellClass: 'text-center' },
-		{ headerName: "업태", field: "bizType", width: 200, cellClass: 'text-center' },
+		{ headerName: "사업자등록번호", field: "bizNo", width: 120, cellClass: 'text-center' },
+		{
+			headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center',
+			valueGetter: function (params) { return params.data.econtractYn == 'Y' ? 'Yes' : 'No'; }
+		},
+		{ headerName: "업종", field: "bizKind", width: 150, cellClass: 'text-center' },
+		{ headerName: "업태", field: "bizType", width: 150, cellClass: 'text-center' },
 		{
 			headerName: "입점상태", field: "supplyStat", width: 100, cellClass: 'text-center',
 			valueGetter: function (params) {
@@ -323,7 +337,6 @@
 		{ headerName: "정산담당자연락처", field: "settleChargeTelno", width: 100, cellClass: 'text-center', hide: true },
 		{ headerName: "정산담당자이메일", field: "settleChargeEmail", width: 100, cellClass: 'text-center', hide: true },
 		{ headerName: "계산서이메일", field: "billEmail", width: 100, cellClass: 'text-center', hide: true },
-		{ headerName: "전자계약여부", field: "econtractYn", width: 100, cellClass: 'text-center', hide: true },
 		{ headerName: "정산일(매월)", field: "settleDay", width: 100, cellClass: 'text-center', hide: true },
 		{
 			headerName: "은행명", field: "bankCd", width: 150, cellClass: 'text-center', hide: true,
@@ -351,8 +364,13 @@
 		$('#detailForm input[name=supplyCompNm]').val(event.data.supplyCompNm);
 		$('#detailForm select[name=supplyStat]').val(event.data.supplyStat);
 		$('#detailForm input[name=ownerNm]').val(event.data.ownerNm);
-		$('#detailForm input:radio[name=useYn]:input[value= ' + event.data.useYn + '] ').click();
-		$('#detailForm input:radio[name=bizGb]:input[value= ' + event.data.bizGb + '] ').click();
+		
+		if (event.data.bizGb == 'C') {
+			$('#detailForm input:radio[name=bizGb]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=bizGb]').eq(1).trigger('click');
+		}
+		
 		$('#detailForm input[name=bizNo] ').val(event.data.bizNo);
 		$('#detailForm input[name=bizKind]').val(event.data.bizKind);
 		$('#detailForm input[name=bizType]').val(event.data.bizType);
@@ -372,9 +390,9 @@
 		$('#detailForm input[name=billEmail]').val(event.data.billEmail);
 		
 		if (event.data.econtractYn == 'Y') {
-			$('#detailForm input:radio[name=econtractYn]').eq(0).attr('checked', true);
+			$('#detailForm input:radio[name=econtractYn]').eq(0).trigger('click');
 		} else {
-			$('#detailForm input:radio[name=econtractYn]').eq(1).attr('checked', true);
+			$('#detailForm input:radio[name=econtractYn]').eq(1).trigger('click');
 		}
 		
 		$('#detailForm input[name=settleDay]').val(event.data.settleDay);
@@ -384,6 +402,12 @@
 		$('#detailForm input[name=accountNo]').val(event.data.accountNo);
 		$('#detailForm input[name=depositorNm]').val(event.data.depositorNm);
 		$('#detailForm textarea[name=remarks]').val(event.data.remarks);
+		
+		if (event.data.useYn == 'Y') {
+			$('#detailForm input:radio[name=useYn]').eq(0).trigger('click');
+		} else {
+			$('#detailForm input:radio[name=useYn]').eq(1).trigger('click');
+		}
 	}
 
 	// 검색

+ 118 - 2
style24.admin/src/main/webapp/WEB-INF/views/envset/BasicEnvsetForm.html

@@ -45,7 +45,7 @@
 		<!-- 검색조건 영역 -->
 
 		<div class="panelStyle">
-			<h4>쇼핑몰Meta정보</h4>
+			<h4>[B10] 쇼핑몰Meta정보</h4>
 			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
 			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
 			
@@ -112,7 +112,7 @@
 				</tbody>
 			</table>
 			
-			<h4>기본설정</h4>
+			<h4>[B11] 기본설정</h4>
 			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B11');">저장</button>
 			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B11', '기본설정');">이력보기</button>
 			<table class="frmStyle" aria-describedby="기본설정">
@@ -143,6 +143,72 @@
 					</tr>
 				</tbody>
 			</table>
+			
+			<h4>[G10] 상품노출</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G10');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G10', '상품노출');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품노출">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col style="width: 85%;"/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>상품평노출여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="Y" checked="checked"/>노출</label>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal1" value="N">미노출</label>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>품절상품노출여부</th>
+						<td>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="Y"/>노출</label>
+							<label class="rdoBtn"><input type="radio" name="g10StrSetVal2" value="N" checked="checked">미노출</label>
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>상품리스트가격노출기준</th>
+						<td>
+							상품 썸네일 리스트의 가격은 할인율이 <input name="g10StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name=""/><span class="cRed">%</span> 이상일 경우 TAG가와 할인율 대신 <span class="infoTxt cBlue">'특가세일'</span>로 표기됩니다.
+						</td>
+					</tr>
+				</tbody>
+			</table>
+
+			<h4>[G11] 상품보관</h4>
+			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('G11');">저장</button>
+			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('G11', '상품보관');">이력보기</button>
+			<table class="frmStyle" aria-describedby="상품보관">
+				<colgroup>
+					<col style="width: 15%;"/>
+					<col style="width: 85%;"/>
+				</colgroup>
+				<tbody>
+					<tr>
+						<th>장바구니보관기간(일)</th>
+						<td>
+							장바구니 보관기간은 <input name="g11StrSetVal1" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+						</td>
+					</tr>
+					<tr>
+						<th>장바구니담기최대상품수</th>
+						<td>
+							장바구니에 담을 수 있는 최대 상품 개수는 <input name="g11StrSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">개</span> 입니다.
+						</td>
+					</tr>
+					<tr>
+						<th>위시리스트보관기간(일)</th>
+						<td>
+							위시리스트 보관기간은 <input name="g11StrSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
+							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
+						</td>
+					</tr>
+				</tbody>
+			</table>
 		</div>
 	</div>
 
@@ -192,6 +258,46 @@
 						}
 					}
 				});
+		
+		// 상품노출
+		$.getJSON(actionUrl + '/G10'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$("input:radio[name=g10StrSetVal1]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal1 == 'Y') {
+								$("input:radio[name=g10StrSetVal1]").eq(0).prop('checked', true);
+								$("input:radio[name=g10StrSetVal1]").eq(0).parent().addClass('checked');
+							} else {
+								$("input:radio[name=g10StrSetVal1]").eq(1).prop('checked', true);
+								$("input:radio[name=g10StrSetVal1]").eq(1).parent().addClass('checked');
+							}
+
+							$("input:radio[name=g10StrSetVal2]").parents('td').find('label').removeClass('checked');
+							if (result.strSetVal2 == 'Y') {
+								$("input:radio[name=g10StrSetVal2]").eq(0).prop('checked', true);
+								$("input:radio[name=g10StrSetVal2]").eq(0).parent().addClass('checked');
+							} else {
+								$("input:radio[name=g10StrSetVal2]").eq(1).prop('checked', true);
+								$("input:radio[name=g10StrSetVal2]").eq(1).parent().addClass('checked');
+							}
+							
+							$('input[name=g10StrSetVal1]').val(result.strSetVal3);
+						}
+					}
+				});
+
+		// 상품보관
+		$.getJSON(actionUrl + '/G11'
+				, function(result, status) {
+					if (status === 'success') {
+						if (!gagajf.isNull(result)) {
+							$('input[name=g11StrSetVal1]').val(result.strSetVal1);
+							$('input[name=g11StrSetVal2]').val(result.strSetVal2);
+							$('input[name=g11StrSetVal3]').val(result.strSetVal3);
+						}
+					}
+				});
 	}
 
 	// 파일첨부 선택 시
@@ -243,6 +349,16 @@
 			params.strSetVal4 = $('input[name=b11StrSetVal4]').val();
 			params.strSetVal5 = $('input[name=b11StrSetVal5]').val().removeComma();
 			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
+		} else if (envsetType == 'G10') { // 상품노출
+			params.envsetNm = '상품노출';
+			params.strSetVal1 = $('input:radio[name=g10StrSetVal1]:checked').val();
+			params.strSetVal2 = $('input:radio[name=g10StrSetVal2]:checked').val();
+			params.strSetVal3 = $('input[name=g10StrSetVal1]').val();
+		} else if (envsetType == 'G11') { // 상품보관
+			params.envsetNm = '상품보관';
+			params.strSetVal1 = $('input[name=g11StrSetVal1]').val();
+			params.strSetVal2 = $('input[name=g11StrSetVal2]').val();
+			params.strSetVal3 = $('input[name=g11StrSetVal3]').val();
 		}
 
 		var jsonData = JSON.stringify(params);

+ 233 - 0
style24.admin/src/main/webapp/WEB-INF/views/envset/EnvsetHistoryForm.html

@@ -0,0 +1,233 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org">
+<!--
+ *******************************************************************************
+ * @source  : EnvsetHistoryForm.html
+ * @desc    : 환경설정이력 팝업 Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2020 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2020.10.22   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<div class="modalPopup" data-width="1200">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${envsetTypeNm + ' 이력'}">쇼핑몰Meat정보 이력</strong>
+			<button type="button" class="close" onclick="uiPopupClose('popupEnvset');"><i class="fa fa-times" aria-hidden="true"></i></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent">
+			<div id="gridEnvsetHistoryList" style="width: 100%; height: 330px;" class="ag-theme-balham"></div>
+		</div>
+		<!-- //CONTENT -->
+	</div>
+</div>
+
+<script th:inline="javascript">
+/*<![CDATA[*/
+	var envsetType = [[${envsetType}]];
+	var pointGiveType = { "A":"승인후지급", "D":"즉시지급" };
+	var pointUseType = { "A":"정액", "R":"정율" };
+
+	// 쇼핑몰Meta정보
+	var columnDefsB10 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "웹브라우저Title", field: "strSetVal1", width: 200},
+		{headerName: "쇼핑몰Title(og:title)", field: "strSetVal2", width: 200},
+		{headerName: "쇼핑몰설명(og:description)", field: "strSetVal3", width: 200},
+		{headerName: "쇼핑몰이미지(og:image)", field: "strSetVal4", width: 200},
+		{headerName: "키워드(Keywords)", field: "strSetVal5", width: 200},
+		{headerName: "파비콘이미지", field: "strSetVal6", width: 200},
+		{headerName: "등록자", field: "regNm", width: 150, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+	// 기본설정
+	var columnDefsB11 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "탈퇴후재가입불가기간(월)", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+		{headerName: "휴면회원선정기간(일)", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+		{headerName: "휴면회원전환기간(일)", field: "numSetVal3", width: 150, cellClass: 'text-center'},
+		{headerName: "회원등급산정기간(월)", field: "numSetVal4", width: 150, cellClass: 'text-center'},
+		{headerName: "무료배송비최소주문금액", field: "numSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value);}},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+// 	// 회원혜택안내
+// 	var columnDefsB12 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가입혜택안내배너(A)", field: "strSetVal1", width: 180},
+// 		{headerName: "가입혜택안내배너(B)", field: "strSetVal2", width: 180},
+// 		{headerName: "회원혜택안내배너", field: "strSetVal3", width: 180},
+// 		{headerName: "상품평혜택안내배너(상품상세)", field: "strSetVal4", width: 210},
+// 		{headerName: "상품평혜택안내배너(마이페이지)", field: "strSetVal5", width: 210},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+	// 상품노출
+	var columnDefsG10 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "상품평노출여부", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
+		{headerName: "품절상품노출여부", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
+		{headerName: "특가세일노출기준", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+	// 상품보관
+	var columnDefsG11 = [
+		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+		{headerName: "장바구니보관기간", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+		{headerName: "위시리스트보관기간", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+	];
+
+// 	// 품절안내
+// 	var columnDefsB14 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "품절안내방법", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'A' ? '발송' : '미발송'; }},
+// 		{headerName: "품절안내메시지발송기간", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 배송/구매확정
+// 	var columnDefsB15 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "배송완료처리기간", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "구매확정처리기간", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 회원쿠폰
+// 	var columnDefsC10 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가입축하쿠폰", field: "strSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "앱푸쉬수신동의쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "생일축하쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "생일쿠폰발급도래시점", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 회원포인트
+// 	var columnDefsP10 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가입축하기본포인트", field: "numSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "가입축하추가포인트", field: "numSetVal6", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "생일축하포인트", field: "numSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "앱설치후최초로그인포인트", field: "numSetVal3", width: 200, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "출석체크1일포인트", field: "numSetVal4", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 구매포인트
+// 	var columnDefsP11 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "자사상품정상포인트(PC)", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "자사상품정상포인트(모바일)", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "자사상품이월포인트(PC)", field: "numSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "자사상품이월포인트(모바일)", field: "numSetVal4", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품정상포인트(PC)", field: "numSetVal5", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품정상포인트(모바일)", field: "numSetVal6", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품이월포인트(PC)", field: "numSetVal7", width: 150, cellClass: 'text-center'},
+// 		{headerName: "입점상품이월포인트(모바일)", field: "numSetVal8", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 상품평포인트
+// 	var columnDefsP12 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "포인트지급방법", field: "strSetVal1", width: 150, cellClass: 'text-center',
+// 			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pointGiveType, params.value); }
+// 		},
+// 		{headerName: "텍스트상품평포인트", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "포토상품평포인트", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "최초텍스트상품평배율", field: "numSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "최초포토상품평포인트배율", field: "numSetVal4", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 클레임포인트
+// 	var columnDefsP13 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "배송지연보상기준일수", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "배송지연보상포인트", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "품절보상기준일수", field: "numSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "품절보상포인트", field: "numSetVal4", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 가용포인트전환
+// 	var columnDefsP20 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "가용포인트전환대기일수", field: "numSetVal1", width: 150, cellClass: 'text-center'},
+// 		{headerName: "가용포인트추가적립율", field: "numSetVal2", width: 150, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 포인트사용
+// 	var columnDefsP30 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "사용방법", field: "strSetVal1", width: 80, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(pointUseType, params.value); }},
+// 		{
+// 			headerName: "사용단위", field: "strSetVal2", width: 100, cellClass: 'text-center',
+// 			cellRenderer: function (params) {
+// 				var value = '';
+// 				if (params.value == '10') { value = '일원'; }
+// 				else if (params.value == '100') { value = '십원'; }
+// 				else if (params.value == '1000') { value = '백원'; }
+// 				return value + '단위절사';
+// 			}
+// 		},
+// 		{headerName: "사용가능보유포인트금액", field: "numSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "사용가능최소포인트금액", field: "numSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "사용가능최대포인트율", field: "numSetVal3", width: 150, cellClass: 'text-center'},
+// 		{headerName: "즉시사용최대포인트금액", field: "numSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "최소주문제한금액", field: "numSetVal4", width: 120, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+// 	// 모바일앱
+// 	var columnDefsM10 = [
+// 		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
+// 		{headerName: "AOS버전", field: "strSetVal1", width: 100, cellClass: 'text-center'},
+// 		{headerName: "IOS버전", field: "strSetVal2", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록자", field: "regNm", width: 100, cellClass: 'text-center'},
+// 		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
+// 	];
+
+	// Get GridOptions
+	var gridOptions = gagaAgGrid.getGridOptions(eval('columnDefs' + envsetType));
+
+	$(document).ready(function() {
+		// Create a agGrid
+		gagaAgGrid.createGrid('gridEnvsetHistoryList', gridOptions);
+
+		var actionUrl = '/envset/history/' + [[${siteCd}]] + '/' + envsetType;
+
+		// Fetch data
+		gagaAgGrid.fetch(actionUrl, gridOptions);
+	});
+/*]]>*/
+</script>
+
+</html>

+ 0 - 735
style24.admin/src/main/webapp/WEB-INF/views/system/BasicEnvsetForm.html

@@ -1,735 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : BasicEnvsetForm.html
- * @desc    : 기본환경설정 Page
- *============================================================================
- * Wivismall
- * Copyright(C) 2019 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.03.13   gagamel     최초 작성
- *******************************************************************************
- -->
-
-	<div id="main">
-		<!-- 메인타이틀 영역 -->
-		<div class="main-title">
-		</div>
-		<!-- //메인타이틀 영역 -->
-
-		<!-- 검색조건 영역 -->
-		<div class="panelStyle2">
-			<table class="frmStyle" aria-describedby="검색조건">
-				<colgroup>
-					<col style="width:10%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>사이트</th>
-						<td>
-							<select name="siteCd" class="w150" onchange="fnSearch();">
-								<option th:if="${siteList}" th:each="oneData, status : ${siteList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-							</select>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			<div class="panelBtnB"></div>
-		</div>
-		<!-- //검색조건 영역 -->
-		<!-- 테이블 영역 -->
-		<div class="panelStyle2">
-			<h4>쇼핑몰Meta정보</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B10', '쇼핑몰Meta정보');">이력보기</button>
-			<table class="frmStyle" aria-describedby="쇼핑몰Meta정보">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>웹브라우저Title</th>
-						<td>
-							<input name="b10StrSetVal1" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>웹 브라우저 상단에 노출되는 사이트 소개 문구입니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰Title(og:title)</th>
-						<td>
-							<input name="b10StrSetVal2" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Title입니다. 영문/한글/숫자만 입력하세요.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰설명(og:description)</th>
-						<td>
-							<input name="b10StrSetVal3" type="text" class="w500" maxlength="200"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Description입니다. 200자 이내의 영문/한글/숫자만 입력하세요.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>쇼핑몰이미지(og:image)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b10StrSetVal4" name="b10StrSetVal4" class="uFileInput"/>
-								<label for="b10StrSetVal4" class="uFileLabel">쇼핑몰이미지 선택</label>
-								<input type="hidden" name="b10StrSetVal4OrgFileNm"/>
-								<input type="hidden" name="b10StrSetVal4SysFileNm"/>
-							</div>
-							<a id="b10StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal4');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>오픈그래프 Image입니다</span>
-						</td>
-					</tr>
-					<tr>
-						<th>키워드(Keywords)</th>
-						<td>
-							<input name="b10StrSetVal5" type="text" class="w500" maxlength="70"/>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>70자 이내로 작성하시고 같은 단어는 3회 이상 반복하시면 안 됩니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>파비콘이미지</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b10StrSetVal6" name="b10StrSetVal6" class="uFileInput"/>
-								<label for="b10StrSetVal6" class="uFileLabel">파비콘이미지 선택</label>
-								<input type="hidden" name="b10StrSetVal6OrgFileNm"/>
-								<input type="hidden" name="b10StrSetVal6SysFileNm"/>
-							</div>
-							<a id="b10StrSetVal6FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b10StrSetVal6');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>16x16 사이즈의 아이콘 이미지(확장자:ico)</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>기본설정</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B11');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B11', '기본설정');">이력보기</button>
-			<table class="frmStyle" aria-describedby="기본설정">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>탈퇴후재가입불가기간(월)</th>
-						<td><input name="b11NumSetVal1" type="text" class="w50 aR" maxlength="2" data-valid-type="integer" data-valid-name="탈퇴후재가입불가기간"/><span class="cRed">개월</span> 동안 탈퇴 후 재가입 불가합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원선정기간(일)</th>
-						<td><input name="b11NumSetVal2" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원선정기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 선정합니다.</td>
-					</tr>
-					<tr>
-						<th>휴면회원전환기간(일)</th>
-						<td><input name="b11NumSetVal3" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="휴면회원전환기간"/><span class="cRed">일</span> 동안 사이트에 로그인 하지 않은 회원을 휴면회원으로 전환합니다.</td>
-					</tr>
-					<tr>
-						<th>회원등급산정기간</th>
-						<td>직전월 이전 <input name="b11NumSetVal4" type="text" class="w50 aR" maxlength="3" data-valid-type="integer" data-valid-name="회원등급산정기간"/><span class="cRed">개월</span> 기간동안의 매출금액을 기준으로 월초에 산정합니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 회원별등급산정을 하지 않습니다.</span></td>
-					</tr>
-					<tr>
-						<th>무료배송비최소주문금액</th>
-						<td>최소주문금액이 <input name="b11NumSetVal5" type="text" class="w100 aR" maxlength="6" data-valid-type="integer" data-valid-name="무료배송비최소주문금액"/> 이상이면 배송비가 무료입니다. <span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>이 값은 기본값이며 공급업체별로 다르게 설정할 수도 있습니다.</span></td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>회원혜택안내(PC)</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B12');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B12', '회원혜택안내');">이력보기</button>
-			<table class="frmStyle" aria-describedby="회원혜택안내(PC)">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>가입혜택안내배너(A)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b12StrSetVal1" name="b12StrSetVal1" class="uFileInput"/>
-								<label for="b12StrSetVal1" class="uFileLabel">가입혜택안내배너 선택</label>
-								<input type="hidden" name="b12StrSetVal1OrgFileNm"/>
-								<input type="hidden" name="b12StrSetVal1SysFileNm"/>
-							</div>
-							<a id="b12StrSetVal1FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b12StrSetVal1');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>가입혜택안내배너(B)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b12StrSetVal2" name="b12StrSetVal2" class="uFileInput"/>
-								<label for="b12StrSetVal2" class="uFileLabel">가입혜택안내배너 선택</label>
-								<input type="hidden" name="b12StrSetVal2OrgFileNm"/>
-								<input type="hidden" name="b12StrSetVal2SysFileNm"/>
-							</div>
-							<a id="b12StrSetVal2FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b12StrSetVal2');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>회원혜택안내배너</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b12StrSetVal3" name="b12StrSetVal3" class="uFileInput"/>
-								<label for="b12StrSetVal3" class="uFileLabel">회원혜택안내배너 선택</label>
-								<input type="hidden" name="b12StrSetVal3OrgFileNm"/>
-								<input type="hidden" name="b12StrSetVal3SysFileNm"/>
-							</div>
-							<a id="b12StrSetVal3FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b12StrSetVal3');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>상품평혜택안내배너(상품상세)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b12StrSetVal4" name="b12StrSetVal4" class="uFileInput"/>
-								<label for="b12StrSetVal4" class="uFileLabel">상품평혜택안내배너 선택(상품상세페이지)</label>
-								<input type="hidden" name="b12StrSetVal4OrgFileNm"/>
-								<input type="hidden" name="b12StrSetVal4SysFileNm"/>
-							</div>
-							<a id="b12StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b12StrSetVal4');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>상품평혜택안내배너(마이페이지)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b12StrSetVal5" name="b12StrSetVal5" class="uFileInput"/>
-								<label for="b12StrSetVal5" class="uFileLabel">상품평혜택안내배너 선택(마이페이지)</label>
-								<input type="hidden" name="b12StrSetVal5OrgFileNm"/>
-								<input type="hidden" name="b12StrSetVal5SysFileNm"/>
-							</div>
-							<a id="b12StrSetVal5FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b12StrSetVal5');"></a>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			<h4>회원혜택안내(MOBILE)</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B16');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B16', '회원혜택안내');">이력보기</button>
-			<table class="frmStyle" aria-describedby="회원혜택안내(MOBILE)">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>가입혜택안내배너(A)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b16StrSetVal1" name="b16StrSetVal1" class="uFileInput"/>
-								<label for="b16StrSetVal1" class="uFileLabel">가입혜택안내배너 선택</label>
-								<input type="hidden" name="b16StrSetVal1OrgFileNm"/>
-								<input type="hidden" name="b16StrSetVal1SysFileNm"/>
-							</div>
-							<a id="b16StrSetVal1FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b16StrSetVal1');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>가입혜택안내배너(B)</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b16StrSetVal2" name="b16StrSetVal2" class="uFileInput"/>
-								<label for="b16StrSetVal2" class="uFileLabel">가입혜택안내배너 선택</label>
-								<input type="hidden" name="b16StrSetVal2OrgFileNm"/>
-								<input type="hidden" name="b16StrSetVal2SysFileNm"/>
-							</div>
-							<a id="b16StrSetVal2FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b16StrSetVal2');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>회원혜택안내배너</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b16StrSetVal3" name="b16StrSetVal3" class="uFileInput"/>
-								<label for="b16StrSetVal3" class="uFileLabel">회원혜택안내배너 선택</label>
-								<input type="hidden" name="b16StrSetVal3OrgFileNm"/>
-								<input type="hidden" name="b16StrSetVal3SysFileNm"/>
-							</div>
-							<a id="b16StrSetVal3FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b16StrSetVal3');"></a>
-						</td>
-					</tr>
-					<tr>
-						<th>상품평혜택안내배너</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="b16StrSetVal4" name="b16StrSetVal4" class="uFileInput"/>
-								<label for="b16StrSetVal4" class="uFileLabel">상품평혜택안내배너 선택(상품상세, 마이페이지)</label>
-								<input type="hidden" name="b16StrSetVal4OrgFileNm"/>
-								<input type="hidden" name="b16StrSetVal4SysFileNm"/>
-							</div>
-							<a id="b16StrSetVal4FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('b16StrSetVal4');"></a>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>상품노출</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B13');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B13', '상품노출');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품노출">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>상품평노출여부</th>
-						<td>
-							<label class="rdoBox"><input type="radio" name="b13StrSetVal1" value="Y" checked="checked"/>노출</label>
-							<label class="rdoBox"><input type="radio" name="b13StrSetVal1" value="N">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>미노출로 설정 시 상품상세의 상품평 영역이 노출되지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>품절상품노출여부</th>
-						<td>
-							<label class="rdoBox"><input type="radio" name="b13StrSetVal2" value="Y"/>노출</label>
-							<label class="rdoBox"><input type="radio" name="b13StrSetVal2" value="N" checked="checked">미노출</label>
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle" aria-hidden="true"></i>품절된 상품을 사이트에 노출할지 말지를 설정합니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>특가세일노출기준</th>
-						<td>
-							상품 썸네일 리스트의 가격은 할인율이 <input name="b13NumSetVal1" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name=""/><span class="cRed">%</span> 이상일 경우 TAG가와 할인율 대신 <span class="infoTxt cBlue">'특가세일'</span>로 표기됩니다.
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>상품보관</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B17');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B17', '상품보관');">이력보기</button>
-			<table class="frmStyle" aria-describedby="상품보관">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>장바구니보관기간(일)</th>
-						<td>
-							장바구니 보관기간은 <input name="b17NumSetVal1" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name="장바구니보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>위시리스트보관기간(일)</th>
-						<td>
-							위시리스트 보관기간은 <input name="b17NumSetVal2" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name="위시리스트보관기간"/><span class="cRed">일</span> 입니다. 보관기간 경과 시 자동 삭제됩니다.
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 삭제 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>품절안내</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B14');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B14', '품절안내');">이력보기</button>
-			<table class="frmStyle" aria-describedby="품절안내">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>품절안내방법</th>
-						<td>
-							<label class="rdoBox"><input type="radio" name="b14StrSetVal1" value="A" checked="checked"/>발송</label>
-							<label class="rdoBox"><input type="radio" name="b14StrSetVal1" value="M">미발송</label>
-							<p>결제완료 후 <input name="b14NumSetVal1" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name="품절안내메시지발송기간"/><span class="cRed">일</span> 동안 출고되지 않으면 품절안내 메시지를 발송합니다.</p>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>배송/구매확정</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('B15');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('B15', '배송/구매확정');">이력보기</button>
-			<table class="frmStyle" aria-describedby="배송/구매확정">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>배송완료처리기간(일)</th>
-						<td>
-							주문상세상태가 배송중 이후 <input name="b15NumSetVal1" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name="배송완료처리기간"/><span class="cRed">일</span> 경과한 기간동안 배송완료로 처리하지 않으면 자동으로 배송완료로 처리합니다.
-							<span class="infoTxt cBlue"><i class="fa fa-info-circle marL20" aria-hidden="true"></i>0으로 설정하면 자동으로 배송완료 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>구매확정처리기간(일)</th>
-						<td>
-							주문상세상태가 배송완료 후 <input name="b15NumSetVal2" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name="구매확정처리기간"/><span class="cRed">일</span> 경과한 기간동안 구매확정으로 처리를 하지 않으면 자동으로 구매확정으로 처리합니다.
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 자동으로 구매확정 처리를 하지 않습니다.</span>
-						</td>
-					</tr>
-					<tr>
-						<th>반품가능기간(일)</th>
-						<td>
-							주문상세상태가 배송완료 후 <input name="b15NumSetVal3" type="text" class="w20 aR" maxlength="3" data-valid-type="integer" data-valid-name="반품가능기간"/> <span class="cRed">일</span> 동안 반품요청할 수 있습니다.
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>0으로 설정하면 언제든 반품요청을 할 수 있습니다.</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-
-			<h4>모바일앱</h4>
-			<button type="button" class="btn btn-success btn-ssm" onclick="fnSave('M10');">저장</button>
-			<button type="button" class="btn btn-info btn-ssm" onclick="fnOpenEnvsetPopup('M10', '모바일앱');">이력보기</button>
-			<table class="frmStyle" aria-describedby="모바일앱">
-				<colgroup>
-					<col style="width: 15%;"/>
-					<col style="width: 85%;"/>
-				</colgroup>
-				<tbody>
-					<tr>
-						<th>AOS앱버전</th>
-						<td>
-							<input name="m10StrSetVal1" type="text" class="w100" maxlength="20" data-valid-name="AOS앱버전"/>
-						</td>
-					</tr>
-					<tr>
-						<th>IOS앱버전</th>
-						<td>
-							<input name="m10StrSetVal2" type="text" class="w100" maxlength="20" data-valid-name="IOS앱버전"/>
-						</td>
-					</tr>
-					<tr>
-						<th>스플래시이미지</th>
-						<td>
-							<div class="uFile w500">
-								<input type="file" id="m10StrSetVal3" name="m10StrSetVal3" class="uFileInput"/>
-								<label for="m10StrSetVal3" class="uFileLabel">스플래시 이미지 선택</label>
-								<input type="hidden" name="m10StrSetVal3OrgFileNm"/>
-								<input type="hidden" name="m10StrSetVal3SysFileNm"/>
-							</div>
-							<a id="m10StrSetVal3FileDownload" href="#" style="display: none;" onclick="fnDownloadFile('m10StrSetVal3');"></a>
-							<span class="infoTxt cBlue marL20"><i class="fa fa-info-circle" aria-hidden="true"></i>스플래시 이미지입니다</span>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-			<div class="panelBtnB"></div>
-		</div>
-	</div>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	// 조회
-	var fnSearch = function() {
-		var siteCd = $('select[name=siteCd]').val();
-		var actionUrl = '/system/envset/' + siteCd;
-
-		// 쇼핑몰Meta정보
-		$.getJSON(actionUrl + '/B10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=b10StrSetVal2]').val(result.strSetVal2);
-							$('input[name=b10StrSetVal3]').val(result.strSetVal3);
-							
-							if (!gagajf.isNull(result.strSetVal4)) {
-								$('input[name=b10StrSetVal4SysFileNm]').val(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').html(result.strSetVal4);
-								$('#b10StrSetVal4FileDownload').show();
-							}
-							
-							$('input[name=b10StrSetVal5]').val(result.strSetVal5);
-							
-							if (!gagajf.isNull(result.strSetVal6)) {
-								$('input[name=b10StrSetVal6SysFileNm]').val(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').html(result.strSetVal6);
-								$('#b10StrSetVal6FileDownload').show();
-							}
-						}
-					}
-				});
-
-		// 기본설정
-		$.getJSON(actionUrl + '/B11'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b11NumSetVal1]').val(result.numSetVal1);
-							$('input[name=b11NumSetVal2]').val(result.numSetVal2);
-							$('input[name=b11NumSetVal3]').val(result.numSetVal3);
-							$('input[name=b11NumSetVal4]').val(result.numSetVal4);
-							$('input[name=b11NumSetVal5]').val(result.numSetVal5.addComma());
-						}
-					}
-				});
-
-		// 회원혜택안내
-		$.getJSON(actionUrl + '/B12'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result.strSetVal1)) {
-							$('input[name=b12StrSetVal1SysFileNm]').val(result.strSetVal1);
-							$('#b12StrSetVal1FileDownload').html(result.strSetVal1);
-							$('#b12StrSetVal1FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal2)) {
-							$('input[name=b12StrSetVal2SysFileNm]').val(result.strSetVal2);
-							$('#b12StrSetVal2FileDownload').html(result.strSetVal2);
-							$('#b12StrSetVal2FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal3)) {
-							$('input[name=b12StrSetVal3SysFileNm]').val(result.strSetVal3);
-							$('#b12StrSetVal3FileDownload').html(result.strSetVal3);
-							$('#b12StrSetVal3FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal4)) {
-							$('input[name=b12StrSetVal4SysFileNm]').val(result.strSetVal4);
-							$('#b12StrSetVal4FileDownload').html(result.strSetVal4);
-							$('#b12StrSetVal4FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal5)) {
-							$('input[name=b12StrSetVal5SysFileNm]').val(result.strSetVal5);
-							$('#b12StrSetVal5FileDownload').html(result.strSetVal5);
-							$('#b12StrSetVal5FileDownload').show();
-						}
-					}
-				});
-
-		// 상품노출
-		$.getJSON(actionUrl + '/B13'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$("input:radio[name=b13StrSetVal1]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal1 == 'Y') {
-								$("input:radio[name=b13StrSetVal1]").eq(0).prop('checked', true);
-								$("input:radio[name=b13StrSetVal1]").eq(0).parent().addClass('checked');
-							} else {
-								$("input:radio[name=b13StrSetVal1]").eq(1).prop('checked', true);
-								$("input:radio[name=b13StrSetVal1]").eq(1).parent().addClass('checked');
-							}
-
-							$("input:radio[name=b13StrSetVal2]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal2 == 'Y') {
-								$("input:radio[name=b13StrSetVal2]").eq(0).prop('checked', true);
-								$("input:radio[name=b13StrSetVal2]").eq(0).parent().addClass('checked');
-							} else {
-								$("input:radio[name=b13StrSetVal2]").eq(1).prop('checked', true);
-								$("input:radio[name=b13StrSetVal2]").eq(1).parent().addClass('checked');
-							}
-							
-							$('input[name=b13NumSetVal1]').val(result.numSetVal1);
-						}
-					}
-				});
-
-		// 상품보관
-		$.getJSON(actionUrl + '/B17'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b17NumSetVal1]').val(result.numSetVal1);
-							$('input[name=b17NumSetVal2]').val(result.numSetVal2);
-						}
-					}
-				});
-
-		// 품절안내
-		$.getJSON(actionUrl + '/B14'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$("input:radio[name=b14StrSetVal1]").parents('td').find('label').removeClass('checked');
-							if (result.strSetVal1 == 'A') {
-								$("input:radio[name=b14StrSetVal1]").eq(0).prop('checked', true);
-								$("input:radio[name=b14StrSetVal1]").eq(0).parent().addClass('checked');
-							} else if (result.strSetVal1 == 'M') {
-								$("input:radio[name=b14StrSetVal1]").eq(1).prop('checked', true);
-								$("input:radio[name=b14StrSetVal1]").eq(1).parent().addClass('checked');
-							}
-
-							$('input[name=b14NumSetVal1]').val(result.numSetVal1);
-						}
-					}
-				});
-
-		// 배송/구매확정
-		$.getJSON(actionUrl + '/B15'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=b15NumSetVal1]').val(result.numSetVal1);
-							$('input[name=b15NumSetVal2]').val(result.numSetVal2);
-							$('input[name=b15NumSetVal3]').val(result.numSetVal3);
-						}
-					}
-				});
-
-		// 회원혜택안내(MOBILE)
-		$.getJSON(actionUrl + '/B16'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result.strSetVal1)) {
-							$('input[name=b16StrSetVal1SysFileNm]').val(result.strSetVal1);
-							$('#b16StrSetVal1FileDownload').html(result.strSetVal1);
-							$('#b16StrSetVal1FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal2)) {
-							$('input[name=b16StrSetVal2SysFileNm]').val(result.strSetVal2);
-							$('#b16StrSetVal2FileDownload').html(result.strSetVal2);
-							$('#b16StrSetVal2FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal3)) {
-							$('input[name=b16StrSetVal3SysFileNm]').val(result.strSetVal3);
-							$('#b16StrSetVal3FileDownload').html(result.strSetVal3);
-							$('#b16StrSetVal3FileDownload').show();
-						}
-
-						if (!gagajf.isNull(result.strSetVal4)) {
-							$('input[name=b16StrSetVal4SysFileNm]').val(result.strSetVal4);
-							$('#b16StrSetVal4FileDownload').html(result.strSetVal4);
-							$('#b16StrSetVal4FileDownload').show();
-						}
-					}
-				});
-
-		// 모바일앱
-		$.getJSON(actionUrl + '/M10'
-				, function(result, status) {
-					if (status === 'success') {
-						if (!gagajf.isNull(result)) {
-							$('input[name=m10StrSetVal1]').val(result.strSetVal1);
-							$('input[name=m10StrSetVal2]').val(result.strSetVal2);
-						}
-						
-						if (!gagajf.isNull(result.strSetVal3)) {
-							$('input[name=m10StrSetVal3SysFileNm]').val(result.strSetVal3);
-							$('#m10StrSetVal3FileDownload').html(result.strSetVal3);
-							$('#m10StrSetVal3FileDownload').show();
-						}
-					}
-				});
-	}
-
-	// 파일첨부 선택 시
-	$('#b10StrSetVal4').on('change', function() { fnChooseFile(this); });
-	$('#b10StrSetVal6').on('change', function() { fnChooseFile(this); });
-	$('#b12StrSetVal1').on('change', function() { fnChooseFile(this); });
-	$('#b12StrSetVal2').on('change', function() { fnChooseFile(this); });
-	$('#b12StrSetVal3').on('change', function() { fnChooseFile(this); });
-	$('#b12StrSetVal4').on('change', function() { fnChooseFile(this); });
-	$('#b12StrSetVal5').on('change', function() { fnChooseFile(this); });
-	$('#b16StrSetVal1').on('change', function() { fnChooseFile(this); });
-	$('#b16StrSetVal2').on('change', function() { fnChooseFile(this); });
-	$('#b16StrSetVal3').on('change', function() { fnChooseFile(this); });
-	$('#b16StrSetVal4').on('change', function() { fnChooseFile(this); });
-	$('#m10StrSetVal3').on('change', function() { fnChooseFile(this); });
-
-	var fnChooseFile = function(obj) {
-		// multiple 속성이 있으면 files에는 다수의 객체가 할당됨
-		var file = obj.files[0];
-
-		// 파일 업로드
-		gagajf.ajaxFileUpload('/common/file/upload?subDir=/envset'
-				, file
-				, function(result) {
-					// 업로드한 파일명 설정
-					$('input[name=' + obj.name + 'OrgFileNm]').val(result.oldFileName);
-					$('input[name=' + obj.name + 'SysFileNm]').val(result.newFileName);
-				}
-		);
-	}
-
-	// 파일다운로드
-	var fnDownloadFile = function(id) {
-		$('#' + id + 'FileDownload').attr({
-			href : _uploadDefaultUrl + '/envset/' + $('input[name=' + id + 'SysFileNm]').val(),
-			target: '_blank'
-		}).get(0).click();
-	}
-
-	// 저장 처리
-	var fnSave = function(envsetType) {
-		var params = new Object();
-		params.siteCd = $('select[name=siteCd]').val();
-		params.envsetType = envsetType;
-
-		if (envsetType == 'B10') { // 쇼핑몰Meta정보
-			params.strSetVal1 = $('input[name=b10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=b10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=b10StrSetVal3]').val();
-			params.strSetVal4 = $('input[name=b10StrSetVal4SysFileNm]').val();
-			params.strSetVal5 = $('input[name=b10StrSetVal5]').val();
-			params.strSetVal6 = $('input[name=b10StrSetVal6SysFileNm]').val();
-		} else if (envsetType == 'B11') { // 기본설정
-			params.numSetVal1 = $('input[name=b11NumSetVal1]').val();
-			params.numSetVal2 = $('input[name=b11NumSetVal2]').val();
-			params.numSetVal3 = $('input[name=b11NumSetVal3]').val();
-			params.numSetVal4 = $('input[name=b11NumSetVal4]').val();
-			params.numSetVal5 = $('input[name=b11NumSetVal5]').val().removeComma();
-		} else if (envsetType == 'B12') { // 회원혜택안내
-			params.strSetVal1 = $('input[name=b12StrSetVal1SysFileNm]').val();
-			params.strSetVal2 = $('input[name=b12StrSetVal2SysFileNm]').val();
-			params.strSetVal3 = $('input[name=b12StrSetVal3SysFileNm]').val();
-			params.strSetVal4 = $('input[name=b12StrSetVal4SysFileNm]').val();
-			params.strSetVal5 = $('input[name=b12StrSetVal5SysFileNm]').val();
-		} else if (envsetType == 'B13') { // 상품노출
-			params.strSetVal1 = $('input:radio[name=b13StrSetVal1]:checked').val();
-			params.strSetVal2 = $('input:radio[name=b13StrSetVal2]:checked').val();
-			params.numSetVal1 = $('input[name=b13NumSetVal1]').val();
-		} else if (envsetType == 'B17') { // 상품보관
-			params.numSetVal1 = $('input[name=b17NumSetVal1]').val();
-			params.numSetVal2 = $('input[name=b17NumSetVal2]').val();
-		} else if (envsetType == 'B14') { // 품절안내
-			params.strSetVal1 = $('input:radio[name=b14StrSetVal1]:checked').val();
-			params.numSetVal1 = $('input[name=b14NumSetVal1]').val();
-		} else if (envsetType == 'B15') { // 배송/구매확정
-			params.numSetVal1 = $('input[name=b15NumSetVal1]').val();
-			params.numSetVal2 = $('input[name=b15NumSetVal2]').val();
-			params.numSetVal3 = $('input[name=b15NumSetVal3]').val();
-		} else if (envsetType == 'B16') { // 회원혜택안내(MOBILE)
-			params.strSetVal1 = $('input[name=b16StrSetVal1SysFileNm]').val();
-			params.strSetVal2 = $('input[name=b16StrSetVal2SysFileNm]').val();
-			params.strSetVal3 = $('input[name=b16StrSetVal3SysFileNm]').val();
-			params.strSetVal4 = $('input[name=b16StrSetVal4SysFileNm]').val();
-		} else if (envsetType == 'M10') { // 모바일앱
-			params.strSetVal1 = $('input[name=m10StrSetVal1]').val();
-			params.strSetVal2 = $('input[name=m10StrSetVal2]').val();
-			params.strSetVal3 = $('input[name=m10StrSetVal3SysFileNm]').val();
-		}
-
-		var jsonData = JSON.stringify(params);
-		gagajf.ajaxJsonSubmit('/system/envset/create', jsonData);
-	}
-
-	// 환경설정 이력보기 팝업
-	var fnOpenEnvsetPopup = function(envsetType, envsetTypeNm) {
-		var actionUrl = '/system/envset/history/form'
-				+ '?siteCd=' + $('select[name=siteCd]').val()
-				+ '&envsetType=' + envsetType
-				+ '&envsetTypeNm=' + encodeURIComponent(envsetTypeNm);
-		cfnOpenModalPopup(actionUrl, 'popupEnvset');
-	}
-
-	$(document).ready(function() {
-		fnSearch();
-		uifnFitGrid();
-	});
-/*]]>*/
-</script>
-</html>

+ 0 - 229
style24.admin/src/main/webapp/WEB-INF/views/system/EnvsetHistoryForm.html

@@ -1,229 +0,0 @@
-<!DOCTYPE html>
-<html lang="ko"
-	xmlns:th="http://www.thymeleaf.org">
-<!--
- *******************************************************************************
- * @source  : EnvsetHistoryForm.html
- * @desc    : 환경설정이력 팝업 Page
- *============================================================================
- * Wivismall
- * Copyright(C) 2019 TSIT, All rights reserved.
- *============================================================================
- * VER  DATE         AUTHOR      DESCRIPTION
- * ===  ===========  ==========  =============================================
- * 1.0  2020.03.16   gagamel     최초 작성
- *******************************************************************************
- -->
-<ul class="popup modal" data-width="1200">
-	<li class="mdPopTitle">
-		<strong th:text="${envsetTypeNm + ' 이력'}">쇼핑몰Meat정보 이력</strong>
-		<button type="button" class="close" onclick="uifnPopClose('popupEnvset');"><i class="fa fa-times" aria-hidden="true"></i></button>
-	</li>
-
-	<li class="mdPopContent">
-		<div class="panelContent" style="overflow: hidden;">
-			<div id="gridEnvsetHistoryList" style="width: 100%; height: 330px;" class="ag-theme-balham"></div>
-		</div>
-	</li>
-</ul>
-
-<script th:inline="javascript">
-/*<![CDATA[*/
-	var envsetType = [[${envsetType}]];
-	var pointGiveType = { "A":"승인후지급", "D":"즉시지급" };
-	var pointUseType = { "A":"정액", "R":"정율" };
-
-	// 쇼핑몰Meta정보
-	var columnDefsB10 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "웹브라우저Title", field: "strSetVal1", width: 200},
-		{headerName: "쇼핑몰Title(og:title)", field: "strSetVal2", width: 200},
-		{headerName: "쇼핑몰설명(og:description)", field: "strSetVal3", width: 200},
-		{headerName: "쇼핑몰이미지(og:image)", field: "strSetVal4", width: 200},
-		{headerName: "키워드(Keywords)", field: "strSetVal5", width: 200},
-		{headerName: "파비콘이미지", field: "strSetVal6", width: 200},
-		{headerName: "등록자ID", field: "regId", width: 150, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 기본설정
-	var columnDefsB11 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "탈퇴후재가입불가기간(월)", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "휴면회원선정기간(일)", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "휴면회원전환기간(일)", field: "numSetVal3", width: 150, cellClass: 'text-center'},
-		{headerName: "회원등급산정기간(월)", field: "numSetVal4", width: 150, cellClass: 'text-center'},
-		{headerName: "무료배송비최소주문금액", field: "numSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value);}},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 회원혜택안내
-	var columnDefsB12 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "가입혜택안내배너(A)", field: "strSetVal1", width: 180},
-		{headerName: "가입혜택안내배너(B)", field: "strSetVal2", width: 180},
-		{headerName: "회원혜택안내배너", field: "strSetVal3", width: 180},
-		{headerName: "상품평혜택안내배너(상품상세)", field: "strSetVal4", width: 210},
-		{headerName: "상품평혜택안내배너(마이페이지)", field: "strSetVal5", width: 210},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 상품노출
-	var columnDefsB13 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "상품평노출여부", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
-		{headerName: "품절상품노출여부", field: "strSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'Y' ? '노출' : '미노출'; }},
-		{headerName: "특가세일노출기준", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 상품보관
-	var columnDefsB17 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "장바구니보관기간", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "위시리스트보관기간", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 품절안내
-	var columnDefsB14 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "품절안내방법", field: "strSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return params.value == 'A' ? '발송' : '미발송'; }},
-		{headerName: "품절안내메시지발송기간", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 배송/구매확정
-	var columnDefsB15 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "배송완료처리기간", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "구매확정처리기간", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 회원쿠폰
-	var columnDefsC10 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "가입축하쿠폰", field: "strSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "앱푸쉬수신동의쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "생일축하쿠폰", field: "strSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "생일쿠폰발급도래시점", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 회원포인트
-	var columnDefsP10 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "가입축하기본포인트", field: "numSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "가입축하추가포인트", field: "numSetVal6", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "생일축하포인트", field: "numSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "앱설치후최초로그인포인트", field: "numSetVal3", width: 200, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "출석체크1일포인트", field: "numSetVal4", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 구매포인트
-	var columnDefsP11 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "자사상품정상포인트(PC)", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "자사상품정상포인트(모바일)", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "자사상품이월포인트(PC)", field: "numSetVal3", width: 150, cellClass: 'text-center'},
-		{headerName: "자사상품이월포인트(모바일)", field: "numSetVal4", width: 150, cellClass: 'text-center'},
-		{headerName: "입점상품정상포인트(PC)", field: "numSetVal5", width: 150, cellClass: 'text-center'},
-		{headerName: "입점상품정상포인트(모바일)", field: "numSetVal6", width: 150, cellClass: 'text-center'},
-		{headerName: "입점상품이월포인트(PC)", field: "numSetVal7", width: 150, cellClass: 'text-center'},
-		{headerName: "입점상품이월포인트(모바일)", field: "numSetVal8", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 상품평포인트
-	var columnDefsP12 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "포인트지급방법", field: "strSetVal1", width: 150, cellClass: 'text-center',
-			valueFormatter: function (params) { return gagaAgGrid.lookupValue(pointGiveType, params.value); }
-		},
-		{headerName: "텍스트상품평포인트", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "포토상품평포인트", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "최초텍스트상품평배율", field: "numSetVal3", width: 150, cellClass: 'text-center'},
-		{headerName: "최초포토상품평포인트배율", field: "numSetVal4", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 클레임포인트
-	var columnDefsP13 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "배송지연보상기준일수", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "배송지연보상포인트", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "품절보상기준일수", field: "numSetVal3", width: 150, cellClass: 'text-center'},
-		{headerName: "품절보상포인트", field: "numSetVal4", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 가용포인트전환
-	var columnDefsP20 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "가용포인트전환대기일수", field: "numSetVal1", width: 150, cellClass: 'text-center'},
-		{headerName: "가용포인트추가적립율", field: "numSetVal2", width: 150, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 포인트사용
-	var columnDefsP30 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "사용방법", field: "strSetVal1", width: 80, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.lookupValue(pointUseType, params.value); }},
-		{
-			headerName: "사용단위", field: "strSetVal2", width: 100, cellClass: 'text-center',
-			cellRenderer: function (params) {
-				var value = '';
-				if (params.value == '10') { value = '일원'; }
-				else if (params.value == '100') { value = '십원'; }
-				else if (params.value == '1000') { value = '백원'; }
-				return value + '단위절사';
-			}
-		},
-		{headerName: "사용가능보유포인트금액", field: "numSetVal1", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "사용가능최소포인트금액", field: "numSetVal2", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "사용가능최대포인트율", field: "numSetVal3", width: 150, cellClass: 'text-center'},
-		{headerName: "즉시사용최대포인트금액", field: "numSetVal5", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "최소주문제한금액", field: "numSetVal4", width: 120, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toAddComma(params.value); }},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// 모바일앱
-	var columnDefsM10 = [
-		{headerName: 'No', width: 60, cellClass: 'text-center', valueGetter: function(params) { return params.node.rowIndex + 1 }},
-		{headerName: "AOS버전", field: "strSetVal1", width: 100, cellClass: 'text-center'},
-		{headerName: "IOS버전", field: "strSetVal2", width: 100, cellClass: 'text-center'},
-		{headerName: "등록자ID", field: "regId", width: 100, cellClass: 'text-center'},
-		{headerName: "등록일시", field: "regDt", width: 150, cellClass: 'text-center', cellRenderer: function (params) { return gagaAgGrid.toDateTimeFormat(params.value); }}
-	];
-
-	// Get GridOptions
-	var gridOptions = gagaAgGrid.getGridOptions(eval('columnDefs' + envsetType));
-
-	$(document).ready(function() {
-		// Create a agGrid
-		gagaAgGrid.createGrid('gridEnvsetHistoryList', gridOptions);
-
-		var actionUrl = '/system/envset/history/' + [[${siteCd}]] + '/' + envsetType;
-
-		// Fetch data
-		gagaAgGrid.fetch(actionUrl, gridOptions);
-	});
-/*]]>*/
-</script>
-
-</html>

+ 219 - 203
style24.admin/src/main/webapp/WEB-INF/views/system/UserDetailForm.html

@@ -14,212 +14,228 @@
  * 1.0  2020.10.07   gagamel     최초 작성
  *******************************************************************************
  -->
-<ul class="popup modal" data-width="900">
-	<li class="mdPopTitle">
-		<strong th:text="${'사용자 ' + (mode == 'N' ? '등록' : '상세')}">사용자 상세</strong>
-		<button type="button" class="close" onclick="uifnPopClose('popupUser');"><em class="fa fa-times"></em></button>
-	</li>
+<div class="modalPopup" data-width="900" id="popupUser">
+	<div class="panelStyle">
+		<!-- TITLE -->
+		<div class="panelTitle">
+			<strong th:text="${'사용자 ' + (mode == 'N' ? '등록' : '상세')}">사용자 상세</strong>
+			<button type="button" class="close" onclick="uiPopupClose('popupUser');"><em class="fa fa-times"></em></button>
+		</div>
+		<!-- //TITLE -->
+		
+		<!-- CONTENT -->
+		<div class="panelContent" th:if="${mode == 'N'}">
+			<form id="userRegisterForm" name="userRegisterForm" action="#" th:action="@{'/system/user/save'}" th:method="post">
+				<input type="hidden" name="mode" th:value="${mode}"/>
+				
+				<table class="frmStyle" aria-describedby="등록폼">
+					<colgroup>
+						<col style="width:10%"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사용자ID<em class="required" title="필수"></em></th>
+						<td>
+							<input type="hidden" name="userNo" value="" readonly="readonly"/>
+							<input type="text" class="w150" name="userId" placeholder="" maxlength="20" required="required" data-valid-type="alphaNumeric" data-valid-name="사용자ID"/>
+							<button type="button" class="btn btn-default btn-sm" id="userIdDupCheck">중복체크</button>
+						</td>
+						<th>사용자명<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="userNm" placeholder="" maxlength="50" required="required" data-valid-name="사용자명"/>
+						</td>
+					</tr>
+					<tr>
+						<th>비밀번호<em class="required" title="필수"></em></th>
+						<td colspan="3">
+							<input type="password" name="passwd" placeholder="비밀번호" maxlength="50" required="required" data-valid-type="password" data-valid-name="비밀번호"/> /
+							<input type="password" name="passwdConfirm" placeholder="비밀번호확인" maxlength="50" required="required" data-valid-type="password" data-valid-name="비밀번호확인"/>
+							<p class="dot cBlue">대문자, 소문자, 특수문자, 숫자로 구성해야 합니다.</p>
+							<p class="dot cBlue">이 중 3개 이상은 8 ~ 20자, 2개 이상은 10 ~ 20자로 설정해야 합니다.</p>
+						</td>
+					</tr>
+					<tr>
+						<th>권한<em class="required" title="필수"></em></th>
+						<td>
+							<input type="hidden" name="roleChangeYn" value="Y"/>
+							<select name="roleCd" required="required" data-valid-name="권한">
+								<option th:if="${roleList}" th:each="oneData, status : ${roleList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+						<th><span id="registerRoleRefVal">업체</span></th>
+						<td>
+							<input type="hidden" name="roleRefVal"/>
+							<select name="supplyCompCd">
+								<option th:if="${sessionInfo.supplyCompCd == null}" value="">[선택]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+							<select name="vendorId" style="display: none">
+								<option th:if="${sessionInfo.vendorId == null}" value="">[선택]</option>
+								<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>이메일</th>
+						<td>
+							<input type="text" name="email" placeholder="" maxlength="100" data-valid-type="email" data-valid-name="이메일"/>
+						</td>
+						<th>휴대전화번호</th>
+						<td>
+							<input type="text" name="cellPhnno" placeholder="" maxlength="50" data-valid-type="cellPhone" data-valid-name="휴대전화번호"/>
+						</td>
+					</tr>
+					<tr>
+						<th>포인트부여가능금액</th>
+						<td>
+							<input type="text" name="pntAssignAmt" placeholder="" maxlength="6" data-valid-type="integer" data-valid-name="포인트부여가능금액"/>
+						</td>
+						<th>IP주소</th>
+						<td>
+							<input type="text" name="ipAddr" placeholder="" maxlength="20" data-valid-type="ipAddress" data-valid-name="IP주소"/>
+						</td>
+					</tr>
+					
+					<tr>
+						<th>IP체크여부</th>
+						<td>
+							<input type="hidden" name="ipChkYn" value="Y"/>
+							<label class="chkBox"><input type="checkbox" name="chkIpChkYn" value="Y"/>IP체크</label>
+						</td>
+						<th>사용여부</th>
+						<td>
+							<input type="hidden" name="useYn" value="Y"/>
+							<label class="chkBox"><input type="checkbox" name="chkUseYn" value="Y" checked="checked"/>사용</label>
+						</td>
+					</tr>
+				</table>
+			</form>
+		</div>
+		<!-- //CONTENT -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar" th:if="${mode == 'N'}">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" onclick="fnSaveUser('#userRegisterForm');">저장</button>
+				<button type="button" class="btn btn-gray btn-lg" onclick="$('#userRegisterForm')[0].reset();">초기화</button>
+			</li>
+		</ul>
+		<!-- //버튼 배치 영역 -->
 	
-	<li class="mdPopContent" th:if="${mode == 'N'}">
-		<form id="userRegisterForm" name="userRegisterForm" action="#" th:action="@{'/system/user/save'}" th:method="post">
-			<input type="hidden" name="mode" th:value="${mode}"/>
-			
-			<table class="frmStyle" aria-describedby="등록폼">
-				<colgroup>
-					<col style="width:10%"/>
-					<col style="width:40%;"/>
-					<col style="width:10%;"/>
-					<col/>
-				</colgroup>
-				<tr>
-					<th>사용자ID<em class="required" title="필수"></em></th>
-					<td>
-						<input type="hidden" name="userNo" value="" readonly="readonly"/>
-						<input type="text" class="w150" name="userId" placeholder="" maxlength="20" required="required" data-valid-type="alphaNumeric" data-valid-name="사용자ID"/>
-						<button type="button" class="btn btn-default btn-sm" id="userIdDupCheck">중복체크</button>
-					</td>
-					<th>사용자명<em class="required" title="필수"></em></th>
-					<td>
-						<input type="text" name="userNm" placeholder="" maxlength="50" required="required" data-valid-name="사용자명"/>
-					</td>
-				</tr>
-				<tr>
-					<th>비밀번호<em class="required" title="필수"></em></th>
-					<td colspan="3">
-						<input type="password" name="passwd" placeholder="비밀번호" maxlength="50" required="required" data-valid-type="password" data-valid-name="비밀번호"/> /
-						<input type="password" name="passwdConfirm" placeholder="비밀번호확인" maxlength="50" required="required" data-valid-type="password" data-valid-name="비밀번호확인"/>
-						<p class="dot cBlue">대문자, 소문자, 특수문자, 숫자로 구성해야 합니다.</p>
-						<p class="dot cBlue">이 중 3개 이상은 8 ~ 20자, 2개 이상은 10 ~ 20자로 설정해야 합니다.</p>
-					</td>
-				</tr>
-				<tr>
-					<th>권한<em class="required" title="필수"></em></th>
-					<td>
-						<input type="hidden" name="roleChangeYn" value="Y"/>
-						<select name="roleCd" required="required" data-valid-name="권한">
-							<option th:if="${roleList}" th:each="oneData, status : ${roleList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-						</select>
-					</td>
-					<th><span id="registerRoleRefVal">업체</span></th>
-					<td>
-						<input type="hidden" name="roleRefVal"/>
-						<select name="supplyCompCd">
-							<option th:if="${sessionInfo.supplyCompCd == null}" value="">[선택]</option>
-							<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-						</select>
-						<select name="vendorId" style="display: none">
-							<option th:if="${sessionInfo.vendorId == null}" value="">[선택]</option>
-							<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}"></option>
-						</select>
-					</td>
-				</tr>
-				<tr>
-					<th>이메일</th>
-					<td>
-						<input type="text" name="email" placeholder="" maxlength="100" data-valid-type="email" data-valid-name="이메일"/>
-					</td>
-					<th>휴대전화번호</th>
-					<td>
-						<input type="text" name="cellPhnno" placeholder="" maxlength="50" data-valid-type="cellPhone" data-valid-name="휴대전화번호"/>
-					</td>
-				</tr>
-				<tr>
-					<th>포인트부여가능금액</th>
-					<td>
-						<input type="text" name="pntAssignAmt" placeholder="" maxlength="6" data-valid-type="integer" data-valid-name="포인트부여가능금액"/>
-					</td>
-					<th>IP주소</th>
-					<td>
-						<input type="text" name="ipAddr" placeholder="" maxlength="20" data-valid-type="ipAddress" data-valid-name="IP주소"/>
-					</td>
-				</tr>
+		<!-- CONTENT -->
+		<div class="panelContent" th:if="${mode == 'U'}">
+			<form id="userDetailForm" name="userDetailForm" action="#" th:action="@{'/system/user/save'}" th:method="post" th:object="${userInfo}">
+				<input type="hidden" name="mode" th:value="${mode}"/>
 				
-				<tr>
-					<th>IP체크여부</th>
-					<td>
-						<input type="hidden" name="ipChkYn" value="Y"/>
-						<label class="chkBox"><input type="checkbox" name="chkIpChkYn" value="Y"/>IP체크</label>
-					</td>
-					<th>사용여부</th>
-					<td>
-						<input type="hidden" name="useYn" value="Y"/>
-						<label class="chkBox"><input type="checkbox" name="chkUseYn" value="Y" checked="checked"/>사용</label>
-					</td>
-				</tr>
-			</table>
-		</form>
-	</li>
+				<table class="frmStyle" aria-describedby="상세폼">
+					<colgroup>
+						<col style="width:10%"/>
+						<col style="width:40%;"/>
+						<col style="width:10%;"/>
+						<col/>
+					</colgroup>
+					<tr>
+						<th>사용자ID<em class="required" title="필수"></em></th>
+						<td>
+							<input type="hidden" name="userNo" readonly="readonly" th:field="*{userNo}"/>
+							<input type="text" name="userId" placeholder="" readonly="readonly" th:field="*{userId}"/>
+						</td>
+						<th>사용자명<em class="required" title="필수"></em></th>
+						<td>
+							<input type="text" name="userNm" placeholder="" maxlength="50" required="required" data-valid-name="사용자명" th:field="*{userNm}"/>
+						</td>
+					</tr>
+					<tr>
+						<th>비밀번호</th>
+						<td colspan="3">
+							<input type="password" name="passwd" placeholder="비밀번호" maxlength="50" data-valid-type="password" data-valid-name="비밀번호"/> /
+							<input type="password" name="passwdConfirm" placeholder="비밀번호확인" maxlength="50" data-valid-type="password" data-valid-name="비밀번호확인"/>
+							<button type="button" class="btn btn-info btn-sm" id="btnChangePassword">비밀번호변경</button>
+							<p class="dot cBlue">대문자, 소문자, 특수문자, 숫자로 구성해야 합니다.</p>
+							<p class="dot cBlue">이 중 3개 이상은 8 ~ 20자, 2개 이상은 10 ~ 20자로 설정해야 합니다.</p>
+						</td>
+					</tr>
+					<tr>
+						<th>권한<em class="required" title="필수"></em></th>
+						<td>
+							<input type="hidden" name="roleChangeYn" value="N"/>
+							<select name="roleCd" required="required" data-valid-name="권한" th:field="*{roleCd}">
+								<option th:if="${roleList}" th:each="oneData, status : ${roleList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${roleCd == oneData.cd}"></option>
+							</select>
+						</td>
+						<th><span id="detailRoleRefVal">업체</span></th>
+						<td>
+							<input type="hidden" name="roleRefVal" th:value="${userInfo.roleRefVal}"/>
+							<select name="supplyCompCd">
+								<option th:if="${sessionInfo.supplyCompCd == null}" value="">[선택]</option>
+								<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
+							</select>
+							<select name="vendorId" style="display: none">
+								<option th:if="${sessionInfo.vendorId == null}" value="">[선택]</option>
+								<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<th>이메일</th>
+						<td colspan="3">
+							<input type="text" name="email" placeholder="" maxlength="100" data-valid-type="email" data-valid-name="이메일" th:field="*{email}"/>
+							<!-- <button type="button" class="btn btn-info btn-sm" id="btnSendTempPassword">임시비밀번호 발송</button> -->
+						</td>
+					</tr>
+					<tr>
+						<th>휴대전화번호</th>
+						<td>
+							<input type="text" name="cellPhnno" placeholder="" maxlength="50" data-valid-type="cellPhone" data-valid-name="휴대전화번호" th:field="*{cellPhnno}"/>
+						</td>
+						<th>포인트부여가능금액</th>
+						<td>
+							<input type="text" class="aR" name="pntAssignAmt" placeholder="" maxlength="6" data-valid-type="integer" data-valid-name="포인트부여가능금액" th:field="*{pntAssignAmt}"/>
+						</td>
+					</tr>
+					<tr>
+						<th>IP주소</th>
+						<td>
+							<input type="text" name="ipAddr" placeholder="" maxlength="20" data-valid-type="ipAddress" data-valid-name="IP주소" th:field="*{ipAddr}"/>
+						</td>
+						<th>IP체크여부</th>
+						<td>
+							<input type="hidden" name="ipChkYn" th:value="${userInfo.ipChkYn}"/>
+							<label class="chkBox" th:checked="${userInfo.ipChkYn == 'Y'}"><input type="checkbox" name="chkIpChkYn" th:value="${userInfo.ipChkYn}" th:checked="${userInfo.ipChkYn == 'Y'}"/>IP체크</label>
+						</td>
+					</tr>
+					<tr>
+						<th>사용여부</th>
+						<td>
+							<input type="hidden" name="useYn" th:value="${userInfo.useYn}"/>
+							<label class="chkBox" th:checked="${userInfo.useYn == 'Y'}"><input type="checkbox" name="chkUseYn" th:value="${userInfo.useYn}" th:checked="${userInfo.useYn == 'Y'}"/>사용</label>
+						</td>
+						<th>최종로그인일시</th>
+						<td th:text="*{loginLdt}">
+						</td>
+					</tr>
+					<tr>
+						<th>비밀번호변경일시</th>
+						<td colspan="3" th:text="*{passwdChgDt}">
+						</td>
+					</tr>
+				</table>
+			</form>
+		</div>
 		
-	<li class="mdPopBtnB aR" th:if="${mode == 'N'}">
-		<button type="button" class="btn btn-info btn-lg" onclick="fnSaveUser('#userRegisterForm');">저장</button>
-		<button type="button" class="btn btn-gray btn-lg" onclick="$('#userRegisterForm')[0].reset();">초기화</button>
-	</li>
-	
-	<li class="mdPopContent" th:if="${mode == 'U'}">
-		<form id="userDetailForm" name="userDetailForm" action="#" th:action="@{'/system/user/save'}" th:method="post" th:object="${userInfo}">
-			<input type="hidden" name="mode" th:value="${mode}"/>
-			
-			<table class="frmStyle" aria-describedby="상세폼">
-				<colgroup>
-					<col style="width:10%"/>
-					<col style="width:40%;"/>
-					<col style="width:10%;"/>
-					<col/>
-				</colgroup>
-				<tr>
-					<th>사용자ID<em class="required" title="필수"></em></th>
-					<td>
-						<input type="hidden" name="userNo" readonly="readonly" th:field="*{userNo}"/>
-						<input type="text" name="userId" placeholder="" readonly="readonly" th:field="*{userId}"/>
-					</td>
-					<th>사용자명<em class="required" title="필수"></em></th>
-					<td>
-						<input type="text" name="userNm" placeholder="" maxlength="50" required="required" data-valid-name="사용자명" th:field="*{userNm}"/>
-					</td>
-				</tr>
-				<tr>
-					<th>비밀번호</th>
-					<td colspan="3">
-						<input type="password" name="passwd" placeholder="비밀번호" maxlength="50" data-valid-type="password" data-valid-name="비밀번호"/> /
-						<input type="password" name="passwdConfirm" placeholder="비밀번호확인" maxlength="50" data-valid-type="password" data-valid-name="비밀번호확인"/>
-						<button type="button" class="btn btn-info btn-sm" id="btnChangePassword">비밀번호변경</button>
-						<p class="dot cBlue">대문자, 소문자, 특수문자, 숫자로 구성해야 합니다.</p>
-						<p class="dot cBlue">이 중 3개 이상은 8 ~ 20자, 2개 이상은 10 ~ 20자로 설정해야 합니다.</p>
-					</td>
-				</tr>
-				<tr>
-					<th>권한<em class="required" title="필수"></em></th>
-					<td>
-						<input type="hidden" name="roleChangeYn" value="N"/>
-						<select name="roleCd" required="required" data-valid-name="권한" th:field="*{roleCd}">
-							<option th:if="${roleList}" th:each="oneData, status : ${roleList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${roleCd == oneData.cd}"></option>
-						</select>
-					</td>
-					<th><span id="detailRoleRefVal">업체</span></th>
-					<td>
-						<input type="hidden" name="roleRefVal" th:value="${userInfo.roleRefVal}"/>
-						<select name="supplyCompCd">
-							<option th:if="${sessionInfo.supplyCompCd == null}" value="">[선택]</option>
-							<option th:if="${supplyCompList}" th:each="oneData, status : ${supplyCompList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
-						</select>
-						<select name="vendorId" style="display: none">
-							<option th:if="${sessionInfo.vendorId == null}" value="">[선택]</option>
-							<option th:if="${vendorList}" th:each="oneData, status : ${vendorList}" th:value="${oneData.cd}" th:text="${'[' + oneData.cd + '] ' + oneData.cdNm}" th:selected="${userInfo.roleRefVal == oneData.cd}"></option>
-						</select>
-					</td>
-				</tr>
-				<tr>
-					<th>이메일</th>
-					<td colspan="3">
-						<input type="text" name="email" placeholder="" maxlength="100" data-valid-type="email" data-valid-name="이메일" th:field="*{email}"/>
-						<!-- <button type="button" class="btn btn-info btn-sm" id="btnSendTempPassword">임시비밀번호 발송</button> -->
-					</td>
-				</tr>
-				<tr>
-					<th>휴대전화번호</th>
-					<td>
-						<input type="text" name="cellPhnno" placeholder="" maxlength="50" data-valid-type="cellPhone" data-valid-name="휴대전화번호" th:field="*{cellPhnno}"/>
-					</td>
-					<th>포인트부여가능금액</th>
-					<td>
-						<input type="text" class="aR" name="pntAssignAmt" placeholder="" maxlength="6" data-valid-type="integer" data-valid-name="포인트부여가능금액" th:field="*{pntAssignAmt}"/>
-					</td>
-				</tr>
-				<tr>
-					<th>IP주소</th>
-					<td>
-						<input type="text" name="ipAddr" placeholder="" maxlength="20" data-valid-type="ipAddress" data-valid-name="IP주소" th:field="*{ipAddr}"/>
-					</td>
-					<th>IP체크여부</th>
-					<td>
-						<input type="hidden" name="ipChkYn" th:value="${userInfo.ipChkYn}"/>
-						<label class="chkBox" th:checked="${userInfo.ipChkYn == 'Y'}"><input type="checkbox" name="chkIpChkYn" th:value="${userInfo.ipChkYn}" th:checked="${userInfo.ipChkYn == 'Y'}"/>IP체크</label>
-					</td>
-				</tr>
-				<tr>
-					<th>사용여부</th>
-					<td>
-						<input type="hidden" name="useYn" th:value="${userInfo.useYn}"/>
-						<label class="chkBox" th:checked="${userInfo.useYn == 'Y'}"><input type="checkbox" name="chkUseYn" th:value="${userInfo.useYn}" th:checked="${userInfo.useYn == 'Y'}"/>사용</label>
-					</td>
-					<th>최종로그인일시</th>
-					<td th:text="*{loginLdt}">
-					</td>
-				</tr>
-				<tr>
-					<th>비밀번호변경일시</th>
-					<td colspan="3" th:text="*{passwdChgDt}">
-					</td>
-				</tr>
-			</table>
-		</form>
-	</li>
-	
-	<li class="mdPopBtnB aR" th:if="${mode == 'U'}">
-		<button type="button" class="btn btn-info btn-lg" onclick="fnSaveUser('#userDetailForm');">저장</button>
-		<button type="button" class="btn btn-gray btn-lg" onclick="fnInitialize(false);">초기화</button>
-	</li>
-</ul>
+		<!-- //CONTENT -->
+
+		<!-- 버튼 배치 영역 -->
+		<ul class="panelBar" th:if="${mode == 'U'}">
+			<li class="right">
+				<button type="button" class="btn btn-info btn-lg" onclick="fnSaveUser('#userDetailForm');">저장</button>
+				<button type="button" class="btn btn-gray btn-lg" onclick="fnInitialize(false);">초기화</button>
+			</li>
+		</ul>
+	</div>
+</div>
 
 <script th:inline="javascript">
 /*<![CDATA[*/

+ 43 - 39
style24.admin/src/main/webapp/ux/css/admin.ui.css

@@ -21,7 +21,7 @@ input[readonly="readonly"], input[disabled="disabled"], input[readonly="readonly
 button, select {text-transform:none;}
 button,[type=button],[type=reset],[type=submit] {margin:0; -webkit-appearance:button; border-radius:0; cursor:pointer; background-color:transparent; border-color:transparent;}
 button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner {padding:0; border-style:none;}
-textarea {overflow:auto; resize:vertical; width:100%; margin:4px 0; vertical-align:middle; line-height:22px; height:22px;}
+textarea {overflow:auto; resize:vertical; width:100%; margin:4px 0; vertical-align:middle; line-height:22px; height:32px;}
 .textareaR2 {height:60px; line-height:26px;}
 .textareaR3 {height:96px; line-height:26px;}
 .textareaR4 {height:134px; line-height:26px;}
@@ -133,7 +133,7 @@ header a, header button {color:#fff;}
 .panelStyle .panelTitle {margin:-15px -15px 0; padding:0 20px; line-height:40px; border-bottom:1px solid #e7eaec;}
 .panelStyle .panelControl {position:absolute; top:0; right:15px; color:#c4c4c4;}
 .panelStyle .panelControl i {padding:10px 10px; cursor:pointer;}
-.panelStyle .panelContent .frmStyle{margin-top:10px;}
+.panelStyle .panelContent {margin-top:10px;}
 .panelStyle h2 {margin-right:10px; font-size:14px; font-weight:bold;}
 .panelStyle h3 {margin-right:10px; font-size:12px; font-weight:normal; line-height:25px;}
 .panelStyle h3 i {padding-right:5px}
@@ -141,9 +141,9 @@ header a, header button {color:#fff;}
 .panelStyle .panelBar {display:table; width:100%; padding-bottom:10px;}
 .panelStyle .panelBar::after{display:block; clear:both; content:'';}
 .panelStyle .panelBar h4 {margin-bottom:0;}
-.panelStyle .panelBar li {display:table-cell;}
-.panelStyle .panelBar .center {text-align:center;}
-.panelStyle .panelBar .right {text-align:right;}
+.panelStyle .panelBar > li {display:table-cell;}
+.panelStyle .panelBar > .center {text-align:center;}
+.panelStyle .panelBar > .right {text-align:right;}
 /* 패널 내부 테이블 여러개 배치 */
 .panelStyle .division + .panelBar {padding-bottom:15px;}
 .panelStyle .division {display:table; width:100%;}
@@ -155,6 +155,7 @@ header a, header button {color:#fff;}
 .ag-theme-balham {margin:10px 0 15px;}
 .ag-theme-balham + .panelBar{padding-bottom:15px;}
 .panelBar + .ag-theme-balham {margin:0 0 15px;}
+.panelBar + .frmStyle {margin-top:0;}
 
 
 /* TABS 영역 --------------- */
@@ -169,8 +170,8 @@ header a, header button {color:#fff;}
 .tabsCont {position:relative; top:-2px; z-index:1;}
 .tabsCont::after {display:block}
 .tab {display:none;}
+.tab > .panelStyle{margin:0;}
 .tab.on {display:block;}
-.tab .panelStyle{margin:0 0;}
 .popupTabs {padding-top:10px;}
 .tabContArea {overflow-x:hidden; overflow-y:auto;}
 .tabBtnArea {padding:15px 0 20px 0;}
@@ -200,16 +201,32 @@ a, button, .ui-state-active, .ui-state-focus, .ui-state-hover {outline:0 !import
 .tabJrContArea {vertical-align:middle;}
 
 /* modal, modeless popup --------------- */
-.popupWrap { display:none; position:fixed; left:0; top:0; z-index:10; width:100%; height:100%; background-color:rgba(0,0,0,0.5);}
-.popupWrap.bgTrans {background-color:rgba(0,0,0,0.0) !important;}
-.popup {z-index:10; color:#333;background-color:#fff;border:1px solid #ccc;border-radius:3px;box-shadow:3px 7px 10px -5px rgba(0, 0, 0, 0.1);}
-.popup .close {position:absolute;top:0;right:0;font-size:18px;padding:3px 20px;cursor:pointer;}
-.modal {position:absolute;top:50%;left:50%;transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);}
-.modeless {display:none;float:left;position:fixed;top:0;left:0;cursor:move;}
-.modeless .mdPopTitle {cursor:move;}
-.mdPopTitle {padding:7px 20px; font-size:16px; border-bottom:1px solid #dfe2e3;}
-.mdPopContent {padding:15px 20px 0;}
-.mdPopBtnB {display:inline-block; width:100%; padding:0 20px 20px 20px; text-align:center; }
+.modalPopup{display:none;position:fixed; left:0; top:0; z-index:11; width:100%; height:100%;background:rgba(0,0,0,0.5);}
+.modalPopup > .panelStyle{position:absolute;top:50%;left:50%;z-index:11;-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);margin:0;border:1px solid #79797a;border-radius:3px;}
+.modalPopup > .panelStyle .close {position:absolute;top:0;right:0;font-size:18px;padding:5px 15px 8px;}
+.modalPopup .tabs{ margin:0;}
+.modalPopup .tabs .panelStyle{box-shadow:none}
+.modalPopup .tab > .panelStyle{overflow-y:auto;}
+
+/*MODELESS POPUP --------------- */
+.modelessPopup{display:none;position:absolute;z-index:11;top:50%;left:50%;}
+.modelessPopup.draggable {cursor:move;}
+.modelessPopup .panelStyle{margin:0;border:1px solid #ccc;border-radius:3px;}
+.modelessPopup .panelStyle .close {position:absolute;top:0;right:0;font-size:18px;padding:5px 15px 8px;}
+.modelessPopup .tabs{ margin:0;}
+.modelessPopup .tabs  .panelStyle{box-shadow:none}
+.modelessPopup .tab > .panelStyle{overflow-y:auto;}
+
+/*VIDEO POPUP --------------- */
+.videoPopup {display:none;position:fixed;top:50%;left:50%;z-index:11;-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);margin:0;border:1px solid #79797a;border-radius:3px;}
+.modalPopup::before{position:fixed; left:0; top:0; z-index:11; width:100%; height:100%;background:rgba(0,0,0,0.5);}
+.videoPopup .close {position:absolute; top:-20px; right:-20px; z-index:1; width:40px; height:40px; line-height:20px; font-size:20px; border:1px solid #666; border-radius:50px; background-color:#fff;}
+.videoPopup iframe{width:100%;height:100%}
+
+
+#btnTop {display:none; position:fixed; right:0; bottom:50px; width:40px; line-height:10px; font-size:10px; background:#fff; border:1px solid #ddd; border-right:none; padding:3px 0 5px 0; box-shadow:5px 5px 5px -4px rgba(0, 0, 0, 0.07); color:#1c84c6;}
+#btnTop i {width:100%; font-size:12px;}
+#btnTop:hover {padding-right:30px; width:70px; font-weight:bold;}
 
 
 /* 컨텐트 스크롤--------------- */
@@ -304,13 +321,11 @@ td[rowspan] {border-bottom:1px solid #eee;}
 
 /* button --------------- */
 .btn {border-radius:3px; vertical-align:middle; white-space:nowrap;}
-.btn-lg {padding:4px 20px 5px; height:28px; line-height:100%; overflow-y:hidden;}
+.btn-lg {padding:4px 20px 5px; height:28px; overflow-y:hidden;}
 .btn-sm {margin-top:-2px; line-height:100%; height:28px; overflow-y:hidden;}
 .btn-ssm {margin-top:-2px; line-height:100%; height:22px; overflow-y:hidden;}
-.btn + .btn {margin-left:3px;}
+.btn + .btn {margin-left:6px;}
 .btn:first-child {margin-left:0;}
-.btnLeft {float:left; margin-right:3px;}
-.btnRight {float:right; margin-right:3px;}
 
 
 /* 버튼 색상 */
@@ -372,10 +387,6 @@ footer {position:absolute; bottom:0; left:0; width:100%; height:40px; background
 footer .f-left {float:left; padding-left:20px; line-height:38px;}
 footer .f-right {float:right; padding-right:20px; line-height:38px;}
 
-/* sortable 영역 --------------- */
-#sortable {overflow-x:hidden;}
-#sortable .boxTitle {cursor:move;}
-
 /* 이미지 카드 */
 .dexterArea {min-width:350px; min-height:180px; padding:0 !important; vertical-align:top; background:#f1f1f1; vertical-align:top;}
 .dexterTable {display:table; width:100%; overflow-y:auto;}
@@ -405,7 +416,8 @@ footer .f-right {float:right; padding-right:20px; line-height:38px;}
 .cardArea2 .cardDel:hover {background:#f1f1f1 url('../../image/btn_sltCloseOn.png') no-repeat 50% 50%;}
 
 /* 테이블 외부 안내문구 */
-.notice {margin-bottom:10px;}
+.panelStyle > .notice {margin:0 0 15px ;}
+.panelContent > .notice {margin:15px 0;}
 .notice em {color:red;}
 .notice li, p.dot {padding-left:20px; background:url('../../image/dot_bk.png') no-repeat 5px 50%; line-height:24px;}
 p.dot .btn {margin-left:10px !important;}
@@ -450,28 +462,24 @@ p.dot em {color:red;}
 .color-mGray header, span.color-mGray {background:linear-gradient(to right,#6c757d 0%,#555 100%) !important;}
 .color-gray header, span.color-gray {background:#666 !important;}
 .color-mGray .frmStyle th, .color-mGray .tableStyle th, .color-gray .frmStyle th, .color-gray .tableStyle th {background:#eee !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-mGray .tablePaging .num.on, .color-gray .tablePaging .num.on {background:#888 !important; border-color:#888 !important;}
 .color-mGray #lnb .dep3, .color-gray #lnb .dep3 {border-color:#777 !important;}
 
 /*Color :Blue ---*/
 .color-mBlue header, span.color-mBlue {background:linear-gradient(to right,#4481eb 0%,#04befe 100%) !important;}
 .color-blue header, span.color-blue {background:#0042a5 !important;}
 .color-mBlue .frmStyle th, .color-mBlue .tableStyle th, .color-blue .frmStyle th, .color-blue .tableStyle th {background:#d8eafc !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-mBlue .tablePaging .num.on, .color-blue .tablePaging .num.on {background:#3e91de !important; border-color:#3e91de !important;}
 .color-mBlue #lnb .dep3, .color-blue #lnb .dep3 {border-color:#3e91de !important;}
 
 /*Color :Green ---*/
 .color-mGreen header, span.color-mGreen {background:linear-gradient(135deg,#00b09b 0,#96c93d 100%) !important;}
 .color-green header, span.color-green {background:#00b09b !important;}
 .color-mGreen .frmStyle th, .color-mGreen .tableStyle th, .color-green .frmStyle th, .color-green .tableStyle th {background:#e5f7f5 !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-mGreen .tablePaging .num.on, .color-green .tablePaging .num.on {background:rgba(0,176,155,0.8); border-color:rgba(0,176,155,0.8) !important;}
 .color-mGreen #lnb .dep3, .color-green #lnb .dep3 {border-color:#00b09b !important;}
 
 /*Color :Pink ---*/
 .color-mPink header, span.color-mPink {background:linear-gradient(to right, rgb(242, 112, 156), rgb(255, 148, 114)) !important;}
 .color-pink header, span.color-pink {background:#feada6 !important;}
 .color-mPink .frmStyle th, .color-mPink .tableStyle th, .color-pink .frmStyle th, .color-pink .tableStyle th {background:#fff7f6 !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-mPink .tablePaging .num.on, .color-pink .tablePaging .num.on {background:#feada6; border-color:#feada6 !important;}
 .color-mPink #lnb .dep3, .color-pink #lnb .dep3 {border-color:#feada6 !important;}
 
 /*Color : wivis ---*/
@@ -486,7 +494,6 @@ p.dot em {color:red;}
 .color-black #lnb .dep3 a {color:#111111 !important;}
 .color-black #lnb a {color:#fff !important;}
 .color-black .frmStyle th, .color-black .tableStyle th, .color-black .frmStyle th, .color-black .tableStyle th {background:#eee !important; border-top:1px solid #ddd; border-bottom:1px solid #ddd;}
-.color-black .tablePaging .num.on, .color-black .tablePaging .num.on {background:#888 !important; border-color:#888 !important;}
 
 /* 폰트 컬러, 폰트 두께 */
 .cBlue {color:#127fdc !important;}
@@ -555,11 +562,6 @@ hr {border:0; padding-bottom:10px;}/* 기본 여백 :10px */
 .w20p {width:20% !important;}
 .h100 {height:100px !important;} /*alert, confirm 컨텐츠 높이에 사용*/
 
-.videoClose {cursor:pointer;}
-.videoPopup .close {position:absolute; top:-20px; right:-20px; z-index:1; width:40px; height:40px; line-height:20px; font-size:20px; border:1px solid #666; border-radius:50px; background-color:#fff;}
-#btnTop {display:none; position:fixed; right:0; bottom:50px; width:40px; line-height:10px; font-size:10px; background:#fff; border:1px solid #ddd; border-right:none; padding:3px 0 5px 0; box-shadow:5px 5px 5px -4px rgba(0, 0, 0, 0.07); color:#1c84c6;}
-#btnTop i {width:100%; font-size:12px;}
-#btnTop:hover {padding-right:30px; width:70px; font-weight:bold;}
 
 /*-- 캘린더 --------------*/
 #calendar {max-width:900px; margin:20px 0 50px 20px;}
@@ -651,10 +653,10 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none; }
 .checkBoxMore[data-unit='8'] li {flex-basis:12.5%;}
 
 /* 아이콘 툴팁 버튼 */
-.iconTooltip {display:inline-block; position:relative; margin-right:10px; text-align:center;}
-.iconTooltip i {position:relative; color:#46a1ff; width:15px; height:15px; line-height:16px; border-radius:50%; border:1px solid #46a1ff; cursor:pointer}
+.iconTooltip {display:inline-block; position:relative; margin-right:10px;}
+.iconTooltip i {position:relative; color:#46a1ff; width:15px; height:15px; line-height:16px; border-radius:50%; border:1px solid #46a1ff; cursor:pointer; text-align:center;}
 .iconTooltip:hover i {box-shadow:0px 3px 7px 0px rgba(0,0,0,0.4);}
-.iconTooltip span {display:none; position:absolute; top:36px; z-index:5; padding:10px 7px; line-height:24px; color:#fff; background:#6d6d6d; box-shadow:0px 3px 7px 0px rgba(0,0,0,0.2); border-radius:5px;}
+.iconTooltip span {display:none; position:absolute; top:36px; z-index:5; padding:10px 15px; line-height:24px; color:#fff; background:#6d6d6d; box-shadow:0px 3px 7px 0px rgba(0,0,0,0.2); border-radius:5px;}
 .iconTooltip span:after {position:absolute; top:-4px; content:''; background:#6d6d6d; width:8px; height:8px; -ms-transform:rotate(-45deg); -webkit-transform:rotate(-45deg); transform:rotate(-45deg);}
 .iconTooltip span.left {left:-10px}
 .iconTooltip span.left:after {left:15px;}
@@ -675,7 +677,8 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none; }
 .itemMove .item li:nth-of-type(2) div {line-height:20px}
 
 /* 상품 Dragable : 20200129 */
-.sortableWrap {overflow:auto; margin:20px 0; width:100%; max-height:675px;}
+.sortableWrap #sortable { overflow-y:auto }
+.sortableWrap {margin:20px 0; width:100%; max-height:675px;}
 .sortableWrap .itemWrap {display:inline-block;}
 .sortableWrap .item {float:left; margin-right:12px; margin-bottom:12px; padding:5px 8px; line-height:20px; border:1px solid #ddd; vertical-align:top; background:#fff;}
 .sortableWrap .item > li {float:left; vertical-align:middle;}
@@ -693,6 +696,7 @@ table.mtz-monthpicker {border:1px solid #ddd; border-top:none; }
 .sortableWrap .item .cont .price {padding-top:3px; padding-bottom:3px;}
 .sortableWrap .item .cont input {margin-left:5px; width:37px;}
 
+
 .ag-theme-balham.lh60 .ag-cell {line-height: 60px !important; height:60px;}
 .ag-theme-balham.lh70 .ag-cell {line-height: 70px !important; height:70px;}
 .ag-theme-balham.lh80 .ag-cell {line-height: 80px !important; height:80px;}

+ 4 - 3
style24.admin/src/main/webapp/ux/js/admin.popup.js

@@ -35,14 +35,15 @@ function uifnAllCheck(id) {
  * @author : gagamel
  */
 var cfnOpenModalPopup = function(actionUrl, oTarget) {
-	var str = '<div class="popupWrap color-pastel" id="'+oTarget+'"></div>';
+	var str = '<div class="popupWrap" id="' + oTarget + '"></div>';
 
 	if ($('#'+ oTarget).length == 0) {
 		$('body').append(str);
 	}
 
-	$("#" + oTarget).load(actionUrl,function(){
-		uifnMpopup(oTarget);
+	$("#" + oTarget).load(actionUrl, function() {
+		uiPopupOpen(oTarget);
+		
 		$('.schDate').datepicker({
 			changeMonth: true,
 			changeYear: true,

+ 69 - 87
style24.admin/src/main/webapp/ux/js/admin.ui.js

@@ -32,106 +32,87 @@ function uifnAllCheck(id) {
 	return false;
 };
 
-//MODAL POPUP 열기
-function uifnMpopup(id){
-	var $thisId = $("#"+id + ">.popup");
-	var popW = parseInt( $thisId.attr("data-width") );
-	var popH = parseInt( $thisId.attr("data-height") );
-	if (!popW && !popH) {
+//MODAL & MODELESS POPUP 열기
+function uiPopupOpen(id){
+	var $thisId = $(document).find("#"+id);
+	var popW = parseInt( $thisId.children().attr("data-width"));
+	var popH = parseInt( $thisId.children().attr("data-height"));
+
+	//팝업사이즈
+	if (!popW && !popH) { //가로&세로 미지정(풀사이즈 출력)
 		popW = $(window).width()-100;
 		popH = $(window).height()-100;
-		if (popW % 2 != 0 )	{popW = popW+1};	//넓이 짝수 변환(border 두께 영향)
-		if (popW < 1180)	{ popW = 1180 };		//최소 넓이
-		if (popH % 2 != 0 )	{popH = popH+1};	//높이 짝수 변환(border 두께 영향)
-		if (popH < 488)	{ popH = 488 };				//최소 높이
-		$thisId.css({width:popW, height:popH});
-	}
-	//이미지카드가 있는 팝업일때 내부 컨텐츠 높이 지정
-	if ($thisId.find(".cardArea").length > 0) {
-		var noticeH = parseInt($(".notice").height());
-		var cardAreaH = popH-40-noticeH-37-170; //높이계산 : 팝업-타이틀-안내문-컬러명TR-기타버튼영역
-		$(".cardArea").css({height:cardAreaH+'px'});
-	};
-	//tab이 있는 팝업일때 내부 컨텐츠 높이 지정
-	if ($thisId.find(".tabContArea").length > 0) {
-		var btnAreaH = 0, mdConH = 0;
-		if ($thisId.find(".tabBtnArea").length > 0 ){ btnAreaH = 46 };
-		if ($thisId.find(".mdPopContent").length > 0 ){
-			mdConH = $thisId.find(".mdPopContent").innerHeight();
-		};
-		var tabContH = $thisId.height()-38-84-btnAreaH-mdConH; //높이계산 : 팝업-타이틀-기타영역-탭버튼
-		$(".tabContArea").css({height:tabContH});
-	};
-	$thisId.parent().css({display:"block"});
-	$("body").addClass("scrollOff");
-};
-
-
-
-//DRAGGABLE 공지팝업 OPEN
-function uiDragPopup(id){
-
-};
-
-
-//MODELESS POPUP 열기
-function uifnModelPop(id){
-	var $thisId = $("#"+id);
-	var popW = parseInt( $thisId.attr("data-width") );
-	var popH = parseInt( $thisId.attr("data-height") );
-	var mdPopBtnBH = parseInt($thisId.find(".mdPopBtnB").outerHeight());
-	if (!popW && !popH) {
-		popW = $(window).width()-100;
-		popH = $(window).height()-150;
 		if (popW % 2 != 0 )	{popW = popW+1}; //짝수 변환(border 두께 영향)
-		if (popW < 1180)	{ popW = 1180 };  //최소넓이
+		if (popW < 1180)	{popW = 1180 };  //최소넓이
 		if (popH % 2 != 0 )	{popH = popH+1}; //짝수 변환(border 두께 영향)
-		if (popH < 488)	{ popH = 488 };  //최소높이
-		$thisId.css({width:popW, height:popH});
+		if (popH < 488)	{ popH = 488 };  	//최소높이
+		$thisId.children().find(" > .panelStyle").css({width:popW, height:popH});
+	} else if (popW && popH) { 		//가로,세로 둘다 지정(지정된 사이즈로 출력)
+		$thisId.children().find(".panelStyle").css({width:popW, height:popH});
+	} else { 	//가로만 지정(세로는 auto)
+		$thisId.children().find("> .panelStyle").css({width:popW});
+	};
 
+	if ($thisId.children().hasClass("modelessPopup")){ //모덜리스 팝업의 경우
+		if (isNaN(popW)){popW = $thisId.children().width(); }
+		if (isNaN(popH)){popH = $thisId.children().height(); }
+		let popL = $(window).width()/2 - popW/2;
+		let popT = $(window).height()/2 - popH/2;
+		$thisId.children().css({left:popL, top:popT});
 	};
+
+	$thisId.children().css({display:"block"});
+	$("body").addClass("scrollOff");
+
 	//이미지카드가 있는 팝업일때 내부 컨텐츠 높이 지정
-	if ($thisId.find(".cardArea").length > 0) {
-		var noticeH = $(".notice").height();
-		var cardAreaH = popH-38-noticeH-37-105; //높이계산 : 팝업-타이틀-안내문-컬러명TR-기타버튼영역
+	if ($thisId.children().find(".cardArea").length > 0) {
+		var popH=0, noticeH=0, btnAreaH=0;
+		if ($thisId.children().find(".notice").length > 0){
+			var noticeLen =  $thisId.children().find(".notice li").length;
+			noticeH = (noticeLen*24) + 30;
+		};
+		if ($thisId.children().hasClass("modelessPopup")){ //모덜리스 팝업의 경우
+			popH = $thisId.children().height();
+		} else {
+			popH = $thisId.children().find(".panelStyle").height();
+		};
+		if ($thisId.children().find(".panelBar").length > 0 ){ btnAreaH = 52 };
+
+		var cardAreaH = popH-42-noticeH-37-btnAreaH; //높이계산 : 팝업-타이틀-안내문-컬러명TR-기타버튼영역
 		$(".cardArea").css({height:cardAreaH});
 	};
+
 	//tab이 있는 팝업일때 내부 컨텐츠 높이 지정
-	if ($thisId.find(".tabContArea").length > 0) {
-		var btnAreaH = 0, mdConH = 0;
-		if ($thisId.find(".tabBtnArea").length > 0 ){ btnAreaH = 46 };
-		if ($thisId.find(".mdPopContent").length > 0 ){
-			mdConH = $thisId.find(".mdPopContent").innerHeight();
+	if ($thisId.children().find(".tabsCont").length > 0) {
+		var mdConH=0, topTbl=0, popH=0, btnAreaH=0;
+		if ($thisId.children().hasClass("modelessPopup")){ //모덜리스 팝업의 경우
+			popH = $thisId.children().height();
+		} else {
+			popH = $thisId.children().find(".panelStyle").height();
 		};
-		var tabContH = $thisId.height()-38-84-btnAreaH-mdConH; //높이계산 : 팝업-타이틀-기타영역-탭버튼
-		$(".tabContArea").css({height:tabContH});
-	};
+		if ($thisId.children().find(".panelContent > .frmStyle:eq(0)").length > 0 ){
+			topTbl = $thisId.children().find(".panelContent > .frmStyle:eq(0)").outerHeight() + 15;
+		};
+		if ($thisId.children().find(".panelBar").length > 0 ){ btnAreaH = 52 };
 
-	var $thisId = $("#"+id);
-	var thisW = $thisId.width()/2;
-	var thisH = $thisId.height()/2;
-	var thisL = $(window).width()/2 - thisW;
-	var thisT = $(window).height()/2 - thisH;
-	$thisId.css({top:thisT+'px', left:thisL+'px'}).css({display:"block"});
-	$("body").addClass("scrollOff");
-};
+		console.log(topTbl);
+		var tabContH = popH-42-topTbl-35-btnAreaH; //높이계산 : 팝업높이-타이틀-상단테이블-탭스높이-버튼
+		$(".tab > .panelStyle").css({height:tabContH});
+	};
 
-//MODELESS POPUP
-function unfnModeless(){
-	$(".modeless").draggable({containment:"#wrapper", scroll:false});
 };
 
-//POPUP CLOSE
-function uifnPopClose(id) {
+//MODAL POPUP CLOSE
+function uiPopupClose(id) {
 	var $thisId = $("#"+id);
-	$thisId.css({display:"none"});
-	//$thisId.html('');
-	$thisId.remove();
-	var popLen = $(".popupWrap[style='display: block;']").length;
-	if ( popLen == 0 ){
+	$thisId.children().css({display:"none"});
+	$thisId.children().remove();
+	var modalLen = $(".modalPopup[style='display:block;']").length;
+	var modalessLen = $(".modalPopup[style='display:block;']").length;
+	if ( modalLen == 0 && modalessLen ==0 ){
 		$("body").removeClass("scrollOff");
 	};
-	if ( $thisId.hasClass("videoClose") ){
+	if ( $thisId.children().hasClass("videoClose") ){
 		$("#iframe_video").attr("src","");
 	};
 };
@@ -139,8 +120,8 @@ function uifnPopClose(id) {
 //비디오 팝업 열기
 function viewVideoPopup(id){
 	var $thisId = $("#"+id + ">.videoPopup");
-	var popW = parseInt( $thisId.attr("data-width") );
-	var popH = parseInt( $thisId.attr("data-height") );
+	var popW = parseInt( $thisId.children().attr("data-width") );
+	var popH = parseInt( $thisId.children().attr("data-height") );
 	var iframeSrc = 'https://www.youtube.com/embed/' + $("#video_url").val() + '?showinfo=0&rel=0&vp=hd1080&fs=0&wmode=opaque&enablejsapi=1';
 	$("#iframe_video").css({width:popW, height:popH});
 	$("#iframe_video").attr("src", iframeSrc+"?enablejsapi=1&version=3&playerapiid=ytplayer");
@@ -183,6 +164,10 @@ function lnbToggle(){
 
 $(document).ready(function(){
 
+	//MODELESS POPUP : draggable
+	$(document).find(".draggable").draggable({containment:"#wrapper", scroll:false});
+
+
 	//chart resizing
 	$(window).resize(function(){
 		setTimeout( chartResize, 300);	//차트 리사이징
@@ -295,9 +280,6 @@ $(document).ready(function(){
 		}
 	});
 
-	//MODELESS POPUP : draggable
-	$(".modeless").draggable({containment:"#wrapper", scroll:false});
-
 	//SORTABLE LIST
 	if ( $("#sortable").length > 0 ) {
 		var mainW = $("#main").width();

+ 6 - 2
style24.admin/src/main/webapp/ux/plugins/fullcalendar/fullcalendar-4.2.0.css

@@ -507,7 +507,7 @@ TODO: more distinction between this file and common.css
 .fc-unthemed .fc-popover,
 .fc-unthemed .fc-list-view,
 .fc-unthemed .fc-list-heading td {
-  border-color: #ddd; }
+  border-color: #ddd; line-height:22px; }
 
 .fc-unthemed .fc-popover {
   background-color: #fff; }
@@ -518,7 +518,7 @@ TODO: more distinction between this file and common.css
   background: #eee; }
 
 .fc-unthemed td.fc-today {
-  background: #fcf8e3; }
+  background:#fdfad3; }
 
 .fc-unthemed .fc-disabled-day {
   background: #d7d7d7;
@@ -983,3 +983,7 @@ Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
   /* work around the way we do column resizing and ensure a minimum width */
   display: inline-block;
   min-width: 1.25em; }
+
+.fc-day-header.fc-widget-header.fc-sat{background-color:#e0f2ff}
+.fc-day-header.fc-widget-header.fc-sun{background-color:#f7dcda}
+.fc-unthemed .fc-content{position:relative;top:50%;}

+ 1 - 7
style24.admin/src/main/java/com/style24/persistence/TsaBaseDomain.java → style24.core/src/main/java/com/style24/persistence/TscBaseDomain.java

@@ -15,7 +15,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class TsaBaseDomain implements Serializable {
+public class TscBaseDomain implements Serializable {
 
 	@JsonInclude(JsonInclude.Include.NON_EMPTY)
 	private Integer regNo;
@@ -41,10 +41,4 @@ public class TsaBaseDomain implements Serializable {
 	// CRUD
 	private String crud;
 
-	// Pagination
-	private TsaPageRequest pageable;
-	private int pageNo = 1;
-	private int pageSize = 50;
-	private int pageUnit = 10;
-
 }

+ 2 - 19
style24.core/src/main/java/com/style24/persistence/domain/Envset.java

@@ -1,8 +1,6 @@
 package com.style24.persistence.domain;
 
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -14,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Envset implements Serializable {
+public class Envset extends TscBaseDomain {
 
 	private Integer envsetSq;
 	private String siteCd;
@@ -34,19 +32,4 @@ public class Envset implements Serializable {
 	private String strSetNm3;
 	private String strSetNm4;
 
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private Integer regNo;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String regDt;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private Integer updNo;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String updDt;
-
-	// 등록/수정화면 제어용(N:신규, U:상세/수정, C:복사)
-	private String mode;
-
 }

+ 0 - 50
style24.scm/src/main/java/com/style24/persistence/TssBaseDomain.java

@@ -1,50 +0,0 @@
-package com.style24.persistence;
-
-import java.io.Serializable;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-
-import lombok.Data;
-
-/**
- * Domain의 기본 Super class
- * Domain 클래스 생성 시 이 클래스를 상속받아서 처리한다.
- *
- * @author gagamel
- * @since 2020. 10. 19
- */
-@SuppressWarnings("serial")
-@Data
-public class TssBaseDomain implements Serializable {
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private Integer regNo;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String regNm;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String regDt;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private Integer updNo;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String updNm;
-
-	@JsonInclude(JsonInclude.Include.NON_EMPTY)
-	private String updDt;
-
-	// 등록/수정화면 제어용(N:신규, U:상세/수정, C:복사)
-	private String mode;
-
-	// CRUD
-	private String crud;
-
-	// Pagination
-	private TssPageRequest pageable;
-	private int pageNo = 1;
-	private int pageSize = 50;
-	private int pageUnit = 10;
-
-}

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/Brand.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Brand extends TssBaseDomain {
+public class Brand extends TscBaseDomain {
 
 //	//HTML
 //	private String cpnId;		//쿠폰ID

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/Color.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class Color extends TssBaseDomain {
+public class Color extends TscBaseDomain {
 
 	private String colorCd;			// 색상코드
 	private String colorEnm;		// 색상영문명

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/CommonCode.java

@@ -1,7 +1,7 @@
 package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -13,7 +13,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class CommonCode extends TssBaseDomain {
+public class CommonCode extends TscBaseDomain {
 
 	private String cdGb;
 	private String cd;

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/Menu.java

@@ -4,7 +4,7 @@ import java.util.Collection;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -18,7 +18,7 @@ import lombok.Data;
 @Data
 @JsonSerialize
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class Menu extends TssBaseDomain {
+public class Menu extends TscBaseDomain {
 
 	public Menu() {
 

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/MenuAccessHst.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class MenuAccessHst extends TssBaseDomain {
+public class MenuAccessHst extends TscBaseDomain {
 
 	private Integer menuAccessSq;
 	private String userNo;

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/MenuRole.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class MenuRole extends TssBaseDomain {
+public class MenuRole extends TscBaseDomain {
 
 	private String roleCd;	// 권한코드
 	private String roleNm;	// 권한명

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/SupplyCompany.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class SupplyCompany extends TssBaseDomain {
+public class SupplyCompany extends TscBaseDomain {
 
 	private String supplyCompCd;		// 공급업체코드
 	private String supplyCompNm;		// 공급업체명

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/User.java

@@ -2,7 +2,7 @@ package com.style24.persistence.domain;
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -16,7 +16,7 @@ import lombok.Data;
 @Data
 @JsonSerialize
 @JsonIgnoreProperties(ignoreUnknown = true)
-public class User extends TssBaseDomain {
+public class User extends TscBaseDomain {
 
 	// 세션을 JSON 형식으로 레디스에 저장하려면 기본 생성자를 반드시 명시해야 한다
 	public User() {

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/UserHst.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class UserHst extends TssBaseDomain {
+public class UserHst extends TscBaseDomain {
 
 	private Integer chgHstSq;	// 변경이력일련번호
 	private Integer userNo;		// 사용자번호

+ 2 - 2
style24.scm/src/main/java/com/style24/persistence/domain/UserMenu.java

@@ -1,6 +1,6 @@
 package com.style24.persistence.domain;
 
-import com.style24.persistence.TssBaseDomain;
+import com.style24.persistence.TscBaseDomain;
 
 import lombok.Data;
 
@@ -12,7 +12,7 @@ import lombok.Data;
  */
 @SuppressWarnings("serial")
 @Data
-public class UserMenu extends TssBaseDomain {
+public class UserMenu extends TscBaseDomain {
 
 	private Integer userNo;	// 사용자번호
 	private String menuId;	// 메뉴ID