Skip to content

Clipboard Plugin

The Clipboard plugin brings familiar copy/paste functionality to your grid with full keyboard shortcut support (Ctrl+C, Ctrl+V). It handles single cells, multi-cell selections, and integrates seamlessly with Excel and other spreadsheet applications via tab-delimited output.

import '@toolbox-web/grid/features/clipboard';

Just enable the feature and you’re ready to go—keyboard shortcuts work automatically. Configure options like includeHeaders for copying column headers or delimiter for custom CSV formats.

import { queryGrid } from '@toolbox-web/grid';
const grid = queryGrid('tbw-grid');
grid.gridConfig = {
columns: [
{ field: 'name', header: 'Name' },
{ field: 'email', header: 'Email' },
{ field: 'department', header: 'Department' }
],
features: {
clipboard: {
includeHeaders: true,
quoteStrings: true, // Wrap text in quotes for CSV compatibility
},
},
};
Include headers Include column headers when copying
Quote strings Wrap string values in quotes

Select cells and use Ctrl+C to copy, Ctrl+V to paste.

X1 Y1 Z1 X2 Y2 Z2
Try it: Select the sample data above → Ctrl+C → Click a cell in the grid → Ctrl+V to paste.
Or paste tab/comma-separated data from Excel or Sheets!
Also try to select an area to paste in. Pasting will be restricted to that area only.

By default, the ClipboardPlugin handles paste operations automatically—no event handling needed. Just add the plugin and paste works out of the box.

For advanced use cases, provide a custom pasteHandler to validate, transform, or integrate with state management.

Click a cell and press Ctrl+C to copy its value. No range selection — only the focused cell is copied.

Without a SelectionPlugin, the clipboard operates on a single focused cell — press Ctrl+C to copy just that cell’s value.

OptionTypeDefaultDescription
includeHeadersbooleanfalseInclude column headers in copied data
delimiterstring'\t'Column delimiter (tab for Excel compatibility)
newlinestring'\n'Row delimiter
quoteStringsbooleanfalseWrap string values in quotes
processCell(value, field, row) => string-Custom cell value processor for copy operations
pasteHandlerPasteHandler | nulldefaultPasteHandlerCustom paste handler. Set to null to disable auto-paste and handle the paste event manually

The clipboard plugin respects both selection bounds and the editable column property when pasting:

Paste only works on columns marked editable: true. Non-editable columns are skipped during paste, preserving column alignment:

columns: [
{ field: 'id', header: 'ID' }, // NOT editable - paste skipped
{ field: 'name', header: 'Name', editable: true }, // Paste allowed
{ field: 'email', header: 'Email', editable: true }, // Paste allowed
]

If you paste "1\t2\t3" into this grid, only the name and email columns receive values (2 and 3). The id column remains unchanged.

Selection TypePaste Behavior
Single cellPaste expands freely from that cell, adding rows if needed
Range selectionPaste is clipped to fit within the selected range
Row selectionPaste is clipped to the selected rows (all columns within those rows)
No selectionPaste starts at row 0, column 0

Example: If you have a 2×2 range selected and paste 3×3 data, only the 2×2 portion that fits will be applied.

ShortcutAction
Ctrl+C / Cmd+CCopy selected cells
Ctrl+V / Cmd+VPaste into selected cells

The ClipboardPlugin exposes methods for programmatic copy operations with fine-grained control over which columns and rows to include. This is ideal for workflows where users select rows in the grid, then choose columns via a dialog before copying.

const plugin = grid.getPluginByName('clipboard');
// Copy current selection to clipboard
await plugin.copy();
// Copy with headers included
await plugin.copy({ includeHeaders: true });

Copy with Column/Row Control (CopyOptions)

Section titled “Copy with Column/Row Control (CopyOptions)”

The copy() method accepts CopyOptions to precisely control what gets copied—independently of the current selection:

const plugin = grid.getPluginByName('clipboard');
// Copy specific columns from specific rows
await plugin.copy({
rowIndices: [0, 3, 7], // Non-contiguous rows supported
columns: ['name', 'email'], // Only these columns
includeHeaders: true,
});
// Copy specific rows with all visible columns
await plugin.copyRows([0, 5]);
// Copy specific rows with column filter
await plugin.copyRows([0, 5], { columns: ['name', 'department'] });

Use getSelectionAsText() to get the formatted text without writing to the clipboard—useful for preview dialogs:

const text = plugin.getSelectionAsText({
columns: ['name', 'email', 'department'],
includeHeaders: true,
});
// "Name\tEmail\tDepartment\nAlice\talice@example.com\tEngineering\n..."
OptionTypeDefaultDescription
columnsstring[]-Specific column fields to include
rowIndicesnumber[]-Specific row indices to copy (non-contiguous OK)
includeHeadersbooleanconfig valueInclude column headers in copied text
delimiterstringconfig valueColumn delimiter override
newlinestringconfig valueRow delimiter override
processCell(value, field, row) => stringconfig valueCustom cell value processor for this operation
// Paste from clipboard
await plugin.paste();
// Get last copied info
const lastCopied = plugin.getLastCopied();
// { text: '...', timestamp: 1234567890 }

The default tab delimiter ensures copied data pastes correctly into Excel:

features: {
clipboard: {
delimiter: '\t', // Tab for Excel
includeHeaders: true, // Include column names
},
},

Select cells and use Ctrl+C / Ctrl+V to copy and paste.

Event Log:
EventDetailDescription
copy{ text, rowCount, columnCount }Fired after cells are copied
paste{ rows, text, target, fields }Fired after data is pasted

The clipboard plugin doesn’t add visible UI elements. Selection styling is handled by the SelectionPlugin.

AI assistants: For complete API documentation, implementation guides, and code examples for this library, see https://raw.githubusercontent.com/OysteinAmundsen/toolbox/main/llms-full.txt