Skip to content

Commit c8c0bc0

Browse files
authored
AB#57920: Add line query mode for StopRoutePlate component (#123)
* AB#57920: Add line query mode for StopRoutePlate component * Add styling to StopRoutePlate line query option * Add error checking and clearing selected lines after generating starts
1 parent d078b4f commit c8c0bc0

File tree

3 files changed

+105
-8
lines changed

3 files changed

+105
-8
lines changed

src/components/Generator.js

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { inject, observer, PropTypes } from 'mobx-react';
33
import styled from 'styled-components';
44
import FlatButton from 'material-ui/FlatButton';
55
import RaisedButton from 'material-ui/RaisedButton';
6+
import { Switch } from '@material-ui/core';
67
import DatePicker from 'material-ui/DatePicker';
78
import TextField from 'material-ui/TextField';
89
import RadioGroup from './RadioGroup';
@@ -13,7 +14,7 @@ import SelectTemplate from './SelectTemplate';
1314
import SelectRuleTemplates from './SelectRuleTemplates';
1415
import { componentsWithMapOptions } from '../stores/generatorStore';
1516
import TerminalSelect from './TerminalSelect';
16-
import LineSelect from './LineSelect';
17+
import { ObservedLineSelect, ObservedSingleLineSelect } from './LineSelect';
1718

