Skip to content

Commit b6758c1

Browse files
committed
Merge branch 'archiving' of https://github.com/osmlab/maproulette3 into qa
2 parents 81d3065 + 39ad766 commit b6758c1

File tree

18 files changed

+1983
-1373
lines changed

18 files changed

+1983
-1373
lines changed

src/components/AdminPane/HOCs/WithChallengeManagement/WithChallengeManagement.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
fetchChallenge,
1616
fetchChallengeActions,
1717
deleteChallenge,
18+
archiveChallenge,
1819
} from "../../../../services/Challenge/Challenge";
1920
import { recordChallengeSnapshot } from "../../../../services/Challenge/ChallengeSnapshot";
2021
import {
@@ -249,7 +250,6 @@ async function deleteIncompleteTasks(dispatch, ownProps, challenge) {
249250

250251
const mapDispatchToProps = (dispatch, ownProps) => ({
251252
saveChallenge: async (challengeData) => {
252-
debugger;
253253
const prebundled = await convertAndBundleGeoJson(challengeData);
254254

255255
//If the prebundler succeeds, mutate challenge data to fit line-by-line criteria
@@ -351,6 +351,18 @@ const mapDispatchToProps = (dispatch, ownProps) => ({
351351
);
352352
},
353353

354+
archiveChallenge: (projectId, challengeId, pathname) => {
355+
dispatch(archiveChallenge(challengeId, true)).then(() =>
356+
ownProps.history.replace(pathname)
357+
);
358+
},
359+
360+
unarchiveChallenge: (projectId, challengeId, pathname) => {
361+
dispatch(archiveChallenge(challengeId, false)).then(() =>
362+
ownProps.history.replace(pathname)
363+
);
364+
},
365+
354366
updateEnabled: (challengeId, isEnabled) => {
355367
dispatch(setIsEnabled(challengeId, isEnabled));
356368
},
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { connect } from "react-redux";
2+
import { archiveProject } from "../../../../services/Project/Project";
3+
4+
/**
5+
* WithProjectManagement provides functions to its WrappedComponent that can
6+
* support management capabilities.
7+
*/
8+
9+
const mapDispatchToProps = (dispatch, ownProps) => ({
10+
archiveProject: (projectId) => {
11+
dispatch(archiveProject(projectId, true)).then(() =>
12+
ownProps.history.replace(ownProps.location.pathname)
13+
);
14+
},
15+
16+
unarchiveProject: (projectId) => {
17+
dispatch(archiveProject(projectId, false)).then(() =>
18+
ownProps.history.replace(ownProps.location.pathname)
19+
);
20+
},
21+
});
22+
23+
const WithProjectManagement = (Component) => {
24+
return connect(null, mapDispatchToProps)(Component);
25+
};
26+
27+
export default WithProjectManagement;

src/components/AdminPane/Manage/ChallengeCard/ChallengeControls.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,26 @@ export default class ChallengeControls extends Component {
4949
this.props.deleteChallenge(parent.id, this.props.challenge.id);
5050
};
5151

52+
refresh = () => {
53+
this.props.history.push(this.props.location.pathname);
54+
};
55+
56+
archiveChallenge = (parent) => {
57+
this.props.archiveChallenge(
58+
parent.id,
59+
this.props.challenge.id,
60+
this.props.location.pathname
61+
);
62+
};
63+
64+
unarchiveChallenge = (parent) => {
65+
this.props.unarchiveChallenge(
66+
parent.id,
67+
this.props.challenge.id,
68+
this.props.location.pathname
69+
);
70+
};
71+
5272
render() {
5373
if (!this.props.challenge) {
5474
return null;
@@ -74,6 +94,7 @@ export default class ChallengeControls extends Component {
7494
const status = _get(this.props.challenge, "status", ChallengeStatus.none);
7595
const hasTasks = _get(this.props.challenge, "actions.total", 0) > 0;
7696
const requiresEmail = isEmailRequired(this.props.user);
97+
const isArchived = _get(this.props.challenge, "isArchived");
7798

7899
if (requiresEmail) {
79100
return (
@@ -179,6 +200,28 @@ export default class ChallengeControls extends Component {
179200
</a>
180201
</ConfirmAction>
181202
)}
203+
{manager.canAdministrateProject(parent) && !isArchived ? (
204+
<>
205+
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
206+
<a
207+
onClick={() => this.archiveChallenge(parent)}
208+
className={this.props.controlClassName}
209+
>
210+
<FormattedMessage {...messages.archiveChallengeLabel} />
211+
</a>
212+
</>
213+
) : null}
214+
{manager.canAdministrateProject(parent) && isArchived ? (
215+
<>
216+
{/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
217+
<a
218+
onClick={() => this.unarchiveChallenge(parent)}
219+
className={this.props.controlClassName}
220+
>
221+
<FormattedMessage {...messages.unarchiveChallengeLabel} />
222+
</a>
223+
</>
224+
) : null}
182225
{this.state.pickingProject && (
183226
<ProjectPickerModal
184227
{...this.props}
@@ -199,6 +242,8 @@ ChallengeControls.propTypes = {
199242
challenge: PropTypes.object,
200243
/** Invoked when the user wishes to delete the challenge */
201244
deleteChallenge: PropTypes.func.isRequired,
245+
/** Invoked when the user wishes to archive the challenge */
246+
archiveChallenge: PropTypes.func.isRequired,
202247
/** Invoked when the user wishes to move the challenge */
203248
moveChallenge: PropTypes.func.isRequired,
204249
/** Invoked when an in-situ control is completed */

src/components/AdminPane/Manage/ChallengeDashboard/Messages.js

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineMessages } from 'react-intl'
1+
import { defineMessages } from "react-intl";
22

33
/**
44
* Internationalized messages for use with ChallengeDashboard
@@ -39,13 +39,23 @@ export default defineMessages({
3939
defaultMessage: "Delete Challenge",
4040
},
4141

42+
archiveChallengeLabel: {
43+
id: "Admin.Challenge.controls.archive.label",
44+
defaultMessage: "Archive Challenge",
45+
},
46+
47+
unarchiveChallengeLabel: {
48+
id: "Admin.Challenge.controls.unarchive.label",
49+
defaultMessage: "Unarchive Challenge",
50+
},
51+
4252
deleteChallengeConfirm: {
4353
id: "Admin.Challenge.controls.delete.confirm",
44-
defaultMessage: "Are you sure you wish to delete this challenge?"
54+
defaultMessage: "Are you sure you wish to delete this challenge?",
4555
},
4656

4757
deleteChallengeWarn: {
4858
id: "Admin.Challenge.controls.delete.warn",
49-
defaultMessage: "This action cannot be undone."
50-
}
51-
})
59+
defaultMessage: "This action cannot be undone.",
60+
},
61+
});
Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,37 @@
1-
import React, { Component } from 'react'
2-
import { FormattedMessage } from 'react-intl'
3-
import { messagesByFilter }
4-
from '../../../../services/Widget/ChallengeFilter/ChallengeFilter'
5-
import DashboardFilterToggle
6-
from '../DashboardFilterToggle/DashboardFilterToggle'
1+
import React, { Component } from "react";
2+
import { FormattedMessage } from "react-intl";
3+
import { messagesByFilter } from "../../../../services/Widget/ChallengeFilter/ChallengeFilter";
4+
import DashboardFilterToggle from "../DashboardFilterToggle/DashboardFilterToggle";
75

8-
const VisibleFilterToggle = DashboardFilterToggle('challenge', 'visible')
9-
const PinnedFilterToggle = DashboardFilterToggle('challenge', 'pinned')
6+
const VisibleFilterToggle = DashboardFilterToggle("challenge", "visible");
7+
const PinnedFilterToggle = DashboardFilterToggle("challenge", "pinned");
8+
const ArchivedFilterToggle = DashboardFilterToggle("challenge", "archived");
109

1110
export default class ChallengeFilterGroup extends Component {
1211
render() {
1312
return (
1413
<React.Fragment>
15-
<VisibleFilterToggle {...this.props}
16-
dashboardEntityFilters={this.props.dashboardChallengeFilters}
17-
toggleEntityFilter={this.props.toggleDashboardChallengeFilter}
18-
filterToggleLabel={<FormattedMessage {...messagesByFilter.visible} />} />
19-
<PinnedFilterToggle {...this.props}
20-
dashboardEntityFilters={this.props.dashboardChallengeFilters}
21-
toggleEntityFilter={this.props.toggleDashboardChallengeFilter}
22-
filterToggleLabel={<FormattedMessage {...messagesByFilter.pinned} />} />
14+
<VisibleFilterToggle
15+
{...this.props}
16+
dashboardEntityFilters={this.props.dashboardChallengeFilters}
17+
toggleEntityFilter={this.props.toggleDashboardChallengeFilter}
18+
filterToggleLabel={<FormattedMessage {...messagesByFilter.visible} />}
19+
/>
20+
<PinnedFilterToggle
21+
{...this.props}
22+
dashboardEntityFilters={this.props.dashboardChallengeFilters}
23+
toggleEntityFilter={this.props.toggleDashboardChallengeFilter}
24+
filterToggleLabel={<FormattedMessage {...messagesByFilter.pinned} />}
25+
/>
26+
<ArchivedFilterToggle
27+
{...this.props}
28+
dashboardEntityFilters={this.props.dashboardChallengeFilters}
29+
toggleEntityFilter={this.props.toggleDashboardChallengeFilter}
30+
filterToggleLabel={
31+
<FormattedMessage {...messagesByFilter.archived} />
32+
}
33+
/>
2334
</React.Fragment>
24-
)
35+
);
2536
}
2637
}

src/components/AdminPane/Manage/ProjectCard/Messages.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineMessages } from 'react-intl'
1+
import { defineMessages } from "react-intl";
22

33
/**
44
* Internationalized messages for use with ProjectCard
@@ -39,6 +39,16 @@ export default defineMessages({
3939
defaultMessage: "Edit Project",
4040
},
4141

42+
archiveProjectLabel: {
43+
id: "Admin.ProjectCard.controls.archiveProject.label",
44+
defaultMessage: "Archive Project",
45+
},
46+
47+
unarchiveProjectLabel: {
48+
id: "Admin.ProjectCard.controls.unarchiveProject.label",
49+
defaultMessage: "Unarchive Project",
50+
},
51+
4252
pinProjectLabel: {
4353
id: "Admin.ProjectCard.controls.pinProject.label",
4454
defaultMessage: "Pin Project",
@@ -50,12 +60,12 @@ export default defineMessages({
5060
},
5161

5262
addChallengeLabel: {
53-
id: 'Admin.Project.controls.addChallenge.label',
63+
id: "Admin.Project.controls.addChallenge.label",
5464
defaultMessage: "Add Challenge",
5565
},
5666

5767
manageChallengeListLabel: {
58-
id: 'Admin.Project.controls.manageChallengeList.label',
68+
id: "Admin.Project.controls.manageChallengeList.label",
5969
defaultMessage: "Manage Challenge List",
6070
},
6171

@@ -78,4 +88,4 @@ export default defineMessages({
7888
id: "Admin.Project.controls.exportReviewCSV.label",
7989
defaultMessage: "Export Mapper Review CSV",
8090
},
81-
})
91+
});

0 commit comments

Comments
 (0)