diff --git a/src/renderer/components/WorkspaceTabQueryTable.vue b/src/renderer/components/WorkspaceTabQueryTable.vue index 5c028e6c..6925c1df 100644 --- a/src/renderer/components/WorkspaceTabQueryTable.vue +++ b/src/renderer/components/WorkspaceTabQueryTable.vue @@ -465,6 +465,42 @@ const copyRow = (format: string) => { navigator.clipboard.writeText(csv.join('\n')); } + else if (format === 'html') { + const arrayContent = new Array(); + if (!Array.isArray(contentToCopy)) contentToCopy = [contentToCopy]; + + for (const row of contentToCopy) + arrayContent.push(Object.values(row)); + + const htmlContent = createHtmlTable(arrayContent); + const htmlBlob = new Blob([htmlContent.outerHTML], { type: 'text/html' }); + const textBlob = new Blob([arrayContent.map(row => row.join(' ')).join('\n')], { type: 'text/plain' }); + const data = [new ClipboardItem({ + 'text/plain': textBlob, + 'text/html': htmlBlob + })]; + + navigator.clipboard.write(data); + } +}; + +const createHtmlTable = (tableData: Array) => { + const table = document.createElement('table'); + const tableBody = document.createElement('tbody'); + tableData.forEach(function (rowData: Array) { + const row = document.createElement('tr'); + + rowData.forEach(function (cellData: string) { + const cell = document.createElement('td'); + cell.appendChild(document.createTextNode(cellData)); + row.appendChild(cell); + }); + + tableBody.appendChild(row); + }); + + table.appendChild(tableBody); + return table; }; const fillCell = (event: { name: string; group: string; type: string }) => { diff --git a/src/renderer/components/WorkspaceTabQueryTableContext.vue b/src/renderer/components/WorkspaceTabQueryTableContext.vue index de9e303b..c1d13a4e 100644 --- a/src/renderer/components/WorkspaceTabQueryTableContext.vue +++ b/src/renderer/components/WorkspaceTabQueryTableContext.vue @@ -16,6 +16,11 @@ {{ t('word.cell', 1) }} +
+ + {{ t('word.row', selectedRows.length) }} (Table) + +
{{ t('word.row', selectedRows.length) }} (JSON)