@@ -11,8 +11,17 @@ export default class Remove extends getBaseAdapterProcess(AdapterProcess.remove)
11
11
return ;
12
12
}
13
13
14
+ const shouldRemove = Remove . removeItems ( scroller , params ) ;
15
+
16
+ scroller . workflow . call ( {
17
+ process : Remove . process ,
18
+ status : shouldRemove ? ProcessStatus . next : ProcessStatus . done
19
+ } ) ;
20
+ }
21
+
22
+ static removeItems ( scroller : Scroller , params : AdapterRemoveOptions , sequenceOnly = false ) : boolean {
14
23
const shouldRemove = Remove . removeBufferedItems ( scroller , params ) ;
15
- const shouldRemoveVirtual = Remove . removeVirtualItems ( scroller , params ) ;
24
+ const shouldRemoveVirtual = Remove . removeVirtualItems ( scroller , params , sequenceOnly ) ;
16
25
17
26
if ( shouldRemove || shouldRemoveVirtual ) {
18
27
const { clip } = scroller . state ;
@@ -25,10 +34,7 @@ export default class Remove extends getBaseAdapterProcess(AdapterProcess.remove)
25
34
}
26
35
}
27
36
28
- scroller . workflow . call ( {
29
- process : Remove . process ,
30
- status : shouldRemove || shouldRemoveVirtual ? ProcessStatus . next : ProcessStatus . done
31
- } ) ;
37
+ return shouldRemove || shouldRemoveVirtual ;
32
38
}
33
39
34
40
static removeBufferedItems ( scroller : Scroller , options : AdapterRemoveOptions ) : boolean {
@@ -68,26 +74,32 @@ export default class Remove extends getBaseAdapterProcess(AdapterProcess.remove)
68
74
return result ;
69
75
}
70
76
71
- static removeVirtualItems ( scroller : Scroller , options : AdapterRemoveOptions ) : boolean {
72
- const { indexes } = options ;
73
- let result = false ;
77
+ static removeVirtualItems ( scroller : Scroller , { indexes } : AdapterRemoveOptions , sequenceOnly : boolean ) : boolean {
74
78
if ( ! indexes ) {
75
79
return false ;
76
80
}
81
+ let last = null ;
77
82
const { state : { clip } } = scroller ;
78
83
const { finiteAbsMinIndex, firstIndex, finiteAbsMaxIndex, lastIndex } = scroller . buffer ;
79
- for ( let i = indexes . length - 1 ; i >= 0 ; i -- ) {
84
+ for ( let i = 0 , len = indexes . length ; i < len ; i ++ ) {
85
+ let dir = null ;
80
86
const index = indexes [ i ] ;
81
87
if ( index >= finiteAbsMinIndex && firstIndex !== null && index < firstIndex ) {
82
- clip . virtual . backward . push ( index ) ;
83
- result = true ;
88
+ dir = Direction . backward ;
84
89
}
85
90
if ( index <= finiteAbsMaxIndex && lastIndex !== null && index > lastIndex ) {
86
- clip . virtual . forward . push ( index ) ;
87
- result = true ;
91
+ dir = Direction . forward ;
92
+ }
93
+ if ( dir !== null ) {
94
+ if ( sequenceOnly && last !== null && Math . abs ( last - index ) > 1 ) {
95
+ // allow only first strict uninterrupted sequence
96
+ break ;
97
+ }
98
+ clip . virtual [ dir ] . push ( index ) ;
99
+ last = index ;
88
100
}
89
101
}
90
- return result ;
102
+ return last !== null ;
91
103
}
92
104
93
105
}
0 commit comments