@@ -69,14 +69,15 @@ export default function AddTabDialog(props: AddTabDialogProps) {
6969 ! props . currentTabs . some ( tab => tab . key === item . path )
7070 ) ;
7171
72- const selectedModules = allItems . filter ( item =>
73- props . currentTabs . some ( tab => tab . key === item . path )
74- ) ;
72+ // Preserve the order from currentTabs for selectedModules
73+ const selectedModules = props . currentTabs
74+ . map ( tab => allItems . find ( item => item . path === tab . key ) )
75+ . filter ( item => item !== undefined ) as Module [ ] ;
7576
7677 setAvailableItems ( availableModules ) ;
7778 setSelectedItems ( selectedModules ) ;
7879 }
79- } , [ props . project , props . currentTabs ] ) ;
80+ } , [ props . project , props . currentTabs , props . isOpen ] ) ;
8081
8182 const handleAddNewItem = async ( ) => {
8283 let trimmedName = newItemName . trim ( ) ;
@@ -113,9 +114,10 @@ export default function AddTabDialog(props: AddTabDialogProps) {
113114 } ;
114115
115116 const handleSelectItem = ( item : Module ) => {
116- if ( ! selectedItems . includes ( item ) ) {
117+ const existingItem = selectedItems . find ( i => i . path === item . path ) ;
118+ if ( ! existingItem ) {
117119 setSelectedItems ( [ ...selectedItems , item ] ) ;
118- setAvailableItems ( availableItems . filter ( i => i !== item ) ) ;
120+ setAvailableItems ( availableItems . filter ( i => i . path !== item . path ) ) ;
119121 }
120122 } ;
121123
@@ -179,6 +181,7 @@ export default function AddTabDialog(props: AddTabDialogProps) {
179181 availableItems = { availableItems }
180182 handleSelectItem = { handleSelectItem }
181183 storage = { props . storage }
184+ buttonLabel = { t ( "New" ) }
182185 />
183186 </ div >
184187
@@ -218,6 +221,13 @@ export default function AddTabDialog(props: AddTabDialogProps) {
218221 dataSource = { filteredAvailableItems }
219222 renderItem = { ( item ) => (
220223 < Antd . List . Item
224+ draggable
225+ onDragStart = { ( e ) => {
226+ e . dataTransfer . setData ( 'application/json' , JSON . stringify ( {
227+ type : 'available' ,
228+ item : item
229+ } ) ) ;
230+ } }
221231 actions = { [
222232 < Antd . Button
223233 size = "small"
@@ -226,6 +236,7 @@ export default function AddTabDialog(props: AddTabDialogProps) {
226236 →
227237 </ Antd . Button >
228238 ] }
239+ style = { { cursor : 'grab' } }
229240 >
230241 < Antd . List . Item . Meta
231242 avatar = { TabTypeUtils . getIcon ( item . type ) }
@@ -256,7 +267,31 @@ export default function AddTabDialog(props: AddTabDialogProps) {
256267 { t ( "Shown" ) }
257268 </ h4 >
258269 < div style = { { height : 32 , marginBottom : 8 } } > </ div >
259- < div style = { { height : 200 , overflow : 'auto' , border : '1px solid #d9d9d9' } } >
270+ < div
271+ style = { { height : 200 , overflow : 'auto' , border : '1px solid #d9d9d9' } }
272+ onDragOver = { ( e ) => {
273+ e . preventDefault ( ) ;
274+ } }
275+ onDrop = { ( e ) => {
276+ e . preventDefault ( ) ;
277+ try {
278+ const dragData = JSON . parse ( e . dataTransfer . getData ( 'application/json' ) ) ;
279+ if ( dragData . type === 'available' ) {
280+ handleSelectItem ( dragData . item ) ;
281+ }
282+ } catch ( error ) {
283+ // Handle reordering within shown list
284+ const fromIndex = parseInt ( e . dataTransfer . getData ( 'text/plain' ) ) ;
285+ if ( ! isNaN ( fromIndex ) ) {
286+ // This is a reorder operation within the shown list
287+ const items = Array . from ( selectedItems ) ;
288+ const [ reorderedItem ] = items . splice ( fromIndex , 1 ) ;
289+ items . push ( reorderedItem ) ; // Add to end
290+ setSelectedItems ( items ) ;
291+ }
292+ }
293+ } }
294+ >
260295 { selectedItems . map ( ( item , index ) => (
261296 < div
262297 key = { item . path }
@@ -269,10 +304,31 @@ export default function AddTabDialog(props: AddTabDialogProps) {
269304 } }
270305 onDrop = { ( e ) => {
271306 e . preventDefault ( ) ;
307+ e . stopPropagation ( ) ;
308+
309+ // First check if it's an item from available list
310+ try {
311+ const dragData = JSON . parse ( e . dataTransfer . getData ( 'application/json' ) ) ;
312+ if ( dragData . type === 'available' ) {
313+ // Insert the available item at this position
314+ const existingItem = selectedItems . find ( i => i . path === dragData . item . path ) ;
315+ if ( ! existingItem ) {
316+ const newItems = Array . from ( selectedItems ) ;
317+ newItems . splice ( index , 0 , dragData . item ) ;
318+ setSelectedItems ( newItems ) ;
319+ setAvailableItems ( availableItems . filter ( i => i . path !== dragData . item . path ) ) ;
320+ }
321+ return ;
322+ }
323+ } catch ( error ) {
324+ // Not JSON data, continue with reordering logic
325+ }
326+
327+ // Handle reordering within shown list
272328 const fromIndex = parseInt ( e . dataTransfer . getData ( 'text/plain' ) ) ;
273329 const toIndex = index ;
274330
275- if ( fromIndex !== toIndex ) {
331+ if ( fromIndex !== toIndex && ! isNaN ( fromIndex ) ) {
276332 const items = Array . from ( selectedItems ) ;
277333 const [ reorderedItem ] = items . splice ( fromIndex , 1 ) ;
278334 items . splice ( toIndex , 0 , reorderedItem ) ;
0 commit comments