diff --git a/common/lib/sort-sites.ts b/common/lib/sort-sites.ts index 27aa26c94d..d1aa919909 100644 --- a/common/lib/sort-sites.ts +++ b/common/lib/sort-sites.ts @@ -1,3 +1,18 @@ -export function sortSites< T extends { name: string } >( sites: T[] ): T[] { - return sites.sort( ( a, b ) => a.name.localeCompare( b.name, undefined, { numeric: true } ) ); +export function sortSites< T extends { name: string; sortOrder?: number } >( sites: T[] ): T[] { + return sites.sort( ( a, b ) => { + // If both have sortOrder, sort by sortOrder + if ( a.sortOrder !== undefined && b.sortOrder !== undefined ) { + return a.sortOrder - b.sortOrder; + } + // If only a has sortOrder, a comes first + if ( a.sortOrder !== undefined ) { + return -1; + } + // If only b has sortOrder, b comes first + if ( b.sortOrder !== undefined ) { + return 1; + } + // Neither has sortOrder, sort by name + return a.name.localeCompare( b.name, undefined, { numeric: true } ); + } ); } diff --git a/common/lib/tests/sort-sites.test.ts b/common/lib/tests/sort-sites.test.ts index 3d41b2d470..231fa05191 100644 --- a/common/lib/tests/sort-sites.test.ts +++ b/common/lib/tests/sort-sites.test.ts @@ -20,4 +20,36 @@ describe( 'sortSites', () => { 'Tristan', ] ); } ); + + it( 'should sort sites by sortOrder when available', () => { + const sites = [ + { name: 'Charlie', sortOrder: 3000 }, + { name: 'Alpha', sortOrder: 1000 }, + { name: 'Bravo', sortOrder: 2000 }, + ] as SiteDetails[]; + + const sortedSites = sortSites( sites ); + + expect( sortedSites.map( ( site ) => site.name ) ).toEqual( [ 'Alpha', 'Bravo', 'Charlie' ] ); + } ); + + it( 'should prioritize sortOrder over name', () => { + const sites = [ + { name: 'Zulu', sortOrder: 3000 }, + { name: 'Charlie' }, + { name: 'Alpha', sortOrder: 1000 }, + { name: 'Bravo' }, + { name: 'Beta', sortOrder: 2000 }, + ] as SiteDetails[]; + + const sortedSites = sortSites( sites ); + + expect( sortedSites.map( ( site ) => site.name ) ).toEqual( [ + 'Alpha', + 'Beta', + 'Zulu', + 'Bravo', + 'Charlie', + ] ); + } ); } ); diff --git a/src/components/site-menu.tsx b/src/components/site-menu.tsx index 542a317f03..76d0164746 100644 --- a/src/components/site-menu.tsx +++ b/src/components/site-menu.tsx @@ -2,7 +2,8 @@ import * as Sentry from '@sentry/electron/renderer'; import { speak } from '@wordpress/a11y'; import { Spinner } from '@wordpress/components'; import { __, sprintf } from '@wordpress/i18n'; -import { useEffect } from 'react'; +import { Icon, dragHandle } from '@wordpress/icons'; +import { useEffect, useState } from 'react'; import { XDebugIcon } from 'src/components/icons/xdebug-icon'; import { Tooltip } from 'src/components/tooltip'; import { useSyncSites } from 'src/hooks/sync-sites'; @@ -46,6 +47,7 @@ function ButtonToRun( { const classCircle = `rounded-full`; const triangle = (
  • onDragStart( e, index ) } + onDragOver={ ( e ) => onDragOver( e, index ) } + onDrop={ ( e ) => onDrop( e, index ) } + onDragEnd={ onDragEnd } > +