@@ -14,6 +14,8 @@ interface FileRankDialogProps {
1414}
1515
1616const FileRankDialog : React . FC < FileRankDialogProps > = ( { isOpen, onClose, files, onSelectFile, onCopyPath, onDeleteFile, onToggleExclude } ) => {
17+ const [ sortBy , setSortBy ] = React . useState < 'size' | 'name' | 'type' > ( 'size' ) ;
18+
1719 // Prevent interaction with background and handle Esc
1820 React . useEffect ( ( ) => {
1921 const handleKeyDown = ( e : KeyboardEvent ) => {
@@ -26,8 +28,17 @@ const FileRankDialog: React.FC<FileRankDialogProps> = ({ isOpen, onClose, files,
2628 } , [ isOpen , onClose ] ) ;
2729
2830 const sortedFiles = React . useMemo ( ( ) => {
29- return [ ...files ] . sort ( ( a , b ) => b . stats . chars - a . stats . chars ) ;
30- } , [ files ] ) ;
31+ const sorted = [ ...files ] ;
32+ if ( sortBy === 'size' ) {
33+ sorted . sort ( ( a , b ) => b . stats . chars - a . stats . chars ) ;
34+ } else if ( sortBy === 'name' ) {
35+ sorted . sort ( ( a , b ) => a . path . localeCompare ( b . path ) ) ;
36+ } else {
37+ const getExt = ( path : string ) => { const dot = path . lastIndexOf ( '.' ) ; return dot >= 0 ? path . slice ( dot ) : '' ; } ;
38+ sorted . sort ( ( a , b ) => getExt ( a . path ) . localeCompare ( getExt ( b . path ) ) || a . path . localeCompare ( b . path ) ) ;
39+ }
40+ return sorted ;
41+ } , [ files , sortBy ] ) ;
3142
3243 const maxChars = sortedFiles . length > 0 ? sortedFiles [ 0 ] . stats . chars : 0 ;
3344
@@ -72,6 +83,24 @@ const FileRankDialog: React.FC<FileRankDialogProps> = ({ isOpen, onClose, files,
7283 </ button >
7384 </ div >
7485
86+ { /* Sort Options */ }
87+ < div className = "flex items-center gap-1.5 px-6 py-2 border-b border-light-border dark:border-dark-border bg-light-bg/30 dark:bg-dark-bg/30 shrink-0" >
88+ < span className = "text-xs text-light-subtle-text dark:text-dark-subtle-text mr-1" > 排序:</ span >
89+ { ( [ [ 'size' , '大小' ] , [ 'name' , '名称' ] , [ 'type' , '类型' ] ] as const ) . map ( ( [ key , label ] ) => (
90+ < button
91+ key = { key }
92+ onClick = { ( ) => setSortBy ( key ) }
93+ className = { `px-2 py-0.5 rounded text-xs font-medium transition-colors ${
94+ sortBy === key
95+ ? 'bg-primary text-white'
96+ : 'bg-light-bg dark:bg-dark-bg text-light-subtle-text dark:text-dark-subtle-text hover:bg-light-border dark:hover:bg-dark-border'
97+ } `}
98+ >
99+ { label }
100+ </ button >
101+ ) ) }
102+ </ div >
103+
75104 { /* List */ }
76105 < div className = "flex-1 overflow-y-auto p-4 space-y-2" >
77106 { sortedFiles . length === 0 ? (
0 commit comments