Skip to content

Commit b046f46

Browse files
committed
feature: upload layers to server and add to layer
1 parent aa00d2a commit b046f46

File tree

11 files changed

+142
-27
lines changed

11 files changed

+142
-27
lines changed

src/App.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import React, { Component } from "react";
22

33
import Map from "./containers/MapContainer";
44
import ToolsScreen from "./components/ToolsScreen";
5-
import Layers from "./components/Layers";
5+
import Layers from "./containers/LayersContainer";
66

77
import "./App.css";
88
import { setQueryHistory, getQueryHistory } from "./utils/queryHistoryStorage";

src/components/Icons/Icons.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,38 @@ export function ConfirmIcon({ className }) {
6969
</svg>
7070
);
7171
}
72+
73+
export function CheckboxOnIcon({ className }) {
74+
return (
75+
<svg
76+
className={className}
77+
xmlns="http://www.w3.org/2000/svg"
78+
version="1.1"
79+
viewBox="0 0 474.8 474.801"
80+
>
81+
<g>
82+
<g>
83+
<path d="M396.283,257.097c-1.14-0.575-2.282-0.862-3.433-0.862c-2.478,0-4.661,0.951-6.563,2.857l-18.274,18.271 c-1.708,1.715-2.566,3.806-2.566,6.283v72.513c0,12.565-4.463,23.314-13.415,32.264c-8.945,8.945-19.701,13.418-32.264,13.418 H82.226c-12.564,0-23.319-4.473-32.264-13.418c-8.947-8.949-13.418-19.698-13.418-32.264V118.622 c0-12.562,4.471-23.316,13.418-32.264c8.945-8.946,19.7-13.418,32.264-13.418H319.77c4.188,0,8.47,0.571,12.847,1.714 c1.143,0.378,1.999,0.571,2.563,0.571c2.478,0,4.668-0.949,6.57-2.852l13.99-13.99c2.282-2.281,3.142-5.043,2.566-8.276 c-0.571-3.046-2.286-5.236-5.141-6.567c-10.272-4.752-21.412-7.139-33.403-7.139H82.226c-22.65,0-42.018,8.042-58.102,24.126 C8.042,76.613,0,95.978,0,118.629v237.543c0,22.647,8.042,42.014,24.125,58.098c16.084,16.088,35.452,24.13,58.102,24.13h237.541 c22.647,0,42.017-8.042,58.101-24.13c16.085-16.084,24.134-35.45,24.134-58.098v-90.797 C402.001,261.381,400.088,258.623,396.283,257.097z" />
84+
<path d="M467.95,93.216l-31.409-31.409c-4.568-4.567-9.996-6.851-16.279-6.851c-6.275,0-11.707,2.284-16.271,6.851 L219.265,246.532l-75.084-75.089c-4.569-4.57-9.995-6.851-16.274-6.851c-6.28,0-11.704,2.281-16.274,6.851l-31.405,31.405 c-4.568,4.568-6.854,9.994-6.854,16.277c0,6.28,2.286,11.704,6.854,16.274l122.767,122.767c4.569,4.571,9.995,6.851,16.274,6.851 c6.279,0,11.704-2.279,16.274-6.851l232.404-232.403c4.565-4.567,6.854-9.994,6.854-16.274S472.518,97.783,467.95,93.216z" />
85+
</g>
86+
</g>
87+
</svg>
88+
);
89+
}
90+
91+
export function CheckboxOffIcon({ className }) {
92+
return (
93+
<svg
94+
className={className}
95+
xmlns="http://www.w3.org/2000/svg"
96+
version="1.1"
97+
viewBox="0 0 401.998 401.998"
98+
>
99+
<g>
100+
<g>
101+
<path d="M377.87,24.126C361.786,8.042,342.417,0,319.769,0H82.227C59.579,0,40.211,8.042,24.125,24.126 C8.044,40.212,0.002,59.576,0.002,82.228v237.543c0,22.647,8.042,42.014,24.123,58.101c16.086,16.085,35.454,24.127,58.102,24.127 h237.542c22.648,0,42.011-8.042,58.102-24.127c16.085-16.087,24.126-35.453,24.126-58.101V82.228 C401.993,59.58,393.951,40.212,377.87,24.126z M365.448,319.771c0,12.559-4.47,23.314-13.415,32.264 c-8.945,8.945-19.698,13.411-32.265,13.411H82.227c-12.563,0-23.317-4.466-32.264-13.411c-8.945-8.949-13.418-19.705-13.418-32.264 V82.228c0-12.562,4.473-23.316,13.418-32.264c8.947-8.946,19.701-13.418,32.264-13.418h237.542 c12.566,0,23.319,4.473,32.265,13.418c8.945,8.947,13.415,19.701,13.415,32.264V319.771L365.448,319.771z" />
102+
</g>
103+
</g>
104+
</svg>
105+
);
106+
}

