@@ -4,7 +4,9 @@ import { connect } from "react-redux";
44
55import NodeSelect from "./NodeSelect" ;
66import Graph from "~/models/Graph" ;
7- import { searchGraph , clearAnswers } from "~/actions/controller" ;
7+ import DistanceType from "./DistanceType" ;
8+ import { searchGraph , clearAnswers , udpateAnswers } from "~/actions/controller" ;
9+ import { COLORS , DANGER_COLOR } from "~/constants" ;
810
911import styles from "./Searchbar.less" ;
1012
@@ -16,6 +18,59 @@ class Searchbar extends React.Component {
1618 return { ...state , selectedNodes } ;
1719 }
1820
21+ static getTransparentColor ( color ) {
22+ return `${ color } 0D` ;
23+ }
24+ 25+ static renderNoFound ( answer , index ) {
26+ const color = COLORS [ index ] ;
27+ return (
28+ < div
29+ key = { index }
30+ className = "alert"
31+ style = { {
32+ borderLeft : `5px solid ${ DANGER_COLOR } ` ,
33+ backgroundColor : Searchbar . getTransparentColor ( color ) ,
34+ } }
35+ >
36+ No path from { answer . start } to { answer . end } { " " }
37+ < i
38+ className = "fas fa-exclamation-circle"
39+ style = { { color : DANGER_COLOR } }
40+ />
41+ </ div >
42+ ) ;
43+ }
44+ 45+ static renderFound ( answer , index ) {
46+ const color = COLORS [ index ] ;
47+ const pathInfo = answer . path . reduce ( ( pthinf , node ) => {
48+ const arr = pthinf ;
49+ if ( arr . length ) {
50+ arr . push (
51+ < i
52+ className = "fas fa-arrow-circle-right"
53+ style = { { color : "#9E9E9E" } }
54+ /> ,
55+ ) ;
56+ }
57+ arr . push ( < span > { node . name } </ span > ) ;
58+ return arr ;
59+ } , [ ] ) ;
60+ return (
61+ < div
62+ key = { index }
63+ className = "alert"
64+ style = { {
65+ borderLeft : `5px solid ${ color } ` ,
66+ backgroundColor : Searchbar . getTransparentColor ( color ) ,
67+ } }
68+ >
69+ { pathInfo }
70+ </ div >
71+ ) ;
72+ }
73+ 1974 constructor ( props ) {
2075 super ( props ) ;
2176 this . state = this . getInitialState ( ) ;
@@ -29,7 +84,7 @@ class Searchbar extends React.Component {
2984
3085 setSelectedNodes ( selectedNodes ) {
3186 this . setState ( { selectedNodes } ) ;
32- clearAnswers ( ) ;
87+ udpateAnswers ( selectedNodes ) ;
3388 }
3489
3590 renderNodeSelect ( ) {
@@ -59,6 +114,20 @@ class Searchbar extends React.Component {
59114 ) ;
60115 }
61116
117+ renderClearNodeSelectButton ( ) {
118+ if ( this . props . answers ) return null ;
119+ return (
120+ < button
121+ className = "btn ml-2"
122+ onClick = { ( ) => {
123+ this . setSelectedNodes ( [ ] ) ;
124+ } }
125+ >
126+ Clear All
127+ </ button >
128+ ) ;
129+ }
130+ 62131 renderClearAnswersButton ( ) {
63132 if ( ! this . props . answers ) return null ;
64133 return (
@@ -75,35 +144,42 @@ class Searchbar extends React.Component {
75144
76145 renderAnswers ( ) {
77146 if ( ! this . props . answers ) return null ;
78- return this . props . answers . map ( ( answer , index ) => {
147+ const answersDOM = this . props . answers . map ( ( answer , index ) => {
79148 if ( ! answer . path ) {
80- return (
81- < div key = { index } className = "alert alert-warning" >
82- No path from { answer . start } to { answer . end }
83- </ div >
84- ) ;
149+ return Searchbar . renderNoFound ( answer , index ) ;
85150 }
86- const pathInfo = answer . path . reduce ( ( pthinf , node ) => {
87- if ( ! pthinf ) return node . name ;
88- return `${ pthinf } > ${ node . name } ` ;
89- } , null ) ;
90- return (
91- < div key = { index } className = "alert alert-info" >
92- { pathInfo }
93- </ div >
94- ) ;
151+ return Searchbar . renderFound ( answer , index ) ;
95152 } ) ;
153+ return < div className = "mt-4" > { answersDOM } </ div > ;
154+ }
155+ 156+ renderDistanceType ( ) {
157+ return (
158+ < DistanceType
159+ onChange = { ( ) => {
160+ udpateAnswers ( this . state . selectedNodes ) ;
161+ } }
162+ />
163+ ) ;
164+ }
165+ 166+ renderButtons ( ) {
167+ return (
168+ < div className = "mt-4" >
169+ { this . renderSearchButton ( ) }
170+ { this . renderClearNodeSelectButton ( ) }
171+ { this . renderClearAnswersButton ( ) }
172+ </ div >
173+ ) ;
96174 }
97175
98176 render ( ) {
99177 return (
100178 < nav id = "searchbar" className = { styles . searchbar } >
101179 { this . renderNodeSelect ( ) }
102- < div className = "mt-4" >
103- { this . renderSearchButton ( ) }
104- { this . renderClearAnswersButton ( ) }
105- </ div >
106- < div className = "mt-4" > { this . renderAnswers ( ) } </ div >
180+ { this . renderDistanceType ( ) }
181+ { this . renderButtons ( ) }
182+ { this . renderAnswers ( ) }
107183 </ nav >
108184 ) ;
109185 }
0 commit comments