Skip to content

Commit 914759f

Browse files
committed
Merge branch 'release/1.11'
2 parents 9655ea1 + 5f57207 commit 914759f

File tree

88 files changed

+1947
-3977
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+1947
-3977
lines changed

.travis.yml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1-
language: generic
1+
language: bash
22

33
sudo: required
44
services:
55
- docker
66
cache:
77
directories:
8-
- $HOME/.m2
8+
- "$HOME/.m2"
9+
- "$HOME/.npm"
10+
- "$HOME/.cache"
911

1012
script:
11-
- docker build -t akvo/flow-builder .
1213
- "./ci/bootstrap-build.sh /app/src/ci/build.sh && ./ci/deploy.sh"
1314

1415
before_cache:
15-
- find $HOME/.m2 -name resolver-status.properties -exec rm {} \;
16-
16+
- find $HOME/.m2 \( -name resolver-status.properties -o -name maven-metadata-clojars.xml.sha1 \) -exec rm {} \;
17+
1718
notifications:
18-
slack: akvo:ZLetmotGiT22QryK6pR5bnFS
19+
slack: akvo:ZLetmotGiT22QryK6pR5bnFS

Dashboard/app/js/lib/components/devices/AssignmentsEditView/MainBody.jsx

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
/* eslint-disable jsx-a11y/anchor-is-valid */
22
import React from 'react';
33
import { groupBy as _groupBy } from 'lodash';
4+
45
import FormSection from './screens/FormSection';
56
import AddDevices from './screens/AddDevices';
67
import EditDevices from './screens/EditDevices';
8+
import AssignDatapoints from './screens/AssignDatapoints';
9+
import EditDatapoints from './screens/EditDatapoints';
10+
711
import DevicesSection from './DevicesSection';
812
import SidebarDropdown from './__partials/SidebarDropdown';
913

