diff options
author | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-05-31 16:01:47 +0200 |
---|---|---|
committer | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-06-08 15:58:45 +0200 |
commit | 75dcf901ffe9ced33407a765a76874abb1698449 (patch) | |
tree | 0e5fba26e4994f9a9eefcb405f1876282c7bb5a2 | |
parent | fbceac9fe1c270945f697189eb9648423a6bd677 (diff) | |
download | nextcloud-server-75dcf901ffe9ced33407a765a76874abb1698449.tar.gz nextcloud-server-75dcf901ffe9ced33407a765a76874abb1698449.zip |
fix(files): Ensure that focussed file is always scrolled right
Ensure the correct file is scrolled if the content changes,
this also sets a minimal height to the virtual scrolling area
so that the `scrollTop` can be set.
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
-rw-r--r-- | apps/files/src/components/VirtualList.vue | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/apps/files/src/components/VirtualList.vue b/apps/files/src/components/VirtualList.vue index 3386924d928..22b54e560bf 100644 --- a/apps/files/src/components/VirtualList.vue +++ b/apps/files/src/components/VirtualList.vue @@ -146,9 +146,17 @@ export default Vue.extend({ return Math.floor(this.filesListWidth / this.itemWidth) }, + /** + * Index of the first item to be rendered + */ startIndex() { return Math.max(0, this.index - this.bufferItems) }, + + /** + * Number of items to be rendered at the same time + * For list view this is the same as `rowCount`, for grid view this is `rowCount` * `columnCount` + */ shownItems() { // If in grid mode, we need to multiply the number of rows by the number of columns if (this.gridMode) { @@ -157,6 +165,7 @@ export default Vue.extend({ return this.rowCount }, + renderedItems(): RecycledPoolItem[] { if (!this.isReady) { return [] @@ -185,6 +194,13 @@ export default Vue.extend({ }) }, + /** + * The total number of rows that are available + */ + totalRowCount() { + return Math.floor(this.dataSources.length / this.columnCount) + }, + tbodyStyle() { const isOverScrolled = this.startIndex + this.rowCount > this.dataSources.length const lastIndex = this.dataSources.length - this.startIndex - this.shownItems @@ -192,6 +208,7 @@ export default Vue.extend({ return { paddingTop: `${Math.floor(this.startIndex / this.columnCount) * this.itemHeight}px`, paddingBottom: isOverScrolled ? 0 : `${hiddenAfterItems * this.itemHeight}px`, + minHeight: `${this.totalRowCount * this.itemHeight + this.beforeHeight}px`, } }, }, @@ -199,6 +216,13 @@ export default Vue.extend({ scrollToIndex(index) { this.scrollTo(index) }, + + totalRowCount() { + if (this.scrollToIndex) { + this.$nextTick(() => this.scrollTo(this.scrollToIndex)) + } + }, + columnCount(columnCount, oldColumnCount) { if (oldColumnCount === 0) { // We're initializing, the scroll position |