달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
반응형

날짜의 분기(Quarter)를 구해서 자동으로 달력 input에 매핑해 주면

실 사용자들이 편리하겠다라는 생각이 들어서 바로 작업을 진행하였다.

 

분기의 규칙만 알면 간단하게 진행할 수 있었는데 수학적으로 표현하자면

1/1 ~ 3/31은 1분기, 

4/1 ~ 6/30은 2분기,

7/1 ~ 9/30은 3분기,

10/1 ~ 12/31은 4분기 이므로 분기 시작 월을 구하려면 다음과 같은 규칙을 꺼낼 수 있었다.

현재 분기 = 현재 월/3의 소수점 1번째 자리 올림
분기 시작 월 = (현재 분기 - 1)* 3 + 1

 

하지만 javascript에서 월은 0~11로 표현되므로 아래 소스코드의 수식으로 변환되었다.

(분기도 0~3으로 표현되도록 함)

var quarter = parseInt(date.getMonth() / 3);
var startMonth = quarter * 3;

 

분기 끝 날짜를 구하려면 시작일에 2개월을 더하고 해당 월의 마지막 날짜를 구한다.

var endDate = getMonthLastDate(new Date(addMonths(new Date(startDate), 2)));

 

이전/다음 분기는 분기마다 3개월 씩 차이나므로 현재 날짜의 월에 3씩 이동해서 구하면 된다.

(단, 3월 31일에 3개월을 더할 경우 6월 31일이 되는데 이는 존재하지 않는 날짜로 js에서 7월 1일으로 자동 변환된다.

때문에 날짜를 1일로 셋팅하고 구해야 일(day)에 따른 버그가 생기지 않는다.)

var date = addMonths((new Date(now.setDate(1))), count*3);

 

그렇게 완성된 소스코드는 다음과 같다.

<script type="text/javascript">
	function getQuarterStartDate(date) {
		var year = date.getFullYear();
		var quarter = parseInt(date.getMonth() / 3);
		var startMonth = quarter * 3;
		
		return (new Date(year, startMonth, 2)).toISOString().substring(0, 10);
	}
	
	function getMonthLastDate(date) {
		
		return (new Date(date.getFullYear(), date.getMonth()+1, 1)).toISOString().substring(0, 10);
	}

	function addMonths(orgDate, count) {
		
		return (new Date(orgDate.setMonth(orgDate.getMonth() + count))).toISOString().substring(0, 10);
	}
	
	function setDate(startId, endId, count) {
		var now = new Date();
		var date = addMonths((new Date(now.setDate(1))), count*3);
		var startDate = getQuarterStartDate(new Date(date));
		var endDate = getMonthLastDate(new Date(addMonths(new Date(startDate), 2)));

		$("#"+startId).val(startDate);
		$("#"+endId).val(endDate);
	}
	
	var quarterCnt = 0;
	
	function moveQuarter(count) {
		quarterCnt += count;
		setDate("startDate", "endDate", quarterCnt);
	}
	
	$(function() {
		setDate("startDate", "endDate", quarterCnt);
	});
</script>
<html>
    <body>
        <button type="button" onClick="moveQuarter(-1)">◀</button>
        <input type="text" id="startDate" name="startDate" readonly/>
        <input type="text" id="endDate" name="endDate" readonly/>
        <button type="button" onClick="moveQuarter(1)">▶</button>
    </body>
</html>

 

반응형
:
Posted by 리샤씨
반응형

td에 tooltip을 추가하면 해당 td에 마우스 오버시 tooltip이 td 사이에 생기면서 td가 하나씩 옆으로 밀려나는 현상이 발생한다.

그럴 때 tooltip이 있는 td에 data-container="body" 속성을 추가하면 td가 밀려나지 않고 예쁘게 보이게 된다.

<td data-container="body" data-toggle="tooltip" title="테스트입니다.">
 테스트
</td>

 

그리고 꼭 td에 tooltip을 추가할 때 뿐만 아니라,

table 안에 어떠한 태그에 tooltip을 추가했을 때 해당 tooltip이 table 영역을 벗어나서

tooltip이 잘린다면 그 때에도 data-container="body" 속성을 추가하면 간단히 해결할 수 있다.

<td>
    <a href="test.html" data-container="body" data-toggle="tooltip" title="테스트입니다.">
        테스트
    </a>
</td>

 

 

참고 출처 : https://stackoverflow.com/questions/21938008/bootstraps-tooltip-moves-table-cells-to-right-a-bit-on-hover

 

반응형
:
Posted by 리샤씨
반응형

웹 개발을 하다 보면 보통 처음엔 퍼블리싱을 받지만

어쩔 수 없이 추가 개발이 들어와 기존에 있던 ui를 확장하여 새로운 ui 작업을 하기도 한다.

ui 고칠 일이 많거나 새로운 아이콘이 필요하다거나 잘 모르겠으면

퍼블리셔 분에게 요청하겠지만 간단한 것은 빠르게 내 선에서 해결하는 편이다.

 

이것도 그런 일 중 하나로, 관리자 페이지 특정 목록에서 엑셀 일괄 등록 기능이 새로 추가되는 일이었다.

엑셀 파일로 데이터를 업로드하여 진짜 테이블에 넣기 전에 임시 테이블에 넣어 확인하는 ui가 있었는데

