컬럼 도구 플러그인
컬럼 도구 · columnToolsPlugin
헤더 메뉴의 컬럼 표시·필터와 조건 빌더를 제공합니다. 정렬·고정·너비 맞춤은 연결된 Core API에서 설정합니다.
설치 함수: columnToolsPlugin() · 해제 이름: columnTools
설정 속성 · 기본값
필수값은 해당 입력에서 반드시 제공하는 값입니다. 조건부 필수값은 설명에 적힌 기능을 사용할 때 필요합니다. 표시가 없는 옵션은 생략할 수 있으며 기본값을 사용합니다. 빈 문자열·누락과 0·false를 혼동하지 마세요.
| 설정 | 기본값 | 설명 |
|---|---|---|
함수 인수 | 없음 | columnToolsPlugin()으로 설치합니다. |
options.columnMenu / column.columnMenu | ['columns','filter'] | 영역과 순서를 지정합니다. columns=컬럼 표시 설정, filter=컬럼 필터. 컬럼 값이 그리드 값을 대체하며 []는 해당 헤더 메뉴를 숨깁니다. filterable:false이면 필터 영역을 제외합니다. 이전 sort 항목은 호환을 위해 허용하지만 표시하지 않습니다. |
column.sortable | true | 정렬 허용 여부. 정렬 실행은 Core의 설정 검사를 따릅니다. |
column.filterable | true | false인 컬럼은 필터 메뉴·조건 빌더에서 제외합니다. |
permissions.view | 없음 | 표시 권한이 없는 컬럼은 컬럼 관리·필터 필드 목록에서 제외합니다. |
filterTree / filters | 없음 | 그리드의 조건 트리 또는 컬럼별 조건 배열을 사용합니다. 조건은 원래 데이터 타입을 기준으로 비교합니다. |
사용 순서
- 헤더의 ⋮ 또는 우클릭으로 간단한 메뉴를 엽니다. 컬럼 표시 설정 하위 창과 값 검색·전체 선택·체크 목록을 제공합니다. 검색 중 적용하면 검색 결과에서 체크한 값만 반영하며 아무 값도 선택하지 않으면 0행입니다. 초기화는 해당 컬럼 필터만 해제합니다. 체크 목록은 적재한 데이터 기준이며 200개씩 더 볼 수 있습니다. 서버 전체의 고유 값 목록을 자동 조회하지 않습니다.
- 컬럼 표시 설정을 누르면 표시 컬럼 관리와 같은 컬럼 검색·체크 목록이 바로 나타납니다. 체크 변경은 즉시 반영하며 마지막 표시 컬럼 숨김은 거부하고 권한이 없는 컬럼은 제외합니다. 텍스트/숫자/날짜 필터 하위 창에서 두 조건과 AND/OR를 지정할 수 있습니다. 조건 적용은 해당 컬럼의 값 목록 필터를 교체하며 다른 컬럼·전역 필터는 유지합니다. Enter로 적용, Escape로 하위 창부터 닫고 바깥 클릭으로 전체를 닫습니다.
- 조건 빌더에서 AND/OR와 필드·연산·값을 지정한 뒤 적용합니다. range/in 값은 쉼표로 나눕니다.
연결 API
| 호출 | 동작 |
|---|---|
grid.openColumnMenu(field, anchor?) | 지정 헤더 컬럼의 메뉴를 엽니다. 필수값 |
grid.openColumns(anchor?) | 표시 컬럼 관리 창을 엽니다. |
grid.openFilterBuilder(anchor?) | 평면 AND/OR 조건 빌더를 엽니다. |
grid.setFilters(filters) / grid.setFilter(tree) | 조건을 API로 설정합니다. Core API이며 플러그인 해제 뒤에도 사용할 수 있습니다. 필수값 |
설치 · 해제 · Vue 3 수명주기
생성 시 plugins에 등록하거나, 아직 설치하지 않은 인스턴스에서 grid.install을 호출합니다. 같은 name은 중복 설치할 수 없습니다. 설정에 쓰는 데이터·함수는 아래 전체 예제 소스를 참고하세요.
grid.install(columnToolsPlugin());
grid.uninstall('columnTools'); // 플러그인 해제
// Vue 3 컴포넌트가 종료될 때
onBeforeUnmount(() => grid.destroy());열린 도구 창·ResizeObserver·헤더 및 외부 클릭 리스너를 제거하고 설치 전의 openColumnMenu/openColumns/openFilterBuilder를 복원합니다.
관련 이벤트
- render
- error
이벤트 구독은 grid.on(name, (detail, grid) => {})를 사용합니다. 해제 함수 또는 grid.off로 구독을 정리하세요.
실행 예제 · 실제 원본
아래 소스는 examples/features/column-tools.js와 Vue 원본입니다. 해당 예제 경로를 기준으로 import하며, 행 데이터는 별도 파일을 함께 사용합니다.
JavaScript 예제 실행 ↗ · Vue 3 예제 실행 ↗ · 행 데이터 원본
JavaScript 전체 소스 · column-tools.js
import { ZixoGrid, columnToolsPlugin } from '../../src/index.js';
import { rows } from './column-tools.data.js';
import { createToolbar } from '../feature-controls.js';
const host = document.querySelector('#grid'),
toolbar = document.querySelector('#toolbar'),
report = document.querySelector('#report');
const { button, select } = createToolbar(toolbar, report);
const options = {
rowKey: 'id',
height: 360,
rows: rows,
columns: [
{ field: 'name', title: '주문', width: 240 },
{ field: 'qty', title: '수량', type: 'number', parse: Number },
{ field: 'price', title: '단가', type: 'number', parse: Number },
],
plugins: [columnToolsPlugin()],
columnMenu: ['columns', 'filter'],
};
const grid = new ZixoGrid(host, options);
window.addEventListener('pagehide', () => grid.destroy(), { once: true });
grid.on(
'validationerror',
(detail) => (report.textContent = detail.error.message),
);
button('컬럼 표시 설정', () => grid.openColumns());
select(
'전체 헤더 메뉴',
['전체', '컬럼 표시 설정만', '필터만', '메뉴 없음'],
(value) => {
const choices = {
'컬럼 표시 설정만': ['columns'],
필터만: ['filter'],
전체: ['columns', 'filter'],
'메뉴 없음': [],
};
grid.options.columnMenu = choices[value];
for (const column of grid.columns) delete column.columnMenu;
grid.refresh();
},
);
report.textContent =
'columnMenu 배열로 헤더 메뉴에 넣을 영역과 순서를 지정합니다. columns=컬럼 표시 설정, filter=컬럼 필터이며 기본값은 전체입니다. 컬럼 배열은 그리드 배열을 대체하며 []는 메뉴를 숨깁니다. 이 예제의 전체 헤더 메뉴 선택은 주문·수량·단가의 모든 헤더에 적용합니다. 선택하면 컬럼별 columnMenu를 제거하고 그리드 기본 구성을 함께 상속합니다. 초기 선택은 전체이며 세 컬럼의 실제 메뉴와 일치합니다. 필터/정렬 상태와 API는 메뉴를 숨겨도 유지합니다. 컬럼 표시 설정은 표시 컬럼 관리와 같은 컬럼 검색·체크 목록을 하위 창으로 제공합니다. 목록의 체크박스·행 간격·색상·검색창·스크롤 스타일은 필터 값 목록과 같습니다. 체크하면 즉시 표시하고 해제하면 즉시 숨깁니다. 마지막 표시 컬럼은 숨길 수 없으며 권한이 없는 컬럼은 목록에서 제외합니다. 메뉴에는 정렬 항목을 제공하지 않습니다. 필터는 값 검색·모두 선택·체크 목록과 적용/초기화 버튼으로 구성합니다. 검색 중 적용하면 검색 결과에서 체크한 값만 반영합니다. 텍스트/숫자/날짜 필터를 누르면 두 조건을 AND/OR로 결합하는 하위 창이 열립니다. 각 적용은 해당 컬럼의 기존 필터만 교체하며 다른 컬럼·전역 조건은 유지합니다. Escape로 하위 창부터 닫고, 바깥 클릭은 전체를 닫습니다. 목록은 적재한 데이터 기준이며 200개씩 더 볼 수 있습니다. 서버 전체 데이터의 조건 조회는 조건 필터를 사용합니다.';
Vue 3 전체 소스 · vue-column-tools.vue
<script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';
import { ZixoGrid, columnToolsPlugin } from '../../src/index.js';
import { rows } from './column-tools.data.js';
// Instance and DOM belong to this component, never to window or a global ID.
const gridHost = ref(null);
const message = ref('');
const controls = ref([]);
let grid;
let alive = true;
async function run(action, value) {
try {
const result = await action(value);
if (alive && result !== undefined)
message.value =
typeof result === 'string' ? result : JSON.stringify(result, null, 2);
} catch (error) {
if (alive) message.value = error.message;
}
}
const button = (label, action) =>
controls.value.push({ kind: 'button', label, action });
const select = (label, values, action) =>
controls.value.push({
kind: 'select',
label,
values,
value: values[0],
action,
});
onMounted(() => {
const options = {
rowKey: 'id',
height: 360,
rows: rows,
columns: [
{ field: 'name', title: '주문', width: 240 },
{ field: 'qty', title: '수량', type: 'number', parse: Number },
{ field: 'price', title: '단가', type: 'number', parse: Number },
],
plugins: [columnToolsPlugin()],
columnMenu: ['columns', 'filter'],
};
grid = new ZixoGrid(gridHost.value, options);
grid.on(
'validationerror',
(detail) => (message.value = detail.error.message),
);
button('컬럼 표시 설정', () => grid.openColumns());
select(
'전체 헤더 메뉴',
['전체', '컬럼 표시 설정만', '필터만', '메뉴 없음'],
(value) => {
const choices = {
'컬럼 표시 설정만': ['columns'],
필터만: ['filter'],
전체: ['columns', 'filter'],
'메뉴 없음': [],
};
grid.options.columnMenu = choices[value];
for (const column of grid.columns) delete column.columnMenu;
grid.refresh();
},
);
message.value =
'columnMenu 배열로 헤더 메뉴에 넣을 영역과 순서를 지정합니다. columns=컬럼 표시 설정, filter=컬럼 필터이며 기본값은 전체입니다. 컬럼 배열은 그리드 배열을 대체하며 []는 메뉴를 숨깁니다. 이 예제의 전체 헤더 메뉴 선택은 주문·수량·단가의 모든 헤더에 적용합니다. 선택하면 컬럼별 columnMenu를 제거하고 그리드 기본 구성을 함께 상속합니다. 초기 선택은 전체이며 세 컬럼의 실제 메뉴와 일치합니다. 필터/정렬 상태와 API는 메뉴를 숨겨도 유지합니다. 컬럼 표시 설정은 표시 컬럼 관리와 같은 컬럼 검색·체크 목록을 하위 창으로 제공합니다. 목록의 체크박스·행 간격·색상·검색창·스크롤 스타일은 필터 값 목록과 같습니다. 체크하면 즉시 표시하고 해제하면 즉시 숨깁니다. 마지막 표시 컬럼은 숨길 수 없으며 권한이 없는 컬럼은 목록에서 제외합니다. 메뉴에는 정렬 항목을 제공하지 않습니다. 필터는 값 검색·모두 선택·체크 목록과 적용/초기화 버튼으로 구성합니다. 검색 중 적용하면 검색 결과에서 체크한 값만 반영합니다. 텍스트/숫자/날짜 필터를 누르면 두 조건을 AND/OR로 결합하는 하위 창이 열립니다. 각 적용은 해당 컬럼의 기존 필터만 교체하며 다른 컬럼·전역 조건은 유지합니다. Escape로 하위 창부터 닫고, 바깥 클릭은 전체를 닫습니다. 목록은 적재한 데이터 기준이며 200개씩 더 볼 수 있습니다. 서버 전체 데이터의 조건 조회는 조건 필터를 사용합니다.';
});
onBeforeUnmount(() => {
alive = false;
grid?.destroy(); // Cancels grid requests, removes events and releases plugins.
grid = undefined;
});
defineExpose({ getGrid: () => grid });
</script>
<template>
<main>
<h1>컬럼 메뉴 · 표시 · 필터</h1>
<div class="toolbar">
<template v-for="(control, index) in controls" :key="index">
<button
v-if="control.kind === 'button'"
type="button"
@click="run(control.action)"
>
{{ control.label }}
</button>
<label v-else
>{{ control.label }}
<select
v-model="control.value"
:aria-label="control.label"
@change="run(control.action, control.value)"
>
<option v-for="value in control.values" :key="value" :value="value">
{{ value }}
</option>
</select>
</label>
</template>
</div>
<div ref="gridHost" class="vue-grid-host"></div>
<div class="notes result" aria-live="polite">{{ message }}</div>
</main>
</template>
제약 사항 · 주의할 동작
- GUI 조건 빌더는 평면 AND/OR이고 최대 20개 조건을 입력합니다. 중첩 API 조건을 GUI에서 적용하면 새 평면 조건으로 대체됩니다.
- 숫자 필터는 숫자를 입력해야 하며 마지막 표시 컬럼은 숨길 수 없습니다.
- 미저장 변경이 있는 서버 조회의 조건 변경은 Core 계약에 따라 거부될 수 있습니다.
연결 기능 메뉴
컬럼 메뉴 · 표시 · 필터 · 컬럼 필터 · AND/OR 조건 · 정렬 · 너비 · 순서 · 높이 · 레이아웃 저장 · 복원