From 30114cf45664f1dcc64f55a83a64538a4555f079 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Fri, 20 Jan 2017 11:43:49 -0500 Subject: [PATCH 01/18] Display HIT status and download btn --- src/components/TurkHit/index.js | 44 +++++++++++----- src/containers/BuildingDetail/actions.js | 56 +++++++++++++++++--- src/containers/BuildingDetail/constants.js | 5 +- src/containers/BuildingDetail/index.js | 10 +++- src/containers/BuildingDetail/reducer.js | 59 +++++++++++++++++++--- src/containers/BuildingDetail/sagas.js | 18 +++++++ 6 files changed, 165 insertions(+), 27 deletions(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index a3d13882..4476970c 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -4,29 +4,45 @@ import './styles.scss'; export default function TurkHit({ createHit, address, building_id, hit }) { let hitStatus =
; - if (!hit.error.message && hit.status !== '') { + let createBtn =
; + + // Loading HIT + if (hit.loading) { + return

Loading...

; + } else if (hit.error.message) { + return

{hit.error.message}

; + } + + // Creating HIT -- error message + if (hit.create.error.message) { + return

{hit.create.error.message}

; + } + + if (hit.status !== '') { hitStatus = (
-

HIT Id: {hit.id}

-

HIT Status: {hit.status}

+ HIT Status: {hit.status} + { + hit.status === 'Reviewable' ? + Download File : +
+ }
); } else { - hitStatus = ( -
-

{hit.error.message}

-
- ); - } - - return ( -
+ createBtn = ( + ); + } + + return ( +
+ {createBtn} {hitStatus}
); @@ -41,5 +57,9 @@ TurkHit.propTypes = { status: PropTypes.string, loading: PropTypes.boolean, error: PropTypes.boolean, + create: PropTypes.shape({ + loading: PropTypes.boolean, + error: PropTypes.boolean, + }), }), }; diff --git a/src/containers/BuildingDetail/actions.js b/src/containers/BuildingDetail/actions.js index 5a574bc8..c67ddf52 100644 --- a/src/containers/BuildingDetail/actions.js +++ b/src/containers/BuildingDetail/actions.js @@ -3,15 +3,18 @@ import { LOAD_BUILDING_DETAIL, LOAD_BUILDING_DETAIL_SUCCEES, LOAD_BUILDING_DETAIL_ERROR, + LOAD_HIT, + LOAD_HIT_SUCCESS, + LOAD_HIT_ERROR, CREATE_HIT, - CREATE_HIT_SUCCEES, + CREATE_HIT_SUCCESS, CREATE_HIT_ERROR, } from './constants'; /** * Load building details, this action starts the request saga * - * @param buildingID The current buildingID + * @param buildingID The current buildingID * @returns {object} An action object with a type of LOAD_BUILDING_DETAIL * passing the building detail */ @@ -40,7 +43,6 @@ export function buildingDetailLoaded(buildingDetail) { * Dispatched when loading the building detail fails * * @param {object} error The error - * * @return {object} An action object with a type of * LOAD_BUILDING_DETAIL_ERROR passing the error */ @@ -51,6 +53,49 @@ export function buildingDetailLoadingError(error) { }; } +/** + * Load status of HIT + * TODO The HIT status should be loaded from the building detail route + * + * @param {string} buildingId The current buildingID + * @returns {object} An action object with a type of + * LOAD_HIT passing the building_id + */ +export function loadHit(buildingId) { + return { + type: LOAD_HIT, + payload: buildingId, + }; +} + +/** + * Dispatched when the hit status was successfully loaded + * + * @param {string} hitStatus The HIT status + * @returns {object} An action object with a type of + * LOAD_HIT_SUCCESS passing the hit status + */ +export function hitLoaded(hitStatus) { + return { + type: LOAD_HIT_SUCCESS, + payload: hitStatus, + }; +} + +/** + * Dispatched when loading the hit status fails + * + * @param {object} error The error + * @returns {object} An action object with a type of + * LOAD_HIT passing the hit status + */ +export function hitLoadingError(error) { + return { + type: LOAD_HIT_ERROR, + error, + }; +} + /** * Create mturk HIT, this action starts the request saga * @@ -68,11 +113,11 @@ export function createHit(formData) { * Dispatched when the mturk HIT was successfully created * * @param {object} hitData The created hit data - * @returns {object} An action object with a type of CREATE_HIT_SUCCEES + * @returns {object} An action object with a type of CREATE_HIT_SUCCESS */ export function createHitSuccess(hitData) { return { - type: CREATE_HIT_SUCCEES, + type: CREATE_HIT_SUCCESS, payload: hitData, }; } @@ -81,7 +126,6 @@ export function createHitSuccess(hitData) { * Dispatched when creating the mturk HIT fails * * @param {object} error The error - * * @return {object} An action object with a type of CREATE_HIT_ERROR * passing the error */ diff --git a/src/containers/BuildingDetail/constants.js b/src/containers/BuildingDetail/constants.js index 873b9080..229ae047 100644 --- a/src/containers/BuildingDetail/constants.js +++ b/src/containers/BuildingDetail/constants.js @@ -1,6 +1,9 @@ export const LOAD_BUILDING_DETAIL = 'LOAD_BUILDING_DETAIL'; export const LOAD_BUILDING_DETAIL_SUCCEES = 'LOAD_BUILDING_DETAIL_SUCCEES'; export const LOAD_BUILDING_DETAIL_ERROR = 'LOAD_BUILDING_DETAIL_ERROR'; +export const LOAD_HIT = 'LOAD_HIT'; +export const LOAD_HIT_SUCCESS = 'LOAD_HIT_SUCCESS'; +export const LOAD_HIT_ERROR = 'LOAD_HIT_ERROR'; export const CREATE_HIT = 'CREATE_HIT'; -export const CREATE_HIT_SUCCEES = 'CREATE_HIT_SUCCEES'; +export const CREATE_HIT_SUCCESS = 'CREATE_HIT_SUCCESS'; export const CREATE_HIT_ERROR = 'CREATE_HIT_ERROR'; diff --git a/src/containers/BuildingDetail/index.js b/src/containers/BuildingDetail/index.js index 01b34909..7f016ed4 100644 --- a/src/containers/BuildingDetail/index.js +++ b/src/containers/BuildingDetail/index.js @@ -2,7 +2,7 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import { loadBuildingDetail, createHit } from './actions'; +import { loadBuildingDetail, loadHit, createHit } from './actions'; import './styles.scss'; import SideBarDetail from '../../components/SideBarDetail'; import TurkHit from '../../components/TurkHit'; @@ -11,6 +11,7 @@ import TurkHit from '../../components/TurkHit'; class BuildingDetail extends Component { componentDidMount() { this.props.loadBuildingDetail(this.props.params.buildingID); + this.props.loadHit(this.props.params.buildingID); } render() { @@ -73,12 +74,17 @@ BuildingDetail.propTypes = { }), params: PropTypes.objectOf(PropTypes.string), loadBuildingDetail: PropTypes.func, + loadHit: PropTypes.func, createHit: PropTypes.func, children: React.PropTypes.element, }; function mapDispatchToProps(dispatch) { - return bindActionCreators({ loadBuildingDetail, createHit }, dispatch); + return bindActionCreators({ + loadBuildingDetail, + loadHit, + createHit, + }, dispatch); } function mapStateToProps({ buildingDetail }) { diff --git a/src/containers/BuildingDetail/reducer.js b/src/containers/BuildingDetail/reducer.js index 457c6ed7..5b7a758f 100644 --- a/src/containers/BuildingDetail/reducer.js +++ b/src/containers/BuildingDetail/reducer.js @@ -2,8 +2,11 @@ import { LOAD_BUILDING_DETAIL, LOAD_BUILDING_DETAIL_SUCCEES, LOAD_BUILDING_DETAIL_ERROR, + LOAD_HIT, + LOAD_HIT_SUCCESS, + LOAD_HIT_ERROR, CREATE_HIT, - CREATE_HIT_SUCCEES, + CREATE_HIT_SUCCESS, CREATE_HIT_ERROR, } from './constants'; @@ -17,6 +20,10 @@ const initState = { status: '', loading: false, error: false, + create: { + loading: false, + error: false, + }, }, }; @@ -39,6 +46,7 @@ export default function (state = initState, action) { ...state.overview, ...action.payload.data, loading: false, + error: false, }, }; @@ -52,7 +60,7 @@ export default function (state = initState, action) { }, }; - case CREATE_HIT: + case LOAD_HIT: return { ...state, hit: { @@ -62,18 +70,19 @@ export default function (state = initState, action) { }, }; - case CREATE_HIT_SUCCEES: + case LOAD_HIT_SUCCESS: return { ...state, hit: { ...state.hit, - id: action.payload.data.hit_id, - status: 'Submitted', + status: action.payload.data.status, + url: action.payload.data.hit_url, loading: false, + error: false, }, }; - case CREATE_HIT_ERROR: + case LOAD_HIT_ERROR: return { ...state, hit: { @@ -83,6 +92,44 @@ export default function (state = initState, action) { }, }; + case CREATE_HIT: + return { + ...state, + hit: { + ...state.hit, + create: { + loading: true, + error: false, + }, + }, + }; + + case CREATE_HIT_SUCCESS: + return { + ...state, + hit: { + ...state.hit, + id: action.payload.data.hit_id, + status: 'Submitted', + create: { + loading: false, + error: false, + }, + }, + }; + + case CREATE_HIT_ERROR: + return { + ...state, + hit: { + ...state.hit, + create: { + loading: false, + error: action.error, + }, + }, + }; + default: return state; } diff --git a/src/containers/BuildingDetail/sagas.js b/src/containers/BuildingDetail/sagas.js index 55c0fae7..adfce559 100644 --- a/src/containers/BuildingDetail/sagas.js +++ b/src/containers/BuildingDetail/sagas.js @@ -3,12 +3,15 @@ import request from '../../utils/request'; import { LOAD_BUILDING_DETAIL, + LOAD_HIT, CREATE_HIT, } from './constants'; import { buildingDetailLoaded, buildingDetailLoadingError, + hitLoaded, + hitLoadingError, createHitSuccess, createHitError, } from './actions'; @@ -40,6 +43,20 @@ function* getBuildingDetail(action) { } } +function* loadHit(action) { + const buildingId = action.payload; + const data = yield call(request, `${BUILDING_SERVICE_URL}/turkhit/${buildingId}`, { + method: 'GET', + headers: HEADERS, + }); + + if (!data.err) { + yield put(hitLoaded(data)); + } else { + yield put(hitLoadingError(data.err)); + } +} + /** * Mechanical Turk HIT creation request/response handler * @@ -66,6 +83,7 @@ function* createHit(action) { */ function* buildingDetailWatcher() { yield takeEvery(LOAD_BUILDING_DETAIL, getBuildingDetail); + yield takeEvery(LOAD_HIT, loadHit); yield takeEvery(CREATE_HIT, createHit); } -- GitLab From fd037675d742e5b03e7612ec055130c854815cfc Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Sun, 22 Jan 2017 13:56:20 -0500 Subject: [PATCH 02/18] Update TurkHit component and actions --- src/components/TurkHit/index.js | 26 ++++++++-------- src/containers/BuildingDetail/actions.js | 35 ++++++++++++++++++++++ src/containers/BuildingDetail/constants.js | 3 ++ src/containers/BuildingDetail/reducer.js | 7 +++-- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index 4476970c..74ba8456 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -5,28 +5,25 @@ import './styles.scss'; export default function TurkHit({ createHit, address, building_id, hit }) { let hitStatus =
; let createBtn =
; + // let approveBtn = ; + // let disapproveBtn = ; // Loading HIT if (hit.loading) { return

Loading...

; - } else if (hit.error.message) { + } else if (hit.error.message && hit.error.response.status !== 404) { return

{hit.error.message}

; } - // Creating HIT -- error message - if (hit.create.error.message) { - return

