FreeGridv1.15.1English

우클릭 메뉴 직접 만들기

기본 항목 이름과 직접 만든 항목으로 우클릭 메뉴 구성: 하위 메뉴, 아이콘, 체크 표시, 제목, 숨김·위험 항목, 헤더 전용 메뉴.

실행 예제직접 만든 우클릭 메뉴

키, 하위 메뉴, 아이콘, 헤더 메뉴.

이 데모의 코드
import { createGrid, type ColumnDef, type Row } from '@freegridjs/core';
import { makeRows } from '../data';
import { button, separator, text, tr, type DemoContext } from '../ui';

export default function mount(ctx: DemoContext) {
  const h = (en: string, ko: string) => tr(ctx.lang, { en, ko });
  const starred = new Set<unknown>();
  const grid = createGrid(ctx.host, {
    columns: [{ field: 'id', header: 'ID', type: 'number', width: 70 }, { field: 'name', header: h('Name', '이름'), width: 170 }, { field: 'country', header: h('Country', '국가'), width: 140 }, { field: 'q1', header: h('Q1', '1분기'), type: 'number', format: '#,##0', width: 120 }],
    data: makeRows(300), locale: ctx.lang, rowSelection: 'multiple', getRowId: r => String(r.id), cellNotes: true,
    contextMenu: p => [
      { heading: p.row ? h(`Customer #${p.row.id}`, `고객 #${p.row.id}`) : h('Customers', '고객') },
      'copy', 'copyWithHeaders', 'paste', 'undo',
      'separator',
      { label: h('Starred', '즐겨찾기'), icon: '★', checked: starred.has(p.row?.id), disabled: !p.row, action: () => { starred.has(p.row!.id) ? starred.delete(p.row!.id) : starred.add(p.row!.id); ctx.log(`starred: ${[...starred].join(', ')}`); } },
      { label: h('Export', '내보내기'), icon: '⇩', items: ['exportCsv', 'exportExcel', { label: h('More', '기타'), items: ['exportJson', 'exportPdf', 'print'] }] },
      { label: h('Column', '컬럼'), items: ['autosize', 'hideColumn', 'separator', 'pinLeft', 'pinRight', 'unpin'] },
      'note',
      'separator',
      { label: h('Delete row', '행 삭제'), icon: '🗑', danger: true, hidden: !p.row, action: () => grid.removeRows([p.row!]) },
    ],
    headerContextMenu: p => [{ heading: p.column?.header ?? p.colId }, ...p.defaultItems],
  });
  text(ctx, h('Right-click a cell (hover Export for a submenu) or a header. Shift+F10 opens it from the keyboard: ↓ ↑, → opens, ← goes back.',
    '셀(내보내기에 마우스를 올리면 하위 메뉴)이나 헤더를 우클릭하세요. Shift+F10으로 키보드로 열고 ↓ ↑, →로 열고 ←로 돌아갑니다.'));
  return grid;
}

contextMenu(셀)와 headerContextMenu(컬럼 헤더)는 항목 목록, 또는 우클릭한 셀에 맞는 목록을 돌려주는 함수를 받습니다. 목록에는 이름으로 고른 기본 항목과 직접 만든 항목을 섞습니다.

전체 예

createGrid(el, {
  columns, data, cellNotes: true,
  contextMenu: p => [
    { heading: p.row ? `Order #${p.row.id}` : 'Order' },
    'copy', 'paste',
    'separator',
    { label: 'Starred', icon: '★', checked: !!p.row?.starred, action: () => toggleStar(p.row) },
    { label: 'Export', icon: '<svg viewBox="0 0 16 16"><path d="M8 1v9m-4-4 4 4 4-4M2 14h12" stroke="currentColor" fill="none"/></svg>',
      items: ['exportCsv', 'exportExcel', { label: 'More', items: ['exportJson', 'exportPdf', 'print'] }] },
    { label: 'Refund…', hidden: !p.row?.paid, action: () => refund(p.row) },
    'note',
    'separator',
    { label: 'Delete', icon: '🗑', danger: true, shortcut: 'Del', action: () => grid.removeRows([p.row]) },
  ],
  headerContextMenu: p => [{ heading: p.column?.header ?? p.colId }, ...p.defaultItems],
});

항목

