From b19a2a3d3a01fead26632757833c56e2c4cd2ac1 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 24 Nov 2022 16:41:53 +0000 Subject: [PATCH] Refactor to use IDs and support changing text values inline --- .../app/spreadsheet/Spreadsheet.svelte | 47 +++++++++++++------ .../app/spreadsheet/TextCell.svelte | 31 ++++++++++-- 2 files changed, 61 insertions(+), 17 deletions(-) diff --git a/packages/client/src/components/app/spreadsheet/Spreadsheet.svelte b/packages/client/src/components/app/spreadsheet/Spreadsheet.svelte index 72ce139e5e..40d9d130cb 100644 --- a/packages/client/src/components/app/spreadsheet/Spreadsheet.svelte +++ b/packages/client/src/components/app/spreadsheet/Spreadsheet.svelte @@ -21,6 +21,7 @@ let selectedCell let selectedRows = {} let horizontallyScrolled = false + let changeCache = {} $: query = LuceneUtils.buildLuceneQuery(filter) $: fetch = createFetch(table) @@ -89,8 +90,8 @@ return "Text" } - const selectRow = idx => { - selectedRows[idx] = !selectedRows[idx] + const selectRow = id => { + selectedRows[id] = !selectedRows[id] } const selectAll = () => { @@ -98,11 +99,27 @@ if (allSelected) { selectedRows = {} } else { - for (let i = 0; i < rowCount; i++) { - selectedRows[i] = true - } + $fetch.rows.forEach(row => { + selectedRows[row._id] = true + }) } } + + const handleChange = async (rowId, field, value) => { + selectedCell = null + let row = $fetch.rows.find(x => x._id === rowId) + if (!row) { + return + } + const newRow = { + ...row, + [field]: value, + } + changeCache[rowId] = { [field]: value } + await API.saveRow(newRow) + await fetch.refresh() + delete changeCache[rowId] + }
@@ -147,16 +164,17 @@ {/each} - {#each $fetch.rows as row, rowIdx} - {@const rowSelected = !!selectedRows[rowIdx]} - {@const rowHovered = hoveredRow === rowIdx} + {#each $fetch.rows as row, rowIdx (row._id)} + {@const rowSelected = !!selectedRows[row._id]} + {@const rowHovered = hoveredRow === row._id} + {@const data = { ...row, ...changeCache[row._id] }}
(hoveredRow = rowIdx)} - on:click={() => selectRow(rowIdx)} + on:mouseover={() => (hoveredRow = row._id)} + on:click={() => selectRow(row._id)} > {#if rowSelected || rowHovered} @@ -167,7 +185,7 @@ {/if}
{#each fields as field, fieldIdx} - {@const cellIdx = rowIdx * fields.length + fieldIdx} + {@const cellIdx = `${row._id}-${field}`}
(hoveredRow = rowIdx)} + on:mouseover={() => (hoveredRow = row._id)} on:click={() => (selectedCell = cellIdx)} > handleChange(row._id, field, val)} />
{/each} @@ -292,7 +311,7 @@ z-index: 2; } .cell.row-selected { - background-color: rgba(20, 122, 243, 0.05); + background-color: rgb(224, 242, 255); } .header { diff --git a/packages/client/src/components/app/spreadsheet/TextCell.svelte b/packages/client/src/components/app/spreadsheet/TextCell.svelte index c4ea345e8b..fb8b208831 100644 --- a/packages/client/src/components/app/spreadsheet/TextCell.svelte +++ b/packages/client/src/components/app/spreadsheet/TextCell.svelte @@ -1,10 +1,20 @@ -
- {value || ""} -
+{#if selected} + +{:else} +
+ {value || ""} +
+{/if}