Fix scroll state not resetting
This commit is contained in:
parent
c2b41ac55a
commit
567e43046e
|
@ -50,6 +50,15 @@
|
||||||
rows.length
|
rows.length
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Reset state when data chanegs
|
||||||
|
$: data.length, reset()
|
||||||
|
const reset = () => {
|
||||||
|
nextScrollTop = 0
|
||||||
|
scrollTop = 0
|
||||||
|
clearTimeout(timeout)
|
||||||
|
timeout = null
|
||||||
|
}
|
||||||
|
|
||||||
const getVisibleRowCount = (loaded, height, allRows, rowCount) => {
|
const getVisibleRowCount = (loaded, height, allRows, rowCount) => {
|
||||||
if (!loaded) {
|
if (!loaded) {
|
||||||
return rowCount || 0
|
return rowCount || 0
|
||||||
|
@ -175,128 +184,129 @@
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div class="wrapper" bind:offsetHeight={height}>
|
||||||
bind:offsetHeight={height}
|
|
||||||
on:scroll={onScroll}
|
|
||||||
class:quiet
|
|
||||||
style={`--row-height: ${rowHeight}px; --header-height: ${headerHeight}px;`}
|
|
||||||
class="container">
|
|
||||||
{#if !loaded}
|
{#if !loaded}
|
||||||
<div class="loading" style={contentStyle} />
|
<div class="loading" style={contentStyle} />
|
||||||
{:else}
|
{:else}
|
||||||
<div style={contentStyle}>
|
<div
|
||||||
<table class="spectrum-Table" class:spectrum-Table--quiet={quiet}>
|
on:scroll={onScroll}
|
||||||
{#if sortedRows?.length}
|
class:quiet
|
||||||
<thead class="spectrum-Table-head">
|
style={`--row-height: ${rowHeight}px; --header-height: ${headerHeight}px;`}
|
||||||
<tr>
|
class="container">
|
||||||
{#if showEditColumn}
|
<div style={contentStyle}>
|
||||||
<th class="spectrum-Table-headCell">
|
<table class="spectrum-Table" class:spectrum-Table--quiet={quiet}>
|
||||||
<div class="spectrum-Table-headCell-content">
|
|
||||||
{editColumnTitle || ''}
|
|
||||||
</div>
|
|
||||||
</th>
|
|
||||||
{/if}
|
|
||||||
{#each fields as field}
|
|
||||||
<th
|
|
||||||
class="spectrum-Table-headCell"
|
|
||||||
class:is-sortable={field.sortable !== false}
|
|
||||||
class:is-sorted-desc={sortColumn === field && sortOrder === 'Descending'}
|
|
||||||
class:is-sorted-asc={sortColumn === field && sortOrder === 'Ascending'}
|
|
||||||
on:click={() => sortBy(schema[field])}>
|
|
||||||
<div class="spectrum-Table-headCell-content">
|
|
||||||
<div class="title">{getDisplayName(schema[field])}</div>
|
|
||||||
{#if schema[field]?.autocolumn}
|
|
||||||
<svg
|
|
||||||
class="spectrum-Icon spectrum-Table-autoIcon"
|
|
||||||
focusable="false">
|
|
||||||
<use xlink:href="#spectrum-icon-18-MagicWand" />
|
|
||||||
</svg>
|
|
||||||
{/if}
|
|
||||||
{#if sortColumn === field}
|
|
||||||
<svg
|
|
||||||
class="spectrum-Icon spectrum-UIIcon-ArrowDown100 spectrum-Table-sortedIcon"
|
|
||||||
focusable="false"
|
|
||||||
aria-hidden="true">
|
|
||||||
<use xlink:href="#spectrum-css-icon-Arrow100" />
|
|
||||||
</svg>
|
|
||||||
{/if}
|
|
||||||
{#if allowEditColumns && schema[field]?.editable !== false}
|
|
||||||
<svg
|
|
||||||
class="spectrum-Icon spectrum-Table-editIcon"
|
|
||||||
focusable="false"
|
|
||||||
on:click={e => editColumn(e, field)}>
|
|
||||||
<use xlink:href="#spectrum-icon-18-Edit" />
|
|
||||||
</svg>
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</th>
|
|
||||||
{/each}
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
{/if}
|
|
||||||
<tbody class="spectrum-Table-body">
|
|
||||||
{#if sortedRows?.length}
|
{#if sortedRows?.length}
|
||||||
{#each sortedRows as row, idx}
|
<thead class="spectrum-Table-head">
|
||||||
<tr
|
<tr>
|
||||||
on:click={() => toggleSelectRow(row)}
|
{#if showEditColumn}
|
||||||
class="spectrum-Table-row"
|
<th class="spectrum-Table-headCell">
|
||||||
class:hidden={idx < firstVisibleRow || idx > lastVisibleRow}>
|
<div class="spectrum-Table-headCell-content">
|
||||||
{#if idx >= firstVisibleRow && idx <= lastVisibleRow}
|
{editColumnTitle || ''}
|
||||||
{#if showEditColumn}
|
</div>
|
||||||
<td
|
</th>
|
||||||
class="spectrum-Table-cell spectrum-Table-cell--divider">
|
|
||||||
<div class="spectrum-Table-cell-content">
|
|
||||||
<SelectEditRenderer
|
|
||||||
data={row}
|
|
||||||
selected={selectedRows.includes(row)}
|
|
||||||
onToggleSelection={() => toggleSelectRow(row)}
|
|
||||||
onEdit={e => editRow(e, row)}
|
|
||||||
{allowSelectRows}
|
|
||||||
{allowEditRows} />
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
{/if}
|
|
||||||
{#each fields as field}
|
|
||||||
<td class="spectrum-Table-cell">
|
|
||||||
<div class="spectrum-Table-cell-content">
|
|
||||||
<CellRenderer
|
|
||||||
{customRenderers}
|
|
||||||
{row}
|
|
||||||
schema={schema[field]}
|
|
||||||
value={row[field]}
|
|
||||||
on:clickrelationship>
|
|
||||||
<slot />
|
|
||||||
</CellRenderer>
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
{/each}
|
|
||||||
{/if}
|
{/if}
|
||||||
|
{#each fields as field}
|
||||||
|
<th
|
||||||
|
class="spectrum-Table-headCell"
|
||||||
|
class:is-sortable={schema[field].sortable !== false}
|
||||||
|
class:is-sorted-desc={sortColumn === field && sortOrder === 'Descending'}
|
||||||
|
class:is-sorted-asc={sortColumn === field && sortOrder === 'Ascending'}
|
||||||
|
on:click={() => sortBy(schema[field])}>
|
||||||
|
<div class="spectrum-Table-headCell-content">
|
||||||
|
<div class="title">{getDisplayName(schema[field])}</div>
|
||||||
|
{#if schema[field]?.autocolumn}
|
||||||
|
<svg
|
||||||
|
class="spectrum-Icon spectrum-Table-autoIcon"
|
||||||
|
focusable="false">
|
||||||
|
<use xlink:href="#spectrum-icon-18-MagicWand" />
|
||||||
|
</svg>
|
||||||
|
{/if}
|
||||||
|
{#if sortColumn === field}
|
||||||
|
<svg
|
||||||
|
class="spectrum-Icon spectrum-UIIcon-ArrowDown100 spectrum-Table-sortedIcon"
|
||||||
|
focusable="false"
|
||||||
|
aria-hidden="true">
|
||||||
|
<use xlink:href="#spectrum-css-icon-Arrow100" />
|
||||||
|
</svg>
|
||||||
|
{/if}
|
||||||
|
{#if allowEditColumns && schema[field]?.editable !== false}
|
||||||
|
<svg
|
||||||
|
class="spectrum-Icon spectrum-Table-editIcon"
|
||||||
|
focusable="false"
|
||||||
|
on:click={e => editColumn(e, field)}>
|
||||||
|
<use xlink:href="#spectrum-icon-18-Edit" />
|
||||||
|
</svg>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
</th>
|
||||||
|
{/each}
|
||||||
</tr>
|
</tr>
|
||||||
{/each}
|
</thead>
|
||||||
{:else}
|
|
||||||
<div class="placeholder">
|
|
||||||
<svg
|
|
||||||
class="spectrum-Icon spectrum-Icon--sizeXXL"
|
|
||||||
focusable="false">
|
|
||||||
<use xlink:href="#spectrum-icon-18-Table" />
|
|
||||||
</svg>
|
|
||||||
<div>No rows found</div>
|
|
||||||
</div>
|
|
||||||
{/if}
|
{/if}
|
||||||
</tbody>
|
<tbody class="spectrum-Table-body">
|
||||||
</table>
|
{#if sortedRows?.length}
|
||||||
|
{#each sortedRows as row, idx}
|
||||||
|
<tr
|
||||||
|
on:click={() => toggleSelectRow(row)}
|
||||||
|
class="spectrum-Table-row"
|
||||||
|
class:hidden={idx < firstVisibleRow || idx > lastVisibleRow}>
|
||||||
|
{#if idx >= firstVisibleRow && idx <= lastVisibleRow}
|
||||||
|
{#if showEditColumn}
|
||||||
|
<td
|
||||||
|
class="spectrum-Table-cell spectrum-Table-cell--divider">
|
||||||
|
<div class="spectrum-Table-cell-content">
|
||||||
|
<SelectEditRenderer
|
||||||
|
data={row}
|
||||||
|
selected={selectedRows.includes(row)}
|
||||||
|
onToggleSelection={() => toggleSelectRow(row)}
|
||||||
|
onEdit={e => editRow(e, row)}
|
||||||
|
{allowSelectRows}
|
||||||
|
{allowEditRows} />
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
{/if}
|
||||||
|
{#each fields as field}
|
||||||
|
<td class="spectrum-Table-cell">
|
||||||
|
<div class="spectrum-Table-cell-content">
|
||||||
|
<CellRenderer
|
||||||
|
{customRenderers}
|
||||||
|
{row}
|
||||||
|
schema={schema[field]}
|
||||||
|
value={row[field]}
|
||||||
|
on:clickrelationship>
|
||||||
|
<slot />
|
||||||
|
</CellRenderer>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
{/each}
|
||||||
|
{/if}
|
||||||
|
</tr>
|
||||||
|
{/each}
|
||||||
|
{:else}
|
||||||
|
<div class="placeholder">
|
||||||
|
<svg
|
||||||
|
class="spectrum-Icon spectrum-Icon--sizeXXL"
|
||||||
|
focusable="false">
|
||||||
|
<use xlink:href="#spectrum-icon-18-Table" />
|
||||||
|
</svg>
|
||||||
|
<div>No rows found</div>
|
||||||
|
</div>
|
||||||
|
{/if}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.loading,
|
.wrapper {
|
||||||
.container,
|
|
||||||
th {
|
|
||||||
background-color: var(--spectrum-global-color-gray-100);
|
background-color: var(--spectrum-global-color-gray-100);
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
|
height: 100%;
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
border: 1px solid
|
border: 1px solid
|
||||||
|
@ -358,6 +368,7 @@
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
background-color: var(--spectrum-global-color-gray-100);
|
||||||
}
|
}
|
||||||
.spectrum-Table-headCell-content {
|
.spectrum-Table-headCell-content {
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
Loading…
Reference in New Issue