@@ -227,6 +227,7 @@ export class UI {
227227 document . body . addEventListener ( 'contextmenu' , ( e ) => {
228228 e . preventDefault ( ) ;
229229 e . stopPropagation ( ) ;
230+ if ( ! this . isSidePanel ) this . openSettings ( ) ;
230231 return false ;
231232 } ) ;
232233
@@ -415,16 +416,18 @@ export class UI {
415416 if ( sourceElement === null || ! isDragEnabled ) return ;
416417 const currentTiles = Array . from ( grid . querySelectorAll ( tileClassNames ) ) ;
417418 const targetIdx = currentTiles . indexOf ( sourceElement ) ;
418- if ( sourceIdx !== targetIdx ) {
419- if ( tile . classList . contains ( 'folder' ) ) {
420- const itemId = sourceElement . dataset . id ;
421- const groupId = e . currentTarget . dataset . id ;
422- items [ sourceIdx ] . move ( )
423- grid . dispatchEvent ( new Event ( 'move' , { groupId, itemId } ) ) ;
424- } else {
425- grid . dispatchEvent ( new Event ( 'reorder' , { sourceIdx, targetIdx } ) ) ;
419+ const item = items [ sourceIdx ] ;
420+ const itemId = sourceElement . dataset . id ;
421+ const parentId = e . currentTarget . dataset . id ;
422+ if ( tile . classList . contains ( 'folder' ) && itemId !== parentId ) {
423+ if ( ! ( item instanceof Tab && item . url === '' ) ) {
424+ item . save ( { parentId : parentId } ) ; // move
426425 }
426+ } else if ( sourceIdx !== targetIdx ) {
427+ item . save ( { index : targetIdx } ) ; // reorder
427428 }
429+ tile . classList . remove ( 'dropping' ) ;
430+ sourceElement . style . opacity = 1 ;
428431 } ) ;
429432 } ) ;
430433 }
@@ -436,7 +439,6 @@ export class UI {
436439 }
437440
438441 handleTileEvent ( view , id , eventType , item ) {
439- console . log ( view , id , eventType , item ) ;
440442 if ( this . currentView !== view ) return ;
441443
442444 const isCurrentFolder = this . currentPath [ this . currentPath . length - 1 ] ?. id === id ;
@@ -453,23 +455,32 @@ export class UI {
453455 }
454456 return ;
455457 }
458+ return this . loadContent ( ) ;
456459
457460 const grid = document . getElementById ( 'grid' ) ;
458461 const oldTile = grid . querySelector ( `.tile[data-id="${ id } "]` ) ;
459462 const newTile = item ? this . createTile ( item ) : null ;
463+ const render = ( tile ) => {
464+ if ( ! item . index || item . index >= grid . children . length ) {
465+ grid . appendChild ( tile ) ;
466+ } else {
467+ grid . insertBefore ( tile , grid . children [ item . index ] ) ;
468+ }
469+ }
460470
461471 const isContentOfCurrentFolder = grid . dataset . parentId === item ?. parentId ;
462472 if ( isContentOfCurrentFolder ) {
463473 switch ( eventType ) {
464474 case 'created' :
465- grid . appendChild ( newTile ) ;
475+ render ( newTile ) ;
466476 break ;
467477
468478 case 'updated' :
469479 if ( oldTile ) { // updated inplace
470480 oldTile . innerHTML = newTile . innerHTML ;
481+ render ( oldTile ) ;
471482 } else { // probably moved here from another folder, so we need to create the tile here
472- grid . appendChild ( newTile ) ;
483+ render ( newTile ) ;
473484 }
474485 break ;
475486
@@ -486,8 +497,8 @@ export class UI {
486497 chrome . bookmarks ?. onCreated ?. addListener ( ( id , bookmark ) => this . handleTileEvent ( 'bookmarks' , null , 'created' , new Bookmark ( bookmark ) ) ) ;
487498 chrome . bookmarks ?. onChanged ?. addListener ( async ( id , changeInfo ) => this . handleTileEvent ( 'bookmarks' , id , 'updated' , ( await Bookmark . get ( id ) ) [ 0 ] ) ) ;
488499 chrome . bookmarks ?. onMoved ?. addListener ( async ( id , moveInfo ) => this . handleTileEvent ( 'bookmarks' , id , 'updated' , ( await Bookmark . get ( id ) ) [ 0 ] ) ) ;
500+ chrome . bookmarks ?. onChildrenReordered ?. addListener ( async ( id , reorderInfo ) => this . handleTileEvent ( 'bookmarks' , id , 'updated' , ( await Bookmark . get ( id ) ) [ 0 ] ) ) ;
489501 chrome . bookmarks ?. onRemoved ?. addListener ( ( id , removeInfo ) => this . handleTileEvent ( 'bookmarks' , id , 'removed' , null ) ) ;
490- // onChildrenReordered
491502
492503 chrome . readingList ?. onEntryAdded ?. addListener ( ( entry ) => this . handleTileEvent ( 'readingList' , null , 'created' , new Page ( entry ) ) ) ;
493504 chrome . readingList ?. onEntryUpdated ?. addListener ( ( entry ) => this . handleTileEvent ( 'readingList' , entry . url , 'updated' , new Page ( entry ) ) ) ;
@@ -498,11 +509,16 @@ export class UI {
498509 chrome . tabGroups ?. onMoved ?. addListener ( ( group ) => this . handleTileEvent ( 'tabGroups' , group . id , 'updated' , new Tab ( group ) ) ) ;
499510 chrome . tabGroups ?. onRemoved ?. addListener ( ( group ) => this . handleTileEvent ( 'tabGroups' , group . id , 'removed' , null ) ) ;
500511
512+ chrome . tabs ?. onAttached ?. addListener ( async ( id , attachInfo ) => this . handleTileEvent ( 'tabGroups' , null , 'created' , ( await Tab . get ( id ) ) [ 0 ] ) ) ;
501513 chrome . tabs ?. onCreated ?. addListener ( ( tab ) => this . handleTileEvent ( 'tabGroups' , null , 'created' , new Tab ( tab ) ) ) ;
502514 chrome . tabs ?. onUpdated ?. addListener ( ( id , changeInfo , tab ) => this . handleTileEvent ( 'tabGroups' , id , 'updated' , new Tab ( tab ) ) ) ;
503515 chrome . tabs ?. onMoved ?. addListener ( async ( id , moveInfo ) => this . handleTileEvent ( 'tabGroups' , id , 'updated' , ( await Tab . get ( id ) ) [ 0 ] ) ) ;
504516 chrome . tabs ?. onRemoved ?. addListener ( ( id , removeInfo ) => this . handleTileEvent ( 'tabGroups' , id , 'removed' , null ) ) ;
505- // onReplaced, onAttached, onDetached
517+ chrome . tabs ?. onDetached ?. addListener ( ( id , detachInfo ) => this . handleTileEvent ( 'tabGroups' , id , 'removed' , null ) ) ;
518+ chrome . tabs ?. onReplaced ?. addListener ( async ( addedTabId , removedTabId ) => {
519+ this . handleTileEvent ( 'tabGroups' , removedTabId , 'removed' , null ) ;
520+ this . handleTileEvent ( 'tabGroups' , null , 'created' , ( await Tab . get ( addedTabId ) ) [ 0 ] ) ;
521+ } ) ;
506522
507523 chrome . history ?. onVisited ?. addListener ( ( history ) => this . handleTileEvent ( 'history' , history . id , 'created' , new History ( history ) ) ) ;
508524 chrome . history ?. onVisitRemoved ?. addListener ( ( { allHistory, urls} ) => urls ?. forEach ( url => this . handleTileEvent ( 'history' , url , 'removed' , null ) ) ) ;
@@ -729,7 +745,7 @@ export class UI {
729745
730746 // MARK: Edit button
731747 createEditButton ( item ) {
732- if ( ( item instanceof Bookmark && item . parentId === '0' ) || ( item instanceof Page && ! item . url ) || item instanceof History || item instanceof TopSite || item instanceof Tab ) return ;
748+ if ( ( item instanceof Bookmark && item . parentId === '0' ) || item instanceof Page || item instanceof History || item instanceof TopSite ) return ;
733749
734750 let title = '' ;
735751 switch ( this . currentView ) {
@@ -759,7 +775,7 @@ export class UI {
759775
760776 // MARK: Delete button
761777 createDeleteButton ( item ) {
762- if ( ( item instanceof Bookmark && item . parentId === '0' ) || ( ( item instanceof Tab || item instanceof Page ) && ! item . url ) || item instanceof TopSite ) return ;
778+ if ( ( item instanceof Bookmark && item . parentId === '0' ) || ( item instanceof Page && ! item . url ) || item instanceof TopSite ) return ;
763779
764780 const deleteBtn = document . createElement ( 'button' ) ;
765781 deleteBtn . title = chrome . i18n . getMessage ( 'delete' ) ;
@@ -850,7 +866,7 @@ export class UI {
850866 const option = document . createElement ( 'option' ) ;
851867 option . value = item . id ;
852868 option . textContent = item . title ;
853- option . selected = ( defaultValue && defaultValue === item . id ) ? true : undefined ;
869+ option . selected = ( defaultValue && defaultValue == item . id ) ? true : undefined ;
854870 target . appendChild ( option ) ;
855871 }
856872 }
0 commit comments