diff --git a/packages/web/src/datagrid/DataGridCore.svelte b/packages/web/src/datagrid/DataGridCore.svelte index e786450db..c3dfe26cc 100644 --- a/packages/web/src/datagrid/DataGridCore.svelte +++ b/packages/web/src/datagrid/DataGridCore.svelte @@ -107,6 +107,14 @@ onClick: () => getCurrentDataGrid().editJsonDocument(), }); + registerCommand({ + id: 'dataGrid.copyJsonDocument', + category: 'Data grid', + name: 'Copy JSON document', + testEnabled: () => getCurrentDataGrid()?.copyJsonEnabled(), + onClick: () => getCurrentDataGrid().copyJsonDocument(), + }); + registerCommand({ id: 'dataGrid.filterSelected', category: 'Data grid', @@ -432,11 +440,21 @@ return grider.editable && isDynamicStructure && _.uniq(selectedCells.map(x => x[0])).length == 1; } + export function copyJsonEnabled() { + return isDynamicStructure && _.uniq(selectedCells.map(x => x[0])).length == 1; + } + export function editJsonDocument() { const rowIndex = selectedCells[0][0]; editJsonRowDocument(grider, rowIndex); } + export function copyJsonDocument() { + const rowIndex = selectedCells[0][0]; + const rowData = grider.getRowData(rowIndex); + copyTextToClipboard(JSON.stringify(rowData, undefined, 2)); + } + export function buildFindMenu() { const res = []; @@ -1104,6 +1122,7 @@ registerMenu( { command: 'dataGrid.refresh' }, { command: 'dataGrid.copyToClipboard' }, + { command: 'dataGrid.copyJsonDocument', hideDisabled: true }, { placeTag: 'switch' }, { divider: true }, { placeTag: 'save' }, @@ -1120,7 +1139,7 @@ { command: 'dataGrid.clearFilter' }, { command: 'dataGrid.undo' }, { command: 'dataGrid.redo' }, - { command: 'dataGrid.editJsonDocument' }, + { command: 'dataGrid.editJsonDocument', hideDisabled: true }, { divider: true }, { placeTag: 'export' }, { command: 'dataGrid.generateSqlFromData' }, diff --git a/packages/web/src/jsonview/CollectionJsonRow.svelte b/packages/web/src/jsonview/CollectionJsonRow.svelte index efc20e55d..93307f1ed 100644 --- a/packages/web/src/jsonview/CollectionJsonRow.svelte +++ b/packages/web/src/jsonview/CollectionJsonRow.svelte @@ -20,6 +20,7 @@ import EditJsonModal from '../modals/EditJsonModal.svelte'; import ErrorMessageModal from '../modals/ErrorMessageModal.svelte'; import { showModal } from '../modals/modalTools'; + import { copyTextToClipboard } from '../utility/clipboard'; import { getContextMenu, registerMenu } from '../utility/contextMenu'; export let rowIndex; @@ -32,7 +33,13 @@ editJsonRowDocument(grider, rowIndex); } + function handleCopyJsonDocument() { + const rowData = grider.getRowData(rowIndex); + copyTextToClipboard(JSON.stringify(rowData, undefined, 2)); + } + registerMenu([ + { text: 'Copy JSON document', onClick: handleCopyJsonDocument }, { text: 'Edit document', onClick: handleEditDocument }, { text: 'Delete document', onClick: () => grider.deleteRow(rowIndex) }, { text: 'Revert row changes', onClick: () => grider.revertRowChanges(rowIndex) },