Files
klatab/common/FilterModal.tsx

169 lines
6.7 KiB
TypeScript
Raw Permalink Normal View History

2024-09-19 16:29:47 +02:00
import React, { useState } from 'react';
2024-09-19 16:33:36 +02:00
import { View, Modal, StyleSheet, Text, ScrollView, Dimensions, Platform } from 'react-native';
2024-09-19 16:25:57 +02:00
import RNPickerSelect from 'react-native-picker-select';
2024-09-15 14:36:20 +02:00
import { FontAwesome } from '@expo/vector-icons';
2024-09-19 16:29:47 +02:00
import { useColors } from '../common/colors';
import { ThemeButton, ThemeText } from '../common/ThemeTypes';
2024-09-15 16:03:10 +02:00
import { getDefaultFilter } from '../utils/getDefaultFilter';
2024-09-15 14:36:20 +02:00
const categories = { class: 'Klasse', room: 'Raum', teacher: 'Lehrer' };
type FilterModalTypes = {
2024-09-19 16:29:47 +02:00
filter?: any;
setFilter?: (date: any) => void;
userInformation: any;
baseData: any;
};
2024-09-19 16:25:57 +02:00
2024-09-15 14:36:20 +02:00
const FilterModal = ({ filter, setFilter, userInformation, baseData }: FilterModalTypes) => {
const colors = useColors();
const [tempFilter, setTempFilter] = useState(filter);
const [showFilterModal, setShowFilterModal] = useState(false);
2024-09-19 16:32:23 +02:00
const screenHeight = Dimensions.get('window').height;
2024-09-15 14:36:20 +02:00
const styles = StyleSheet.create({
2024-09-19 16:33:36 +02:00
modalOverlay: {
2024-09-19 16:25:57 +02:00
flex: 1,
justifyContent: 'center',
alignItems: 'center',
2024-09-19 16:33:36 +02:00
backgroundColor: 'rgba(0, 0, 0, 0.5)',
2024-09-15 14:36:20 +02:00
},
modalView: {
2024-09-19 16:25:57 +02:00
margin: 20,
backgroundColor: colors.backSecondary,
borderRadius: 20,
width: '80%',
2024-09-19 16:32:23 +02:00
maxHeight: screenHeight * 0.8,
2024-09-19 16:29:47 +02:00
padding: 20,
borderWidth: 5,
borderColor: colors.backSecondary,
2024-09-19 16:25:57 +02:00
shadowColor: '#000',
2024-09-19 16:29:47 +02:00
shadowOffset: { width: 0, height: 2 },
2024-09-19 16:25:57 +02:00
shadowOpacity: 0.25,
shadowRadius: 4,
elevation: 5,
2024-09-15 14:36:20 +02:00
},
modalSubtitle: {
2024-09-19 16:25:57 +02:00
fontSize: 16,
marginTop: 20,
marginBottom: 10,
2024-09-15 14:36:20 +02:00
},
picker: {
2024-09-19 16:25:57 +02:00
color: colors.text,
backgroundColor: colors.backPrimary,
2024-09-15 14:36:20 +02:00
},
pickerDisabled: {
2024-09-19 16:25:57 +02:00
color: colors.backPrimary,
backgroundColor: colors.backSecondary,
borderColor: colors.backPrimary,
2024-09-15 14:36:20 +02:00
},
modalButtons: {
2024-09-19 16:25:57 +02:00
flexDirection: 'row',
justifyContent: 'space-between',
marginTop: 20,
2024-09-15 14:36:20 +02:00
},
2024-09-19 16:32:23 +02:00
scrollView: {
flex: 1,
},
2024-09-19 16:25:57 +02:00
});
2024-09-15 14:36:20 +02:00
const renderFilterModal = () => (
<Modal
visible={showFilterModal}
transparent={true}
onRequestClose={() => setFilter(tempFilter)}
>
2024-09-19 16:33:36 +02:00
<View style={styles.modalOverlay}>
2024-09-15 14:36:20 +02:00
<View style={styles.modalView}>
2024-09-19 16:32:23 +02:00
<ScrollView contentContainerStyle={{ flexGrow: 1 }}>
<ThemeText style={styles.modalSubtitle}>Kriterium</ThemeText>
<RNPickerSelect
style={{
inputIOS: styles.picker,
inputAndroid: styles.picker,
}}
value={tempFilter.type ?? ""}
onValueChange={(itemValue) => {
setTempFilter(prevState => ({ ...prevState, type: itemValue, value: null }));
}}
items={Object.keys(baseData).map(item => ({
label: categories[item],
value: item,
}))}
placeholder={{}}
/>
{tempFilter.type && (
<View>
<ThemeText style={styles.modalSubtitle}>Suchbegriff</ThemeText>
<RNPickerSelect
style={{
inputIOS: styles.picker,
inputAndroid: styles.picker,
}}
value={tempFilter.value ?? ""}
onValueChange={(itemValue) => {
setTempFilter(prevState => ({ ...prevState, value: itemValue }));
}}
items={baseData[tempFilter.type].map(item => ({
label: item.name,
value: item.id,
}))}
placeholder={{}}
/>
</View>
)}
2024-09-19 16:25:57 +02:00
2024-09-15 14:36:20 +02:00
<View>
2024-09-19 16:32:23 +02:00
<ThemeText style={styles.modalSubtitle}>Gruppe</ThemeText>
2024-09-19 16:25:57 +02:00
<RNPickerSelect
style={{
2024-09-19 16:32:23 +02:00
inputIOS: tempFilter.type === "class" ? styles.picker : styles.pickerDisabled,
inputAndroid: tempFilter.type === "class" ? styles.picker : styles.pickerDisabled,
2024-09-19 16:25:57 +02:00
}}
2024-09-19 16:32:23 +02:00
value={tempFilter.group ?? "1"}
2024-09-19 16:25:57 +02:00
onValueChange={(itemValue) => {
2024-09-19 16:32:23 +02:00
setTempFilter(prevState => ({ ...prevState, group: itemValue }));
2024-09-15 14:36:20 +02:00
}}
2024-09-19 16:32:23 +02:00
disabled={tempFilter.type !== "class"}
items={[
{ label: '1', value: '1' },
{ label: '2', value: '2' }
]}
2024-09-19 16:25:57 +02:00
placeholder={{}}
/>
2024-09-15 14:36:20 +02:00
</View>
2024-09-19 16:29:47 +02:00
2024-09-19 16:32:23 +02:00
<View style={styles.modalButtons}>
<ThemeButton onPress={() => setTempFilter(getDefaultFilter(userInformation))}>
<Text>Zurücksetzen</Text>
</ThemeButton>
<ThemeButton
onPress={() => {
setFilter(tempFilter);
setShowFilterModal(false);
}}
disabled={!Boolean(tempFilter.value) || (tempFilter.type === 'class' && !Boolean(tempFilter.value))}
>
<Text>Anwenden</Text>
</ThemeButton>
</View>
</ScrollView>
2024-09-15 14:36:20 +02:00
</View>
</View>
</Modal>
);
2024-09-19 16:25:57 +02:00
return (
<>
2024-09-19 16:29:47 +02:00
<ThemeButton onPress={() => { setTempFilter(filter); setShowFilterModal(true); }}>
<FontAwesome name="filter" size={24} />
</ThemeButton>
2024-09-19 16:25:57 +02:00
{renderFilterModal()}
</>
);
2024-09-15 14:36:20 +02:00
};
export default FilterModal;