@@ -2,10 +2,13 @@ import React, { Component } from "react";
22
33import  "./Layers.css" ; 
44import  {  UploadFromUrl ,  GetLayerUrlFromId  }  from  "./RemoteStorage" ; 
5- import  {  LayersIcon  }  from  "../Icons/Icons" ; 
6- import  Checkbox  from  "./checkbox" ; 
5+ import  {  LayersIcon ,  BoundingBoxIcon  }  from  "../Icons/Icons" ; 
76import  axios  from  "axios" ; 
87import  UploadFile  from  "./UploadFile" ; 
8+ import  LayerTypes  from  '../../common/LayerTypes' 
9+ 
10+ import  "leaflet-draw/dist/leaflet.draw.css" ; 
11+ import  CheckableItem  from  "./CheckableItem" ; 
912
1013export  default  class  Layers  extends  Component  { 
1114 constructor ( props )  { 
@@ -16,7 +19,8 @@ export default class Layers extends Component {
1619 } 
1720 state  =  { 
1821 highlighted : { } , 
19-  layersList : [ ] 
22+  layersList : [ ] , 
23+  bboxList : [ ] 
2024 } ; 
2125
2226 componentDidMount ( )  { 
@@ -29,16 +33,20 @@ export default class Layers extends Component {
2933 } 
3034
3135 fetchLayersList ( )  { 
32-  let  layersList ; 
36+  let  layersList ,   bboxList ; 
3337 try  { 
34-  layersList  =  JSON . parse ( localStorage . getItem ( "LayersList" ) ) ; 
35-  if  ( ! Array . isArray ( layersList ) )  layersList  =  [ ] ; 
38+  const  data  =  JSON . parse ( localStorage . getItem ( "LayersList" ) ) ; 
39+  bboxList  =  data . bboxList ; 
40+  layersList  =  data . layersList ; 
41+ 
42+  layersList . forEach ( layer  =>  ( layer . displayed  =  false ) ) ; 
43+  bboxList . forEach ( bbox  =>  ( bbox . displayed  =  false ) ) ; 
3644 }  catch  ( err )  { 
37-  this . props . alert . error ( "Failed to load layers" ) ; 
3845 layersList  =  [ ] ; 
46+  bboxList  =  [ ] ; 
3947 } 
40-   layersList . forEach ( layer   =>   ( layer . displayed   =   false ) ) ; 
41-  this . setState ( {  layersList :  layersList  } ) ; 
48+ 
49+  this . setState ( {  layersList,  bboxList  } ) ; 
4250 } 
4351
4452 setHighlightedLayer ( layerId ,  isHighlighted )  { 
@@ -77,12 +85,16 @@ export default class Layers extends Component {
7785 const  layersList  =  this . state . layersList . concat ( nonExistingLayers ) ; 
7886
7987 this . setState ( {  layersList } ) ; 
80- 
8188 layersToAdd . map ( ( {  id } )  =>  this . highlight ( id ) ) ; 
89+  this . saveToLocalStorage ( layersList ,  this . state . bboxList ) ; 
90+  } 
8291
92+  saveToLocalStorage ( layersList ,  bboxList )  { 
93+  layersList . map ( ( {  name,  id } )  =>  ( {  name,  id } ) ) ; 
94+  bboxList . map ( ( {  id,  name,  box } )  =>  ( {  id,  name,  box } ) ) ; 
8395 localStorage . setItem ( 
8496 "LayersList" , 
85-  JSON . stringify ( layersList . map ( ( {  name ,  id  } )   =>   ( {  name ,  id  } ) ) ) 
97+  JSON . stringify ( {  layersList ,  bboxList  } ) 
8698 ) ; 
8799 } 
88100
@@ -103,13 +115,13 @@ export default class Layers extends Component {
103115 axios 
104116 . get ( GetLayerUrlFromId ( layer . id ) ) 
105117 . then ( ( {  data } )  =>  data ) 
106-  . then ( geojson  =>  this . props . addLayerToMap ( layer . id ,  geojson ) ) ; 
118+  . then ( geojson  =>  this . props . addLayerToMap ( layer . id , LayerTypes . GEO_JSON ,  geojson ) ) ; 
107119 }  else  { 
108120 this . props . removeLayerFromMap ( layer . id ) ; 
109121 } 
110122
111-  const  layersList  =  this . state . layersList . map ( 
112-  layer   =>   ( layer . id  ===  layerId  ? newLayer  : layer ) 
123+  const  layersList  =  this . state . layersList . map ( layer   => 
124+  layer . id  ===  layerId  ? newLayer  : layer 
113125 ) ; 
114126 this . setState ( {  layersList } ) ; 
115127 } 
@@ -126,28 +138,71 @@ export default class Layers extends Component {
126138 } ) ; 
127139 } 
128140
141+  addBoundingBox  =  bbox  =>  { 
142+  const  bboxList  =  this . state . bboxList . concat ( [ 
143+  { 
144+  box : bbox , 
145+  name : "Bounding Box" , 
146+  id : Math . random ( ) 
147+  . toString ( 36 ) 
148+  . substring ( 7 ) 
149+  } 
150+  ] ) ; 
151+  this . setState ( {  bboxList } ) ; 
152+  this . saveToLocalStorage ( this . state . layersList ,  bboxList ) ; 
153+  } ; 
154+ 
155+  toggleBbox  =  bboxId  =>  { 
156+  let  bbox  =  this . state . bboxList . filter ( bbox  =>  bbox . id  ===  bboxId ) [ 0 ] ; 
157+  bbox  =  {  ...bbox ,  displayed : ! bbox . displayed  } ; 
158+ 
159+  if  ( bbox . displayed )  { 
160+  this . props . addLayerToMap ( bbox . id ,  LayerTypes . BOUNDING_BOX ,  bbox . box ) ; 
161+  }  else  { 
162+  this . props . removeLayerFromMap ( bbox . id ) ; 
163+  } 
164+ 
165+  const  bboxList  =  this . state . bboxList . map ( b  => 
166+  b . id  ===  bboxId  ? bbox  : b 
167+  ) ; 
168+  this . setState ( {  bboxList } ) ; 
169+  } ; 
129170 render ( )  { 
171+  const  {  setDrawRectange,  drawedRectange }  =  this . props ; 
130172 return  ( 
131173 < div  className = "layers" > 
132174 < h3  className = "title" > 
133175 < LayersIcon  className = "layers-icon"  /> 
134176 < span > Layers</ span > 
135177 </ h3 > 
136-  < UploadFile  concatLayers = { this . concatLayers }  /> 
178+  < UploadFile 
179+  concatLayers = { this . concatLayers } 
180+  addBoundingBox = { this . addBoundingBox } 
181+  setDrawRectange = { setDrawRectange } 
182+  drawedRectange = { drawedRectange } 
183+  /> 
137184 { this . state . layersList . map ( layer  =>  ( 
138-  < div 
139-  className = { `layer ${  
140-  this . state . highlighted [ layer . id ]  ? "highlighted"  : ""  
141-  }  `} 
185+  < CheckableItem 
186+  highlight = { ! ! this . state . highlighted [ layer . id ] } 
187+  data = { layer . id } 
188+  onClick = { this . toggleLayer } 
189+  content = { layer . name } 
190+  value = { layer . displayed } 
142191 key = { layer . id } 
143-  > 
144-  < Checkbox 
145-  isDisplayed = { layer . displayed } 
146-  onClick = { this . toggleLayer } 
147-  identifier = { layer . id } 
148-  /> 
149-  < span > { layer . name } </ span > 
150-  </ div > 
192+  /> 
193+  ) ) } 
194+  < h3  className = "title" > 
195+  < BoundingBoxIcon  className = "layers-icon"  /> 
196+  < span > Bounding Boxes</ span > 
197+  </ h3 > 
198+  { this . state . bboxList . map ( bbox  =>  ( 
199+  < CheckableItem 
200+  data = { bbox . id } 
201+  onClick = { this . toggleBbox } 
202+  content = { bbox . name } 
203+  value = { bbox . displayed } 
204+  key = { bbox . id } 
205+  /> 
151206 ) ) } 
152207 </ div > 
153208 ) ; 
0 commit comments