1819
const Root = styled.div`
1920
display: flex;
@@ -80,7 +81,11 @@ const Generator = props => {
8081
break;
8182

8283
case 'StopRoutePlate':
83-
text = stopCount;
84+
if (generatorStore.useLineQuery && generatorStore.selectedRoutePlateLine) {
85+
text = 1;
86+
} else {
87+
text = stopCount;
88+
}
8489
break;
8590

8691
default:
@@ -124,6 +129,22 @@ const Generator = props => {
124129
/>
125130
</div>
126131
)}
132+
{generatorStore.component === 'StopRoutePlate' && (
133+
<div style={{ marginLeft: '20px' }}>
134+
<span style={{ opacity: generatorStore.useLineQuery ? 0.4 : 1.0 }}>
135+
Pysäkkihaku
136+
</span>
137+
<Switch
138+
checked={generatorStore.useLineQuery}
139+
onChange={() => generatorStore.toggleUseLineQuery()}
140+
color="primary"
141+
inputProps={{ 'aria-label': 'Linjahaku' }}
142+
className="muiSwitch-toggle"
143+
style={{ color: '#0077c7' }}
144+
/>
145+
<span style={{ opacity: generatorStore.useLineQuery ? 1.0 : 0.4 }}>Linjahaku</span>
146+
</div>
147+
)}
127148
</div>
128149
</Column>
129150

@@ -211,7 +232,7 @@ const Generator = props => {
211232

212233
{generatorStore.component === 'LineTimetable' && (
213234
<Main>
214-
<LineSelect
235+
<ObservedLineSelect
215236
setLineQuery={commonStore.setLineQuery}
216237
lines={commonStore.lines}
217238
lineQuery={commonStore.lineQuery}
@@ -222,7 +243,20 @@ const Generator = props => {
222243
</Main>
223244
)}
224245

225-
{generatorStore.component !== 'LineTimetable' && (
246+
{generatorStore.component === 'StopRoutePlate' && generatorStore.useLineQuery && (
247+
<Main>
248+
<ObservedSingleLineSelect
249+
setLineQuery={commonStore.setLineQuery}
250+
lines={commonStore.lines}
251+
lineQuery={commonStore.lineQuery}
252+
selectedRoutePlateLine={generatorStore.selectedRoutePlateLine}
253+
setSelectedRoutePlateLine={generatorStore.setSelectedRoutePlateLine}
254+
clearSelectedRoutePlateLine={generatorStore.clearSelectedRoutePlateLine}
255+
/>
256+
</Main>
257+
)}
258+
259+
{generatorStore.component !== 'LineTimetable' && !generatorStore.useLineQuery && (
226260
<div>
227261
<Main>
228262
<StopList
@@ -302,7 +336,7 @@ const Generator = props => {
302336
</Row>
303337
)}
304338

305-
{generatorStore.component !== 'LineTimetable' && (
339+
{generatorStore.component !== 'LineTimetable' && !generatorStore.useLineQuery && (
306340
<div>
307341
<h3>Poissuodatettavat linjat</h3>
308342
<Row>
@@ -334,7 +368,10 @@ const Generator = props => {
334368
<RaisedButton
335369
data-cy="generate-button"
336370
disabled={
337-
(stopCount < 1 && generatorStore.component !== 'LineTimetable') ||
371+
(stopCount < 1 &&
372+
generatorStore.component !== 'LineTimetable' &&
373+
!generatorStore.useLineQuery) ||
374+
(generatorStore.useLineQuery && generatorStore.selectedRoutePlateLine === null) ||
338375
!generatorStore.buildId ||
339376
(generatorStore.component === 'TerminalPoster' && generatorStore.terminalId === '') ||
340377
(generatorStore.component === 'LineTimetable' && generatorStore.lineId === '') ||

src/components/LineSelect.js

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const ListContainer = styled.div`
2424
`;
2525

2626
const mapLineItems = (lines, onClick) => {
27-
if (lines.length > 0) {
27+
if (lines.length > 0 && lines[0] !== null) {
2828
return lines.map((line, index) => (
2929
<ListItem onClick={() => onClick(line)} key={index}>
3030
<ListItemTitle>{line.lineIdParsed}</ListItemTitle> <p>{line.nameFi}</p>
@@ -54,6 +54,26 @@ const LineSelect = props => (
5454
</div>
5555
);
5656

57+
const SingleLineSelect = props => (
58+
<div>
59+
<SectionHeading>Linjahaku</SectionHeading>
60+
<TextField
61+
id="line-select"
62+
hintText="Hae linjaa..."
63+
onChange={event =>
64+
event.target.value ? props.setLineQuery(event.target.value) : props.setLineQuery('')
65+
}
66+
value={props.lineQuery}
67+
style={{ width: '100%' }}
68+
/>
69+
<ListContainer>{mapLineItems(props.lines, props.setSelectedRoutePlateLine)}</ListContainer>
70+
<div>
71+
<SelectedLinesTitle>Valittu linja</SelectedLinesTitle>
72+
{mapLineItems([props.selectedRoutePlateLine], props.clearSelectedRoutePlateLine)}
73+
</div>
74+
</div>
75+
);
76+
5777
LineSelect.propTypes = {
5878
setLineQuery: PropTypes.func.isRequired,
5979
lineQuery: PropTypes.string.isRequired,
@@ -63,4 +83,20 @@ LineSelect.propTypes = {
6383
selectedLines: PropTypes.object.isRequired,
6484
};
6585

66-
export default observer(LineSelect);
86+
SingleLineSelect.propTypes = {
87+
setLineQuery: PropTypes.func.isRequired,
88+
lineQuery: PropTypes.string.isRequired,
89+
lines: PropTypes.object.isRequired,
90+
selectedRoutePlateLine: PropTypes.object,
91+
setSelectedRoutePlateLine: PropTypes.func.isRequired,
92+
clearSelectedRoutePlateLine: PropTypes.func.isRequired,
93+
};
94+
95+
SingleLineSelect.defaultProps = {
96+
selectedRoutePlateLine: null,
97+
};
98+
99+
export const ObservedLineSelect = observer(LineSelect);
100+
export const ObservedSingleLineSelect = observer(SingleLineSelect);
101+
102+
export default { ObservedLineSelect, ObservedSingleLineSelect };

src/stores/generatorStore.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const store = observable({
4444
legend: true,
4545
isSmallTerminalPoster: false,
4646
selectedLines: [],
47+
selectedRoutePlateLine: null,
48+
useLineQuery: false,
4749
get rows() {
4850
let rows = [];
4951

@@ -164,6 +166,23 @@ store.removeLine = line => {
164166
store.selectedLines.remove(line);
165167
};
166168

169+
store.clearSelectedLines = () => {
170+
store.selectedLines = [];
171+
};
172+
173+
store.toggleUseLineQuery = () => {
174+
store.clearSelectedRoutePlateLine();
175+
store.useLineQuery = !store.useLineQuery;
176+
};
177+
178+
store.setSelectedRoutePlateLine = line => {
179+
store.selectedRoutePlateLine = line;
180+
};
181+
182+
store.clearSelectedRoutePlateLine = () => {
183+
store.selectedRoutePlateLine = null;
184+
};
185+
167186
store.generate = () => {
168187
const user = commonStore.getUser();
169188
const routeFilter = commonStore.routeFilter;
@@ -219,6 +238,8 @@ store.generate = () => {
219238
selectedRuleTemplates: [],
220239
template: 'default',
221240
downloadTable: true,
241+
useLineQuery: store.useLineQuery,
242+
lineId: store.selectedRoutePlateLine ? store.selectedRoutePlateLine.lineId : null,
222243
});
223244

224245
let props;
@@ -242,6 +263,9 @@ store.generate = () => {
242263
}
243264

244265
store.resetChecked();
266+
store.clearSelectedRoutePlateLine();
267+
store.clearSelectedLines();
268+
245269
commonStore.addPosters(store.buildId, store.component, props);
246270
};
247271

0 commit comments

Comments
 (0)