@topgrid/grid-pro-master 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +108 -0
- package/dist/index.cjs +571 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +393 -0
- package/dist/index.d.ts +393 -0
- package/dist/index.mjs +559 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/internal/ExpandToggleCell.tsx","../src/DetailRow.tsx","../src/internal/useRowKeyboardNav.ts","../src/MasterDetailGrid.tsx","../src/internal/useContextMenu.ts","../src/internal/ContextMenuPortal.tsx","../src/ContextMenuGrid.tsx","../src/internal/useExpandedPersistence.ts","../src/index.ts"],"names":["jsx","useState","useCallback","useEffect","jsxs","useReactTable","getCoreRowModel","useImperativeHandle","flexRender","forwardRef","useRef"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * Internal expand/collapse toggle button cell for Master-Detail grid rows.\r\n *\r\n * NOT part of the public API surface — do not re-export from src/index.ts.\r\n *\r\n * @internal\r\n * @see G-001-spec.md Section 8.2\r\n */\r\n\r\nimport type { MouseEvent } from 'react';\r\n\r\n/** Indent pixels per depth level (matches TreeGrid.tsx:17 INDENT_PX). */\r\nconst INDENT_PX = 16;\r\n\r\ninterface ExpandToggleCellProps {\r\n /** Whether the row is currently expanded. */\r\n isExpanded: boolean;\r\n /** Row depth (0 = root). Controls left padding indent. */\r\n depth: number;\r\n /** Toggle handler — called with the original mouse event. */\r\n onToggle: (e: MouseEvent) => void;\r\n}\r\n\r\n/**\r\n * Renders an expand/collapse toggle button with depth-based indentation.\r\n *\r\n * Stops click propagation to prevent row click handlers from firing on toggle.\r\n */\r\nexport function ExpandToggleCell({ isExpanded, depth, onToggle }: ExpandToggleCellProps) {\r\n return (\r\n <div className=\"flex items-center\" style={{ paddingLeft: `${depth * INDENT_PX}px` }}>\r\n <button\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n onToggle(e);\r\n }}\r\n className=\"text-gray-500 hover:text-gray-700 focus:outline-none\"\r\n aria-label={isExpanded ? '접기' : '펼치기'}\r\n aria-expanded={isExpanded}\r\n >\r\n {isExpanded ? '▼' : '▶'}\r\n </button>\r\n </div>\r\n );\r\n}\r\n","/**\r\n * Detail row component for Master-Detail grid.\r\n *\r\n * Renders a full-width `<tr>` containing the detail content for an expanded master row.\r\n *\r\n * @see G-001-spec.md Section 8.3\r\n */\r\n\r\nimport type { Row } from '@tanstack/react-table';\r\nimport type { RenderDetailRow } from './types';\r\n\r\ninterface DetailRowProps<TData> {\r\n /** The TanStack Row object for the expanded master row. */\r\n row: Row<TData>;\r\n /** Number of columns to span (full width). */\r\n colSpan: number;\r\n /** Render function providing the detail row content. */\r\n renderDetailRow: RenderDetailRow<TData>;\r\n}\r\n\r\n/**\r\n * Renders a detail row below the master row when it is expanded.\r\n *\r\n * The `data-detail-row` attribute allows consumers to target detail rows\r\n * with CSS selectors or test queries.\r\n */\r\nexport function DetailRow<TData>({ row, colSpan, renderDetailRow }: DetailRowProps<TData>) {\r\n return (\r\n <tr data-detail-row className=\"bg-gray-50\">\r\n <td colSpan={colSpan} className=\"px-4 py-2\">\r\n {renderDetailRow(row)}\r\n </td>\r\n </tr>\r\n );\r\n}\r\n","/**\r\n * `useRowKeyboardNav` — WCAG 2.1 AA keyboard accessibility hook for Master-Detail rows.\r\n *\r\n * Adds `tabIndex=0` and `onKeyDown` (Enter/Space to toggle expand) to row elements.\r\n *\r\n * C-32 separation:\r\n * - Pure helper: `shouldToggleExpand(key)` — framework-independent key check.\r\n * - React shell: `useRowKeyboardNav(row, enabled)` — returns spreadable props object.\r\n *\r\n * @see G-003-spec.md Section 2.2 + D5\r\n * @see MOD-GRID-16-decisions.md D19\r\n *\r\n * @internal\r\n */\r\n\r\nimport { useCallback } from 'react';\r\nimport type { KeyboardEvent } from 'react';\r\nimport type { Row } from '@tanstack/react-table';\r\n\r\n/**\r\n * Props returned by `useRowKeyboardNav` to spread onto a row element (`<tr>`).\r\n *\r\n * @example\r\n * ```tsx\r\n * const keyboardProps = useRowKeyboardNav(row, !!renderDetailRow);\r\n * <tr {...keyboardProps} className=\"...\">\r\n * ```\r\n */\r\nexport interface RowKeyboardNavProps {\r\n /** Makes the row focusable via keyboard navigation. */\r\n tabIndex: 0;\r\n /** Handles Enter / Space keypress to toggle row expansion. */\r\n onKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\r\n}\r\n\r\n/**\r\n * Pure helper — returns `true` when the key event should toggle row expansion.\r\n *\r\n * C-32: React-independent. Accepts the raw `event.key` string.\r\n *\r\n * @param key - `event.key` value from a `KeyboardEvent`.\r\n * @returns `true` for `'Enter'` or `' '` (Space); `false` otherwise.\r\n */\r\nexport function shouldToggleExpand(key: string): boolean {\r\n return key === 'Enter' || key === ' ';\r\n}\r\n\r\n/**\r\n * WCAG 2.1 AA keyboard accessibility hook for expandable rows.\r\n *\r\n * Returns `{ tabIndex: 0, onKeyDown }` when the row can be expanded and `enabled` is not\r\n * `false`. Returns an empty object (`{}`) otherwise — safe to spread unconditionally\r\n * (EC-04, EC-05).\r\n *\r\n * @param row - TanStack `Row<TData>` — used for `getCanExpand()` / `toggleExpanded()`.\r\n * @param enabled - Pass `false` to skip keyboard wiring (e.g., when `renderDetailRow` is absent).\r\n * Defaults to `true`.\r\n * @returns Spreadable props object — either `RowKeyboardNavProps` or `{}`.\r\n *\r\n * @see G-003-spec.md Section 2.2\r\n */\r\nexport function useRowKeyboardNav<TData>(\r\n row: Row<TData>,\r\n enabled?: boolean,\r\n): RowKeyboardNavProps | Record<string, never> {\r\n const canExpand = row.getCanExpand();\r\n\r\n const onKeyDown = useCallback(\r\n (event: KeyboardEvent<HTMLElement>) => {\r\n if (shouldToggleExpand(event.key)) {\r\n event.preventDefault();\r\n row.toggleExpanded();\r\n }\r\n },\r\n // Re-create only when row reference changes (row.toggleExpanded is bound to the row instance).\r\n [row],\r\n );\r\n\r\n // EC-05: enabled=false → no wiring.\r\n // EC-04: !canExpand → no wiring (row.toggleExpanded would be a no-op anyway).\r\n if (enabled === false || !canExpand) {\r\n return {};\r\n }\r\n\r\n return { tabIndex: 0, onKeyDown };\r\n}\r\n","/**\r\n * `<MasterDetailGrid>` — Pro-tier Master-Detail row expansion.\r\n *\r\n * Wraps `GridProps<TData>` surface with `renderDetailRow` + `masterDetail` expansion options.\r\n * Renders its own standalone `useReactTable` table — does NOT import `<Grid>` from\r\n * `@topgrid/grid-core` at runtime (Option B — MIT↔Pro EULA boundary preservation, D1).\r\n *\r\n * Features:\r\n * - `renderDetailRow` prop: render function for expanded detail row content.\r\n * - Controlled mode: `masterDetail.expandedRowKeys` + `onExpandChange` callback.\r\n * - Uncontrolled mode: internal `useState<ExpandedState>`.\r\n * - Imperative handle: `expandAll()` / `collapseAll()` via `ref`.\r\n *\r\n * @see G-001-spec.md Section 4/8/11\r\n * @see MOD-GRID-16-decisions.md D1/D3/D7/D8\r\n */\r\n\r\nimport {\r\n forwardRef,\r\n Fragment,\r\n useEffect,\r\n useImperativeHandle,\r\n useState,\r\n type ReactElement,\r\n type Ref,\r\n} from 'react';\r\nimport {\r\n flexRender,\r\n getCoreRowModel,\r\n getExpandedRowModel,\r\n useReactTable,\r\n type ColumnDef,\r\n type ExpandedState,\r\n type Row,\r\n} from '@tanstack/react-table';\r\nimport type { GridHandle, GridProps } from '@topgrid/grid-core';\r\nimport { useLicenseStatus, Watermark } from '@topgrid/grid-license';\r\nimport type { MasterDetailGridProps, RenderDetailRow } from './types';\r\nimport { ExpandToggleCell } from './internal/ExpandToggleCell';\r\nimport { DetailRow } from './DetailRow';\r\nimport { useRowKeyboardNav } from './internal/useRowKeyboardNav';\r\n\r\n// Node `process` global 의 minimal local declare — `@types/node` 미설치 환경에서\r\n// dev mode 가드 시 사용 (C-4 준수). Grid.tsx:61 동일 패턴.\r\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\r\n\r\n/** Expand toggle column id (reserved — must not conflict with consumer columns). */\r\nconst EXPAND_COLUMN_ID = '__expand__';\r\n\r\n/**\r\n * Builds the expand-toggle prepend column definition.\r\n * Returns `null` when `renderDetailRow` is not provided (flat mode).\r\n */\r\nfunction buildExpandColumn<TData>(\r\n renderDetailRowProvided: boolean,\r\n): ColumnDef<TData, unknown> | null {\r\n if (!renderDetailRowProvided) return null;\r\n return {\r\n id: EXPAND_COLUMN_ID,\r\n header: () => null,\r\n cell: ({ row }: { row: Row<TData> }) => (\r\n <ExpandToggleCell\r\n isExpanded={row.getIsExpanded()}\r\n depth={row.depth}\r\n onToggle={() => row.toggleExpanded()}\r\n />\r\n ),\r\n size: 40,\r\n enableSorting: false,\r\n enableColumnFilter: false,\r\n };\r\n}\r\n\r\n/**\r\n * Derives TanStack `ExpandedState` from controlled `expandedRowKeys` string array.\r\n */\r\nfunction keysToExpandedState(keys: string[]): ExpandedState {\r\n return keys.reduce<Record<string, boolean>>((acc, key) => {\r\n acc[key] = true;\r\n return acc;\r\n }, {});\r\n}\r\n\r\n/**\r\n * Derives string key array from TanStack `ExpandedState`.\r\n * `true` (all expanded) returns an empty array (callers should use `expandAll()` instead).\r\n */\r\nfunction expandedStateToKeys(state: ExpandedState): string[] {\r\n if (state === true) return [];\r\n return Object.keys(state).filter((k) => state[k] === true);\r\n}\r\n\r\n// ── MasterRow sub-component (module scope) ────────────────────────────────\r\n// Must be defined at MODULE scope — not inside MasterDetailGridInner — so that\r\n// React's reconciler sees a stable component type across re-renders.\r\n// Defining it inside the render function would cause a fresh function reference\r\n// each render → unmount/remount every row → focus lost on keyboard toggle (D19).\r\n\r\ninterface MasterRowProps<TData> {\r\n row: Row<TData>;\r\n renderDetailRow: RenderDetailRow<TData> | undefined;\r\n colCount: number;\r\n onRowClick?: GridProps<TData>['onRowClick'];\r\n onRowDoubleClick?: GridProps<TData>['onRowDoubleClick'];\r\n onCellClick?: GridProps<TData>['onCellClick'];\r\n}\r\n\r\n/**\r\n * Single master row with optional expand toggle and keyboard accessibility.\r\n *\r\n * Extracted from `MasterDetailGridInner` so React's reconciler sees a stable\r\n * component type — a new function reference each parent render would unmount/\r\n * remount all rows and lose keyboard focus (WCAG 2.1 AA breakage).\r\n *\r\n * @see G-003-spec.md D19 / Rules-of-Hooks fix (specCodeDefect F-06)\r\n */\r\nfunction MasterRow<TData>({\r\n row,\r\n renderDetailRow,\r\n colCount,\r\n onRowClick,\r\n onRowDoubleClick,\r\n onCellClick,\r\n}: MasterRowProps<TData>) {\r\n // G-003: WCAG 2.1 AA keyboard accessibility — tabIndex=0 + Enter/Space toggle.\r\n const keyboardProps = useRowKeyboardNav<TData>(row, renderDetailRow !== undefined);\r\n\r\n return (\r\n <Fragment>\r\n <tr\r\n {...keyboardProps}\r\n className=\"border-b border-gray-100 hover:bg-gray-50 focus:outline-none focus-visible:outline-2 focus-visible:outline-blue-500\"\r\n onClick={\r\n onRowClick !== undefined\r\n ? (e) => onRowClick(row.original, e)\r\n : undefined\r\n }\r\n onDoubleClick={\r\n onRowDoubleClick !== undefined\r\n ? (e) => onRowDoubleClick(row.original, e)\r\n : undefined\r\n }\r\n >\r\n {row.getVisibleCells().map((cell) => (\r\n <td\r\n key={cell.id}\r\n className=\"px-4 py-2\"\r\n onClick={\r\n onCellClick !== undefined\r\n ? (e) => onCellClick(cell, row.original, e)\r\n : undefined\r\n }\r\n >\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </td>\r\n ))}\r\n </tr>\r\n {row.getIsExpanded() && renderDetailRow !== undefined && (\r\n <DetailRow<TData>\r\n row={row}\r\n colSpan={colCount}\r\n renderDetailRow={renderDetailRow}\r\n />\r\n )}\r\n </Fragment>\r\n );\r\n}\r\n\r\n/**\r\n * Inner implementation (unwrapped from forwardRef for generic type support).\r\n */\r\nfunction MasterDetailGridInner<TData>(\r\n props: MasterDetailGridProps<TData>,\r\n ref: Ref<GridHandle<TData>>,\r\n): ReactElement {\r\n // ADR-MOD-GRID-REFACTOR-2026-05-17-001 — license watermark wiring\r\n const _lic = useLicenseStatus();\r\n\r\n const { renderDetailRow, masterDetail } = props;\r\n\r\n // ── Expanded state: controlled vs uncontrolled ──\r\n const isControlled = masterDetail?.expandedRowKeys !== undefined;\r\n\r\n const [internalExpanded, setInternalExpanded] = useState<ExpandedState>(() =>\r\n isControlled ? keysToExpandedState(masterDetail!.expandedRowKeys!) : {},\r\n );\r\n\r\n // In controlled mode, sync external expandedRowKeys → internal ExpandedState.\r\n useEffect(() => {\r\n if (isControlled && masterDetail?.expandedRowKeys !== undefined) {\r\n setInternalExpanded(keysToExpandedState(masterDetail.expandedRowKeys));\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [masterDetail?.expandedRowKeys]);\r\n\r\n const expanded = internalExpanded;\r\n\r\n function handleExpandedChange(updaterOrValue: ExpandedState | ((prev: ExpandedState) => ExpandedState)) {\r\n setInternalExpanded((prev) => {\r\n const next =\r\n typeof updaterOrValue === 'function' ? updaterOrValue(prev) : updaterOrValue;\r\n if (masterDetail?.onExpandChange !== undefined) {\r\n masterDetail.onExpandChange(expandedStateToKeys(next));\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n // ── Column definitions: prepend expand toggle if renderDetailRow provided ──\r\n const expandCol = buildExpandColumn<TData>(renderDetailRow !== undefined);\r\n const effectiveColumns: ColumnDef<TData, unknown>[] = expandCol\r\n ? [expandCol, ...props.columns]\r\n : [...props.columns];\r\n\r\n // ── TanStack table instance ──\r\n const table = useReactTable<TData>({\r\n data: props.data,\r\n columns: effectiveColumns,\r\n state: {\r\n expanded,\r\n },\r\n onExpandedChange: handleExpandedChange,\r\n getCoreRowModel: getCoreRowModel(),\r\n getExpandedRowModel: getExpandedRowModel(),\r\n // C-29 spread-skip for exactOptionalPropertyTypes: true\r\n ...(props.getSubRows !== undefined ? { getSubRows: props.getSubRows } : {}),\r\n ...(props.debug !== undefined ? { debugTable: props.debug } : {}),\r\n });\r\n\r\n // ── Imperative handle (D8): GridHandle<TData> + optional expandAll/collapseAll ──\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n addRow: (seed?: Partial<TData>) => {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n if (props.onAddRow === undefined) {\r\n console.warn('[tomis/grid-pro-master] addRow called but onAddRow prop is not provided.');\r\n }\r\n }\r\n props.onAddRow?.(seed);\r\n },\r\n deleteRow: (rowId: string | number) => {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n if (props.onDeleteRow === undefined) {\r\n console.warn('[tomis/grid-pro-master] deleteRow called but onDeleteRow prop is not provided.');\r\n }\r\n }\r\n props.onDeleteRow?.(rowId);\r\n },\r\n updateRow: (rowId: string | number, patch: Partial<TData>) => {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n if (props.onUpdateRow === undefined) {\r\n console.warn('[tomis/grid-pro-master] updateRow called but onUpdateRow prop is not provided.');\r\n }\r\n }\r\n props.onUpdateRow?.(rowId, patch);\r\n },\r\n scrollTo: (_index: number) => {\r\n // no-op stub — virtualization not wired in MasterDetailGrid (G-004 is grid-core scope)\r\n },\r\n getSelection: (): TData[] => {\r\n return table.getSelectedRowModel().rows.map((r) => r.original);\r\n },\r\n clearSelection: () => {\r\n table.setRowSelection({});\r\n },\r\n refresh: () => {\r\n table.resetRowSelection();\r\n },\r\n expandAll: () => {\r\n table.toggleAllRowsExpanded(true);\r\n },\r\n collapseAll: () => {\r\n table.toggleAllRowsExpanded(false);\r\n },\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [table],\r\n );\r\n\r\n const headerGroups = table.getHeaderGroups();\r\n const rows = table.getRowModel().rows;\r\n const colCount = effectiveColumns.length;\r\n\r\n return (\r\n <div className={`${props.className ?? ''} relative`.trim()}>\r\n <table className=\"w-full border-collapse text-sm\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr key={headerGroup.id} className=\"border-b border-gray-200 bg-gray-100\">\r\n {headerGroup.headers.map((header) => (\r\n <th\r\n key={header.id}\r\n className=\"px-4 py-2 text-left font-semibold text-gray-700\"\r\n style={header.column.id === EXPAND_COLUMN_ID ? { width: 40 } : undefined}\r\n >\r\n {header.isPlaceholder\r\n ? null\r\n : flexRender(header.column.columnDef.header, header.getContext())}\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody>\r\n {rows.length === 0 ? (\r\n <tr>\r\n <td colSpan={colCount} className=\"px-4 py-8 text-center text-gray-400\">\r\n {props.emptyText ?? '데이터가 없습니다.'}\r\n </td>\r\n </tr>\r\n ) : (\r\n rows.map((row) => (\r\n <MasterRow<TData>\r\n key={row.id}\r\n row={row}\r\n renderDetailRow={renderDetailRow}\r\n colCount={colCount}\r\n onRowClick={props.onRowClick}\r\n onRowDoubleClick={props.onRowDoubleClick}\r\n onCellClick={props.onCellClick}\r\n />\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n {_lic.watermarkRequired && <Watermark required />}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * `<MasterDetailGrid>` Pro-tier component with Master-Detail row expansion.\r\n *\r\n * @typeParam TData - Row data type.\r\n *\r\n * @example Uncontrolled\r\n * ```tsx\r\n * const gridRef = useRef<GridHandle<Order>>(null);\r\n *\r\n * <MasterDetailGrid<Order>\r\n * ref={gridRef}\r\n * data={orders}\r\n * columns={columns}\r\n * renderDetailRow={(row) => <OrderDetail order={row.original} />}\r\n * />\r\n *\r\n * gridRef.current?.expandAll();\r\n * ```\r\n *\r\n * @example Controlled\r\n * ```tsx\r\n * const [expanded, setExpanded] = useState<string[]>([]);\r\n *\r\n * <MasterDetailGrid<Order>\r\n * data={orders}\r\n * columns={columns}\r\n * renderDetailRow={(row) => <OrderDetail order={row.original} />}\r\n * masterDetail={{ expandedRowKeys: expanded, onExpandChange: setExpanded }}\r\n * />\r\n * ```\r\n */\r\nexport const MasterDetailGrid = forwardRef(MasterDetailGridInner) as <TData>(\r\n props: MasterDetailGridProps<TData> & { ref?: Ref<GridHandle<TData>> },\r\n) => ReactElement;\r\n","/**\r\n * `useContextMenu` — Pure state hook for context menu open/close/position.\r\n *\r\n * G-002 (MOD-GRID-16): Manages right-click context menu state for\r\n * `<ContextMenuGrid>`. No DOM side-effects; all event wiring lives\r\n * in the consumer (C-32: pure helper + React shell separation).\r\n *\r\n * @see G-002-spec.md Section 5.3 / Section 8 Phase 1\r\n */\r\n\r\nimport { useCallback, useState, type Dispatch, type SetStateAction } from 'react';\r\nimport type { Cell } from '@tanstack/react-table';\r\n\r\n/**\r\n * Return type of `useContextMenu`.\r\n *\r\n * @typeParam TData - Row data type.\r\n */\r\nexport interface UseContextMenuReturn<TData> {\r\n /** Whether the context menu is currently open. */\r\n isOpen: boolean;\r\n /** Viewport-absolute pixel position of the menu top-left corner. */\r\n position: { x: number; y: number };\r\n /** The data row that was right-clicked (`row.original`). `null` when closed. */\r\n targetRow: TData | null;\r\n /** The TanStack cell that was right-clicked. `null` when closed. */\r\n targetCell: Cell<TData, unknown> | null;\r\n /**\r\n * Open the menu at the given coordinates with the given row/cell context.\r\n * Replaces any previously open menu (only one menu at a time).\r\n */\r\n openAt: (x: number, y: number, row: TData, cell: Cell<TData, unknown>) => void;\r\n /** Close the menu and reset all transient state. */\r\n close: () => void;\r\n /**\r\n * Index of the keyboard-focused menu item (-1 = none focused).\r\n * Used by `ContextMenuPortal` to highlight the focused item.\r\n */\r\n focusedIndex: number;\r\n /** Setter for `focusedIndex` — forwarded to portal for arrow-key navigation (G-004+). */\r\n setFocusedIndex: Dispatch<SetStateAction<number>>;\r\n}\r\n\r\n/**\r\n * State hook for context menu lifecycle.\r\n *\r\n * Manages `isOpen`, `position`, `targetRow`, `targetCell`, and `focusedIndex`.\r\n * Provides stable `openAt` and `close` callbacks (useCallback, deps=[]).\r\n *\r\n * @typeParam TData - Row data type.\r\n * @returns `UseContextMenuReturn<TData>`\r\n *\r\n * @example\r\n * ```ts\r\n * const { isOpen, position, targetRow, targetCell, openAt, close, focusedIndex, setFocusedIndex } =\r\n * useContextMenu<User>();\r\n * ```\r\n */\r\nexport function useContextMenu<TData>(): UseContextMenuReturn<TData> {\r\n const [isOpen, setIsOpen] = useState(false);\r\n const [position, setPosition] = useState<{ x: number; y: number }>({ x: 0, y: 0 });\r\n const [targetRow, setTargetRow] = useState<TData | null>(null);\r\n const [targetCell, setTargetCell] = useState<Cell<TData, unknown> | null>(null);\r\n const [focusedIndex, setFocusedIndex] = useState(-1);\r\n\r\n const openAt = useCallback(\r\n (x: number, y: number, row: TData, cell: Cell<TData, unknown>) => {\r\n setPosition({ x, y });\r\n setTargetRow(row);\r\n setTargetCell(cell);\r\n setFocusedIndex(-1);\r\n setIsOpen(true);\r\n },\r\n [],\r\n );\r\n\r\n const close = useCallback(() => {\r\n setIsOpen(false);\r\n setTargetRow(null);\r\n setTargetCell(null);\r\n setFocusedIndex(-1);\r\n }, []);\r\n\r\n return {\r\n isOpen,\r\n position,\r\n targetRow,\r\n targetCell,\r\n openAt,\r\n close,\r\n focusedIndex,\r\n setFocusedIndex,\r\n };\r\n}\r\n","/**\r\n * `<ContextMenuPortal>` — createPortal-based context menu renderer.\r\n *\r\n * G-002 (MOD-GRID-16): Renders a context menu into `document.body` via\r\n * `createPortal` to escape parent overflow/stacking contexts (D4).\r\n *\r\n * Responsibilities:\r\n * - `separator: true` items → `<hr>` element (AC-008)\r\n * - `disabled` evaluation at render time against `targetRow` (D7, AC-007)\r\n * - `shortcut` hint display on the right side of each item (AC-005)\r\n * - Outside-click → `onClose()` via `mousedown` listener (AC-012)\r\n * - Viewport-edge position clamping (Section 9 edge case)\r\n *\r\n * @see G-002-spec.md Section 5.3 / Section 9\r\n */\r\n\r\nimport { useEffect, useRef, type ReactElement } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport type { Cell } from '@tanstack/react-table';\r\nimport type { ContextMenuItem } from '../types';\r\n\r\n/**\r\n * Props for `<ContextMenuPortal>`.\r\n *\r\n * @typeParam TData - Row data type.\r\n */\r\ninterface ContextMenuPortalProps<TData> {\r\n /** Whether the menu is currently open. When false, nothing is rendered. */\r\n isOpen: boolean;\r\n /** Viewport-absolute position for the menu top-left corner (pre-computed by caller). */\r\n position: { x: number; y: number };\r\n /** Menu items to render. */\r\n items: ContextMenuItem<TData>[];\r\n /** The row data that was right-clicked. */\r\n targetRow: TData;\r\n /** The TanStack cell that was right-clicked. */\r\n targetCell: Cell<TData, unknown>;\r\n /** Called when the menu should close (outside-click or Esc handled at wrapper level). */\r\n onClose: () => void;\r\n}\r\n\r\n/**\r\n * Clamps menu position so it stays within the viewport.\r\n *\r\n * @param x - Requested left position (clientX from contextmenu event).\r\n * @param y - Requested top position (clientY from contextmenu event).\r\n * @param menuWidth - Estimated / measured menu width in px.\r\n * @param menuHeight - Estimated / measured menu height in px.\r\n * @returns Adjusted `{ x, y }` clamped to viewport bounds.\r\n */\r\nfunction clampPosition(\r\n x: number,\r\n y: number,\r\n menuWidth: number,\r\n menuHeight: number,\r\n): { x: number; y: number } {\r\n const vw = window.innerWidth;\r\n const vh = window.innerHeight;\r\n return {\r\n x: x + menuWidth > vw ? Math.max(0, vw - menuWidth) : x,\r\n y: y + menuHeight > vh ? Math.max(0, vh - menuHeight) : y,\r\n };\r\n}\r\n\r\n/**\r\n * Context menu rendered into `document.body` via `createPortal`.\r\n *\r\n * @typeParam TData - Row data type.\r\n */\r\nfunction ContextMenuPortalInner<TData>(\r\n props: ContextMenuPortalProps<TData>,\r\n): ReactElement | null {\r\n const { isOpen, position, items, targetRow, targetCell, onClose } = props;\r\n\r\n const menuRef = useRef<HTMLUListElement>(null);\r\n\r\n // Outside-click → close (AC-012)\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n function handleMouseDown(e: MouseEvent) {\r\n if (menuRef.current !== null && !menuRef.current.contains(e.target as Node)) {\r\n onClose();\r\n }\r\n }\r\n\r\n document.addEventListener('mousedown', handleMouseDown);\r\n return () => {\r\n document.removeEventListener('mousedown', handleMouseDown);\r\n };\r\n }, [isOpen, onClose]);\r\n\r\n if (!isOpen) return null;\r\n\r\n // Estimate menu dimensions for viewport clamping.\r\n // Use a generous estimate (200×(items.length * 32)) when DOM not yet measured.\r\n const estimatedHeight = items.length * 32 + 8;\r\n const estimatedWidth = 200;\r\n const { x, y } = clampPosition(position.x, position.y, estimatedWidth, estimatedHeight);\r\n\r\n const menu = (\r\n <ul\r\n ref={menuRef}\r\n role=\"menu\"\r\n className=\"fixed z-50 bg-white border border-gray-200 rounded shadow-lg py-1 text-sm min-w-[160px]\"\r\n style={{ left: x, top: y }}\r\n >\r\n {items.map((item, index) => {\r\n // Separator item (AC-008)\r\n if (item.separator === true) {\r\n return (\r\n <li key={index} role=\"separator\">\r\n <hr className=\"my-1 border-gray-200\" />\r\n </li>\r\n );\r\n }\r\n\r\n // Evaluate disabled (D7): function evaluated at render time against targetRow\r\n const isDisabled =\r\n typeof item.disabled === 'function'\r\n ? item.disabled(targetRow)\r\n : (item.disabled ?? false);\r\n\r\n return (\r\n <li key={index} role=\"menuitem\" aria-disabled={isDisabled}>\r\n <button\r\n type=\"button\"\r\n className={[\r\n 'w-full flex items-center gap-2 px-3 py-1.5 text-left text-gray-700',\r\n 'hover:bg-gray-100 focus:bg-gray-100 focus:outline-none',\r\n isDisabled ? 'opacity-50 cursor-not-allowed pointer-events-none' : 'cursor-pointer',\r\n ].join(' ')}\r\n disabled={isDisabled}\r\n onClick={\r\n isDisabled\r\n ? undefined\r\n : (e) => {\r\n item.onClick(targetRow, targetCell, e.nativeEvent);\r\n onClose();\r\n }\r\n }\r\n >\r\n <span className=\"flex-1\">{item.label}</span>\r\n {item.shortcut !== undefined && (\r\n <span className=\"ml-auto text-xs text-gray-400 shrink-0\">{item.shortcut}</span>\r\n )}\r\n </button>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n );\r\n\r\n return createPortal(menu, document.body);\r\n}\r\n\r\n/**\r\n * `<ContextMenuPortal>` — exported as typed generic component.\r\n *\r\n * @typeParam TData - Row data type.\r\n */\r\nexport function ContextMenuPortal<TData>(\r\n props: ContextMenuPortalProps<TData>,\r\n): ReactElement | null {\r\n return ContextMenuPortalInner(props);\r\n}\r\n","/**\r\n * `<ContextMenuGrid>` — Pro-tier right-click context menu grid.\r\n *\r\n * Wraps `GridProps<TData>` surface with `contextMenuItems` prop.\r\n * Renders its own standalone `useReactTable` table — does NOT import `<Grid>`\r\n * from `@topgrid/grid-core` at runtime (Option B — MIT↔Pro EULA boundary, D1).\r\n *\r\n * Features:\r\n * - `contextMenuItems` prop: declarative right-click context menu items.\r\n * - `createPortal` menu rendering into `document.body` (D4).\r\n * - Keyboard shortcut support via wrapper div `onKeyDown` (D5).\r\n * - `disabled` evaluation at render time (D7).\r\n *\r\n * @see G-002-spec.md Section 4/5/8\r\n * @see MOD-GRID-16-decisions.md D9–D16\r\n */\r\n\r\nimport {\r\n forwardRef,\r\n useImperativeHandle,\r\n type KeyboardEvent,\r\n type MouseEvent,\r\n type ReactElement,\r\n type Ref,\r\n} from 'react';\r\nimport {\r\n flexRender,\r\n getCoreRowModel,\r\n useReactTable,\r\n type Cell,\r\n} from '@tanstack/react-table';\r\nimport type { GridHandle } from '@topgrid/grid-core';\r\nimport type { ContextMenuGridProps } from './types';\r\nimport { useContextMenu } from './internal/useContextMenu';\r\nimport { ContextMenuPortal } from './internal/ContextMenuPortal';\r\n\r\n// Node `process` global 의 minimal local declare — `@types/node` 미설치 환경에서\r\n// dev mode 가드 시 사용 (C-4 준수). Grid.tsx:61 동일 패턴.\r\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\r\n\r\n/**\r\n * Parses a shortcut string into its modifier + key parts.\r\n *\r\n * Grammar: `\"[Modifier+]Key\"` where Modifier ∈ {Ctrl, Alt, Shift}.\r\n * Returns `null` if the string is empty; logs a warning for invalid grammar.\r\n *\r\n * @example\r\n * ```ts\r\n * parseShortcut(\"Ctrl+C\") // { ctrl: true, alt: false, shift: false, key: \"c\" }\r\n * parseShortcut(\"Delete\") // { ctrl: false, alt: false, shift: false, key: \"delete\" }\r\n * parseShortcut(\"Ctrl+\") // null (invalid grammar — warns)\r\n * ```\r\n */\r\nfunction parseShortcut(shortcut: string): {\r\n ctrl: boolean;\r\n alt: boolean;\r\n shift: boolean;\r\n key: string;\r\n} | null {\r\n if (shortcut.trim() === '') return null;\r\n\r\n const parts = shortcut.split('+');\r\n const keyPart = parts[parts.length - 1];\r\n\r\n // Grammar validation: key part must be non-empty\r\n if (keyPart === undefined || keyPart.trim() === '') {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n console.warn(`[tomis/grid-pro-master] Invalid shortcut grammar: \"${shortcut}\". Key part is empty.`);\r\n }\r\n return null;\r\n }\r\n\r\n const modifiers = parts.slice(0, -1).map((m) => m.toLowerCase());\r\n const validModifiers = new Set(['ctrl', 'alt', 'shift']);\r\n\r\n for (const mod of modifiers) {\r\n if (!validModifiers.has(mod)) {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n console.warn(`[tomis/grid-pro-master] Invalid shortcut modifier: \"${mod}\" in \"${shortcut}\". Valid modifiers: Ctrl, Alt, Shift.`);\r\n }\r\n return null;\r\n }\r\n }\r\n\r\n return {\r\n ctrl: modifiers.includes('ctrl'),\r\n alt: modifiers.includes('alt'),\r\n shift: modifiers.includes('shift'),\r\n key: keyPart.toLowerCase(),\r\n };\r\n}\r\n\r\n/**\r\n * Tests whether a `KeyboardEvent` matches a parsed shortcut.\r\n */\r\nfunction matchesShortcut(\r\n e: KeyboardEvent<HTMLDivElement>,\r\n parsed: { ctrl: boolean; alt: boolean; shift: boolean; key: string },\r\n): boolean {\r\n return (\r\n e.ctrlKey === parsed.ctrl &&\r\n e.altKey === parsed.alt &&\r\n e.shiftKey === parsed.shift &&\r\n e.key.toLowerCase() === parsed.key\r\n );\r\n}\r\n\r\n/**\r\n * Inner implementation (unwrapped from forwardRef for generic type support).\r\n */\r\nfunction ContextMenuGridInner<TData>(\r\n props: ContextMenuGridProps<TData>,\r\n ref: Ref<GridHandle<TData>>,\r\n): ReactElement {\r\n const { contextMenuItems, ...rest } = props;\r\n\r\n const { isOpen, position, targetRow, targetCell, openAt, close } = useContextMenu<TData>();\r\n\r\n // ── TanStack table instance ──\r\n const table = useReactTable<TData>({\r\n data: rest.data,\r\n columns: rest.columns,\r\n getCoreRowModel: getCoreRowModel(),\r\n // C-29 spread-skip for exactOptionalPropertyTypes: true\r\n ...(rest.getSubRows !== undefined ? { getSubRows: rest.getSubRows } : {}),\r\n ...(rest.debug !== undefined ? { debugTable: rest.debug } : {}),\r\n });\r\n\r\n // ── Imperative handle: GridHandle<TData> ──\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n addRow: (seed?: Partial<TData>) => {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n if (props.onAddRow === undefined) {\r\n console.warn('[tomis/grid-pro-master] addRow called but onAddRow prop is not provided.');\r\n }\r\n }\r\n props.onAddRow?.(seed);\r\n },\r\n deleteRow: (rowId: string | number) => {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n if (props.onDeleteRow === undefined) {\r\n console.warn('[tomis/grid-pro-master] deleteRow called but onDeleteRow prop is not provided.');\r\n }\r\n }\r\n props.onDeleteRow?.(rowId);\r\n },\r\n updateRow: (rowId: string | number, patch: Partial<TData>) => {\r\n if (typeof process !== 'undefined' && process?.env?.NODE_ENV !== 'production') {\r\n if (props.onUpdateRow === undefined) {\r\n console.warn('[tomis/grid-pro-master] updateRow called but onUpdateRow prop is not provided.');\r\n }\r\n }\r\n props.onUpdateRow?.(rowId, patch);\r\n },\r\n scrollTo: (_index: number) => {\r\n // no-op stub — virtualization not wired in ContextMenuGrid\r\n },\r\n getSelection: (): TData[] => {\r\n return table.getSelectedRowModel().rows.map((r) => r.original);\r\n },\r\n clearSelection: () => {\r\n table.setRowSelection({});\r\n },\r\n refresh: () => {\r\n table.resetRowSelection();\r\n },\r\n }),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [table],\r\n );\r\n\r\n const headerGroups = table.getHeaderGroups();\r\n const rows = table.getRowModel().rows;\r\n const colCount = rest.columns.length;\r\n\r\n // ── Keyboard shortcut handler (D5) ──\r\n // Handles: shortcut key dispatch (AC-004/AC-005) + Esc close (AC-012)\r\n // Runs only when contextMenuItems are provided.\r\n function handleKeyDown(e: KeyboardEvent<HTMLDivElement>) {\r\n // Esc always closes the menu (AC-012)\r\n if (e.key === 'Escape') {\r\n close();\r\n return;\r\n }\r\n\r\n if (contextMenuItems === undefined || contextMenuItems.length === 0) return;\r\n if (targetRow === null || targetCell === null) return;\r\n\r\n for (const item of contextMenuItems) {\r\n if (item.separator === true || item.shortcut === undefined) continue;\r\n\r\n const parsed = parseShortcut(item.shortcut);\r\n if (parsed === null) continue;\r\n\r\n if (matchesShortcut(e, parsed)) {\r\n // Evaluate disabled at trigger time (D7)\r\n const isDisabled =\r\n typeof item.disabled === 'function'\r\n ? item.disabled(targetRow)\r\n : (item.disabled ?? false);\r\n\r\n if (!isDisabled) {\r\n // The spec signature requires `MouseEvent` (native, not React synthetic).\r\n // targetCell is narrowed to Cell<TData, unknown> by the null guard above.\r\n item.onClick(targetRow, targetCell, new MouseEvent('click'));\r\n close();\r\n }\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // ── onContextMenu handler ──\r\n // Extracts row/cell from TanStack row model using DOM data attributes.\r\n function handleCellContextMenu(\r\n e: MouseEvent<HTMLTableCellElement>,\r\n row: TData,\r\n cell: Cell<TData, unknown>,\r\n ) {\r\n if (contextMenuItems === undefined || contextMenuItems.length === 0) return;\r\n e.preventDefault();\r\n openAt(e.clientX, e.clientY, row, cell);\r\n }\r\n\r\n return (\r\n // tabIndex={0} makes the wrapper focusable for onKeyDown (D5).\r\n // focus:outline-none suppresses default browser focus ring on the container.\r\n <div\r\n className={['focus:outline-none', rest.className].filter(Boolean).join(' ')}\r\n tabIndex={contextMenuItems !== undefined ? 0 : undefined}\r\n onKeyDown={contextMenuItems !== undefined ? handleKeyDown : undefined}\r\n >\r\n <table className=\"w-full border-collapse text-sm\">\r\n <thead>\r\n {headerGroups.map((headerGroup) => (\r\n <tr key={headerGroup.id} className=\"border-b border-gray-200 bg-gray-100\">\r\n {headerGroup.headers.map((header) => (\r\n <th\r\n key={header.id}\r\n className=\"px-4 py-2 text-left font-semibold text-gray-700\"\r\n >\r\n {header.isPlaceholder\r\n ? null\r\n : flexRender(header.column.columnDef.header, header.getContext())}\r\n </th>\r\n ))}\r\n </tr>\r\n ))}\r\n </thead>\r\n <tbody>\r\n {rows.length === 0 ? (\r\n <tr>\r\n <td colSpan={colCount} className=\"px-4 py-8 text-center text-gray-400\">\r\n {rest.emptyText ?? '데이터가 없습니다.'}\r\n </td>\r\n </tr>\r\n ) : (\r\n rows.map((row) => (\r\n <tr\r\n key={row.id}\r\n className=\"border-b border-gray-100 hover:bg-gray-50\"\r\n onClick={\r\n rest.onRowClick !== undefined\r\n ? (e) => rest.onRowClick!(row.original, e)\r\n : undefined\r\n }\r\n onDoubleClick={\r\n rest.onRowDoubleClick !== undefined\r\n ? (e) => rest.onRowDoubleClick!(row.original, e)\r\n : undefined\r\n }\r\n >\r\n {row.getVisibleCells().map((cell) => (\r\n <td\r\n key={cell.id}\r\n className=\"px-4 py-2\"\r\n onClick={\r\n rest.onCellClick !== undefined\r\n ? (e) => rest.onCellClick!(cell, row.original, e)\r\n : undefined\r\n }\r\n onContextMenu={\r\n contextMenuItems !== undefined\r\n ? (e) => handleCellContextMenu(e, row.original, cell)\r\n : undefined\r\n }\r\n >\r\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\r\n </td>\r\n ))}\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n\r\n {isOpen && targetRow !== null && targetCell !== null && contextMenuItems !== undefined && (\r\n <ContextMenuPortal<TData>\r\n isOpen={isOpen}\r\n position={position}\r\n items={contextMenuItems}\r\n targetRow={targetRow}\r\n targetCell={targetCell}\r\n onClose={close}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * `<ContextMenuGrid>` Pro-tier component with right-click context menu support.\r\n *\r\n * @typeParam TData - Row data type.\r\n *\r\n * @example Uncontrolled\r\n * ```tsx\r\n * const gridRef = useRef<GridHandle<Order>>(null);\r\n *\r\n * const menuItems: ContextMenuItem<Order>[] = [\r\n * { label: '수정', shortcut: 'E', onClick: (row) => openEdit(row) },\r\n * { separator: true, label: '', onClick: () => {} },\r\n * {\r\n * label: '삭제',\r\n * shortcut: 'Delete',\r\n * disabled: (row) => row.status === 'completed',\r\n * onClick: (row) => deleteOrder(row),\r\n * },\r\n * ];\r\n *\r\n * <ContextMenuGrid<Order>\r\n * ref={gridRef}\r\n * data={orders}\r\n * columns={columns}\r\n * contextMenuItems={menuItems}\r\n * />\r\n * ```\r\n */\r\nexport const ContextMenuGrid = forwardRef(ContextMenuGridInner) as <TData>(\r\n props: ContextMenuGridProps<TData> & { ref?: Ref<GridHandle<TData>> },\r\n) => ReactElement;\r\n","/**\r\n * `useExpandedPersistence` — Pro-tier hook that persists TanStack `ExpandedState`\r\n * to Web Storage (localStorage / sessionStorage) across page refreshes.\r\n *\r\n * Option B — independent hook. Does NOT modify `useGridState` in `@topgrid/grid-core` (D17).\r\n * External composition pattern: wire `[expanded, setExpanded]` return value into\r\n * `masterDetail.expandedRowKeys` + `onExpandChange` on `<MasterDetailGrid>`.\r\n *\r\n * Internal SSR-guard + try/catch + JSON I/O boilerplate is now delegated to\r\n * `@topgrid/grid-core/internal/storage` (ADR-007 Wave 3). External API, in-memory\r\n * fallback semantics, and dev-mode warning behaviour unchanged.\r\n *\r\n * @see G-003-spec.md Section 2.1 + D3 (D17 in decisions.md)\r\n * @see MOD-GRID-16-decisions.md D17\r\n * @see MOD-GRID-REFACTOR-2026-05-17-decisions.md ADR-007\r\n */\r\n\r\nimport { useCallback, useEffect, useRef, useState } from 'react';\r\nimport type { ExpandedState } from '@tanstack/react-table';\r\nimport {\r\n getStorage,\r\n readJson,\r\n writeJson,\r\n type StorageType,\r\n} from '@topgrid/grid-core/internal/storage';\r\n\r\n// Minimal process declare for dev-mode guard (C-4). Mirrors MasterDetailGrid.tsx L44.\r\ndeclare const process: { env: { NODE_ENV?: string } } | undefined;\r\n\r\n/** Returns true when running in a non-production environment. */\r\nfunction isDev(): boolean {\r\n return (\r\n typeof process !== 'undefined' &&\r\n process?.env?.NODE_ENV !== 'production'\r\n );\r\n}\r\n\r\n/**\r\n * Options for `useExpandedPersistence`.\r\n *\r\n * @example\r\n * ```tsx\r\n * const [expanded, setExpanded] = useExpandedPersistence({\r\n * storageKey: 'orders-grid-expanded',\r\n * storageType: 'localStorage',\r\n * });\r\n * ```\r\n */\r\nexport interface UseExpandedPersistenceOptions {\r\n /**\r\n * Web Storage key. Use a unique key per grid instance to avoid collisions\r\n * when multiple grids are mounted on the same page.\r\n */\r\n storageKey: string;\r\n /**\r\n * Which Web Storage to use.\r\n * - `'localStorage'` (default): persists across browser sessions.\r\n * - `'sessionStorage'`: cleared when the tab is closed (EC-07).\r\n * @default 'localStorage'\r\n */\r\n storageType?: StorageType;\r\n /**\r\n * Initial `ExpandedState` used when no stored value is found or storage is unavailable.\r\n * @default {}\r\n */\r\n initialExpanded?: ExpandedState;\r\n}\r\n\r\n/** Setter signature matching TanStack table `onExpandedChange` updater contract. */\r\ntype ExpandedStateSetter = (\r\n updated: ExpandedState | ((prev: ExpandedState) => ExpandedState),\r\n) => void;\r\n\r\n/**\r\n * Pro-tier hook — persists TanStack `ExpandedState` to Web Storage.\r\n *\r\n * @remarks\r\n * Does NOT modify `useGridState` in `@topgrid/grid-core` (Option B, D17).\r\n * Wire the returned `[expanded, setExpanded]` into `<MasterDetailGrid>`:\r\n * ```tsx\r\n * masterDetail={{\r\n * expandedRowKeys: Object.keys(expanded).filter(k => (expanded as Record<string,boolean>)[k]),\r\n * onExpandChange: (keys) => {\r\n * const next: Record<string, boolean> = {};\r\n * keys.forEach(k => { next[k] = true; });\r\n * setExpanded(next);\r\n * },\r\n * }}\r\n * ```\r\n *\r\n * @param options - Persistence options (storageKey, storageType, initialExpanded).\r\n * @returns `[expanded, setExpanded]` tuple compatible with TanStack `ExpandedState`.\r\n *\r\n * @see G-003-spec.md Section 2.1\r\n */\r\nexport function useExpandedPersistence(\r\n options: UseExpandedPersistenceOptions,\r\n): [ExpandedState, ExpandedStateSetter] {\r\n const { storageKey, storageType = 'localStorage', initialExpanded = {} } = options;\r\n\r\n // storageRef holds the active Storage object. Updated via useEffect when storageType changes\r\n // so that storageType transitions do not require a full remount (spec Section 2.1).\r\n const storageRef = useRef<Storage | null>(null);\r\n\r\n // One-time storage availability check + dev-mode warning (EC-01).\r\n const warnedUnavailable = useRef(false);\r\n\r\n // Initialise storageRef eagerly so the useState initialiser below can use it.\r\n // ADR-007: SSR + try/catch delegated to getStorage().\r\n if (storageRef.current === null) {\r\n storageRef.current = getStorage(storageType);\r\n if (storageRef.current === null && !warnedUnavailable.current) {\r\n warnedUnavailable.current = true;\r\n if (isDev()) {\r\n console.warn(\r\n '[tomis/grid-pro-master] useExpandedPersistence: storage unavailable, falling back to in-memory.',\r\n );\r\n }\r\n }\r\n }\r\n\r\n const [expanded, setExpandedInternal] = useState<ExpandedState>(() => {\r\n // Attempt to load persisted state; fall back to initialExpanded on parse error (EC-02).\r\n // ADR-007: readJson handles try/catch + JSON.parse + null-on-failure.\r\n const stored = readJson<ExpandedState>(storageRef.current, storageKey);\r\n return stored !== null ? stored : initialExpanded;\r\n });\r\n\r\n // Keep storageRef in sync when storageType prop changes.\r\n useEffect(() => {\r\n const nextStorage = getStorage(storageType);\r\n if (nextStorage === null && !warnedUnavailable.current) {\r\n warnedUnavailable.current = true;\r\n if (isDev()) {\r\n console.warn(\r\n '[tomis/grid-pro-master] useExpandedPersistence: storage unavailable, falling back to in-memory.',\r\n );\r\n }\r\n }\r\n storageRef.current = nextStorage;\r\n }, [storageType]);\r\n\r\n const setExpanded = useCallback<ExpandedStateSetter>(\r\n (updated) => {\r\n setExpandedInternal((prev) => {\r\n const next =\r\n typeof updated === 'function' ? updated(prev) : updated;\r\n // Persist; errors swallowed in writeJson (EC-03 + QuotaExceededError).\r\n // ADR-007: dev-mode QuotaExceededError warning preserved via quotaWarnLabel.\r\n writeJson(\r\n storageRef.current,\r\n storageKey,\r\n next,\r\n isDev() ? 'tomis/grid-pro-master useExpandedPersistence' : undefined,\r\n );\r\n return next;\r\n });\r\n },\r\n // storageKey changes are intentionally NOT in deps — changing the key is an unusual\r\n // operation; consumers should remount to switch keys. This avoids stale-closure risk.\r\n [storageKey], // eslint-disable-line react-hooks/exhaustive-deps -- storageRef intentionally omitted (stable ref)\r\n );\r\n\r\n return [expanded, setExpanded];\r\n}\r\n","import { checkLicense } from '@topgrid/grid-license';\r\n\r\ncheckLicense();\r\n\r\n// G-001 (MOD-GRID-16): Master-Detail row expansion\r\nexport { MasterDetailGrid } from './MasterDetailGrid';\r\nexport type { MasterDetailGridProps, MasterDetailOptions, RenderDetailRow } from './types';\r\n\r\n// G-002 (MOD-GRID-16): Right-click Context Menu\r\nexport { ContextMenuGrid } from './ContextMenuGrid';\r\nexport type { ContextMenuGridProps, ContextMenuItem } from './types';\r\n\r\n// G-003 (MOD-GRID-16): Expanded persistence hook (Option B — independent, D17)\r\nexport { useExpandedPersistence } from './internal/useExpandedPersistence';\r\nexport type { UseExpandedPersistenceOptions } from './internal/useExpandedPersistence';\r\n\r\n// G-003 (MOD-GRID-16): Row Pinning base type (F-16-06 P1 — types only, D20)\r\nexport type { RowPinningOptions } from './types';\r\n\r\n// G-003 (MOD-GRID-16): TreeGrid / ColumnPinGrid C-6 alias re-export (G-005 산출물 재활용, D18)\r\n// @topgrid/grid-core is a peerDependency (package.json). G-005 (MOD-GRID-01) implements\r\n// these aliases with useDeprecationWarn — no new wrapper needed.\r\nexport { TreeGrid, type TreeGridProps } from '@topgrid/grid-core';\r\nexport { ColumnPinGrid, type ColumnPinGridProps } from '@topgrid/grid-core';\r\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@topgrid/grid-pro-master",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"license": "SEE LICENSE IN EULA",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"description": "Pro: Master-Detail, TreeGrid, Context Menu",
|
|
10
|
+
"main": "./dist/index.cjs",
|
|
11
|
+
"module": "./dist/index.mjs",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.mjs",
|
|
17
|
+
"require": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@topgrid/grid-license": "0.1.0"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@tanstack/react-table": "^8.0.0",
|
|
29
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
30
|
+
"react-dom": "^18.0.0 || ^19.0.0",
|
|
31
|
+
"@topgrid/grid-core": "0.1.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@topgrid/grid-core": "0.1.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup",
|
|
38
|
+
"typecheck": "tsc --noEmit",
|
|
39
|
+
"test": "echo TODO"
|
|
40
|
+
}
|
|
41
|
+
}
|