2
2
import { useProxiedModel } from '@/composables/proxiedModel'
3
3
4
4
// Utilities
5
- import { computed , inject , provide } from 'vue'
5
+ import { computed , inject , provide , ref , shallowRef } from 'vue'
6
6
import { deepEqual , propsFactory , wrapInArray } from '@/util'
7
7
8
8
// Types
@@ -122,6 +122,8 @@ export function provideSelection (
122
122
}
123
123
} )
124
124
125
+ const lastSelectedIndex = shallowRef < number | null > ( null )
126
+
125
127
function isSelected ( items : SelectableItem | SelectableItem [ ] ) {
126
128
return wrapInArray ( items ) . every ( item => selected . value . has ( item . value ) )
127
129
}
@@ -140,8 +142,20 @@ export function provideSelection (
140
142
selected . value = newSelected
141
143
}
142
144
143
- function toggleSelect ( item : SelectableItem ) {
144
- select ( [ item ] , ! isSelected ( [ item ] ) )
145
+ function toggleSelect ( item : SelectableItem , index ?: number , event ?: MouseEvent ) {
146
+ const items = [ ]
147
+ index = index ?? allItems . value . findIndex ( i => i . value === item . value )
148
+
149
+ if ( props . selectStrategy !== 'single' && event ?. shiftKey && lastSelectedIndex . value !== null ) {
150
+ const [ start , end ] = [ lastSelectedIndex . value , index ] . sort ( ( a , b ) => a - b )
151
+
152
+ items . push ( ...allItems . value . slice ( start , end + 1 ) )
153
+ } else {
154
+ items . push ( item )
155
+ lastSelectedIndex . value = index
156
+ }
157
+
158
+ select ( items , ! isSelected ( [ item ] ) )
145
159
}
146
160
147
161
function selectAll ( value : boolean ) {
@@ -174,6 +188,8 @@ export function provideSelection (
174
188
someSelected,
175
189
allSelected,
176
190
showSelectAll,
191
+ lastSelectedIndex,
192
+ selectStrategy,
177
193
}
178
194
179
195
provide ( VDataTableSelectionSymbol , data )
0 commit comments