{hit.create.error.message}

; - } - - if (hit.status !== '') { + if (!hit.error.message && hit.status !== '') { + let link =
; + if (hit.status === 'Reviewable') { + link = Download File; + } hitStatus = (
HIT Status: {hit.status} - { - hit.status === 'Reviewable' ? - Download File : -
- } + {link}
); } else { @@ -40,6 +37,11 @@ export default function TurkHit({ createHit, address, building_id, hit }) { ); } + // Creating HIT -- error message + if (hit.create.error.message) { + return

{hit.create.error.message}

; + } + return (
{createBtn} diff --git a/src/containers/BuildingDetail/actions.js b/src/containers/BuildingDetail/actions.js index c67ddf52..d4ea405c 100644 --- a/src/containers/BuildingDetail/actions.js +++ b/src/containers/BuildingDetail/actions.js @@ -9,6 +9,9 @@ import { CREATE_HIT, CREATE_HIT_SUCCESS, CREATE_HIT_ERROR, + DECIDE_HIT, + DECIDE_HIT_SUCCESS, + DECIDE_HIT_ERROR, } from './constants'; /** @@ -135,3 +138,35 @@ export function createHitError(error) { error, }; } + +/** + * Dispatched when user selects approve or disapprove HIT + * + * @param {int} decision 1 or 0 representing approve and disapprove + * @returns {object} An action object with a type of DECIDE_HIT + * passing the decision of the user + */ +export function hitDecision(decision) { + return { + type: DECIDE_HIT, + payload: decision, + }; +} + +/** + * Dispatched when the hit was successfully approved or disapproved + * + * @returns {object} + */ +export function hitDecisionSuccess() { + return { + type: DECIDE_HIT_SUCCESS, + }; +} + +export function hitDecisionError(error) { + return { + type: DECIDE_HIT_ERROR, + error, + }; +} diff --git a/src/containers/BuildingDetail/constants.js b/src/containers/BuildingDetail/constants.js index 229ae047..4ed5fd68 100644 --- a/src/containers/BuildingDetail/constants.js +++ b/src/containers/BuildingDetail/constants.js @@ -7,3 +7,6 @@ export const LOAD_HIT_ERROR = 'LOAD_HIT_ERROR'; export const CREATE_HIT = 'CREATE_HIT'; export const CREATE_HIT_SUCCESS = 'CREATE_HIT_SUCCESS'; export const CREATE_HIT_ERROR = 'CREATE_HIT_ERROR'; +export const DECIDE_HIT = 'DECIDE_HIT'; +export const DECIDE_HIT_SUCCESS = 'DECIDE_HIT_SUCCESS'; +export const DECIDE_HIT_ERROR = 'DECIDE_HIT_ERROR'; diff --git a/src/containers/BuildingDetail/reducer.js b/src/containers/BuildingDetail/reducer.js index 5b7a758f..223d4c13 100644 --- a/src/containers/BuildingDetail/reducer.js +++ b/src/containers/BuildingDetail/reducer.js @@ -33,7 +33,6 @@ export default function (state = initState, action) { return { ...state, overview: { - ...state.overview, loading: true, error: false, }, @@ -65,6 +64,7 @@ export default function (state = initState, action) { ...state, hit: { ...state.hit, + status: '', loading: true, error: false, }, @@ -108,9 +108,10 @@ export default function (state = initState, action) { return { ...state, hit: { - ...state.hit, id: action.payload.data.hit_id, - status: 'Submitted', + status: action.payload.data.status, + loading: false, + error: false, create: { loading: false, error: false, -- GitLab From 26e76d5af1d7ee238ba6b7fdb7f76fdfb474eb49 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Sun, 22 Jan 2017 13:56:42 -0500 Subject: [PATCH 03/18] Move initial address into reducer --- src/containers/BuildingList/index.js | 4 +--- src/containers/BuildingList/reducer.js | 7 ++++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/containers/BuildingList/index.js b/src/containers/BuildingList/index.js index f7a5355b..4b704072 100644 --- a/src/containers/BuildingList/index.js +++ b/src/containers/BuildingList/index.js @@ -7,14 +7,12 @@ import BuildingListTable from '../../components/BuildingListTable'; import './styles.scss'; import { SearchSVG } from '../../components/bpl'; -// TODO remove this address -const INITIAL_TERM = '107 broadway'; class BuildingList extends Component { constructor(props) { super(props); - this.state = { term: INITIAL_TERM }; + this.state = { term: this.props.buildingList.term }; this.onInputChange = this.onInputChange.bind(this); this.onFormSubmit = this.onFormSubmit.bind(this); } diff --git a/src/containers/BuildingList/reducer.js b/src/containers/BuildingList/reducer.js index 13acd7e5..230de775 100644 --- a/src/containers/BuildingList/reducer.js +++ b/src/containers/BuildingList/reducer.js @@ -1,6 +1,11 @@ import { FETCH_BUILDINGS, SEARCH_TERM } from './constants'; -export default function (state = {}, action) { +// TODO remove hard coded search term +const initState = { + term: '107 broadway', +}; + +export default function (state = initState, action) { switch (action.type) { case FETCH_BUILDINGS: return { ...state, buildings: action.payload.buildings }; -- GitLab From 12f11c5da42b299d443866dce5277cc300964286 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Sun, 22 Jan 2017 14:52:36 -0500 Subject: [PATCH 04/18] Chang hit max file upload to 50 mb --- src/components/TurkHit/defaultForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TurkHit/defaultForm.js b/src/components/TurkHit/defaultForm.js index b8fa47c8..ceebdb03 100644 --- a/src/components/TurkHit/defaultForm.js +++ b/src/components/TurkHit/defaultForm.js @@ -10,7 +10,7 @@ const defaultTurkHit = { duration: '300', reward: '5', MIN_FILE_BYTES: 1, - MAX_FILE_BYTES: 10, + MAX_FILE_BYTES: 50000000, }; export default defaultTurkHit; -- GitLab From aa21493c4a32508c52b4e2457b395909c72c614c Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Sun, 22 Jan 2017 22:39:14 -0500 Subject: [PATCH 05/18] Add approve and disapprove buttons for HIT --- src/components/TurkHit/index.js | 30 +++++++++++++---- src/containers/BuildingDetail/actions.js | 9 ++++- src/containers/BuildingDetail/index.js | 15 +++++++-- src/containers/BuildingDetail/reducer.js | 43 ++++++++++++++++++++++++ src/containers/BuildingDetail/sagas.js | 23 +++++++++++++ 5 files changed, 110 insertions(+), 10 deletions(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index 74ba8456..20ce963d 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -2,11 +2,10 @@ import React, { PropTypes } from 'react'; import defaultForm from './defaultForm'; import './styles.scss'; -export default function TurkHit({ createHit, address, building_id, hit }) { + +export default function TurkHit({ createHit, hitDecision, address, building_id, hit }) { let hitStatus =
; let createBtn =
; - // let approveBtn = ; - // let disapproveBtn = ; // Loading HIT if (hit.loading) { @@ -16,14 +15,32 @@ export default function TurkHit({ createHit, address, building_id, hit }) { } if (!hit.error.message && hit.status !== '') { - let link =
; + let fileActions =
; + if (hit.status === 'Reviewable') { - link = Download File; + fileActions = ( +
+ Download File + + +
+ ); } + hitStatus = (
HIT Status: {hit.status} - {link} + {fileActions}
); } else { @@ -52,6 +69,7 @@ export default function TurkHit({ createHit, address, building_id, hit }) { TurkHit.propTypes = { createHit: PropTypes.func, + hitDecision: PropTypes.func, address: PropTypes.string, building_id: PropTypes.number, hit: PropTypes.shape({ diff --git a/src/containers/BuildingDetail/actions.js b/src/containers/BuildingDetail/actions.js index d4ea405c..dd97a172 100644 --- a/src/containers/BuildingDetail/actions.js +++ b/src/containers/BuildingDetail/actions.js @@ -142,7 +142,7 @@ export function createHitError(error) { /** * Dispatched when user selects approve or disapprove HIT * - * @param {int} decision 1 or 0 representing approve and disapprove + * @param {int} decision 1 or 0 representing approve or disapprove * @returns {object} An action object with a type of DECIDE_HIT * passing the decision of the user */ @@ -164,6 +164,13 @@ export function hitDecisionSuccess() { }; } +/** + * Dispatched when there is a error approving or disapproving error + * + * @param error The error + * @returns {object} An action object with a type of DECIDE_HIT_ERROR + * passing the error + */ export function hitDecisionError(error) { return { type: DECIDE_HIT_ERROR, diff --git a/src/containers/BuildingDetail/index.js b/src/containers/BuildingDetail/index.js index 7f016ed4..55fd4dc6 100644 --- a/src/containers/BuildingDetail/index.js +++ b/src/containers/BuildingDetail/index.js @@ -2,7 +2,13 @@ import React, { Component, PropTypes } from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; -import { loadBuildingDetail, loadHit, createHit } from './actions'; +import { + loadBuildingDetail, + loadHit, + createHit, + hitDecision, +} from './actions'; + import './styles.scss'; import SideBarDetail from '../../components/SideBarDetail'; import TurkHit from '../../components/TurkHit'; @@ -32,7 +38,8 @@ class BuildingDetail extends Component { hit = ( @@ -76,7 +83,8 @@ BuildingDetail.propTypes = { loadBuildingDetail: PropTypes.func, loadHit: PropTypes.func, createHit: PropTypes.func, - children: React.PropTypes.element, + hitDecision: PropTypes.func, + children: PropTypes.element, }; function mapDispatchToProps(dispatch) { @@ -84,6 +92,7 @@ function mapDispatchToProps(dispatch) { loadBuildingDetail, loadHit, createHit, + hitDecision, }, dispatch); } diff --git a/src/containers/BuildingDetail/reducer.js b/src/containers/BuildingDetail/reducer.js index 223d4c13..e0f39e0f 100644 --- a/src/containers/BuildingDetail/reducer.js +++ b/src/containers/BuildingDetail/reducer.js @@ -8,6 +8,9 @@ import { CREATE_HIT, CREATE_HIT_SUCCESS, CREATE_HIT_ERROR, + DECIDE_HIT, + DECIDE_HIT_SUCCESS, + DECIDE_HIT_ERROR, } from './constants'; const initState = { @@ -24,6 +27,10 @@ const initState = { loading: false, error: false, }, + approval: { + loading: false, + error: false, + }, }, }; @@ -131,6 +138,42 @@ export default function (state = initState, action) { }, }; + case DECIDE_HIT: + return { + ...state, + hit: { + ...state.hit, + approval: { + loading: true, + error: false, + }, + }, + }; + + case DECIDE_HIT_SUCCESS: + return { + ...state, + hit: { + ...state.hit, + approval: { + loading: false, + error: false, + }, + }, + }; + + case DECIDE_HIT_ERROR: + return { + ...state, + hit: { + ...state.hit, + approval: { + loading: false, + error: action.error, + }, + }, + }; + default: return state; } diff --git a/src/containers/BuildingDetail/sagas.js b/src/containers/BuildingDetail/sagas.js index adfce559..32e9b43e 100644 --- a/src/containers/BuildingDetail/sagas.js +++ b/src/containers/BuildingDetail/sagas.js @@ -5,6 +5,7 @@ import { LOAD_BUILDING_DETAIL, LOAD_HIT, CREATE_HIT, + DECIDE_HIT, } from './constants'; import { @@ -14,6 +15,8 @@ import { hitLoadingError, createHitSuccess, createHitError, + hitDecisionSuccess, + hitDecisionError, } from './actions'; const BUILDING_SERVICE_URL = `${process.env.REACT_APP_BUILDING_SERVICE}`; @@ -77,6 +80,25 @@ function* createHit(action) { } } +/** + * Approve or disapprove HIT request/response handler + * + * @param {number} action 1 or 0 representing approve or disapprove + */ +function* approveHit(action) { + const data = yield call(request, `${BUILDING_SERVICE_URL}/turkhit/`, { + method: 'PUT', + headers: HEADERS, + body: JSON.stringify({ approve: action.payload }), + }); + + if (!data.err) { + yield put(hitDecisionSuccess()); + } else { + yield put(hitDecisionError(data.err)); + } +} + /** * Watches for LOAD_BUILDING_DETAIL & CREATE_HIT actions and calls * the appropriate handler function. @@ -85,6 +107,7 @@ function* buildingDetailWatcher() { yield takeEvery(LOAD_BUILDING_DETAIL, getBuildingDetail); yield takeEvery(LOAD_HIT, loadHit); yield takeEvery(CREATE_HIT, createHit); + yield takeEvery(DECIDE_HIT, approveHit); } export default buildingDetailWatcher; -- GitLab From 080c25cac76baecc392a743d098e55b5577885bb Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Sun, 22 Jan 2017 23:01:36 -0500 Subject: [PATCH 06/18] Rename BuildingDetail container and add screens dir --- .../index.js | 0 .../styles.scss | 0 .../actions.js | 0 .../constants.js | 0 .../index.js | 28 ++++++++----------- .../reducer.js | 0 .../sagas.js | 0 .../styles.scss | 0 src/reducers.js | 4 +-- src/routes.js | 5 ++-- src/sagas.js | 4 +-- src/screens/BuildingDetail/index.js | 20 +++++++++++++ src/screens/BuildingDetail/styles.scss | 0 13 files changed, 39 insertions(+), 22 deletions(-) rename src/components/{BuildingOverview => BuildingOverviewTop}/index.js (100%) rename src/components/{BuildingOverview => BuildingOverviewTop}/styles.scss (100%) rename src/containers/{BuildingDetail => BuildingOverview}/actions.js (100%) rename src/containers/{BuildingDetail => BuildingOverview}/constants.js (100%) rename src/containers/{BuildingDetail => BuildingOverview}/index.js (80%) rename src/containers/{BuildingDetail => BuildingOverview}/reducer.js (100%) rename src/containers/{BuildingDetail => BuildingOverview}/sagas.js (100%) rename src/containers/{BuildingDetail => BuildingOverview}/styles.scss (100%) create mode 100644 src/screens/BuildingDetail/index.js create mode 100644 src/screens/BuildingDetail/styles.scss diff --git a/src/components/BuildingOverview/index.js b/src/components/BuildingOverviewTop/index.js similarity index 100% rename from src/components/BuildingOverview/index.js rename to src/components/BuildingOverviewTop/index.js diff --git a/src/components/BuildingOverview/styles.scss b/src/components/BuildingOverviewTop/styles.scss similarity index 100% rename from src/components/BuildingOverview/styles.scss rename to src/components/BuildingOverviewTop/styles.scss diff --git a/src/containers/BuildingDetail/actions.js b/src/containers/BuildingOverview/actions.js similarity index 100% rename from src/containers/BuildingDetail/actions.js rename to src/containers/BuildingOverview/actions.js diff --git a/src/containers/BuildingDetail/constants.js b/src/containers/BuildingOverview/constants.js similarity index 100% rename from src/containers/BuildingDetail/constants.js rename to src/containers/BuildingOverview/constants.js diff --git a/src/containers/BuildingDetail/index.js b/src/containers/BuildingOverview/index.js similarity index 80% rename from src/containers/BuildingDetail/index.js rename to src/containers/BuildingOverview/index.js index 55fd4dc6..c813797f 100644 --- a/src/containers/BuildingDetail/index.js +++ b/src/containers/BuildingOverview/index.js @@ -10,11 +10,11 @@ import { } from './actions'; import './styles.scss'; -import SideBarDetail from '../../components/SideBarDetail'; +import BuildingOverviewTop from '../../components/BuildingOverviewTop'; import TurkHit from '../../components/TurkHit'; -class BuildingDetail extends Component { +class BuildingOverview extends Component { componentDidMount() { this.props.loadBuildingDetail(this.props.params.buildingID); this.props.loadHit(this.props.params.buildingID); @@ -31,9 +31,11 @@ class BuildingDetail extends Component {

); } else { - mainContent = React.cloneElement(this.props.children, { - building: this.props.buildingDetail.overview, - }); + mainContent = ( + + ); hit = ( -
- -
-
- {mainContent} - {hit} -
+
+ {mainContent} + {hit}
); } } -BuildingDetail.propTypes = { +BuildingOverview.propTypes = { buildingDetail: PropTypes.shape({ overview: PropTypes.shape({ address: PropTypes.string, @@ -84,7 +81,6 @@ BuildingDetail.propTypes = { loadHit: PropTypes.func, createHit: PropTypes.func, hitDecision: PropTypes.func, - children: PropTypes.element, }; function mapDispatchToProps(dispatch) { @@ -100,4 +96,4 @@ function mapStateToProps({ buildingDetail }) { return { buildingDetail }; } -export default connect(mapStateToProps, mapDispatchToProps)(BuildingDetail); +export default connect(mapStateToProps, mapDispatchToProps)(BuildingOverview); diff --git a/src/containers/BuildingDetail/reducer.js b/src/containers/BuildingOverview/reducer.js similarity index 100% rename from src/containers/BuildingDetail/reducer.js rename to src/containers/BuildingOverview/reducer.js diff --git a/src/containers/BuildingDetail/sagas.js b/src/containers/BuildingOverview/sagas.js similarity index 100% rename from src/containers/BuildingDetail/sagas.js rename to src/containers/BuildingOverview/sagas.js diff --git a/src/containers/BuildingDetail/styles.scss b/src/containers/BuildingOverview/styles.scss similarity index 100% rename from src/containers/BuildingDetail/styles.scss rename to src/containers/BuildingOverview/styles.scss diff --git a/src/reducers.js b/src/reducers.js index 3568c2e9..82192a2c 100644 --- a/src/reducers.js +++ b/src/reducers.js @@ -2,10 +2,10 @@ import { combineReducers } from 'redux'; import { routerReducer } from 'react-router-redux'; import BuildingListReducer from './containers/BuildingList/reducer'; -import BuildingDetailReducer from './containers/BuildingDetail/reducer'; +import BuildingOverviewReducer from './containers/BuildingOverview/reducer'; export default combineReducers({ routing: routerReducer, buildingList: BuildingListReducer, - buildingDetail: BuildingDetailReducer, + buildingDetail: BuildingOverviewReducer, }); diff --git a/src/routes.js b/src/routes.js index a86d916e..5d97a45b 100644 --- a/src/routes.js +++ b/src/routes.js @@ -1,8 +1,9 @@ import React from 'react'; import { Route, IndexRoute, IndexRedirect } from 'react-router'; + +import BuildingDetail from './screens/BuildingDetail'; import BuildingList from './containers/BuildingList'; -import BuildingDetail from './containers/BuildingDetail'; -import BuildingOverview from './components/BuildingOverview'; +import BuildingOverview from './containers/BuildingOverview'; export default ( diff --git a/src/sagas.js b/src/sagas.js index 644286f8..09714c28 100644 --- a/src/sagas.js +++ b/src/sagas.js @@ -1,7 +1,7 @@ -import buildingDetailSaga from './containers/BuildingDetail/sagas'; +import buildingOverviewSaga from './containers/BuildingOverview/sagas'; export default function* rootSaga() { yield [ - buildingDetailSaga(), + buildingOverviewSaga(), ]; } diff --git a/src/screens/BuildingDetail/index.js b/src/screens/BuildingDetail/index.js new file mode 100644 index 00000000..d54ada22 --- /dev/null +++ b/src/screens/BuildingDetail/index.js @@ -0,0 +1,20 @@ +import React, { PropTypes } from 'react'; +import SideBarDetail from '../../components/SideBarDetail'; + + +export default function BuildingDetail(props) { + return ( +
+
+ +
+
+ {props.children} +
+
+ ); +} + +BuildingDetail.propTypes = { + children: PropTypes.element, +}; diff --git a/src/screens/BuildingDetail/styles.scss b/src/screens/BuildingDetail/styles.scss new file mode 100644 index 00000000..e69de29b -- GitLab From 4307601ca4e588f4e4619e150a33b4a1d3db8024 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Sun, 22 Jan 2017 23:06:10 -0500 Subject: [PATCH 07/18] Add building id to hit approval request --- src/components/TurkHit/index.js | 4 ++-- src/containers/BuildingOverview/actions.js | 6 ++++-- src/containers/BuildingOverview/sagas.js | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index 20ce963d..51ea70d3 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -23,13 +23,13 @@ export default function TurkHit({ createHit, hitDecision, address, building_id, Download File diff --git a/src/containers/BuildingOverview/actions.js b/src/containers/BuildingOverview/actions.js index dd97a172..7ea7b0a9 100644 --- a/src/containers/BuildingOverview/actions.js +++ b/src/containers/BuildingOverview/actions.js @@ -142,14 +142,16 @@ export function createHitError(error) { /** * Dispatched when user selects approve or disapprove HIT * + * @param {int} buildingId Id of building * @param {int} decision 1 or 0 representing approve or disapprove * @returns {object} An action object with a type of DECIDE_HIT * passing the decision of the user */ -export function hitDecision(decision) { +export function hitDecision(buildingId, decision) { return { type: DECIDE_HIT, - payload: decision, + buildingId, + decision, }; } diff --git a/src/containers/BuildingOverview/sagas.js b/src/containers/BuildingOverview/sagas.js index 32e9b43e..4f197bf3 100644 --- a/src/containers/BuildingOverview/sagas.js +++ b/src/containers/BuildingOverview/sagas.js @@ -86,10 +86,10 @@ function* createHit(action) { * @param {number} action 1 or 0 representing approve or disapprove */ function* approveHit(action) { - const data = yield call(request, `${BUILDING_SERVICE_URL}/turkhit/`, { + const data = yield call(request, `${BUILDING_SERVICE_URL}/turkhit/${action.buildingId}`, { method: 'PUT', headers: HEADERS, - body: JSON.stringify({ approve: action.payload }), + body: JSON.stringify({ accept: action.decision }), }); if (!data.err) { -- GitLab From a35cccb37f7bbd03e1ec9b57bce0320c4b3fc75a Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Jan 2017 00:06:19 -0500 Subject: [PATCH 08/18] Add side bar routes and links --- src/components/BuildingListTable/index.js | 2 +- src/components/SideBarDetail/index.js | 23 ++++++++++++++++++++--- src/components/dummyComponent.js | 5 +++++ src/routes.js | 14 +++++++++++--- src/screens/BuildingDetail/index.js | 5 ++++- src/screens/NotFound/index.js | 5 +++++ 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 src/components/dummyComponent.js create mode 100644 src/screens/NotFound/index.js diff --git a/src/components/BuildingListTable/index.js b/src/components/BuildingListTable/index.js index 1693664d..45ca7cea 100644 --- a/src/components/BuildingListTable/index.js +++ b/src/components/BuildingListTable/index.js @@ -19,7 +19,7 @@ export default function BuildingListTable({ buildings }) { React router Link component does not support relative paths */} - + {building.address} diff --git a/src/components/SideBarDetail/index.js b/src/components/SideBarDetail/index.js index fb62883e..795c51dd 100644 --- a/src/components/SideBarDetail/index.js +++ b/src/components/SideBarDetail/index.js @@ -1,10 +1,27 @@ -import React from 'react'; +import React, { PropTypes } from 'react'; +import { Link } from 'react-router'; import './styles.scss'; -export default function SideBarDetail() { +export default function SideBarDetail({ buildingId }) { return (
-

Sidebar

+ Home +
+ Overview +
+ Dimensions +
+ Weather +
+ Utilities +
+ Occupancy +
+ Financials
); } + +SideBarDetail.propTypes = { + buildingId: PropTypes.string, +}; diff --git a/src/components/dummyComponent.js b/src/components/dummyComponent.js new file mode 100644 index 00000000..2ab9f55a --- /dev/null +++ b/src/components/dummyComponent.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function dummyComponent() { + return

Comming Soon!

; +} diff --git a/src/routes.js b/src/routes.js index 5d97a45b..7e471c18 100644 --- a/src/routes.js +++ b/src/routes.js @@ -4,15 +4,23 @@ import { Route, IndexRoute, IndexRedirect } from 'react-router'; import BuildingDetail from './screens/BuildingDetail'; import BuildingList from './containers/BuildingList'; import BuildingOverview from './containers/BuildingOverview'; +import NotFound from './screens/NotFound'; +import Dummy from './components/dummyComponent'; export default ( - - + + - + + + + + + + ); diff --git a/src/screens/BuildingDetail/index.js b/src/screens/BuildingDetail/index.js index d54ada22..8c3f4d94 100644 --- a/src/screens/BuildingDetail/index.js +++ b/src/screens/BuildingDetail/index.js @@ -6,7 +6,7 @@ export default function BuildingDetail(props) { return (
- +
{props.children} @@ -17,4 +17,7 @@ export default function BuildingDetail(props) { BuildingDetail.propTypes = { children: PropTypes.element, + params: PropTypes.shape({ + buildingID: PropTypes.string, + }), }; diff --git a/src/screens/NotFound/index.js b/src/screens/NotFound/index.js new file mode 100644 index 00000000..b67b113b --- /dev/null +++ b/src/screens/NotFound/index.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function NotFound() { + return

Page Not Found!

; +} -- GitLab From 5eb86bdf4c4b3b3abc960db5f50b9eb0cb98eb22 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Jan 2017 00:11:30 -0500 Subject: [PATCH 09/18] Extract root url from links --- src/components/SideBarDetail/index.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/SideBarDetail/index.js b/src/components/SideBarDetail/index.js index 795c51dd..405c3bbf 100644 --- a/src/components/SideBarDetail/index.js +++ b/src/components/SideBarDetail/index.js @@ -3,21 +3,22 @@ import { Link } from 'react-router'; import './styles.scss'; export default function SideBarDetail({ buildingId }) { + const rootURL = `/buildings/${buildingId}`; return (
Home
- Overview + Overview
- Dimensions + Dimensions
- Weather + Weather
- Utilities + Utilities
- Occupancy + Occupancy
- Financials + Financials
); } -- GitLab From 6f13efd33072bde2128d11e0840fafc68799b852 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Jan 2017 00:15:01 -0500 Subject: [PATCH 10/18] Edit home link url --- src/components/SideBarDetail/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SideBarDetail/index.js b/src/components/SideBarDetail/index.js index 405c3bbf..6530ad2c 100644 --- a/src/components/SideBarDetail/index.js +++ b/src/components/SideBarDetail/index.js @@ -6,7 +6,7 @@ export default function SideBarDetail({ buildingId }) { const rootURL = `/buildings/${buildingId}`; return (
- Home + Home
Overview
-- GitLab From f37b772450db74ab7a62f59f035d3638a05ce6fc Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Jan 2017 13:32:01 -0500 Subject: [PATCH 11/18] Update hit status after approving or disapproving hit --- src/containers/BuildingOverview/actions.js | 3 ++- src/containers/BuildingOverview/reducer.js | 1 + src/containers/BuildingOverview/sagas.js | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/containers/BuildingOverview/actions.js b/src/containers/BuildingOverview/actions.js index 7ea7b0a9..14c6db1e 100644 --- a/src/containers/BuildingOverview/actions.js +++ b/src/containers/BuildingOverview/actions.js @@ -160,9 +160,10 @@ export function hitDecision(buildingId, decision) { * * @returns {object} */ -export function hitDecisionSuccess() { +export function hitDecisionSuccess(data) { return { type: DECIDE_HIT_SUCCESS, + payload: data, }; } diff --git a/src/containers/BuildingOverview/reducer.js b/src/containers/BuildingOverview/reducer.js index e0f39e0f..fca40940 100644 --- a/src/containers/BuildingOverview/reducer.js +++ b/src/containers/BuildingOverview/reducer.js @@ -155,6 +155,7 @@ export default function (state = initState, action) { ...state, hit: { ...state.hit, + status: action.payload.data.hit_status, approval: { loading: false, error: false, diff --git a/src/containers/BuildingOverview/sagas.js b/src/containers/BuildingOverview/sagas.js index 4f197bf3..0fd87593 100644 --- a/src/containers/BuildingOverview/sagas.js +++ b/src/containers/BuildingOverview/sagas.js @@ -93,7 +93,7 @@ function* approveHit(action) { }); if (!data.err) { - yield put(hitDecisionSuccess()); + yield put(hitDecisionSuccess(data)); } else { yield put(hitDecisionError(data.err)); } -- GitLab From 46f87e4d9863f35445218d07c81a4a9f6ad10653 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Jan 2017 13:45:53 -0500 Subject: [PATCH 12/18] Update the duration --- src/components/TurkHit/defaultForm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TurkHit/defaultForm.js b/src/components/TurkHit/defaultForm.js index ceebdb03..40058541 100644 --- a/src/components/TurkHit/defaultForm.js +++ b/src/components/TurkHit/defaultForm.js @@ -7,7 +7,7 @@ const defaultTurkHit = { title: 'Measure building dimensions', description: 'Use google earth to measure building\'s dimensions, windows, and doors', keywords: 'building, dimensions, google earth', - duration: '300', + duration: '7200', reward: '5', MIN_FILE_BYTES: 1, MAX_FILE_BYTES: 50000000, -- GitLab From c041b6d88e7669917c798cec28716cdaa0aee25e Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Mon, 23 Jan 2017 16:24:21 -0500 Subject: [PATCH 13/18] Add download attribute to turk hit file --- src/components/TurkHit/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index 51ea70d3..9646859a 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -20,7 +20,7 @@ export default function TurkHit({ createHit, hitDecision, address, building_id, if (hit.status === 'Reviewable') { fileActions = (
- Download File + Download File + ); // Loading HIT if (hit.loading) { @@ -31,10 +38,12 @@ export default function TurkHit({ createHit, hitDecision, address, building_id, className="btn btn-secondary" onClick={() => hitDecision(building_id, 0)} > - Disapprove + Reject
); + } else if (hit.status === 'Rejected') { + fileActions = createBtn; } hitStatus = ( @@ -44,14 +53,7 @@ export default function TurkHit({ createHit, hitDecision, address, building_id,
); } else { - createBtn = ( - - ); + hitStatus = createBtn; } // Creating HIT -- error message @@ -61,7 +63,6 @@ export default function TurkHit({ createHit, hitDecision, address, building_id, return (
- {createBtn} {hitStatus}
); diff --git a/src/containers/BuildingOverview/actions.js b/src/containers/BuildingOverview/actions.js index 14c6db1e..28840a22 100644 --- a/src/containers/BuildingOverview/actions.js +++ b/src/containers/BuildingOverview/actions.js @@ -140,10 +140,10 @@ export function createHitError(error) { } /** - * Dispatched when user selects approve or disapprove HIT + * Dispatched when user selects approve or reject HIT * * @param {int} buildingId Id of building - * @param {int} decision 1 or 0 representing approve or disapprove + * @param {int} decision 1 or 0 representing approve or reject * @returns {object} An action object with a type of DECIDE_HIT * passing the decision of the user */ @@ -168,7 +168,7 @@ export function hitDecisionSuccess(data) { } /** - * Dispatched when there is a error approving or disapproving error + * Dispatched when there is a error approving or rejecting a HIT * * @param error The error * @returns {object} An action object with a type of DECIDE_HIT_ERROR diff --git a/src/containers/BuildingOverview/sagas.js b/src/containers/BuildingOverview/sagas.js index 0fd87593..2aa9622c 100644 --- a/src/containers/BuildingOverview/sagas.js +++ b/src/containers/BuildingOverview/sagas.js @@ -81,9 +81,9 @@ function* createHit(action) { } /** - * Approve or disapprove HIT request/response handler + * Approve or reject HIT request/response handler * - * @param {number} action 1 or 0 representing approve or disapprove + * @param {number} action 1 or 0 representing approve or reject */ function* approveHit(action) { const data = yield call(request, `${BUILDING_SERVICE_URL}/turkhit/${action.buildingId}`, { -- GitLab From e24319e192ff36b79c279d328c9c0e82ea63f664 Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 24 Jan 2017 11:42:43 -0500 Subject: [PATCH 17/18] Add create turk if hit is expired --- src/components/TurkHit/index.js | 2 +- src/components/dummyComponent.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index 3b31f627..543c54e4 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -42,7 +42,7 @@ export default function TurkHit({ createHit, hitDecision, address, building_id,
); - } else if (hit.status === 'Rejected') { + } else if (hit.status === 'Rejected' || hit.status === 'Expired') { fileActions = createBtn; } diff --git a/src/components/dummyComponent.js b/src/components/dummyComponent.js index 2ab9f55a..2cec953e 100644 --- a/src/components/dummyComponent.js +++ b/src/components/dummyComponent.js @@ -1,5 +1,5 @@ import React from 'react'; export default function dummyComponent() { - return

Comming Soon!

; + return

Coming Soon!

; } -- GitLab From 7cb8d99e69dc6a3d60b009477113ec766aa8070e Mon Sep 17 00:00:00 2001 From: Alessandro DiMarco Date: Tue, 24 Jan 2017 11:52:08 -0500 Subject: [PATCH 18/18] Create hit when hit is disposed --- src/components/TurkHit/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/TurkHit/index.js b/src/components/TurkHit/index.js index 543c54e4..1c3e9383 100644 --- a/src/components/TurkHit/index.js +++ b/src/components/TurkHit/index.js @@ -42,7 +42,9 @@ export default function TurkHit({ createHit, hitDecision, address, building_id,
); - } else if (hit.status === 'Rejected' || hit.status === 'Expired') { + } else if (hit.status === 'Rejected' + || hit.status === 'Expired' + || hit.status === 'Disposed') { fileActions = createBtn; } -- GitLab