이름타입설명
'separator'string구분선. 맨 앞·맨 끝·연달아 오는 구분선은 빠집니다.
'copy', 'exportExcel' …ContextMenuKey이름으로 고른 기본 항목(아래 표). 지금 쓸 수 없는 항목은 빠집니다.
{ heading }object아래 항목들의 작은 제목.
{ label, action }object직접 만든 항목. action은 메뉴 정보를 받습니다.
itemsContextMenuItem[]하위 메뉴(마우스 오버·클릭·→·Enter로 열고 ←·Esc로 돌아감). 남은 항목이 없으면 빠집니다.
iconstring | HTMLElement글자·이모지, 요소, SVG 문자열('<svg…'). 신뢰할 수 없는 데이터는 이스케이프하세요.
checkedboolean아이콘 자리의 체크 표시. 화면 낭독기는 체크 상자로 읽습니다.
disabled / hiddenboolean흐리게 / 빼기.
dangerboolean지우는 항목을 위한 빨간 글자.
shortcut / titlestring오른쪽 단축키 안내 / 마우스 오버 설명.

이름으로 쓰는 기본 항목

키항목기본 메뉴
copy복사셀
copyWithHeaders헤더 포함 복사셀
cut잘라내기셀
copyRows체크한 행 복사(체크한 행이 있을 때)셀
paste붙여넣기셀
undo / redo실행 취소 / 다시 실행(기록이 있을 때)셀
deleteRows체크한 행 삭제(빨간 글자)셀
autosize / autosizeAll이 컬럼 / 모든 컬럼 너비 맞춤둘 다
hideColumn컬럼 숨기기(lockVisible 제외)둘 다
pinLeft / pinRight / unpin컬럼 고정둘 다
sortAsc / sortDesc / clearSort정렬(현재 방향에 체크)헤더
groupBy / ungroup이 컬럼으로 묶기 / 해제헤더
selectAll모든 행 선택(rowSelection multiple)셀
chooseColumns / resetColumns컬럼 선택(둘 다) / 컬럼 초기화(헤더)둘 다
chartBar / chartLine / chartPie선택한 범위로 차트(두 칸 이상 범위)셀
exportCsv / exportExcel / exportJson / exportPdf내보내기셀
advancedFilter고급 필터 열기셀
print인쇄셀
conditionalFormat조건부 서식헤더
columnMenu컬럼 메뉴 열기(필터)헤더
note / deleteNote셀 메모 추가·편집 / 삭제(cellNotes)셀
addCalculated / editCalculated / removeCalculated계산 컬럼헤더
showValuesAs하위 메뉴: 값 그대로, 합계 대비 %, 그룹 대비 %, 누계헤더
expandDetails / collapseDetails상세 행 모두 펼치기 / 접기(detailRenderer)셀

어느 메뉴에서든 모든 키를 쓸 수 있습니다. 셀 메뉴의 sortAsc는 우클릭한 컬럼으로 정렬합니다.

함수와 action이 받는 정보

이름타입설명
area'cell' | 'header'어느 메뉴인지.
row / rowIndexRow | null / number우클릭한 행(헤더나 빈 곳이면 null, -1).
colId / columnstring / ColumnDef | null컬럼.
valueunknown셀 값.
defaultItemsContextMenuItem[]기본 메뉴(항목마다 key 포함). 그대로 두거나 거르거나 순서를 바꾸거나 덧붙입니다.
  • headerContextMenu가 없으면 헤더 우클릭은 지금처럼 컬럼 메뉴를 엽니다. false면 브라우저 메뉴가 열립니다.
  • true면 기본 헤더 메뉴: 정렬(현재 방향 체크), 고정, 묶기, 너비, 숨기기, 컬럼 선택·초기화, 값 표시 방식, 계산 컬럼, 조건부 서식, 컬럼 메뉴.
  • 목록이나 함수로 셀 메뉴처럼 만듭니다.

키보드

키동작
Shift + F10, ContextMenu포커스된 셀에서 셀 메뉴 열기
↓ / ↑항목 이동
→ / Enter하위 메뉴 열기
← / Esc상위 메뉴로. 첫 메뉴에서 Esc는 닫기

이 페이지에 대한 질문

그리드 우클릭 메뉴에 하위 메뉴를 넣으려면?

항목에 items를 주세요: { label: '내보내기', items: ['exportCsv', 'exportExcel'] }. 마우스를 올리거나 누르거나 → 또는 Enter로 열리고, 여러 단계로 넣을 수 있습니다.