엑셀로 등록하다 보니 나중에 행의 개수가 많아져 header가 고정되는 편이 좋을 것 같아 그렇게 작업했다.

 

처음엔 그냥 y축만 움직여서 작업하면 되어서 css로 충분히 작업이 가능하였으나

x축이 필요한 테이블이 생기게 되어 jQuery를 이용하는 아래 결과물이 나오게 되었다.

<style>
#userTbl {
  	width: 600px;
	height: 200px;
  	overflow-y: auto;
}
  	
#userTblHead {
  	width: 600px;
  	overflow-x: hidden;
}
  	
#userTbl table {
  	border-top: 0px;
}
  	
#userTblHead table {
  	overflow: hidden;
  	border-top: 2px solid #aaa;
  	border-bottom: 1px solid #aaa;
}
  	
.tblWrap table {
  	width: 100%;
  	border-spacing: 0;
  	border-width: 1px 0;
  	border-collapse: collapse;
  	table-layout: fixed;
}

.tblWrap table thead th {
	background: #eee;
}

.tblWrap table td {
	text-align: center;
	border-bottom: 1px solid #aaa;
}

.tblWrap table td.left {
	text-align: left;
	padding-left: 10px;
}

.tblWrap table th:not(:last-child), table td:not(:last-child) {
    border-right: solid 1px #aaa;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
var sl = 0;
$(function(){
	$.fn.hasYScrollBar = function() {
	    return (this.prop("scrollHeight") == 0 && this.prop("clientHeight") == 0)
	            || (this.prop("scrollHeight") > this.prop("clientHeight"));
	};

	$.fn.hasXScrollBar = function() {
	    return (this.prop("scrollWidth") == 0 && this.prop("clientWidth") == 0)
	            || (this.prop("scrollWidth") > this.prop("clientWidth"));
	};
	
	$("#userTbl").scroll(function(event){
		// data 테이블 x축 스크롤을 움직일 때header 테이블 x축 스크롤을 똑같이 움직인다
		if (sl != $("#userTbl").scrollLeft()) {
			sl = $("#userTbl").scrollLeft();
			$("#userTblHead").scrollLeft(sl);
		}
	});
	
	if ($("#userTbl").hasYScrollBar()) {
		//y축 스크롤이 있으면 스크롤 넓이인 17px만큼 header 마지막 열 크기를 늘린다
		$("#userTblHead colgroup col:last-child").width($("#userTbl colgroup col:last-child").width() + 17);
	} else {
		$("#userTblHead colgroup col:last-child").width($("#userTbl colgroup col:last-child").width());
	}
});
</script> 
<div class="tblWrap">
	<div id="userTblHead">
		<table>
			<!-- col의 width를 %가 아닌 px 단위로 정확히 지정해야 두 테이블이 하나의 테이블 처럼 보인다 -->
			<colgroup>
				<col style="width:45px">
				<col style="width:100px">
				<col style="width:100px">
				<col style="width:100px">
				<col style="width:100px">
				<col style="width:150px">
				<col style="width:200px">
				<col style="width:130px">
				<col style="width:130px">
			</colgroup>
			<thead>
				<tr>
					<th>No</th>
					<th>이름</th>
					<th>부서</th>
					<th>직급</th>
					<th>아이디</th>
					<th>전화번호</th>
					<th>이메일</th>
					<th>생년월일</th>
					<th>입사일</th>
				</tr>
			</thead>
		</table>
	</div>
	<div id="userTbl">
		<table>
			<colgroup>
				<col style="width:45px">
				<col style="width:100px">
				<col style="width:100px">
				<col style="width:100px">
				<col style="width:100px">
				<col style="width:150px">
				<col style="width:200px">
				<col style="width:130px">
				<col style="width:130px">
			</colgroup>
			<tbody>
				
				<tr>
					<td>1</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>2</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>3</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>4</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>5</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>6</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>7</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>8</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
				<tr>
					<td>9</td>
					<td>홍길동</td>
					<td>영업</td>
					<td>사원</td>
					<td>hong</td>
					<td>010-1000-1000</td>
					<td class="left">hong@company.co.kr</td>
					<td>1994-09-15</td>
					<td>2017-05-08</td>
				</tr>
			</tbody>
		</table>
	</div>
</div>

 

- y축 있을 때

No 이름 부서 직급 아이디 전화번호 이메일 생년월일 입사일
1 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
2 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
3 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
4 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
5 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
6 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
7 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
8 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
9 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08

 

- y축 없을 때

No 이름 부서 직급 아이디 전화번호 이메일 생년월일 입사일
1 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
2 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08
3 홍길동 영업 사원 hong 010-1000-1000 hong@company.co.kr 1994-09-15 2017-05-08

 

아시다시피 html table은 header가 기본적으로 고정되지 않지만 위와 같이 편법을 쓰면 가능하다.

table header를 고정시키는 편법으로는 여러 가지 방법이 있으나

위 방법처럼 접근성엔 좋지 않은 header 테이블과 data 테이블을 나눈 이유는

내가 적용하려는 웹이 관리자 페이지이므로 접근성이 크게 상관없고,

저 방법으로 하면 ie와 Chrome 둘 다 열을 나누는 선이 있어도 y축이 있든 없든 예쁘게 보이기 때문이다.

반응형
:
Posted by 리샤씨


반응형
반응형