colouring-montreal/app/src/frontend/building/data-containers/planning.tsx

295 lines
15 KiB
TypeScript
Raw Normal View History

2019-08-23 09:09:23 -04:00
import React, { Fragment } from 'react';
import { Link } from 'react-router-dom';
2020-02-10 18:39:51 -05:00
import InfoBox from '../../components/info-box';
import CheckboxDataEntry from '../data-components/checkbox-data-entry';
2022-10-05 13:55:18 -04:00
import NumericDataEntryWithFormattedLink from '../data-components/numeric-data-entry-with-formatted-link';
import { buildingUserFields, dataFields } from '../../config/data-fields-config';
2022-10-05 13:55:18 -04:00
import NumericDataEntry from '../data-components/numeric-data-entry';
import UserOpinionEntry from '../data-components/user-opinion-data-entry';
import DataEntry from '../data-components/data-entry';
import { DataEntryGroup } from '../data-components/data-entry-group';
2019-11-07 02:39:26 -05:00
import SelectDataEntry from '../data-components/select-data-entry';
2020-08-04 14:11:08 -04:00
import Verification from '../data-components/verification';
2019-11-07 02:39:26 -05:00
import withCopyEdit from '../data-container';
2022-10-05 13:52:14 -04:00
import PlanningDataOfficialDataEntry from '../data-components/planning-data-entry';
2022-09-14 10:57:08 -04:00
import DataTitle from '../data-components/data-title';
2019-11-07 02:39:26 -05:00
import { CategoryViewProps } from './category-view-props';
import { Category } from '../../config/categories-config';
2022-10-05 13:55:18 -04:00
const currentYear = new Date().getFullYear();
const currentTimestamp = new Date().valueOf();
const milisecondsInYear = 1000 * 60 * 60 * 24 * 365;
// TODO: there is already "parseDate" in helpers
function parseDate(isoUtcDate: string): Date {
const [year, month, day] = isoUtcDate.match(/^(\d{4})-(\d\d)-(\d\d)$/)
.splice(1)
.map(x => parseInt(x, 10));
return new Date(Date.UTC(year, month-1, day));
}
function isArchived(item) {
const decisionDate = item.decision_date;
if(decisionDate != null) {
if ((currentTimestamp - parseDate(decisionDate).valueOf()) > milisecondsInYear) {
return true;
}
}
if(item.registered_with_local_authority_date != null) {
if ((currentTimestamp - parseDate(item.registered_with_local_authority_date).valueOf()) > milisecondsInYear) {
return true;
}
}
return false;
}
2022-10-05 13:55:18 -04:00
const PlanningView: React.FunctionComponent<CategoryViewProps> = (props) => {
const communityLinkUrl = `/${props.mode}/${Category.Community}/${props.building.building_id}`;
return (
2019-08-23 09:09:23 -04:00
<Fragment>
2022-11-04 06:37:46 -04:00
<DataEntryGroup name="Official planning data" collapsed={false} >
2022-07-04 13:14:40 -04:00
<InfoBox type='warning'>
2022-09-14 06:02:13 -04:00
This section is under development as part of the project CLPV Tool. For more details and progress <a href="https://github.com/colouring-cities/manual/wiki/G.-Data-capture-methods">read here</a>.
2022-09-14 11:16:10 -04:00
</InfoBox>
<PlanningDataOfficialDataEntry
shownData={props.building.planning_data ? props.building.planning_data.filter(item => isArchived(item) == false) : []}
allEntryCount={props.building.planning_data ? props.building.planning_data.length : 0}
/>
</DataEntryGroup>
2022-11-04 06:37:46 -04:00
<DataEntryGroup name="Older official planning data" collapsed={true} >
<PlanningDataOfficialDataEntry
shownData={props.building.planning_data ? props.building.planning_data.filter(item => isArchived(item)) : []}
allEntryCount={props.building.planning_data ? props.building.planning_data.length : 0}
2022-09-15 07:20:22 -04:00
/>
2022-10-23 15:27:05 -04:00
</DataEntryGroup>
<DataEntryGroup name="Crowdsourced planning application data" collapsed={false} >
<CheckboxDataEntry
2022-10-05 13:55:18 -04:00
title="Has the work on this site been completed?"
slug="planning_live_application"
value={null}
disabled={false}
/>
<NumericDataEntry
2022-09-15 06:12:35 -04:00
title={"Year of completion"}
2022-10-05 13:55:18 -04:00
slug="date_year"
value={2019}
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
min={1}
max={currentYear}
// "type": "year_estimator"
/>
2022-10-23 15:27:05 -04:00
</DataEntryGroup>
2022-09-20 03:24:16 -04:00
<DataEntryGroup name="Designation/protection" collapsed={false} >
<DataEntryGroup name="Conservation" collapsed={false} >
<DataEntry
2022-09-29 08:40:06 -04:00
title={dataFields.planning_in_conservation_area_id.title}
slug="planning_in_conservation_area_id"
value={props.building.planning_in_conservation_area_id}
2022-09-20 03:25:31 -04:00
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
2022-09-29 08:40:06 -04:00
placeholder="Please add Conservation Area identifier"
2022-09-20 03:25:31 -04:00
/>
<Verification
slug="planning_in_conservation_area_url"
allow_verify={props.user !== undefined && props.building.planning_in_conservation_area_url !== null && !props.edited}
2022-09-20 03:25:31 -04:00
onVerify={props.onVerify}
user_verified={props.user_verified.hasOwnProperty("planning_in_conservation_area_url")}
user_verified_as={props.user_verified.planning_in_conservation_area_url}
verified_count={props.building.verified.planning_in_conservation_area_url}
2022-09-20 03:25:31 -04:00
/>
2022-09-29 08:40:06 -04:00
<DataEntry
title={dataFields.planning_in_conservation_area_url.title}
slug="planning_in_conservation_area_url"
value={props.building.planning_in_conservation_area_url}
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
isUrl={true}
placeholder="Please add CA appraisal link here"
/>
2022-09-20 03:25:31 -04:00
<DataEntry
title={dataFields.planning_conservation_area_name.title}
slug="planning_conservation_area_name"
value={props.building.planning_conservation_area_name}
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
/>
<Verification
slug="planning_conservation_area_name"
allow_verify={props.user !== undefined && props.building.planning_conservation_area_name !== null && !props.edited}
onVerify={props.onVerify}
user_verified={props.user_verified.hasOwnProperty("planning_conservation_area_name")}
user_verified_as={props.user_verified.planning_conservation_area_name}
verified_count={props.building.verified.planning_conservation_area_name}
/>
2022-09-20 03:24:16 -04:00
</DataEntryGroup>
<DataEntryGroup name="Listed buildings & scheduled monuments" collapsed={false} >
2022-09-23 10:03:08 -04:00
<NumericDataEntryWithFormattedLink
title={dataFields.planning_list_id.title}
slug="planning_list_id"
value={props.building.planning_list_id}
2022-09-20 03:25:31 -04:00
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
2022-09-23 10:39:34 -04:00
placeholder="If yes, add ID"
2022-09-23 10:03:08 -04:00
linkTargetFunction={(id: String) => { return "https://historicengland.org.uk/listing/the-list/list-entry/" + id + "?section=official-list-entry" } }
2022-09-23 10:39:34 -04:00
linkDescriptionFunction={(id: String) => { return "ID Link" } }
2022-09-23 10:03:08 -04:00
/>
2022-09-20 03:25:31 -04:00
<Verification
2022-09-23 10:03:08 -04:00
slug="planning_list_id"
allow_verify={props.user !== undefined && props.building.planning_list_id !== null && !props.edited}
2022-09-20 03:25:31 -04:00
onVerify={props.onVerify}
2022-09-23 10:03:08 -04:00
user_verified={props.user_verified.hasOwnProperty("planning_list_id")}
user_verified_as={props.user_verified.planning_list_id}
verified_count={props.building.verified.planning_list_id}
2022-09-20 03:25:31 -04:00
/>
<SelectDataEntry
title={dataFields.planning_list_grade.title}
slug="planning_list_grade"
value={props.building.planning_list_grade}
mode={props.mode}
disabled={false}
copy={props.copy}
onChange={props.onChange}
options={[
"I",
"II*",
"II",
"None"
]}
/>
<Verification
slug="planning_list_grade"
allow_verify={props.user !== undefined && props.building.planning_list_grade !== null && !props.edited}
onVerify={props.onVerify}
user_verified={props.user_verified.hasOwnProperty("planning_list_grade")}
user_verified_as={props.user_verified.planning_list_grade}
verified_count={props.building.verified.planning_list_grade}
/>
<DataEntry
title={dataFields.planning_heritage_at_risk_url.title}
slug="planning_heritage_at_risk_url"
value={props.building.planning_heritage_at_risk_url}
2022-09-20 03:25:31 -04:00
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
placeholder="Please add relevant link here"
2022-09-21 14:31:27 -04:00
isUrl={true}
2022-09-20 03:25:31 -04:00
/>
<Verification
slug="planning_heritage_at_risk_url"
allow_verify={props.user !== undefined && props.building.planning_heritage_at_risk_url !== null && !props.edited}
2022-09-20 03:25:31 -04:00
onVerify={props.onVerify}
user_verified={props.user_verified.hasOwnProperty("planning_heritage_at_risk_url")}
user_verified_as={props.user_verified.planning_heritage_at_risk_url}
verified_count={props.building.verified.planning_heritage_at_risk_url}
2022-09-20 03:25:31 -04:00
/>
</DataEntryGroup>
<DataEntryGroup name="Other types of protection & recording" collapsed={false} >
2022-09-24 06:37:58 -04:00
<NumericDataEntryWithFormattedLink
title={dataFields.planning_world_list_id.title}
slug="planning_world_list_id"
value={props.building.planning_world_list_id}
2022-09-20 03:25:31 -04:00
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
2022-09-24 06:37:58 -04:00
placeholder="If yes, add ID"
linkTargetFunction={(id: String) => { return "https://whc.unesco.org/en/list/" + id } }
linkDescriptionFunction={(id: String) => { return "ID Link" } }
2022-09-20 03:25:31 -04:00
/>
<Verification
2022-09-24 06:37:58 -04:00
slug="planning_world_list_id"
allow_verify={props.user !== undefined && props.building.planning_world_list_id !== null && !props.edited}
2022-09-20 03:25:31 -04:00
onVerify={props.onVerify}
2022-09-24 06:37:58 -04:00
user_verified={props.user_verified.hasOwnProperty("planning_world_list_id")}
user_verified_as={props.user_verified.planning_world_list_id}
verified_count={props.building.verified.planning_world_list_id}
2022-09-20 03:25:31 -04:00
/>
<DataEntry
2022-09-24 18:57:58 -04:00
title={dataFields.planning_in_apa_url.title}
slug="planning_in_apa_url"
value={props.building.planning_in_apa_url}
2022-09-20 03:25:31 -04:00
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
isUrl={true}
placeholder="Please add relevant link here"
2022-09-20 03:25:31 -04:00
/>
<Verification
2022-09-24 18:57:58 -04:00
slug="planning_in_apa_url"
allow_verify={props.user !== undefined && props.building.planning_in_apa_url !== null && !props.edited}
2022-09-20 03:25:31 -04:00
onVerify={props.onVerify}
2022-09-24 18:57:58 -04:00
user_verified={props.user_verified.hasOwnProperty("planning_in_apa_url")}
user_verified_as={props.user_verified.planning_in_apa_url}
verified_count={props.building.verified.planning_in_apa_url}
2022-09-20 03:25:31 -04:00
/>
<DataEntry
2022-09-24 18:57:58 -04:00
title={dataFields.planning_local_list_url.title}
slug="planning_local_list_url"
value={props.building.planning_local_list_url}
2022-09-20 03:25:31 -04:00
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
isUrl={true}
placeholder="Please add relevant link here"
2022-09-20 03:25:31 -04:00
/>
<Verification
2022-09-24 18:57:58 -04:00
slug="planning_local_list_url"
allow_verify={props.user !== undefined && props.building.planning_local_list_url !== null && !props.edited}
2022-09-20 03:25:31 -04:00
onVerify={props.onVerify}
2022-09-24 18:57:58 -04:00
user_verified={props.user_verified.hasOwnProperty("planning_local_list_url")}
user_verified_as={props.user_verified.planning_local_list_url}
verified_count={props.building.verified.planning_local_list_url}
/>
<DataEntry
title={dataFields.planning_glher_url.title}
slug="planning_glher_url"
value={props.building.planning_glher_url}
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
isUrl={true}
placeholder="Please add relevant link here"
2022-09-24 18:57:58 -04:00
/>
<Verification
slug="planning_glher_url"
allow_verify={props.user !== undefined && props.building.planning_glher_url !== null && !props.edited}
onVerify={props.onVerify}
user_verified={props.user_verified.hasOwnProperty("planning_glher_url")}
user_verified_as={props.user_verified.planning_glher_url}
verified_count={props.building.verified.planning_glher_url}
2022-09-20 03:25:31 -04:00
/>
<DataEntry
title={dataFields.planning_historic_area_assessment_url.title}
slug="planning_historic_area_assessment_url"
value={props.building.planning_historic_area_assessment_url}
mode={props.mode}
copy={props.copy}
onChange={props.onChange}
isUrl={true}
placeholder="Please add relevant link here"
2022-09-20 03:25:31 -04:00
/>
<Verification
slug="planning_historic_area_assessment_url"
allow_verify={props.user !== undefined && props.building.planning_historic_area_assessment_url !== null && !props.edited}
onVerify={props.onVerify}
user_verified={props.user_verified.hasOwnProperty("planning_historic_area_assessment_url")}
user_verified_as={props.user_verified.planning_historic_area_assessment_url}
verified_count={props.building.verified.planning_historic_area_assessment_url}
/>
2022-09-27 05:15:55 -04:00
<InfoBox msg="Designation data is currently incomplete. We are aiming for 100% coverage by April 2023." />
2022-09-20 03:24:16 -04:00
</DataEntryGroup>
</DataEntryGroup>
2019-08-23 09:09:23 -04:00
</Fragment>
)};
const PlanningContainer = withCopyEdit(PlanningView);
2019-11-07 03:13:30 -05:00
export default PlanningContainer;