Update AddEntry to contain week days. Remove + from HomeScreen.

Fix typo getMinute -> getMinutes. Remove withTheme from HomeScreen
(since IconButton for + was removed).
This commit is contained in:
Ceda EI 2020-04-09 22:05:23 +05:30
parent 64a3fbc2cf
commit 3f75396bc4
3 changed files with 73 additions and 38 deletions

View File

@ -37,19 +37,16 @@ export default function Timetable({ addTimetableEntry, removeTimetableEntry, tim
/> />
)} )}
</Stack.Screen> </Stack.Screen>
{days.map((day, idx) => ( <Stack.Screen name="New Entry">
<Stack.Screen name={`New Entry ${day}`} key={idx}> {(props) => (
{(props) => ( <AddEntry
<AddEntry {...props}
{...props} subjects={subjects}
subjects={subjects} days={days}
day={idx} addTimetableEntry={addTimetableEntry}
days={days} />
addTimetableEntry={addTimetableEntry} )}
/> </Stack.Screen>
)}
</Stack.Screen>
))}
</Stack.Navigator></Portal.Host> </Stack.Navigator></Portal.Host>
); );
} }

View File

@ -1,20 +1,24 @@
import React, { useState } from "react"; import React, { useState } from "react";
import PropTypes from "prop-types"; import PropTypes from "prop-types";
import { import {
IconButton,
Card, Card,
FAB, FAB,
IconButton,
List, List,
Menu, Menu,
Portal, Portal,
Snackbar, Snackbar,
TextInput, TextInput,
ToggleButton,
} from "react-native-paper"; } from "react-native-paper";
import {StyleSheet} from "react-native"; import {
StyleSheet,
View
} from "react-native";
import DateTimePicker from "@react-native-community/datetimepicker"; import DateTimePicker from "@react-native-community/datetimepicker";
import { format } from "date-fns"; import { format } from "date-fns";
function AddEntry({addTimetableEntry, days, day, subjects, navigation }) { function AddEntry({addTimetableEntry, days, subjects, navigation }) {
const [ subject, setSubject ] = useState({ id: null, name: null }); const [ subject, setSubject ] = useState({ id: null, name: null });
const [ showSubjectMenu, setShowSubjectMenu ] = useState(false); const [ showSubjectMenu, setShowSubjectMenu ] = useState(false);
const [ showTimePicker, setShowTimePicker ] = useState(false); const [ showTimePicker, setShowTimePicker ] = useState(false);
@ -24,6 +28,7 @@ function AddEntry({addTimetableEntry, days, day, subjects, navigation }) {
const [ end, setEnd ] = useState(null); const [ end, setEnd ] = useState(null);
const [ count, setCount ] = useState(0); const [ count, setCount ] = useState(0);
const [ snackbar, setSnackbar ] = useState({ visible: false, message: "" }); const [ snackbar, setSnackbar ] = useState({ visible: false, message: "" });
const [ dayStates, setDayStates ] = useState([ true, false, false, false, false, false, false ]);
function parseCount(text) { function parseCount(text) {
const num = parseInt(text); const num = parseInt(text);
if (isNaN(num)) if (isNaN(num))
@ -56,6 +61,8 @@ function AddEntry({addTimetableEntry, days, day, subjects, navigation }) {
message = "Missing end time."; message = "Missing end time.";
else if (count === 0) else if (count === 0)
message = "Missing count."; message = "Missing count.";
if (! dayStates.filter(i => i).length)
message = "No day selected.";
if (message !== "") { if (message !== "") {
setSnackbar({visible: true, message: message}); setSnackbar({visible: true, message: message});
@ -63,11 +70,16 @@ function AddEntry({addTimetableEntry, days, day, subjects, navigation }) {
return; return;
} }
addTimetableEntry(day, {
sub_id: subject.id, dayStates.forEach((i, idx) => {
count, if (i) {
start, addTimetableEntry(idx, {
end sub_id: subject.id,
count,
start,
end
});
}
}); });
navigation.pop(); navigation.pop();
} }
@ -76,7 +88,7 @@ function AddEntry({addTimetableEntry, days, day, subjects, navigation }) {
return (<> return (<>
<IconButton icon="arrow-left" onPress={() => navigation.pop()}/> <IconButton icon="arrow-left" onPress={() => navigation.pop()}/>
<Card style={style.card}> <Card style={style.card}>
<Card.Title title={`Add Class on ${days[day]}`} /> <Card.Title title="Add Class" />
<Card.Content> <Card.Content>
<List.Section> <List.Section>
<Menu <Menu
@ -127,6 +139,26 @@ function AddEntry({addTimetableEntry, days, day, subjects, navigation }) {
value={count === 0 ? "" : count.toString()} value={count === 0 ? "" : count.toString()}
onChangeText={parseCount} onChangeText={parseCount}
/> />
<View
style={style.daysContainer}
>
{dayStates.map( (i, idx) => (
<ToggleButton
key={idx}
icon={`alpha-${days[idx][0].toLowerCase()}`}
status={i ? "checked": "unchecked"}
onPress={
() =>
setDayStates([
...dayStates.slice(0, idx),
!i,
...dayStates.slice(idx + 1)
])
}
/>
)
)}
</View>
</List.Section> </List.Section>
</Card.Content> </Card.Content>
</Card> </Card>
@ -171,9 +203,8 @@ function AddEntry({addTimetableEntry, days, day, subjects, navigation }) {
AddEntry.propTypes = { AddEntry.propTypes = {
addTimetableEntry: PropTypes.func, addTimetableEntry: PropTypes.func,
subjects: PropTypes.array, subjects: PropTypes.array,
navigation: PropTypes.object,
days: PropTypes.array, days: PropTypes.array,
day: PropTypes.number, navigation: PropTypes.object,
}; };
const style = StyleSheet.create({ const style = StyleSheet.create({
@ -190,6 +221,11 @@ const style = StyleSheet.create({
flexDirection: "row", flexDirection: "row",
justifyContent: "space-between" justifyContent: "space-between"
}, },
daysContainer: {
flexDirection: "row",
justifyContent: "space-evenly",
marginTop: 10
},
}); });
export default AddEntry; export default AddEntry;

View File

@ -3,12 +3,11 @@ import PropTypes from "prop-types";
import { import {
Button, Button,
IconButton,
Card, Card,
DataTable, DataTable,
Dialog, Dialog,
FAB,
Portal, Portal,
withTheme,
} from "react-native-paper"; } from "react-native-paper";
import { import {
@ -22,14 +21,14 @@ function sortTimes(t1, t2) {
return 1; return 1;
if (t1.getHours() < t2.getHours()) if (t1.getHours() < t2.getHours())
return -1; return -1;
if (t1.getMinute() > t2.getMinute()) if (t1.getMinutes() > t2.getMinutes())
return 1; return 1;
if (t1.getMinute() < t2.getMinute()) if (t1.getMinutes() < t2.getMinutes())
return -1; return -1;
return 0; return 0;
} }
function HomeScreen({ days, navigation, removeTimetableEntry, subjects, theme, timetable }) { function HomeScreen({ days, navigation, removeTimetableEntry, subjects, timetable }) {
const [ dialog, setDialog ] = useState({ show: false, id: null }); const [ dialog, setDialog ] = useState({ show: false, id: null });
return (<Portal.Host><ScrollView> return (<Portal.Host><ScrollView>
{timetable.map((day, dayIdx) => ( {timetable.map((day, dayIdx) => (
@ -99,13 +98,6 @@ function HomeScreen({ days, navigation, removeTimetableEntry, subjects, theme, t
})} })}
</DataTable> </DataTable>
</Card.Content> </Card.Content>
<Card.Actions style={{justifyContent: "flex-end"}}>
<IconButton
onPress={() => navigation.navigate(`New Entry ${days[dayIdx]}`)}
icon="plus"
color={theme.colors.primary}
/>
</Card.Actions>
</Card> </Card>
))} ))}
<Portal> <Portal>
@ -125,6 +117,17 @@ function HomeScreen({ days, navigation, removeTimetableEntry, subjects, theme, t
</Button> </Button>
</Dialog.Actions> </Dialog.Actions>
</Dialog> </Dialog>
<FAB
loarge
icon="plus"
onPress={() => navigation.navigate("New Entry")}
style={{
position: "absolute",
margin: 16,
right: 0,
bottom: 0,
}}
/>
</Portal> </Portal>
</ScrollView></Portal.Host>); </ScrollView></Portal.Host>);
} }
@ -134,7 +137,6 @@ HomeScreen.propTypes = {
subjects: PropTypes.array, subjects: PropTypes.array,
navigation: PropTypes.object, navigation: PropTypes.object,
days: PropTypes.array, days: PropTypes.array,
theme: PropTypes.object,
removeTimetableEntry: PropTypes.func, removeTimetableEntry: PropTypes.func,
}; };
@ -154,4 +156,4 @@ const style = StyleSheet.create({
}, },
}); });
export default withTheme(HomeScreen); export default HomeScreen;