@@ -12,21 +16,25 @@ import AssignmentsContext from './assignment-context';
1216
export default class AssignmentMain extends React.Component {
1317
state = {
1418
currentTab: 'FORMS',
19+
selectedDeviceId: null,
1520
};
1621

17-
changeTab = tab => {
18-
this.setState({ currentTab: tab });
22+
changeTab = (tab, selectedDeviceId = null) => {
23+
this.setState({ currentTab: tab, selectedDeviceId }, () => {
24+
if (tab === 'ASSIGN_DATAPOINTS') {
25+
// load full details for each datapoint when viewing device datapoints
26+
this.context.actions.getDeviceDatapoints(selectedDeviceId);
27+
}
28+
});
1929
};
2030

2131
getDeviceGroups = () => {
2232
// filter out selected devices
2333
const { devices, selectedDeviceIds } = this.context.data;
2434

25-
const filteredDevices = devices.filter(device =>
26-
selectedDeviceIds.includes(device.id)
27-
);
35+
const selectedDevices = devices.filter(device => selectedDeviceIds.includes(device.id));
2836

29-
return _groupBy(filteredDevices, device => device.deviceGroup.id);
37+
return _groupBy(selectedDevices, device => device.deviceGroup.id);
3038
};
3139

3240
renderSidebar = () => {
@@ -47,28 +55,18 @@ export default class AssignmentMain extends React.Component {
4755
<a
4856
className={deviceIsSelected ? 'disabled' : undefined}
4957
href="#"
50-
onClick={
51-
deviceIsSelected ? undefined : () => this.changeTab('DEVICES')
52-
}
58+
onClick={deviceIsSelected ? undefined : () => this.changeTab('DEVICES')}
5359
>
5460
{strings.devices}
5561
</a>
5662

5763
{deviceIsSelected && (
58-
<a
59-
href="#"
60-
className="sub-action"
61-
onClick={() => this.changeTab('EDIT_DEVICE')}
62-
>
64+
<a href="#" className="sub-action" onClick={() => this.changeTab('EDIT_DEVICE')}>
6365
{strings.edit}
6466
</a>
6567
)}
6668

67-
<a
68-
href="#"
69-
className="sub-action"
70-
onClick={() => this.changeTab('ADD_DEVICE')}
71-
>
69+
<a href="#" className="sub-action" onClick={() => this.changeTab('ADD_DEVICE')}>
7270
{strings.add}
7371
</a>
7472
</li>
@@ -79,7 +77,7 @@ export default class AssignmentMain extends React.Component {
7977
}`}
8078
>
8179
{Object.keys(deviceGroups).map(dgId => (
82-
<SidebarDropdown key={dgId} devices={deviceGroups[dgId]} />
80+
<SidebarDropdown key={dgId} devices={deviceGroups[dgId]} changeTab={this.changeTab} />
8381
))}
8482
</li>
8583
</ul>
@@ -88,22 +86,22 @@ export default class AssignmentMain extends React.Component {
8886
};
8987

9088
render() {
89+
const { currentTab, selectedDeviceId } = this.state;
90+
9191
return (
9292
<div className="assignment-body">
9393
{this.renderSidebar()}
9494

9595
<div className="assignment-main">
96-
{this.state.currentTab === 'FORMS' && (
97-
<FormSection changeTab={this.changeTab} />
98-
)}
99-
{this.state.currentTab === 'ADD_DEVICE' && (
100-
<AddDevices changeTab={this.changeTab} />
101-
)}
102-
{this.state.currentTab === 'EDIT_DEVICE' && (
103-
<EditDevices changeTab={this.changeTab} />
96+
{currentTab === 'FORMS' && <FormSection changeTab={this.changeTab} />}
97+
{currentTab === 'ADD_DEVICE' && <AddDevices changeTab={this.changeTab} />}
98+
{currentTab === 'EDIT_DEVICE' && <EditDevices changeTab={this.changeTab} />}
99+
{currentTab === 'DEVICES' && <DevicesSection changeTab={this.changeTab} />}
100+
{currentTab === 'ASSIGN_DATAPOINTS' && (
101+
<AssignDatapoints changeTab={this.changeTab} selectedDeviceId={selectedDeviceId} />
104102
)}
105-
{this.state.currentTab === 'DEVICES' && (
106-
<DevicesSection changeTab={this.changeTab} />
103+
{currentTab === 'EDIT_DATAPOINTS' && (
104+
<EditDatapoints changeTab={this.changeTab} selectedDeviceId={selectedDeviceId} />
107105
)}
108106
</div>
109107
</div>

Dashboard/app/js/lib/components/devices/AssignmentsEditView/__partials/SidebarDropdown.jsx

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
/* eslint-disable jsx-a11y/anchor-is-valid */
12
import React from 'react';
23
import PropTypes from 'prop-types';
4+
import AssignmentsContext from '../assignment-context';
35

46
export default class SidebarDropdown extends React.Component {
57
state = {
@@ -24,23 +26,27 @@ export default class SidebarDropdown extends React.Component {
2426
};
2527

2628
render() {
29+
const { data } = this.context;
2730
const { fontClass, panelStyle } = this.getStyleProps();
28-
const { devices } = this.props;
31+
const { devices, changeTab } = this.props;
2932

3033
return (
3134
<div className="sidebar-dropdown">
32-
<div
33-
onKeyDown={this.toggleDropdown}
34-
onClick={this.toggleDropdown}
35-
className="dd-header"
36-
>
35+
<div onKeyDown={this.toggleDropdown} onClick={this.toggleDropdown} className="dd-header">
3736
<span>{devices[0].deviceGroup.name}</span>
3837
<i className={fontClass} />
3938
</div>
4039

4140
<div style={panelStyle} className="sidebar-panel">
4241
{devices.map(device => (
43-
<a key={device.id} href="#">
42+
<a
43+
key={device.id}
44+
href="#"
45+
onClick={
46+
data.datapointsEnabled ? () => changeTab('ASSIGN_DATAPOINTS', device.id) : undefined
47+
}
48+
className={data.datapointsEnabled ? undefined : 'disabled'}
49+
>
4450
{device.name}
4551
</a>
4652
))}
@@ -50,6 +56,8 @@ export default class SidebarDropdown extends React.Component {
5056
}
5157
}
5258

59+
SidebarDropdown.contextType = AssignmentsContext;
5360
SidebarDropdown.propTypes = {
5461
devices: PropTypes.array.isRequired,
62+
changeTab: PropTypes.func.isRequired,
5563
};

Dashboard/app/js/lib/components/devices/AssignmentsEditView/index.jsx

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,7 @@ export default class AssignmentsEdit extends React.Component {
3939
return (
4040
<div className="assignment-topbar">
4141
<div className="assignment-name">
42-
<button
43-
type="button"
44-
className="go-back"
45-
onClick={actions.cancelEditSurveyAssignment}
46-
>
42+
<button type="button" className="go-back" onClick={actions.cancelEditSurveyAssignment}>
4743
<i className="fa fa-arrow-left" />
4844
</button>
4945

@@ -55,7 +51,6 @@ export default class AssignmentsEdit extends React.Component {
5551
value={this.state.data.assignmentName}
5652
onChange={this.onChangeState}
5753
/>
58-
{/* <span className="infoText">0 datapoints / 20k assigned</span> */}
5954
</h3>
6055
</div>
6156

Dashboard/app/js/lib/components/devices/AssignmentsEditView/screens/AddDevices.jsx

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,69 +9,65 @@ import DeviceEmpty from '../__partials/DeviceEmpty';
99

1010
export default class AddDevice extends React.Component {
1111
state = {
12-
selectedDevices: [],
12+
selectedDevicesIds: [],
1313
};
1414

1515
getDeviceGroups() {
1616
// filter out selected devices
1717
const { devices, selectedDeviceIds } = this.context.data;
1818

19-
const filteredDevices = devices.filter(
20-
device => !selectedDeviceIds.includes(device.id)
21-
);
19+
const unSelectedDevices = devices.filter(device => !selectedDeviceIds.includes(device.id));
2220

23-
return _groupBy(filteredDevices, device => device.deviceGroup.id);
21+
return _groupBy(unSelectedDevices, device => device.deviceGroup.id);
2422
}
2523

2624
onSelectDevice = (id, checked) => {
27-
const { selectedDevices } = this.state;
28-
let newSelectedDevices = [];
25+
const { selectedDevicesIds } = this.state;
26+
let newSelectedDevicesIds = [];
2927

3028
if (checked) {
31-
newSelectedDevices = selectedDevices.concat(id);
29+
newSelectedDevicesIds = selectedDevicesIds.concat(id);
3230
} else {
33-
newSelectedDevices = selectedDevices.filter(device => device !== id);
31+
newSelectedDevicesIds = selectedDevicesIds.filter(device => device !== id);
3432
}
3533

36-
this.setState({ selectedDevices: newSelectedDevices });
34+
this.setState({ selectedDevicesIds: newSelectedDevicesIds });
3735
};
3836

3937
onSelectMultipleDevices = (ids, checked) => {
40-
const { selectedDevices } = this.state;
41-
let newSelectedDevices = [...selectedDevices];
38+
const { selectedDevicesIds } = this.state;
39+
let newSelectedDevicesIds = [...selectedDevicesIds];
4240

4341
if (checked) {
44-
newSelectedDevices = selectedDevices.concat(ids);
42+
newSelectedDevicesIds = selectedDevicesIds.concat(ids);
4543
} else {
46-
newSelectedDevices = selectedDevices.filter(
47-
device => !ids.includes(device)
48-
);
44+
newSelectedDevicesIds = selectedDevicesIds.filter(device => !ids.includes(device));
4945
}
5046

51-
this.setState({ selectedDevices: [...new Set(newSelectedDevices)] });
47+
this.setState({ selectedDevicesIds: [...new Set(newSelectedDevicesIds)] });
5248
};
5349

5450
addToAssignment = () => {
55-
const { selectedDevices } = this.state;
51+
const { selectedDevicesIds } = this.state;
5652
const { addDevicesToAssignment } = this.context.actions;
5753

58-
addDevicesToAssignment(selectedDevices);
54+
addDevicesToAssignment(selectedDevicesIds);
5955

6056
// empty selected devices
61-
this.setState({ selectedDevices: [] });
57+
this.setState({ selectedDevicesIds: [] });
6258
};
6359

6460
render() {
6561
const { strings } = this.context;
6662
const deviceGroups = this.getDeviceGroups();
67-
const { selectedDevices } = this.state;
63+
const { selectedDevicesIds } = this.state;
6864

6965
return (
7066
<div className="devices-action-page">
7167
<div className="header">
7268
<p>{strings.addDevicesToAssignment}</p>
7369
<i
74-
className="fa fa-times"
70+
className="fa fa-times icon"
7571
onClick={() => this.props.changeTab('DEVICES')}
7672
onKeyDown={() => this.props.changeTab('DEVICES')}
7773
/>
@@ -87,7 +83,7 @@ export default class AddDevice extends React.Component {
8783
deviceGroups={deviceGroups}
8884
handleSelectDevice={this.onSelectDevice}
8985
handleSelectAllDevices={this.onSelectMultipleDevices}
90-
selectedDevices={selectedDevices}
86+
selectedDevices={selectedDevicesIds}
9187
/>
9288
</div>
9389
</div>
@@ -96,16 +92,14 @@ export default class AddDevice extends React.Component {
9692
<div className="footer-inner">
9793
<div>
9894
<p>
99-
{selectedDevices.length} {strings.selected}
95+
{selectedDevicesIds.length} {strings.selected}
10096
</p>
10197
</div>
10298

10399
<button
104100
type="button"
105101
onClick={this.addToAssignment}
106-
className={`btnOutline ${
107-
selectedDevices.length === 0 ? 'disabled' : ''
108-
}`}
102+
className={`btnOutline ${selectedDevicesIds.length === 0 ? 'disabled' : ''}`}
109103
>
110104
{strings.addToAssignment}
111105
</button>

0 commit comments

Comments
 (0)