@@ -143,15 +143,70 @@ const toolbarEditModeTab = (layout, tab, i) => {
143143 */
144144 const selectTab = ( ) => layout . selectTab ( i ) ;
145145
146+ const dragActiveClass = layout . isDragging ? 'pointer-events-auto' : '' ;
147+ const disableButtonsOnDragClass = layout . isDragging ? 'pointer-events-none' : '' ;
148+ const dropZoneClass = ( position ) => layout . dropTargetId === tab . id && layout . position === position ? 'active' : '' ;
149+
146150 return [
147- h ( '.btn-group.flex-fixed' , [
148- h ( 'button.br-pill.ph2.btn.btn-tab.whitespace-nowrap' , { class : linkClass , onclick : selectTab } , tab . name ) ,
149- selected && [
150- editTabButton ( layout , linkClass , tab , i ) ,
151- resizeGridTabDropDown ( layout , tab ) ,
152- deleteTabButton ( layout , linkClass , i ) ,
151+ h (
152+ '.btn-group.flex-fixed.relative.cursor-grab' ,
153+ {
154+ title : 'Drag the tab to re-arrange them' ,
155+ draggable : true ,
156+ ondragstart : ( e ) => {
157+ e . dataTransfer . setData ( 'text/plain' , tab . id ) ;
158+ layout . startDragging ( ) ;
159+ } ,
160+ ondrop : ( e ) => {
161+ layout . reorderTabs ( e . dataTransfer . getData ( 'text/plain' ) , layout . dropTargetId , layout . position ) ;
162+ layout . clearDropTarget ( ) ;
163+ layout . stopDragging ( ) ;
164+ } ,
165+ ondragend : ( ) => layout . stopDragging ( ) ,
166+ } ,
167+ [
168+ h (
169+ 'button.br-pill.ph2.btn.btn-tab.whitespace-nowrap' ,
170+ { id : 'btn-tab' , class : `${ linkClass } cursor-inherit` , onclick : selectTab } ,
171+ tab . name ,
172+ ) ,
173+ [
174+ h (
175+ '.drop-zone.before' ,
176+ {
177+ class : `${ dragActiveClass } ${ dropZoneClass ( 'before' ) } ` ,
178+ ondragenter : ( ) => layout . setDropTarget ( tab . id , 'before' ) ,
179+ ondragover : ( e ) => e . preventDefault ( ) , // prevent default to allow drop
180+ ondragleave : ( ) => {
181+ if ( layout . dropTargetId === tab . id && layout . position === 'before' ) {
182+ layout . clearDropTarget ( ) ;
183+ }
184+ } ,
185+ } ,
186+ '' ,
187+ ) ,
188+ h (
189+ '.drop-zone.after' ,
190+ {
191+ class : `${ dragActiveClass } ${ dropZoneClass ( 'after' ) } ` ,
192+ ondragenter : ( ) => layout . setDropTarget ( tab . id , 'after' ) ,
193+ ondragover : ( e ) => e . preventDefault ( ) , // prevent default to allow drop
194+ ondragleave : ( ) => {
195+ if ( layout . dropTargetId === tab . id && layout . position === 'after' ) {
196+ layout . clearDropTarget ( ) ;
197+ }
198+ } ,
199+ } ,
200+ '' ,
201+ ) ,
202+ selected && [
203+ editTabButton ( layout , `${ disableButtonsOnDragClass } ${ linkClass } ` , tab , i ) ,
204+ resizeGridTabDropDown ( layout , tab ) ,
205+ deleteTabButton ( layout , `${ disableButtonsOnDragClass } ${ linkClass } ` , i ) ,
206+ ] ,
207+ ] . flat ( ) . filter ( Boolean ) ,
153208 ] ,
154- ] ) ,
209+ ) ,
155210 ' ' ,
156211 ] ;
157212} ;
0 commit comments