@@ -18,6 +18,7 @@ import {
1818 BACKGROUND_BRIGHTNESS_OPTION_KEY ,
1919 BACKGROUND_IMAGE_OPTION_KEY ,
2020 BOARD_SCROLL_POSITION_KEY ,
21+ BOARD_SCROLL_TOP_POSITION_KEY ,
2122 COLUMN_ORDER_OPTION_KEY ,
2223 COLUMN_TRANSPARENCY_OPTION_KEY ,
2324 LOCAL_CARD_ORDER_OPTION_KEY ,
@@ -207,11 +208,11 @@ export class KanbanView extends BasesView {
207208
208209 this . refreshElementIndexes ( ) ;
209210
210- const scrollLeftToRestore =
211- previousBoardScrollLeft > 0
212- ? previousBoardScrollLeft
213- : this . loadBoardScrollPosition ( ) ;
214- this . restoreBoardScrollLeft ( scrollLeftToRestore ) ;
211+ const { scrollLeft : scrollLeftToRestore , scrollTop : scrollTopToRestore } =
212+ this . loadBoardScrollPosition ( ) ;
213+ const finalScrollLeft =
214+ previousBoardScrollLeft > 0 ? previousBoardScrollLeft : scrollLeftToRestore ;
215+ this . restoreBoardScrollPosition ( finalScrollLeft , scrollTopToRestore ) ;
215216 }
216217
217218 private getBoardScrollLeft ( ) : number {
@@ -225,53 +226,82 @@ export class KanbanView extends BasesView {
225226 return boardEl . scrollLeft ;
226227 }
227228
228- private restoreBoardScrollLeft ( scrollLeft : number ) : void {
229- if ( scrollLeft <= 0 ) {
230- return ;
231- }
232-
229+ private restoreBoardScrollPosition ( scrollLeft : number , scrollTop : number ) : void {
233230 const boardEl = this . rootEl . querySelector < HTMLElement > (
234231 ".bases-kanban-board" ,
235232 ) ;
236233 if ( boardEl === null ) {
237234 return ;
238235 }
239236
240- boardEl . scrollLeft = scrollLeft ;
237+ if ( scrollLeft > 0 ) {
238+ boardEl . scrollLeft = scrollLeft ;
239+ }
240+ if ( scrollTop > 0 ) {
241+ boardEl . scrollTop = scrollTop ;
242+ }
243+
241244 window . requestAnimationFrame ( ( ) => {
242245 if ( this . rootEl . contains ( boardEl ) ) {
243- boardEl . scrollLeft = scrollLeft ;
246+ if ( scrollLeft > 0 ) {
247+ boardEl . scrollLeft = scrollLeft ;
248+ }
249+ if ( scrollTop > 0 ) {
250+ boardEl . scrollTop = scrollTop ;
251+ }
244252 }
245253 } ) ;
246254 }
247255
248256 private setupBoardScrollListener ( boardEl : HTMLElement ) : void {
249257 boardEl . addEventListener ( "scroll" , ( ) => {
250- this . debouncedSaveBoardScrollPosition ( boardEl . scrollLeft ) ;
258+ this . debouncedSaveBoardScrollPosition (
259+ boardEl . scrollLeft ,
260+ boardEl . scrollTop ,
261+ ) ;
251262 } ) ;
252263 }
253264
254- private debouncedSaveBoardScrollPosition ( scrollLeft : number ) : void {
265+ private debouncedSaveBoardScrollPosition (
266+ scrollLeft : number ,
267+ scrollTop : number ,
268+ ) : void {
255269 if ( this . scrollSaveTimeout !== null ) {
256270 window . clearTimeout ( this . scrollSaveTimeout ) ;
257271 }
258272 this . scrollSaveTimeout = window . setTimeout ( ( ) => {
259- this . saveBoardScrollPosition ( scrollLeft ) ;
273+ this . saveBoardScrollPosition ( scrollLeft , scrollTop ) ;
260274 this . scrollSaveTimeout = null ;
261275 } , this . plugin . settings . scrollDebounceMs ) ;
262276 }
263277
264- private saveBoardScrollPosition ( scrollLeft : number ) : void {
278+ private saveBoardScrollPosition ( scrollLeft : number , scrollTop : number ) : void {
265279 this . config ?. set ( BOARD_SCROLL_POSITION_KEY , String ( scrollLeft ) ) ;
280+ this . config ?. set ( BOARD_SCROLL_TOP_POSITION_KEY , String ( scrollTop ) ) ;
266281 }
267282
268- private loadBoardScrollPosition ( ) : number {
269- const configValue = this . config ?. get ( BOARD_SCROLL_POSITION_KEY ) ;
270- if ( typeof configValue !== "string" || configValue . length === 0 ) {
271- return 0 ;
283+ private loadBoardScrollPosition ( ) : { scrollLeft : number ; scrollTop : number } {
284+ const scrollLeftValue = this . config ?. get ( BOARD_SCROLL_POSITION_KEY ) ;
285+ const scrollTopValue = this . config ?. get ( BOARD_SCROLL_TOP_POSITION_KEY ) ;
286+
287+ let scrollLeft = 0 ;
288+ let scrollTop = 0 ;
289+
290+ if ( typeof scrollLeftValue === "string" && scrollLeftValue . length > 0 ) {
291+ const parsedLeft = Number . parseInt ( scrollLeftValue , 10 ) ;
292+ if ( ! Number . isNaN ( parsedLeft ) ) {
293+ scrollLeft = parsedLeft ;
294+ }
272295 }
273- const parsed = Number . parseInt ( configValue , 10 ) ;
274- return Number . isNaN ( parsed ) ? 0 : parsed ;
296+
297+ if ( typeof scrollTopValue === "string" && scrollTopValue . length > 0 ) {
298+ const parsedTop = Number . parseInt ( scrollTopValue , 10 ) ;
299+ if ( ! Number . isNaN ( parsedTop ) ) {
300+ scrollTop = parsedTop ;
301+ }
302+ }
303+
304+ return { scrollLeft, scrollTop } ;
275305 }
276306
277307 private renderPlaceholder ( ) : void {
0 commit comments