HetaJs

Table Header 간격 조절

1번 테이블 : 마우스를 가져가면 커서가 바뀐다. (태그는 소스 보기로 확인)

Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC
Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC
Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC

2번 테이블 : 복잡한 2중구조를 TableScroller 로 호출한 예제. (태그는 소스 보기로 확인)

Main ID
Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC
Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC
Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC
Sub Ch.ID Main ID Main Tkin Plan Step Seq EQP ID PPID Tkout Carrier ID Slot LSL USL Check DSA SPC




핵심 Javascript

/**
해더를 드래그 한다.
1: 대상 table 영역의 selector
2: 드래그할 태그 selector
3: 제3의 위치를 드래그 해야할 경우에 호출하는 함수.  function또는 "colgroup" 으로 해도됨.
4: 함께 전체 사이즈를 조절할 selector
 
//3인자는 자동 class 주입.
new TdDrag("#scroll4","td:lt(3)",function(tdObj,idx,width){
		$('#table3 tr:eq(0)').find('td').eq(idx).width(width);
	}
,"col:eq(0)");
new TdDrag("#mainstepGrid","th:lt(3)",function(tdObj,idx,width,dist){
	var $leftCols = $('#mainstepGrid table:eq(0) col');
 
	$leftCols.eq(idx).width(width);		//클때만 컬럼 사이즈를 조정한다.
 
	//자기 영역의 사이즈 변경
	var w1 = $leftCols.eq(0).width();
	var w2 = $leftCols.eq(1).width();
	var w3 = $leftCols.eq(2).width();
	$("#mainstepGrid col:eq(0)").width(w1+w2+w3);
 
});	//앞에꺼
*/
function TdDrag(sourceObject,classInject, callbackFn, totalSizeTrigger){
	if(!window.TdDragId) window.TdDragId = 0;
	this.id = "TdDrag"+window.TdDragId++;
	this.classInject = classInject;
	this.totalSizeTrigger = totalSizeTrigger;
 
	this.sObj = document.querySelector(sourceObject);		//조정할 대상.
	this.callbackFn = callbackFn//	//document.querySelector(target_object);		//스크롤될 대상.
 
	this.totalCols = {}; 			//{"2:3":"1:8"}	key는 event에서 클릭한 곳의 row,cell  value는 움직여햐하는 객체의 row,cell,.. (table의 rowspan의 경우. 앞에꺼를 따로 처리하기 위함. )
	if(classInject != null){
		var tempTotalCols = [];
		//TODO colspan이 있으면 movable을 넣지 않는다.
		var colsTot = 0;
		var lineNum = 0;

		var that = this;
		$(classInject,this.sObj).each(function(i){
			//console.log($(this).index());
			//rowspan
			if($(this).index() == 0){ lineNum++; colsTot = 0;}	//line 초기화.
			if($(this).attr("rowspan") != null ){	//TODO 일단 2줄짜리만 됨
				var currRowSpan = Number($(this).attr("rowspan"));
				var tarnum = lineNum + currRowSpan;						//$$$$ 여기서 1회 만들고.
				if($(this).prev().attr("rowspan") != null){
					var prevRowSpan = Number($(this).prev().attr("rowspan"));
					if(currRowSpan > 1 && prevRowSpan < currRowSpan){	//rownum의 위치가 아래에 해당해야함.
						tarnum = lineNum + currRowSpan - prevRowSpan;		//$$$$ rownum이 차이가 있으면 바꾼다.
					}
				}
				tempTotalCols[lineNum+":"+$(this).index()] = (tarnum -1) + ":" +(colsTot-1);
			}

			//colspan
			var cols = $(this).attr("colspan") == null?0:Number($(this).attr("colspan"));
			if(cols > 0){
				$(this).removeClass(that.id);
				colsTot += cols;	//총col수
			}else{
				$(this).addClass(that.id);
				colsTot ++ ;//총col수
			}
		});

		this.totalCols = tempTotalCols;
	}
	this.mousedown = false; //마우스를 누른 상태
	this.td = ""; //사이즈 변경할 td
	this.td_width; //변경할 td의 width,
	this.x = 0; //마우스 드레그전 가로위치

	//object를 잠시 할당하는부분.
	this.TCstartColResize = function(obj,cellindex){
	  this.mousedown = true;
	  this.td = obj;
	  //obj.clientWidth;	//important
	  this.td_width = $(obj).width();
	  this.cellindex = cellindex;
	  this.x = event.clientX;
	};
	//object할당 해제.
	this.TCstopColResize = function(){
	  this.mousedown = false;
	  this.td = '';
	};
	//td 사이즈 변경. ..... TODO 마지막일때는 2배씩 늘려야 할것 같은데
	this.TCColResize = function()
	{
		if (this.mousedown){
		//자신의 사이즈 변경.
		var distX = event.x - this.x; //이동한 간격
		//this.td.width = Number(this.td_width) + Number(distX);
		$(this.td).width(Number(this.td_width) + Number(distX));		//$$$ 해당객체 사이즈 조절.

		//다른 곳에 있는 사이즈 변경.
		  try{
			  if(this.callbackFn != null){
 
				  //TODO cellindex를 3이상일때 x를 더해라 라는 것을 만들어야 한다. 초기에 colspan을 더해서 결정해야 한다.
				  if(callbackFn == "colgroup"){
 
					  	//colgroup을 조정하고 끝낸다.
						$("col",this.sObj).eq(this.cellindex).width((Number(this.td_width) + Number(distX)));		//$$$
 
					  	//전체 사이즈를 반영하기.
// 						if(this.totalSizeTrigger != null){
// 							var tw = 0;
// 							$(this.classInject,that.sObj).each(function(i){
// 								tw += $(this).width();
// 							});
// 							if(tw > 0) $(this.totalSizeTrigger).width(tw);
// 						}
 
				  }else{
						this.callbackFn(this,this.cellindex,(Number(this.td_width) + Number(distX)), Number(distX));
				  }
			  }
		  }catch(e){}
	  }
	};
	this.cell_left = function(obj){//마우스가 셀의 왼쪽인지 측정
	  if(event.offsetX < 5 && obj.cellIndex!= 0 )   return true;
	  else   return false;
	};
	this.cell_right = function(obj){//마우스가 셀의 오른쪽인지 측정
	  if(event.offsetX > $(obj).width()-4)	//obj.clientWidth
		  return true;
	  else
		  return false;
	};
 
	//찾기
	this.getRowspanIndex = function(now_mousedown){
		var cellindex = now_mousedown.cellIndex;					//현재 위치의 index
		var rowindex = now_mousedown.parentNode.sectionRowIndex;	//0,1	현재의 TR(line) INDEX
 
		var currRowSpan = 1;
		var prevRowSpan = 1;
		if($(now_mousedown).attr("rowspan") != null){
			currRowSpan = Number($(now_mousedown).attr("rowspan"));
		}
		if($(now_mousedown).prev().attr("rowspan") != null){
			prevRowSpan = Number($(now_mousedown).prev().attr("rowspan"));
		}
 
		if( this.cell_left(now_mousedown) ){	//앞에꺼 찾기.
			var cellIdx4Row = this.totalCols[(rowindex+1)+":"+cellindex];	//rowNum이 rowspan2일때 -1인 1이 들어 온다.
			if(cellIdx4Row != null){
				//너비만 가져온다.
				var arr = cellIdx4Row.split(":");	//line, co
				if(currRowSpan > 1 && prevRowSpan < currRowSpan){	//rowspan경계면
					var $tr = $(this.sObj).find('tr').eq(Number(arr[0]));
					now_mousedown = $tr.find(this.classInject).eq(Number(arr[1]));
				}
				cellindex = Number(arr[1]);
			}
		}else{
			var cellIdx4Row = this.totalCols[(rowindex+1)+":"+cellindex];	//rowNum이 rowspan2일때 -1인 1이 들어 온다.
			if(cellIdx4Row != null){
				//너비만 가져온다.
				var arr = cellIdx4Row.split(":");	//line, co
				cellindex = Number(arr[1])+1;
			}
		}
 
		return cellindex;
	};
	//리사이즈시작
	this.sObj.onmousedown = function(){
			try{
				var now_mousedown = window.event.srcElement;
				var cellindex = now_mousedown.cellIndex;

				//자신의 영역에 속한 객체 인지를 체크 한다.
				//return true;
				
				if(now_mousedown.className.indexOf(that.id) > -1 ){
					if($(now_mousedown).attr("rowspan") != null){	//rowspan은 값을 배열에서 가져온다.

						cellindex = that.getRowspanIndex(now_mousedown);	//cellindex와 now_mousedown가 바뀐다.

					}else{
						if( that.cell_left(now_mousedown) ){	//앞에꺼 찾기.
						//now_mousedown = now_mousedown.parentNode.childNodes[now_mousedown.cellIndex-1];
							now_mousedown = $(now_mousedown).prev().get();		//rowspan을 하면 아래에서 카운트 한다..;
							cellindex--;
						}else if( !that.cell_right(now_mousedown) ){
							return true;//오른쪽도 왼쪽도 아니면 사이즈 조절 안함
						}
					}
					that.TCstartColResize(now_mousedown,cellindex);
				}
			}catch(e){ return true; }
		};

	//리사이즈
	this.sObj.onmousemove = function(){
			try{
			  var now_mousemove = window.event.srcElement;
			  if(now_mousemove.className.indexOf(that.id) > -1 || that.td!=""){

				  //셀의 가장자리면 마우스 커서 변경
				  if( that.cell_left(now_mousemove) || that.cell_right(now_mousemove) ){
					now_mousemove.style.cursor = "col-resize";
				  }else{
					now_mousemove.style.cursor = "";
				  }

				  that.TCColResize();
// 			  }else{
// 				  now_mousemove.style.cursor = "";
			  }
			}catch(e){ return true; }
		};

	//리사이즈종료
	this.sObj.onmouseup = function(){
		try{
		  //var now_mouseup = window.event.srcElement;
			that.TCstopColResize();
		}catch(e){ return true; }
	};

	//리사이즈 도중 텍스트 선택 금지
	this.sObj.onselectstart = function(){
		try{
			if(that.td != ""){
				return false;
			}
		}catch(e){ return true; }
	};
}