src/components/LayerInput/LayerInput.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import * as React from "react";
1+
import React from "react";
22
import PropTypes from "prop-types";
33
import Select from "react-select";
44

src/components/Layers/Layers.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
z-index: 9999;
88
bottom: 17px;
99
left: 17px;
10+
overflow-y: auto;
1011
}
1112

1213
.layers .svg-button {
@@ -24,3 +25,16 @@
2425
margin: 0 auto;
2526
display: block;
2627
}
28+
29+
.layers input[type=file] {
30+
margin: 6px 18px;
31+
}
32+
33+
.layers .layer svg{
34+
fill: white;
35+
height: 1em;
36+
padding: 0 0.3em;
37+
}
38+
.layers .layer{
39+
margin-top: 2px
40+
}

src/components/Layers/Layers.js

Lines changed: 60 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
11
import React, { Component } from "react";
22

33
import "./Layers.css";
4-
import { UploadFromFiles, UploadFromUrl } from "./RemoteStorage";
4+
import {
5+
UploadFromFiles,
6+
UploadFromUrl,
7+
GetLayerUrlFromId
8+
} from "./RemoteStorage";
59
import { ConfirmIcon, UploadIcon } from "../Icons/Icons";
610
import LoadingIndicator from "../LoadingIndicator";
11+
import Checkbox from "./checkbox";
12+
import axios from "axios";
13+
import Promise from "bluebird"
714

815
export default class Layers extends Component {
916
constructor(props) {
@@ -13,6 +20,7 @@ export default class Layers extends Component {
1320
layersList: []
1421
};
1522

23+
this.toggleLayer = this.toggleLayer.bind(this);
1624
this.uploadFiles = this.uploadFiles.bind(this);
1725
this.chooseFiles = this.chooseFiles.bind(this);
1826
}
@@ -34,30 +42,50 @@ export default class Layers extends Component {
3442
} catch (err) {
3543
layersList = [];
3644
}
45+
layersList.forEach(layer => (layer.displayed = false));
3746
this.setState({ layersList: layersList });
3847
}
3948

4049
updateLayersList(layersList) {
4150
this.setState({ layersList });
42-
localStorage.setItem("LayersList", JSON.stringify(layersList));
51+
localStorage.setItem(
52+
"LayersList",
53+
JSON.stringify(
54+
layersList.map(({ name, id, url }) => ({
55+
name,
56+
id,
57+
url
58+
}))
59+
)
60+
);
4361
}
4462

45-
// addLayer(id, url, name) {
46-
// const layersList = this.state.layersList.concat({
47-
// id: "404",
48-
// url: "http://www.google.com",
49-
// name: "saranga"
50-
// });
63+
toggleLayer(layerId) {
64+
const layer = this.state.layersList.filter(
65+
layer => layer.id === layerId
66+
)[0];
67+
const newLayer = { ...layer, displayed: !layer.displayed };
68+
if (newLayer.displayed) {
69+
axios
70+
.get(layer.url) //, { transformResponse: [], responseType: "arraybuffer" }
71+
// .then(({ data }) => {
72+
// return new TextDecoder("utf-8").decode(data)
73+
// })
74+
.then(({data})=> data)
75+
.then(geojson => this.props.addLayer(layer.name, geojson));
76+
}
5177

52-
// this.setState({
53-
// layersList
54-
// });
55-
// localStorage.setItem("LayersList", JSON.stringify(this.state.layersList));
56-
// }
78+
const layersList = this.state.layersList.map(
79+
layer => (layer.id === layerId ? newLayer : layer)
80+
);
81+
this.setState({ layersList });
82+
}
5783

