Skip to content

Commit 2d5f7fb

Browse files
authored
Merge pull request #3381 from Vizzuality/fix/thumbnails-issues
Fix/thumbnails issues
2 parents d5cacf8 + 0ce9c3c commit 2d5f7fb

File tree

6 files changed

+67
-54
lines changed

6 files changed

+67
-54
lines changed

app/javascript/pages/map/recent-imagery/components/recent-imagery-settings/recent-imagery-settings-component.js

+12-10
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class RecentImagerySettings extends PureComponent {
3131
settings: {
3232
styles,
3333
thumbsToShow,
34-
selectedTileIndex,
34+
selectedTileSource,
3535
date,
3636
weeks,
3737
clouds
@@ -115,18 +115,18 @@ class RecentImagerySettings extends PureComponent {
115115
/>
116116
</div>
117117
<div className="c-recent-imagery-settings__thumbnails">
118-
{tiles.length >= 2 && (
118+
{tiles.length >= 1 && (
119119
<div>
120120
<div className="c-recent-imagery-settings__thumbnails__description">
121-
{this.state.thumbnailsDescription || selectedTile.description}
121+
{this.state.thumbnailsDescription ||
122+
(selectedTile && selectedTile.description)}
122123
</div>
123124
<Carousel
124125
settings={{
125126
slidesToShow: thumbsToShow,
126-
infinite: tiles.length > thumbsToShow,
127-
centerMode: tiles.length > thumbsToShow,
127+
infinite: false,
128+
centerMode: false,
128129
centerPadding: '20px',
129-
draggable: false,
130130
dots: false,
131131
arrows: tiles.length > thumbsToShow,
132132
responsive: [
@@ -144,9 +144,11 @@ class RecentImagerySettings extends PureComponent {
144144
<RecentImageryThumbnail
145145
id={i}
146146
tile={tile}
147-
selected={selectedTileIndex === i}
147+
selected={selectedTileSource === tile.id}
148148
handleClick={() => {
149-
setRecentImagerySettings({ selectedTileIndex: i });
149+
setRecentImagerySettings({
150+
selectedTileSource: tile.id
151+
});
150152
}}
151153
handleMouseEnter={() => {
152154
this.setState({
@@ -162,7 +164,7 @@ class RecentImagerySettings extends PureComponent {
162164
</Carousel>
163165
</div>
164166
)}
165-
{tiles.length < 2 && (
167+
{tiles.length < 1 && (
166168
<NoContent
167169
className="c-recent-imagery-settings__empty-thumbnails"
168170
message="We can't find additional images for the selection"
@@ -175,7 +177,7 @@ class RecentImagerySettings extends PureComponent {
175177
}
176178

177179
RecentImagerySettings.propTypes = {
178-
selectedTile: PropTypes.object.isRequired,
180+
selectedTile: PropTypes.object,
179181
tiles: PropTypes.array.isRequired,
180182
settings: PropTypes.object.isRequired,
181183
isDragging: PropTypes.bool.isRequired,

app/javascript/pages/map/recent-imagery/recent-imagery-actions.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ const getData = createThunkAction('getData', params => dispatch => {
2424
getRecentTiles({ ...params, token: this.getDataSource.token })
2525
.then(response => {
2626
if (response.data.data.tiles) {
27-
dispatch(setRecentImagerySettings({ selectedTileIndex: 0 }));
27+
dispatch(
28+
setRecentImagerySettings({
29+
selectedTileSource: response.data.data.tiles[0].attributes.source
30+
})
31+
);
2832
dispatch(
2933
setRecentImageryData({
3034
data: response.data.data,
@@ -76,15 +80,19 @@ const getMoreTiles = createThunkAction(
7680
data.tiles,
7781
d => d.attributes.source === item.source_id
7882
);
79-
data.tiles[index].attributes.tile_url = item.tile_url;
83+
if (index !== -1) {
84+
data.tiles[index].attributes.tile_url = item.tile_url;
85+
}
8086
}
8187
});
8288
thumbs.forEach(item => {
8389
const index = findIndex(
8490
data.tiles,
8591
d => d.attributes.source === item.source
8692
);
87-
data.tiles[index].attributes.thumbnail_url = item.thumbnail_url;
93+
if (index !== -1) {
94+
data.tiles[index].attributes.thumbnail_url = item.thumbnail_url;
95+
}
8896
});
8997

9098
dispatch(

app/javascript/pages/map/recent-imagery/recent-imagery-reducers.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export const initialState = {
1818
layerSlug: 'sentinel_tiles',
1919
minZoom: 9,
2020
thumbsToShow: 5,
21-
selectedTileIndex: 0,
21+
selectedTileSource: null,
2222
date: null,
2323
weeks: 13,
2424
clouds: 25

app/javascript/pages/map/recent-imagery/recent-imagery-selectors.js

+32-15
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import { createSelector } from 'reselect';
22
import isEmpty from 'lodash/isEmpty';
3+
import findIndex from 'lodash/findIndex';
34
import moment from 'moment';
45
import { format } from 'd3-format';
6+
import { sortByKey } from 'utils/data';
57

68
const getData = state => state.data || null;
79
const getBbox = state => state.bbox || null;
@@ -13,9 +15,16 @@ const getFilteredData = createSelector(
1315
(data, settings) => {
1416
if (!data || isEmpty(data)) return null;
1517

16-
const { clouds } = settings;
17-
return data.filter(
18-
item => Math.round(item.attributes.cloud_score) <= clouds
18+
const { clouds, selectedTileSource } = settings;
19+
const dataFiltered = data.filter(
20+
item =>
21+
Math.round(item.attributes.cloud_score) <= clouds ||
22+
item.attributes.source === selectedTileSource
23+
);
24+
return sortByKey(
25+
dataFiltered.map(item => item.attributes),
26+
'date_time',
27+
true
1928
);
2029
}
2130
);
@@ -24,17 +33,17 @@ export const getAllTiles = createSelector([getFilteredData], data => {
2433
if (!data || isEmpty(data)) return [];
2534

2635
return data.map(item => ({
27-
id: item.attributes.source,
28-
url: item.attributes.tile_url,
29-
thumbnail: item.attributes.thumbnail_url,
30-
cloudScore: item.attributes.cloud_score,
31-
dateTime: item.attributes.date_time,
32-
instrument: item.attributes.instrument,
33-
description: `${moment(item.attributes.date_time)
36+
id: item.source,
37+
url: item.tile_url,
38+
thumbnail: item.thumbnail_url,
39+
cloudScore: item.cloud_score,
40+
dateTime: item.date_time,
41+
instrument: item.instrument,
42+
description: `${moment(item.date_time)
3443
.format('DD MMM YYYY')
35-
.toUpperCase()} - ${format('.0f')(
36-
item.attributes.cloud_score
37-
)}% cloud coverage - ${item.attributes.instrument}`
44+
.toUpperCase()} - ${format('.0f')(item.cloud_score)}% cloud coverage - ${
45+
item.instrument
46+
}`
3847
}));
3948
});
4049

@@ -43,8 +52,16 @@ export const getTile = createSelector(
4352
(data, settings) => {
4453
if (!data || isEmpty(data)) return null;
4554

46-
const { selectedTileIndex } = settings;
47-
const selectedTile = data[selectedTileIndex].attributes;
55+
const { selectedTileSource } = settings;
56+
const index = findIndex(
57+
data,
58+
d => d.attributes.source === selectedTileSource
59+
);
60+
if (index === -1) {
61+
return null;
62+
}
63+
64+
const selectedTile = data[index].attributes;
4865
return {
4966
url: selectedTile.tile_url,
5067
cloudScore: selectedTile.cloud_score,

app/javascript/pages/map/recent-imagery/recent-imagery-styles.scss

+6-20
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,14 @@
4949
}
5050

5151
.recent-imagery-infowindow {
52+
padding: rem(15px);
5253
font-family: $font-family-1;
53-
padding: rem(10px);
54-
margin: rem(3px) rem(3px) rem(5px) rem(3px);
5554
font-size: 12px;
56-
color: $slate;
57-
background-color: $tip;
58-
box-shadow: 0 1px 3px 0 rgba($slate, 0.25);
55+
color: $white;
56+
background: rgba($black, 0.6);
5957

60-
&__arrow {
61-
position: absolute;
62-
left: rem(-18px);
63-
right: 0;
64-
top: rem(37px);
65-
width: 0;
66-
height: 0;
67-
margin: auto;
68-
border-left: 7px solid $tip;
69-
border-right: none;
70-
border-top: 7px solid $slate-light;
71-
transform-origin: 0 0;
72-
transform: rotate(-45deg);
73-
border-top-color: $tip;
74-
box-shadow: -2px 2px 2px 0 rgba($slate, 0.1);
58+
&__hook {
59+
margin-top: rem(5px);
60+
font-size: 11px;
7561
}
7662
}

app/javascript/pages/map/recent-imagery/recent-imagery.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { createElement, PureComponent } from 'react';
44
import { connect } from 'react-redux';
55
import PropTypes from 'prop-types';
66
import isEqual from 'lodash/isEqual';
7-
import { getPolygonCenter } from 'utils/map';
87

98
import actions from './recent-imagery-actions';
109
import reducers, { initialState } from './recent-imagery-reducers';
@@ -228,7 +227,6 @@ class RecentImageryContainer extends PureComponent {
228227
fillColor: 'transparent',
229228
strokeWeight: 0
230229
});
231-
const polygonCenter = getPolygonCenter(this.boundsPolygon);
232230

233231
this.addBoundsPolygonEvents();
234232
this.boundsPolygon.setMap(map);
@@ -240,10 +238,9 @@ class RecentImageryContainer extends PureComponent {
240238
content: `
241239
<div class="recent-imagery-infowindow">
242240
${description}
243-
<div class="recent-imagery-infowindow__arrow"></div>
241+
<div class="recent-imagery-infowindow__hook">Click to refine image</div>
244242
</div>
245-
`,
246-
position: polygonCenter.top
243+
`
247244
});
248245
}
249246

@@ -266,6 +263,9 @@ class RecentImageryContainer extends PureComponent {
266263
});
267264
this.boundsPolygonInfowindow.close();
268265
});
266+
google.maps.event.addListener(this.boundsPolygon, 'mousemove', e => {
267+
this.boundsPolygonInfowindow.setPosition(e.latLng);
268+
});
269269
google.maps.event.addListener(this.boundsPolygon, 'click', () => {
270270
clickTimeout = setTimeout(() => {
271271
setRecentImageryShowSettings(true);

0 commit comments

Comments
 (0)