1번 테이블에 colgroup과 theader가 함께 있는경우 3번항에 “colgroup”이라는 값만 주면된다.

/**
 * 처음 테이블 단순 호출
 */
 new TdDrag("#TABLE111","th","colgroup");


2번처럼 좌측 고정된 테이블의 경우 면서 해더와 바디가 분리된 복잡한 구조는 아래와 같이 따로 TableScroller 를 만들었다.

/**
 *  2개중에 우측은고정 되어 있고 좌측 이즈를 조정하면  좌측의 col틀이 함께 움직이도록 설계.
   3번째 인자 2는 좌측부터 2개가 고정된다는 뜻
	TableScroller("macroGrid","macroLeftGrid","macroRightGrid",2);
 */
var useTableScroll = true;
function TableScroller(parentGrid,grid1, grid2, grid1Cnt, extraScroll){
 
	new TdDrag("#"+parentGrid,"th:lt("+grid1Cnt+")",function(tdObj,idx,width,dist){
		var $leftCols = $('#'+grid1+' col');
		$leftCols.eq(idx).width(width);		//클때만 컬럼 사이즈를 조정한다.
 
// 		//자기 영역의 사이즈 변경
		var cnt = grid1Cnt;
		var w = 0;
		for(var i = 0;i < cnt; i++ ){
			w += $leftCols.eq(i).width();
		}
		if(w > 0) $("#"+parentGrid+" col:eq(0)").width(w);

	});	//앞에꺼

	if(extraScroll != null){	//추가 스크롤이 있으면 그서의 id값.
		new TdDrag("#"+grid2,"th",function(tdObj,idx,width,dist){
			var $rightCols = $('#'+grid2+' col');
			var $extraCols = $('#'+extraScroll+' col');
 
			$rightCols.eq(idx).width(width);		//클때만 컬럼 사이즈를 조정한다.
			$extraCols.eq(idx).width(width);
 
		});	//뒤에꺼
	}else{
		new TdDrag("#"+grid2,"th","colgroup");	//뒤에꺼
	}
 
}

//파티클 테이블이 헤더랑 바디가 분리되어있어서

$('#particleScrolldiv').on('scroll', function () {     
	 $('#particleHeaderDiv').scrollLeft($(this).scrollLeft());
});

TableScroller("PARTICLETABLE","PARTICLETABLE_LEFT","PARTICLETABLE_RIGHT",1,"particleScrolldiv");	//추가 스크롤.