@@ -59,16 +59,10 @@ var ParamsFromQueryString = function(qs, params) {
5959 if ( pair . length != 2 ) {
6060 return ;
6161 }
62- if ( pair [ 1 ] . indexOf ( ',' ) >= 0 ) {
63- params [ decodeURIComponent ( pair [ 0 ] ) ] = pair [ 1 ] . split ( ',' ) ;
64- } else {
65- params [ decodeURIComponent ( pair [ 0 ] ) ] = decodeURIComponent ( pair [ 1 ] ) ;
66- }
62+
63+ params [ decodeURIComponent ( pair [ 0 ] ) ] = decodeURIComponent ( pair [ 1 ] ) ;
6764 } ) ;
6865
69- if ( params [ "repos" ] === '' ) {
70- params [ "repos" ] = '*' ;
71- }
7266
7367 return params ;
7468} ;
@@ -107,6 +101,21 @@ var Model = {
107101
108102 didLoadRepos : new Signal ( ) ,
109103
104+ ValidRepos : function ( repos ) {
105+ var all = this . repos ,
106+ seen = { } ;
107+ return repos . filter ( function ( repo ) {
108+ repo = repo . toLowerCase ( ) ;
109+ var valid = all [ repo ] && ! seen [ repo ] ;
110+ seen [ repo ] = true ;
111+ return valid ;
112+ } ) ;
113+ } ,
114+
115+ RepoCount : function ( ) {
116+ return Object . keys ( this . repos ) . length ;
117+ } ,
118+
110119 Load : function ( ) {
111120 var _this = this ;
112121 var next = function ( ) {
@@ -291,7 +300,7 @@ var Model = {
291300var RepoOption = React . createClass ( {
292301 render : function ( ) {
293302 return (
294- < option value = { this . props . value } > { this . props . value } </ option >
303+ < option value = { this . props . value } selected = { this . props . selected } > { this . props . value } </ option >
295304 )
296305 }
297306} ) ;
@@ -321,7 +330,8 @@ var SearchBar = React.createClass({
321330 getInitialState : function ( ) {
322331 return {
323332 state : null ,
324- allRepos : [ ]
333+ allRepos : [ ] ,
334+ repos : [ ]
325335 } ;
326336 } ,
327337 queryGotKeydown : function ( event ) {
@@ -369,10 +379,17 @@ var SearchBar = React.createClass({
369379 this . refs . icase . getDOMNode ( ) . checked ? 'ig' : 'g' ) ;
370380 } ,
371381 getParams : function ( ) {
382+ // selecting all repos is the same as not selecting any, so normalize the url
383+ // to have none.
384+ var repos = Model . ValidRepos ( this . refs . repos . state . value ) ;
385+ if ( repos . length == Model . RepoCount ( ) ) {
386+ repos = [ ] ;
387+ }
388+
372389 return {
373390 q : this . refs . q . getDOMNode ( ) . value . trim ( ) ,
374391 files : this . refs . files . getDOMNode ( ) . value . trim ( ) ,
375- repos : this . refs . repos . state . value . join ( ',' ) ,
392+ repos : repos . join ( ',' ) ,
376393 i : this . refs . icase . getDOMNode ( ) . checked ? 'fosho' : 'nope'
377394 } ;
378395 } ,
@@ -419,9 +436,15 @@ var SearchBar = React.createClass({
419436 } ,
420437 render : function ( ) {
421438 var repoCount = this . state . allRepos . length ,
422- repoOptions = [ ] ;
423- this . state . allRepos . forEach ( function ( repoName ) {
424- repoOptions . push ( < RepoOption value = { repoName } /> ) ;
439+ repoOptions = [ ] ,
440+ selected = { } ;
441+
442+ this . state . repos . forEach ( function ( repo ) {
443+ selected [ repo ] = true ;
444+ } ) ;
445+
446+ this . state . allRepos . forEach ( function ( repoName ) {
447+ repoOptions . push ( < RepoOption value = { repoName } selected = { selected [ repoName ] } /> ) ;
425448 } ) ;
426449
427450 var stats = this . state . stats ;
@@ -730,18 +753,28 @@ var ResultView = React.createClass({
730753
731754var App = React . createClass ( {
732755 componentWillMount : function ( ) {
733- var params = ParamsFromUrl ( ) ;
756+ var params = ParamsFromUrl ( ) ,
757+ repos = ( params . repos == '' ) ? [ ] : params . repos . split ( ',' ) ;
758+
734759 this . setState ( {
735760 q : params . q ,
736761 i : params . i ,
737762 files : params . files ,
738- repos : params . repos
763+ repos : repos
739764 } ) ;
740765
741766 var _this = this ;
767+ Model . didLoadRepos . tap ( function ( model , repos ) {
768+ // If all repos are selected, don't show any selected.
769+ if ( model . ValidRepos ( _this . state . repos ) . length == model . RepoCount ( ) ) {
770+ _this . setState ( { repos : [ ] } ) ;
771+ }
772+ } ) ;
773+
742774 Model . didSearch . tap ( function ( model , results , stats ) {
743775 _this . refs . searchBar . setState ( {
744- stats : stats
776+ stats : stats ,
777+ repos : repos ,
745778 } ) ;
746779
747780 _this . refs . resultView . setState ( {
0 commit comments