@@ -4,12 +4,73 @@ export type IdeaData = {
44 id : string ;
55 text : string ;
66 count : number ;
7+ tags ?: string [ ] ;
8+ color ?: string ;
79} ;
810
911export function ideaDataToCRaterIdea ( ideaData : IdeaData ) : CRaterIdea {
10- return new CRaterIdea ( ideaData . id , undefined , ideaData . text ) ;
12+ return new CRaterIdea ( ideaData . id , undefined , ideaData . text , ideaData . tags ) ;
1113}
1214
1315export function cRaterIdeaToIdeaData ( cRaterIdea : CRaterIdea ) : IdeaData {
14- return { id : cRaterIdea . name , text : cRaterIdea . text , count : 0 } ;
16+ return { id : cRaterIdea . name , text : cRaterIdea . text , count : 0 , tags : cRaterIdea . tags } ;
17+ }
18+
19+ export function sortIdeasByCount ( ideas : IdeaData [ ] , sortOrder : 'asc' | 'desc' ) : IdeaData [ ] {
20+ return ideas . sort ( ( a , b ) => ( sortOrder === 'asc' ? a . count - b . count : b . count - a . count ) ) ;
21+ }
22+
23+ export function sortIdeasById ( ideas : IdeaData [ ] ) : IdeaData [ ] {
24+ const sorted = ideas
25+ . filter ( ( idea ) => ! stringContainsLetters ( idea . id ) )
26+ . sort ( ( a , b ) => Number ( a . id ) - Number ( b . id ) ) ;
27+ const sortedIdeasWithLetters = getSortedIdeasWithLetters ( ideas ) ;
28+ return insertIdeasWithLetters ( sorted , sortedIdeasWithLetters ) ;
29+ }
30+
31+ function getSortedIdeasWithLetters ( ideas : IdeaData [ ] ) : IdeaData [ ] {
32+ return ideas
33+ . filter ( ( idea ) => stringContainsLetters ( idea . id ) )
34+ . sort ( ( a , b ) => compareByStringNumericPrefix ( a , b ) ) ;
35+ }
36+
37+ function stringContainsLetters ( str : string ) : boolean {
38+ return Array . from ( str ) . some ( ( char ) => isNaN ( Number ( char ) ) ) ;
39+ }
40+
41+ function compareByStringNumericPrefix ( idea : IdeaData , otherIdea : IdeaData ) : number {
42+ const prefixDif = stringNumericPrefix ( idea . id ) - stringNumericPrefix ( otherIdea . id ) ;
43+ return prefixDif === 0 ? idea . id . localeCompare ( otherIdea . id ) : prefixDif ;
44+ }
45+
46+ function insertIdeasWithLetters (
47+ sorted : IdeaData [ ] ,
48+ sortedIdeasWithLetters : IdeaData [ ]
49+ ) : IdeaData [ ] {
50+ for ( let i = 0 ; i < sorted . length ; i ++ ) {
51+ while (
52+ sortedIdeasWithLetters . length > 0 &&
53+ Number ( sorted . at ( i ) . id ) > stringNumericPrefix ( sortedIdeasWithLetters . at ( 0 ) . id )
54+ ) {
55+ const ideaWithLetter = sortedIdeasWithLetters . at ( 0 ) ;
56+ sortedIdeasWithLetters = sortedIdeasWithLetters . slice ( 1 , sortedIdeasWithLetters . length ) ;
57+ sorted . splice ( i , 0 , ideaWithLetter ) ;
58+ i ++ ;
59+ }
60+ }
61+ return sorted ;
62+ }
63+
64+ function stringNumericPrefix ( str : string ) : number {
65+ let numericPrefix = '' ;
66+ const strArray = Array . from ( str ) ;
67+ for ( let charIndex = 0 ; charIndex < strArray . length ; charIndex ++ ) {
68+ const char = strArray . at ( charIndex ) ;
69+ if ( isNaN ( Number ( char ) ) ) {
70+ break ;
71+ } else {
72+ numericPrefix = numericPrefix . concat ( char ) ;
73+ }
74+ }
75+ return Number ( numericPrefix ) ;
1576}
0 commit comments