coForward Grid
데이터 조회와 편집을 위한 고기능 테이블 컴포넌트입니다.
Grid는 대량 데이터를 효율적으로 표시하며 정렬, 필터, 페이징, 컬럼 설정 등 다양한 기능을 제공합니다.
운영 화면과 관리 시스템에서 사용할 수 있도록 높은 확장성과 사용자 설정 기능을 제공합니다.
정렬 및 필터
컬럼 정렬과 조건 검색, 범위 필터를 지원합니다.
페이징
페이지 단위 데이터 조회와 이동을 지원합니다.
컬럼 설정
컬럼 순서 변경, 숨김, 고정 기능을 제공합니다.
행 선택
전체 선택, 개별 선택 및 선택 데이터 조회를 지원합니다.
드래그 정렬
행과 컬럼 순서를 드래그로 변경할 수 있습니다.
그룹 및 고정
그룹 행, 고정 컬럼, 사용자 설정 기능을 제공합니다.
적용 준비
HTML 영역
<div id="gridToolbar"></div>
<div id="gridContainer"></div>
<div id="gridPagination"></div>
| 요소 | 용도 |
|---|---|
gridToolbar
|
설정 버튼을 자동 생성할 영역 |
gridContainer
|
테이블이 렌더링될 영역 |
gridPagination
|
페이지 이동 버튼이 렌더링될 영역 |
클래스 import
import coForward_grid from './Grid.js';
Grid.js
는 기본 export를 사용합니다. 일반
<script>
전역 등록은 코드에서 확인되지 않았습니다.
위치:
Grid.js:1909
CSS와 의존성
Grid 스타일은
__grid.scss
에 정의되어 있습니다. 프로젝트의 Sass 빌드에 포함하여 CSS로 컴파일한 후 사용합니다.
다음은
Grid.js
에서 생성되며
__grid.scss
에 스타일이 정의된 주요 CSS 클래스입니다.
| CSS 클래스 예 | 위치 |
|---|---|
coForward-grid
|
Grid.js:617
|
coForward-grid-page-navigation
|
Grid.js:125
|
coForward-grid-setting-button
|
Grid.js:247
|
coForward-grid-setting-dialog
|
Grid.js:262
|
coForward-grid-no-data
|
Grid.js:635
|
coForward-grid-added-row
|
Grid.js:792
|
coForward-grid-updated-cell
|
Grid.js:922
|
필수 브라우저 API로는
HTMLElement
,
<dialog>
,
CustomEvent
가 사용됩니다.
위치:
Grid.js:52-58
,
Grid.js:260-351
,
Grid.js:665-666
기본 생성과 렌더링
기본 순서
import coForward_grid from './Grid.js';
const container = document.getElementById('gridContainer');
if (!container) {
throw new Error('그리드 컨테이너를 찾을 수 없습니다.');
}
const grid = new coForward_grid();
grid.setHeader(header);
grid.setData(rows);
grid.render(container);
권장 호출 순서는
new coForward_grid()
→
setHeader(header)
→
setData(rows)
→
render(container)
입니다.
| 단계 | 실제 메서드 | 위치 |
|---|---|---|
| 인스턴스 생성 |
new coForward_grid()
|
Grid.js:8
,
Grid.js:11
|
| 헤더 등록 |
setHeader(header)
|
Grid.js:211-215
|
| 데이터 등록·교체 |
setData(data)
|
Grid.js:220-239
|
| 최초 렌더링 |
render(container)
|
Grid.js:594-645
|
| 같은 컨테이너 재렌더링 |
render()
|
Grid.js:594-597
|
| tbody만 재렌더링 |
renderTbody()
|
Grid.js:580-589
|
컨테이너 연결
setContainer(container)
는
HTMLElement
만 허용합니다. 문자열 선택자나 ID 문자열은 허용하지 않습니다. 잘못된 값이면 콘솔에 오류를 출력합니다.
위치:
Grid.js:52-58
grid.setContainer(document.getElementById('gridContainer'));
render(container)
에 컨테이너를 전달하면 내부에서
setContainer(container)
를 호출합니다.
위치:
Grid.js:594-597
3-3. 테이블 ID와 클래스
grid.setId('employeeGrid');
grid.setClass('compact-grid');
| 메서드 | 설명 | 위치 |
|---|---|---|
setId(id)
|
생성되는
<table>
의
id
설정
|
Grid.js:42-44
,
Grid.js:615
|
setClass(className)
|
생성되는
<table>
에 CSS 클래스 추가
|
Grid.js:45-47
,
Grid.js:618-622
|
4. 헤더 정의
헤더는 컬럼 객체 배열입니다.
setHeader(header)
호출 시
header[].key
를 기준으로 원본 컬럼 순서와 현재 컬럼 순서를 초기화합니다.
위치:
Grid.js:211-215
4-1. 기본 스키마
const header = [
{ key: 'select', caption: '', type: 'check', setting: 'lock' },
{ key: 'name', caption: '이름', type: 'text', sort: '' },
{ key: 'department', caption: '부서', type: 'text' },
{ key: 'hireDate', caption: '입사일', type: 'date', format: 'yyyy-MM-dd' },
{ key: 'salary', caption: '급여', type: 'number', format: ',' }
];
| 속성 | 필수 | 설명 | 위치 |
|---|---|---|---|
key
|
예 |
행 데이터의 셀
key
와 매칭되는 컬럼 키
|
Grid.js:213-214
,
Grid.js:738
,
Grid.js:914
|
caption
|
권장 | 헤더 표시 텍스트 |
Grid.js:698
,
Grid.js:724
|
type
|
권장 | 셀 렌더링 방식. 생략 시 일부 코드에서 오류 가능 |
Grid.js:708-724
,
Grid.js:747-748
,
Grid.js:949-1091
|
sort
|
선택 |
값이
undefined
가 아니면 정렬 버튼 생성
|
Grid.js:696-706
|
sortKey
|
선택 | 실제 정렬에 사용할 다른 key |
Grid.js:1300
,
Grid.js:1317-1320
|
format
|
선택 |
date
,
number
, 기본 타입에서 표시 형식 또는 함수
|
Grid.js:1013-1027
,
Grid.js:1043-1061
,
Grid.js:1084-1086
|
function
|
선택 | 셀 값을 버튼으로 만들고 클릭 시 콜백 실행 |
Grid.js:1029-1031
,
Grid.js:1064-1065
,
Grid.js:1080-1081
,
Grid.js:1158-1165
|
fixed
|
선택 |
'left'
,
'right'
,
'none'
계열 고정 상태
|
Grid.js:440-461
,
Grid.js:1224-1274
|
display
|
선택 |
false
또는
'none'
이면 컬럼 숨김
|
Grid.js:1198-1207
|
setting
|
선택 |
설정 화면 제어.
none
,
lock
, 또는 미지정
|
Grid.js:363
,
Grid.js:383-384
,
Grid.js:401
|
dataset
|
선택 |
<th>
에 data 속성 추가
|
Grid.js:739-744
|
headerDataset
|
선택 | 헤더 내부 요소에 data 속성 추가 |
Grid.js:728-734
|
contentDataset
|
선택 | 셀 내부 콘텐츠 요소에 data 속성 추가 |
Grid.js:1094-1099
|
relKey
|
선택 | 체크박스 상태/비활성화 판단에 참조할 셀 key |
Grid.js:961-977
|
checkedValue
|
선택 |
relKey
값이 배열에 포함되면 체크
|
Grid.js:963-968
|
readOnlyValue
|
선택 |
relKey
값이 배열에 포함되면 체크박스 비활성화
|
Grid.js:970-975
|
주의:
makeTableHeader()
에
if(headerItem.type.fixed)
코드가 있어
type
이 완전히 생략되면 오류가 날 수 있습니다. 일반 텍스트 컬럼도
type: 'text'
처럼 문자열을 지정하는 방식을 권장합니다.
위치:
Grid.js:747-748
4-2. 지원되는
type
type
|
동작 | 위치 |
|---|---|---|
text
또는 그 외 문자열
|
기본 텍스트 셀 |
Grid.js:1080-1091
|
check
|
헤더 전체 선택 체크박스와 행 체크박스 생성 |
Grid.js:709-717
,
Grid.js:949-984
|
drag
|
행 드래그 핸들 생성 |
Grid.js:718-721
,
Grid.js:986-990
,
Grid.js:1111-1143
|
html
|
cell.caption
또는
cell.value
를
innerHTML
로 삽입
|
Grid.js:992-999
|
htmlElement
|
cell.value
가
HTMLElement
이면 그대로 삽입
|
Grid.js:1001-1008
|
date
|
날짜 형식 처리 |
Grid.js:1011-1039
|
number
|
숫자 형식 처리 |
Grid.js:1039-1078
|
보안상 외부 데이터 표시 예제에서는
html
타입을 사용하지 않습니다. 외부 데이터는 기본 텍스트 타입 또는 직접 만든 안전한
HTMLElement
를
htmlElement
타입으로 전달합니다.
5. 행 데이터 구조와 데이터 변경
5-1. 행 데이터 기본 형식
setData(data)
는 행 배열의 배열을 받습니다. 각 행은 셀 객체 배열입니다.
위치:
Grid.js:220-239
,
Grid.js:874-896
const rows = [
[
{ key: 'checked', value: 'EMP-001' },
{ key: 'name', value: '김민수' },
{ key: 'department', value: '개발팀' },
{ key: 'hireDate', value: '2026-07-01' },
{ key: 'salary', value: 4200000 }
],
[
{ key: 'checked', value: 'EMP-002' },
{ key: 'name', value: '이서연' },
{ key: 'department', value: '기획팀' },
{ key: 'hireDate', value: '2026-07-03' },
{ key: 'salary', value: 3900000 }
]
];
5-2. 셀 객체 스키마
| 속성 | 설명 | 위치 |
|---|---|---|
key
|
헤더
key
와 매칭되는 셀 키
|
Grid.js:914
,
Grid.js:940
|
value
|
실제 값.
td.dataset.value
에도 사용
|
Grid.js:938
,
Grid.js:946
|
caption
|
표시 텍스트. 없으면
value
사용
|
Grid.js:946
|
tooltip
|
셀 내부 요소의
title
로 사용
|
Grid.js:955
,
Grid.js:998
,
Grid.js:1003
,
Grid.js:1036
,
Grid.js:1074
,
Grid.js:1090
|
dataset
|
셀 내부 콘텐츠 요소에 data 속성 추가 |
Grid.js:1100-1106
|
tag
|
셀 태그명. 없으면
td
|
Grid.js:916
|
sub
|
그룹 서브 행 데이터 |
Grid.js:825-847
|
5-3.
idx
의 의미
setData(data)
는 행에
{ key: 'idx', value: 번호 }
셀이 없으면 자동으로 추가합니다. 자동 번호는
setData()
호출 시 0부터 다시 부여됩니다.
위치:
Grid.js:223-232
idx
는 행의
data-sequence
, 행 드래그 순서 갱신,
setValue(sequence, key, value)
, 변경 셀 추적에 사용됩니다.
위치:
Grid.js:807
,
Grid.js:1137-1141
,
Grid.js:1865-1880
,
Grid.js:1902-1905
5-4. 데이터 등록, 추가, 삭제, 초기화
| 작업 | 메서드 | 동작 | 위치 |
|---|---|---|---|
| 전체 교체 |
setData(data)
|
data
,
originalData
를 깊은 복사로 교체하고 페이지를 1로 초기화
|
Grid.js:220-239
|
| 행 추가 |
addData(newData)
|
배열 형태 행만 추가,
idx
재부여,
addRowIdx
기록 후 렌더링
|
Grid.js:1474-1498
|
| 체크 행 삭제 |
removeCheckedData()
|
체크된 행을 현재 데이터에서 제거하고 렌더링 |
Grid.js:1450-1468
|
| 단일 행 삭제 |
removeRow(row)
|
현재
data
에서 행 제거. 렌더링은 직접 호출 필요
|
Grid.js:1729-1734
|
| 행 참조 삭제 |
deleteData(rowData)
|
originalData
,
data
에서 같은 참조 제거. 렌더링은 직접 호출 필요
|
Grid.js:1501-1504
|
| 원본 복원 |
resetData(isRender)
|
필터/범위 초기화 후
originalData
로 복원
|
Grid.js:1856-1863
|
6. 페이징
6-1. 페이징 활성화
grid.setPagingRows(10);
grid.setPageNavigationContainer(document.getElementById('gridPagination'));
grid.setPageNavigationCount(5);
| 설정 | 설명 | 위치 |
|---|---|---|
pagingRows
|
한 페이지에 표시할 행 수 |
Grid.js:17
,
Grid.js:90-93
|
pagingRows = 0
|
페이징을 적용하지 않고 전체 데이터 표시 |
Grid.js:790-804
|
page
|
1부터 시작 |
Grid.js:19
,
Grid.js:63-71
,
Grid.js:131-185
|
setPage(page)
|
페이지 이동 후 렌더링과 내비게이션 갱신 |
Grid.js:63-71
|
pageNavigationCount
|
한 번에 표시할 페이지 번호 버튼 수 |
Grid.js:24
,
Grid.js:96-99
,
Grid.js:151-169
|
renderPageNavigation()
은
pageNavigationContainer
가 없으면 아무것도 하지 않습니다.
totalPage < 1
이면 내비게이션을 만들지 않습니다.
위치:
Grid.js:109-119
6-2. 페이지 내비게이션 생성 조건
| 조건 | 결과 | 위치 |
|---|---|---|
pageNavigationContainer
없음
|
페이지 UI 생성 안 함 |
Grid.js:109-110
|
totalPage < 1
|
페이지 UI 생성 안 함 |
Grid.js:112-114
|
totalPage <= pageNavigationCount
|
숫자 버튼만 생성 |
Grid.js:128-148
,
Grid.js:151-169
,
Grid.js:171-191
|
totalPage > pageNavigationCount
|
처음/이전/다음/마지막 버튼 생성 |
Grid.js:128-148
,
Grid.js:171-191
|
7. 체크박스와 체크 행 처리
7-1. 체크박스 컬럼 선언
{ key: 'checked', caption: '', type: 'check', setting: 'lock' }
type: 'check'
헤더는 헤더에 전체 선택 체크박스를 만들고, 각 행에는 체크박스를 만듭니다.
위치:
Grid.js:709-717
,
Grid.js:949-984
행에
checked
셀이 없으면 체크박스 렌더링 중
{ key: 'checked', value: false, readOnly: false }
가 추가됩니다.
위치:
Grid.js:956-982
7-2. 체크 상태 조회와 설정
| 메서드 | 설명 | 위치 |
|---|---|---|
getCheckedData()
|
체크된 행과 체크된 서브 행 반환 |
Grid.js:1427-1447
|
checkData(key, value, isChecked)
|
조건에 맞는 행의 checked 값을 설정 |
Grid.js:1409-1424
|
resetCheckAll()
|
모든 행의 checked 값을 false로 변경 |
Grid.js:1589-1599
|
removeCheckedData()
|
체크된 행 삭제 후 렌더링 |
Grid.js:1450-1468
|
7-3.
pagingCheck
setPage(page)
호출 시
pagingCheck
가
true
이면 현재 체크 상태를 기준으로 전체 선택 체크박스 상태만 갱신합니다.
false
이면 모든 체크를 초기화합니다.
위치:
Grid.js:63-71
,
Grid.js:1566-1586
,
Grid.js:1589-1599
grid.pagingCheck = true;
7-4.
checkRowFix
checkRowFix
가
true
이면 행 체크 시 체크된
<tr>
에
position: sticky
와
top
을 적용해 헤더 아래에 고정합니다. 정렬·필터·페이징 후 고정 상태를 자동으로 재적용하는 전용 로직은 확인되지 않았습니다.
위치:
Grid.js:204-206
,
Grid.js:1535-1554
grid.setCheckRowFix(true);
8. 정렬과 필터
8-1. 정렬 가능한 컬럼
헤더 객체에
sort
속성을
undefined
가 아닌 값으로 넣으면 헤더 텍스트가 버튼으로 렌더링되고 클릭 정렬이 가능해집니다.
{ key: 'name', caption: '이름', type: 'text', sort: '' }
위치:
Grid.js:696-706
,
Grid.js:1294-1312
8-2. 초기 정렬 설정
grid.setSort('salary', 'desc');
setSort(key, direction)
은
sortSetting = { key, direction }
을 저장합니다. 실제 적용은
render()
시점에 이루어집니다.
위치:
Grid.js:606-611
,
Grid.js:1642-1644
정렬 방향은
asc
,
desc
를 사용합니다. 값이 없으면
asc
가 기본입니다.
위치:
Grid.js:1314-1324
8-3. 값 필터
grid.setFilter('department', '개발팀', 'origin', true);
grid.render(container);
| 메서드 | 설명 | 위치 |
|---|---|---|
setFilter(key, value, target, exactly)
|
필터 설정 배열에 추가. 적용은
render()
시점
|
Grid.js:1656-1660
,
Grid.js:599-601
|
filter(key, value, exactly)
|
현재 데이터에 즉시 필터 적용 후 렌더링 |
Grid.js:1666-1672
|
filterByOriginalData(key, value, exactly)
|
원본 데이터 기준 필터 결과를
data
에 반영
|
Grid.js:1674-1676
|
resetFilter()
|
필터 설정 초기화 |
Grid.js:1662-1664
|
filterByArray(filterArray, dataType)
|
여러 조건을 모두 만족하는 행 반환 |
Grid.js:1707-1724
|
target
/
dataType
은
'current'
또는
'origin'
을 사용합니다.
value
는 단일 값 또는 배열을 사용할 수 있습니다.
exactly = true
면 완전 일치,
false
면
includes()
부분 일치를 사용합니다.
위치:
Grid.js:1678-1704
주의:
setFilter()
내부의
exactly = exactly || true
구현 때문에
false
를 넘겨도
true
로 바뀝니다. 부분 일치를 바로 적용하려면
filter(key, value, false)
또는
filterData()
를 사용해야 합니다.
위치:
Grid.js:1656-1660
8-4. 범위 필터
grid.setRange('salary', 3000000, 5000000, 'origin');
grid.render(container);
범위 필터는 헤더 타입이
number
또는
date
인 컬럼에만 적용됩니다.
위치:
Grid.js:1754-1819
| 메서드 | 설명 | 위치 |
|---|---|---|
setRange(key, min, max, dataType)
|
범위 설정 배열에 추가. 적용은
render()
시점
|
Grid.js:1754-1772
,
Grid.js:602-604
|
range(key, min, max, dataType)
|
즉시 범위 필터 적용 후 렌더링 |
Grid.js:1778-1783
|
rangeByOriginalData(key, min, max)
|
원본 데이터 기준 범위 필터 |
Grid.js:1785-1787
|
resetRange()
|
범위 설정 초기화 |
Grid.js:1774-1776
|
9. 그룹과 서브 행
grouping
은 별도 그룹 기준 컬럼을 지정하는 기능이 아니라, 각 행 안의
sub
데이터를 열고 닫는 그룹 컬럼을 추가하는 기능입니다.
grid.setGrouping('close'); // 초기 서브 행 닫힘
grid.setGrouping('open'); // 초기 서브 행 열림
| 값 | 동작 | 위치 |
|---|---|---|
false
|
그룹 컬럼 없음 |
Grid.js:29
,
Grid.js:681-691
,
Grid.js:808-819
|
'close'
|
서브 행을 처음에 숨김 |
Grid.js:830-831
|
'open'
|
서브 행을 처음에 표시 |
Grid.js:830-831
|
서브 행은 셀 객체의
sub
속성에 행 배열 목록을 넣어 표현합니다.
위치:
Grid.js:825-847
[
{ key: 'name', value: '상위 행' },
{
key: 'children',
value: '',
sub: [
[
{ key: 'name', value: '하위 행 1' },
{ key: 'department', value: '개발팀' }
]
]
}
]
10. 컬럼 표시, 순서, 설정 버튼
10-1. 컬럼 순서
setHeader(header)
호출 시
columnOrderOriginal
과
columnOrder
는
header[].key
배열로 초기화됩니다.
위치:
Grid.js:211-215
grid.updateColumnOrder(['checked', 'department', 'name', 'hireDate', 'salary']);
grid.render();
updateColumnOrder(orderArray)
는 전달된 key 순서대로
this.header
를 재정렬합니다.
위치:
Grid.js:570-575
10-2. 숨김 컬럼
hiddenColumns
는 컬럼
key
문자열 배열입니다. 설정 화면의 체크박스 해제 시 해당 key가 추가되고, 체크 시 제거됩니다.
위치:
Grid.js:545-553
,
Grid.js:751-756
,
Grid.js:941-945
grid.hiddenColumns = ['salary'];
grid.render(container);
직접 배열을 수정할 수는 있지만, 설정 화면과 동기화가 필요하므로 초기 상태 지정 정도로만 사용하는 것을 권장합니다.
10-3. 설정 버튼 생성 조건
grid.setSettingButtonContainer(document.getElementById('gridToolbar'));
grid.settingButtonCaption = '컬럼 설정';
grid.settingButtonToolTip = '표시 컬럼과 순서를 설정합니다.';
grid.render(container);
settingButtonContainer
가 있고 그 컨테이너의
innerHTML
이 빈 문자열이면
render()
시 설정 버튼을 자동 생성합니다.
위치:
Grid.js:642-644
설정 버튼은
button.title
에
settingButtonToolTip
을 적용합니다.
위치:
Grid.js:245-255
10-4. 설정 다이얼로그 동작
설정 버튼 클릭 시
showSettingModal()
이 호출됩니다. 현재 구현은
settingType
값을 분기하지 않습니다.
| 조건 | 동작 | 위치 |
|---|---|---|
settingButtonContainer
없음
|
document.body
에 dialog 추가 후
showModal()
|
Grid.js:346-349
|
settingButtonContainer
있음
|
컨테이너에 dialog 추가 후
show()
및
inner
클래스 추가
|
Grid.js:350-351
|
settingType = 'modal'
은 생성자 기본값으로 존재하지만 실제 코드에서 사용되는 곳은 확인되지 않았습니다. 문서에서는 직접 설정 항목으로 안내하지 않습니다.
위치:
Grid.js:38
, 전체 검색 결과
settingType
사용 없음
10-5. 헤더
setting
값
| 값 | 동작 | 위치 |
|---|---|---|
| 미지정 | 표시 여부, 순서, 고정 설정 가능 |
Grid.js:401-501
|
'lock'
|
표시 체크박스 비활성화, 순서/고정 UI 없음 |
Grid.js:383-384
,
Grid.js:401-501
|
'none'
|
설정 목록에서 제외 |
Grid.js:363
|
11. 셀 표시 형식과 편집성 갱신
11-1. 안전한 표시 방식
외부 데이터를 표시할 때는 기본 텍스트 타입을 사용합니다.
{ key: 'name', caption: '이름', type: 'text' }
기본 타입은
textContent
로 표시합니다.
위치:
Grid.js:1084-1088
DOM 요소가 필요하면
htmlElement
타입에 직접 만든 HTMLElement를 전달합니다.
const button = document.createElement('button');
button.type = 'button';
button.textContent = '보기';
const rows = [
[
{ key: 'action', value: button }
]
];
위치:
Grid.js:1001-1008
11-2. 주의가 필요한 표시 방식
type: 'html'
은
innerHTML
을 사용합니다. 외부 입력값을 그대로 넣는 예제는 사용하지 않습니다.
위치:
Grid.js:992-999
format
함수가 문자열을 반환하면
formatElement()
에서
innerHTML
로 삽입합니다. 외부 데이터 기반 문자열을 반환하지 말고, 가능하면
HTMLElement
를 반환합니다.
위치:
Grid.js:1146-1155
11-3. 값 변경과 변경 표시
| 메서드 | 설명 | 위치 |
|---|---|---|
setValue(sequence, key, value)
|
원본 데이터에서
idx = sequence
행의 셀 값 변경
|
Grid.js:1865-1880
|
setValueByRowData(rowData, columnKey, values)
|
전달한 행 참조의 셀 값 변경 |
Grid.js:1883-1899
|
regUpdateCell(rowIdx, key)
|
변경 셀을
updateCells
에 기록
|
Grid.js:1902-1905
|
변경된 셀은 다음 렌더링 시
coForward-grid-updated-cell
클래스가 붙고, 표시 후
updateCells
에서 제거됩니다.
위치:
Grid.js:920-927
추가된 행은
addData()
후 다음 렌더링 시
coForward-grid-added-row
클래스가 붙고, 표시 후
addRowIdx
에서 제거됩니다.
위치:
Grid.js:791-793
,
Grid.js:1474-1498
변경 정보를 별도로 조회하거나 초기화하는 공개 메서드는 확인되지 않았습니다. 개발 담당자 확인 필요.
12. 이벤트
12-1. 렌더 완료 이벤트
makeTbody()
끝에서
fireRenderEvent()
가 호출됩니다. 렌더 완료 시 다음 이벤트가 발생합니다.
| 대상 | 이벤트명 | detail | 위치 |
|---|---|---|---|
window
|
coForwardGridRendered
|
테이블 상태 정보 |
Grid.js:648-666
|
container
|
render
|
테이블 상태 정보 |
Grid.js:648-666
|
detail
에는
id
,
columnOrder
,
hiddenColumns
,
sortSetting
,
filterSetting
,
rangeSetting
, 원본/현재 행 수, 현재 페이지, 전체 페이지, 시작/끝 인덱스가 포함됩니다.
위치:
Grid.js:648-663
12-2. 체크 이벤트
| 대상 | 이벤트명 | 발생 시점 | detail | 위치 |
|---|---|---|---|---|
container
|
coForwardGridCheckedData
|
헤더 전체 선택 체크박스 클릭 | 체크된 행 배열 |
Grid.js:1356-1372
|
container
|
checkRow
|
개별 행 체크박스 클릭 |
{ checked, data }
|
Grid.js:1511-1560
|
13. 오류 처리와 주의사항
| 상황 | 처리 | 위치 |
|---|---|---|
| 컨테이너가 HTMLElement가 아님 |
console.error('유효한 HTML 요소가 아닙니다.')
|
Grid.js:52-58
|
render()
전에 컨테이너 없음
|
별도 방어 코드 없음.
this.container.innerHTML
에서 오류 가능
|
Grid.js:630
|
| 데이터 없음 |
coForward-grid-no-data
문구 표시
|
Grid.js:633-638
|
| 행 데이터 형식 오류 |
console.error('Invalid row data:', row)
|
Grid.js:1492
|
| 추가 데이터 형식 오류 |
console.error('Invalid data format:', newData)
|
Grid.js:1496
|
| 범위 필터 min/max 누락 | 콘솔 오류 후 중단 |
Grid.js:1754-1758
|
| 범위 필터 min > max | 콘솔 오류 후 중단 |
Grid.js:1760-1762
|
| 범위 필터 타입 오류 | 콘솔 오류 후 중단 |
Grid.js:1764-1769
|
| 범위 필터 대상 컬럼 타입 오류 | 콘솔 오류 후 중단 |
Grid.js:1794-1799
|
setValue()
의 잘못된 idx/key
|
콘솔 오류 후 중단 |
Grid.js:1865-1875
|
setValueByRowData()
의 잘못된 행/key
|
콘솔 오류 후 중단 |
Grid.js:1883-1894
|
보안 주의:
noDataMessage
는
innerHTML
에 들어갑니다. 사용자 입력을 그대로 넣지 않습니다.
위치:
Grid.js:636
14. 최소 예제
HTML
<div id="gridContainer"></div>
<script type="module" src="./grid-basic.js"></script>
JavaScript
import coForward_grid from './Grid.js';
const container = document.getElementById('gridContainer');
if (!container) {
throw new Error('그리드 컨테이너를 찾을 수 없습니다.');
}
const header = [
{ key: 'name', caption: '이름', type: 'text' },
{ key: 'department', caption: '부서', type: 'text' },
{ key: 'hireDate', caption: '입사일', type: 'date', format: 'yyyy-MM-dd' }
];
const rows = [
[
{ key: 'name', value: '김민수' },
{ key: 'department', value: '개발팀' },
{ key: 'hireDate', value: '2026-07-01' }
],
[
{ key: 'name', value: '이서연' },
{ key: 'department', value: '기획팀' },
{ key: 'hireDate', value: '2026-07-03' }
]
];
const grid = new coForward_grid();
grid.setHeader(header);
grid.setData(rows);
grid.render(container);
15. 통합 예제
아래 예제는 페이징, 설정 버튼, 체크박스, 정렬, 필터, 값 변경을 포함합니다.
HTML
<div id="gridToolbar"></div>
<div id="gridContainer"></div>
<div id="gridPagination"></div>
<button id="showChecked" type="button">체크 행 확인</button>
<button id="filterDev" type="button">개발팀만 보기</button>
<button id="resetData" type="button">초기화</button>
<button id="updateFirst" type="button">첫 행 이름 변경</button>
<script type="module" src="./grid-page.js"></script>
JavaScript
import coForward_grid from './Grid.js';
const toolbar = document.getElementById('gridToolbar');
const container = document.getElementById('gridContainer');
const pagination = document.getElementById('gridPagination');
if (!toolbar || !container || !pagination) {
throw new Error('그리드 적용에 필요한 HTML 요소가 없습니다.');
}
const header = [
{ key: 'checked', caption: '', type: 'check', setting: 'lock' },
{ key: 'name', caption: '이름', type: 'text', sort: '' },
{ key: 'department', caption: '부서', type: 'text' },
{ key: 'hireDate', caption: '입사일', type: 'date', format: 'yyyy-MM-dd' },
{ key: 'salary', caption: '급여', type: 'number', format: ',' }
];
const rows = [
[
{ key: 'select', value: 'EMP-001' },
{ key: 'name', value: '김민수' },
{ key: 'department', value: '개발팀' },
{ key: 'hireDate', value: '2026-07-01' },
{ key: 'salary', value: 4200000 }
],
[
{ key: 'select', value: 'EMP-002' },
{ key: 'name', value: '이서연' },
{ key: 'department', value: '기획팀' },
{ key: 'hireDate', value: '2026-07-03' },
{ key: 'salary', value: 3900000 }
],
[
{ key: 'select', value: 'EMP-003' },
{ key: 'name', value: '박지훈' },
{ key: 'department', value: '개발팀' },
{ key: 'hireDate', value: '2026-07-05' },
{ key: 'salary', value: 5100000 }
]
];
const grid = new coForward_grid();
grid.setId('employeeGrid');
grid.setClass('employee-grid');
grid.setHeader(header);
grid.setData(rows);
grid.setPagingRows(2);
grid.setPageNavigationContainer(pagination);
grid.setPageNavigationCount(5);
grid.setSettingButtonContainer(toolbar);
grid.settingButtonCaption = '컬럼 설정';
grid.settingButtonToolTip = '표시 컬럼과 순서를 설정합니다.';
grid.pagingCheck = true;
grid.setCheckRowFix(true);
grid.render(container);
container.addEventListener('checkRow', (event) => {
console.log('체크 행:', event.detail);
});
container.addEventListener('render', (event) => {
console.log('렌더 완료:', event.detail);
});
document.getElementById('showChecked').addEventListener('click', () => {
console.log('체크된 데이터:', grid.getCheckedData());
});
document.getElementById('filterDev').addEventListener('click', () => {
grid.filterByOriginalData('department', '개발팀');
grid.setPagingRows(2);
grid.render();
});
document.getElementById('resetData').addEventListener('click', () => {
grid.resetData(true);
});
document.getElementById('updateFirst').addEventListener('click', () => {
grid.setValue(0, 'name', '김민수 수정');
grid.resetData(true);
});
통합 예제 실행 화면
정렬, 필터, 체크, 페이징, 컬럼 표시와 데이터 수정을 직접 확인할 수 있습니다.
16. API 요약
사용자 설정 메서드
| 메서드 | 인자 | 반환값 | 설명 | 위치 |
|---|---|---|---|---|
setId
|
id
|
없음 | table id 설정 |
Grid.js:42-44
|
setClass
|
className
|
없음 | table class 추가 |
Grid.js:45-47
|
setContainer
|
HTMLElement
|
없음 | 렌더링 컨테이너 설정 |
Grid.js:52-58
|
setHeader
|
header
|
없음 | 헤더 등록 및 컬럼 순서 초기화 |
Grid.js:211-215
|
setData
|
data
|
없음 |
데이터 교체 및
idx
자동 보정
|
Grid.js:220-239
|
render
|
container?
|
없음 | 전체 테이블 렌더링 |
Grid.js:594-645
|
renderTbody
|
없음 | 없음 | tbody 재생성 |
Grid.js:580-589
|
setPagingRows
|
pagingRows
|
없음 | 페이지 행 수 설정 |
Grid.js:90-93
|
setPage
|
page
|
없음 | 페이지 이동 |
Grid.js:63-71
|
setPageNavigationContainer
|
HTMLElement
|
없음 | 페이지 UI 영역 지정 |
Grid.js:101-104
|
setPageNavigationCount
|
number
|
없음 | 표시 페이지 버튼 수 설정 |
Grid.js:96-99
|
setSettingButtonContainer
|
HTMLElement
|
없음 | 설정 버튼 영역 지정 |
Grid.js:105-107
|
setCheckRowFix
|
boolean
|
없음 | 체크 행 sticky 고정 사용 여부 |
Grid.js:204-206
|
setGrouping
|
false/open/close
|
없음 | 서브 행 그룹 UI 설정 |
Grid.js:78-80
|
setNoDataMessage
|
string
|
없음 | 데이터 없음 문구 설정 |
Grid.js:82-84
|
데이터 조회·변경 메서드
| 메서드 | 설명 | 위치 |
|---|---|---|
getData(key, value, isOrigial=false)
|
조건에 맞는 행 배열 반환 |
Grid.js:1377-1383
|
getDataByArray(keyValueArray, isOrigial=false)
|
여러 조건을 모두 만족하는 행 배열 반환 |
Grid.js:1392-1404
|
rowsByValue(key, value, dataType='origin')
|
값 기준 행 조회 |
Grid.js:1737-1750
|
getColumnData(columnName, isUnique)
|
원본 데이터의 컬럼 값 배열 반환 |
Grid.js:1826-1850
|
addData(newData)
|
행 추가 후 렌더링 |
Grid.js:1474-1498
|
removeRow(row)
|
현재 데이터에서 행 제거 |
Grid.js:1729-1734
|
deleteData(rowData)
|
원본/현재 데이터에서 같은 참조 제거 |
Grid.js:1501-1504
|
resetData(isRender)
|
원본 데이터로 복원 |
Grid.js:1856-1863
|
setValue(sequence, key, value)
|
idx
기준 셀 값 변경
|
Grid.js:1865-1880
|
setValueByRowData(rowData, columnKey, values)
|
행 참조 기준 셀 값 변경 |
Grid.js:1883-1899
|
정렬·필터 메서드
| 메서드 | 설명 | 위치 |
|---|---|---|
setSort(key, direction)
|
초기 정렬 설정 저장 |
Grid.js:1642-1644
|
sortDataByKey(sortObject)
|
데이터 정렬 후 반환 |
Grid.js:1314-1349
|
setFilter(key, value, target, exactly)
|
렌더 시 적용할 필터 추가 |
Grid.js:1656-1660
|
filter(key, value, exactly=true)
|
현재 데이터 즉시 필터 |
Grid.js:1666-1672
|
filterByOriginalData(key, value, exactly=true)
|
원본 데이터 기준 필터 |
Grid.js:1674-1676
|
resetFilter()
|
필터 설정 초기화 |
Grid.js:1662-1664
|
setRange(key, min, max, dataType)
|
렌더 시 적용할 범위 필터 추가 |
Grid.js:1754-1772
|
range(key, min, max, dataType)
|
즉시 범위 필터 |
Grid.js:1778-1783
|
rangeByOriginalData(key, min, max)
|
원본 기준 범위 필터 |
Grid.js:1785-1787
|
resetRange()
|
범위 필터 초기화 |
Grid.js:1774-1776
|
17. 부록: 내부 상태
다음 속성은 코드에서 내부 상태로 사용됩니다. 화면 상태와 데이터 상태가 어긋날 수 있으므로 직접 수정하지 않는 것을 권장합니다.
| 속성 | 기본값 | 의미 | 위치 |
|---|---|---|---|
data
|
[]
|
현재 표시·가공 데이터 |
Grid.js:9
,
Grid.js:233
|
originalData
|
[]
|
원본 데이터 |
Grid.js:10
,
Grid.js:234
|
container
|
null
|
렌더링 컨테이너 |
Grid.js:15
|
page
|
1
|
현재 페이지 |
Grid.js:19
|
totalPage
|
0
|
전체 페이지 수 |
Grid.js:20
|
startIndex
|
0
|
현재 페이지 시작 인덱스 |
Grid.js:21
|
endIndex
|
0
|
현재 페이지 끝 인덱스 |
Grid.js:22
|
pageNavigation
|
null
|
생성된 페이지 UI 참조 |
Grid.js:24
,
Grid.js:193
|
isRendered
|
false
|
렌더링 완료 여부 |
Grid.js:31
,
Grid.js:640
|
columnOrder
|
[]
|
현재 컬럼 key 순서 |
Grid.js:32
,
Grid.js:213-214
|
columnOrderOriginal
|
[]
|
최초 컬럼 key 순서 |
Grid.js:33
,
Grid.js:213
|
sortSetting
|
false
|
현재 정렬 설정 |
Grid.js:34
,
Grid.js:1314-1323
|
filterSetting
|
[]
|
렌더 시 적용할 필터 설정 |
Grid.js:35
,
Grid.js:599-601
|
rangeSetting
|
[]
|
렌더 시 적용할 범위 설정 |
Grid.js:36
,
Grid.js:602-604
|
hiddenColumns
|
[]
|
숨긴 컬럼 key 목록 |
Grid.js:37
,
Grid.js:545-553
|
settingType
|
'modal'
|
생성자에 있으나 실제 분기 사용 없음 |
Grid.js:38
|
addRowIdx
|
[]
|
추가 행 표시용 idx 목록 |
Grid.js:39
,
Grid.js:791-793
,
Grid.js:1489
|
updateCells
|
{}
|
변경 셀 표시용 상태 |
Grid.js:40
,
Grid.js:920-927
,
Grid.js:1902-1905
|
© team coForward