5884
addLayerFromUrl(url, name) {
5985
UploadFromUrl(url).then(id => {
60-
this.updateLayersList(this.state.layersList.concat({ id, name }));
86+
this.updateLayersList(
87+
this.state.layersList.concat({ id, name, url: GetLayerUrlFromId(id) })
88+
);
6189
});
6290
}
6391

@@ -67,13 +95,18 @@ export default class Layers extends Component {
6795

6896
uploadFiles() {
6997
this.setState({ isChoosingFiles: false, isUploading: true });
70-
98+
7199
const fileInputElement = document.getElementById("layersUpload");
72100

73-
UploadFromFiles(fileInputElement).then(layers => {
74-
this.updateLayersList(this.state.layersList.concat(layers));
75-
this.setState({isUploading: false});
76-
});
101+
UploadFromFiles(fileInputElement)
102+
.then(layers =>
103+
layers.map(({ id, name }) => ({ id, name, url: GetLayerUrlFromId(id) }))
104+
)
105+
.then(layers => {
106+
this.updateLayersList(this.state.layersList.concat(layers));
107+
this.setState({ isUploading: false });
108+
})
109+
.catch(() => this.setState({ isUploading: false }));
77110
}
78111

79112
render() {
@@ -103,7 +136,14 @@ export default class Layers extends Component {
103136
<div className="layers">
104137
{UploadComponent}
105138
{this.state.layersList.map(layer => (
106-
<p>{layer.id}</p>
139+
<div className="layer" key={layer.id}>
140+
<Checkbox
141+
isDisplayed={layer.displayed}
142+
onClick={this.toggleLayer}
143+
identifier={layer.id}
144+
/>
145+
<span>{layer.name}</span>
146+
</div>
107147
))}
108148
</div>
109149
);

src/components/Layers/RemoteStorage.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ import axios from "axios";
22
import { layerServerPath } from "../../config";
33

44
export function GetLayerData(id) {
5-
return axios.get(`${layerServerPath}/layer/${id}`);
5+
return axios.get(GetLayerUrlFromId(id));
6+
}
7+
8+
export function GetLayerUrlFromId(id) {
9+
return `${layerServerPath}/layer/${id}`;
610
}
711

812
export function UploadFromUrl(url) {
@@ -24,5 +28,6 @@ export function UploadFromFiles(element) {
2428
"Content-Type": "multipart/form-data"
2529
}
2630
})
27-
.then(res => res.data.ids);
31+
.then(res => res.data.ids)
32+
;
2833
}

src/components/Layers/checkbox.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import React from "react";
2+
3+
import { CheckboxOnIcon, CheckboxOffIcon } from "../Icons/Icons";
4+
5+
export default class Checkbox extends React.Component {
6+
constructor(props){
7+
super(props)
8+
9+
this.onClick = this.onClick.bind(this);
10+
}
11+
12+
onClick(){
13+
this.props.onClick(this.props.identifier)
14+
}
15+
16+
render() {
17+
const { isDisplayed } = this.props;
18+
const checkbox = isDisplayed ? <CheckboxOnIcon /> : <CheckboxOffIcon />;
19+
return <span onClick={this.onClick}>{checkbox}</span>;
20+
}
21+
}

src/containers/LayerInputContainer/index.js

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/containers/LayerInputContainer/LayerInputContainer.js renamed to src/containers/LayersContainer/LayersContainer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { connect } from 'react-redux';
22

3-
import LayerInput from '../../components/LayerInput';
3+
import LayerInput from '../../components/Layers';
44
import { createAddLayerAction } from '../../action-creators/map';
55

66
function mapDispatchToProps (dispatch) {
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default } from './LayersContainer';

0 commit comments

Comments
 (0)