colouring-montreal/app/src/frontend/multi-edit.js

101 lines
3.2 KiB
JavaScript
Raw Normal View History

2019-05-09 04:16:36 -04:00
import React from 'react';
import { Link, Redirect } from 'react-router-dom';
import { parse } from 'query-string';
2019-05-27 15:13:43 -04:00
import PropTypes from 'prop-types';
2019-05-09 04:16:36 -04:00
import Sidebar from './sidebar';
import CONFIG from './fields-config.json';
2019-05-27 16:28:47 -04:00
import InfoBox from './info-box';
2019-05-09 04:16:36 -04:00
const MultiEdit = (props) => {
if (!props.user){
return <Redirect to="/sign-up.html" />
}
2019-05-10 09:00:20 -04:00
const cat = props.match.params.cat;
if (cat === 'like') {
// special case for likes
return (
<Sidebar
2019-05-27 16:28:47 -04:00
title='Quick edit'
2019-05-27 15:13:43 -04:00
back={`/edit/${cat}.html`}>
<section className='data-section'>
2019-05-27 16:28:47 -04:00
<header className={`section-header view ${cat} active`}>
<a><h3 className="h3">Like me!</h3></a>
</header>
<form className='buttons-container'>
<InfoBox msg='Click all the buildings that you like and think contribute to the city!' />
2019-05-27 15:13:43 -04:00
<Link to='/view/like.html' className='btn btn-secondary'>Back to view</Link>
<Link to='/edit/like.html' className='btn btn-secondary'>Back to edit</Link>
2019-05-27 16:28:47 -04:00
</form>
</section>
</Sidebar>
);
}
2019-05-10 09:00:20 -04:00
const q = parse(props.location.search);
const data = JSON.parse(q.data)
2019-05-27 16:28:47 -04:00
const title = sectionTitleFromCat(cat);
2019-05-09 04:16:36 -04:00
return (
<Sidebar
2019-05-27 15:13:43 -04:00
title='Quick edit'
2019-05-09 04:16:36 -04:00
back={`/edit/${cat}.html`}>
2019-05-27 15:13:43 -04:00
<section className='data-section'>
2019-05-27 16:28:47 -04:00
<header className={`section-header view ${cat} active`}>
<a><h3 className="h3">{title}</h3></a>
</header>
{
Object.keys(data).map((key => {
const label = fieldTitleFromSlug(key);
return (<p className='data-intro' key={key}>
Set <strong>{label}</strong> to <strong>{data[key]}</strong>
</p>)
}))
}
2019-05-27 16:28:47 -04:00
<form className='buttons-container'>
<InfoBox msg='Click buildings to colour' />
2019-05-27 15:13:43 -04:00
<Link to={`/view/${cat}.html`} className='btn btn-secondary'>Back to view</Link>
<Link to={`/edit/${cat}.html`} className='btn btn-secondary'>Back to edit</Link>
2019-05-27 16:28:47 -04:00
</form>
2019-05-09 04:16:36 -04:00
</section>
</Sidebar>
);
}
2019-05-27 15:13:43 -04:00
MultiEdit.propTypes = {
user: PropTypes.object,
match: PropTypes.object,
location: PropTypes.object
}
2019-05-27 16:28:47 -04:00
function sectionTitleFromCat(cat) {
for (let index = 0; index < CONFIG.length; index++) {
const section = CONFIG[index];
if (section.slug === cat) {
return section.title
}
}
return undefined
}
2019-05-27 15:13:43 -04:00
function fieldTitleFromSlug(slug) {
const fields = CONFIG.reduce(
(prev, section) => {
const el = prev.concat(
section.fields.filter(
field => field.slug === slug
)
)
return el
}, []
)
if (fields.length === 1 && fields[0].title) {
return fields[0].title
} else {
console.error('Expected single match, got', fields)
}
}
2019-05-09 04:16:36 -04:00
export default MultiEdit;