Untitled
unknown
plain_text
2 years ago
12 kB
6
Indexable
import React, { useState, useEffect } from 'react';
import { View, TextInput, Button, Text, StyleSheet } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import DateTimePicker from '@react-native-community/datetimepicker';
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
padding: 16,
},
inputContainer: {
flexDirection: 'row',
alignItems: 'center',
marginBottom: 10,
width: '100%',
},
label: {
marginRight: 10,
fontWeight: 'bold',
width: 120,
},
input: {
flex: 1,
borderWidth: 1,
padding: 10,
},
button: {
width: '100%',
marginTop: 10,
},
logoutButton: {
position: 'absolute',
top: 10,
right: 10,
},
welcomeText: {
marginBottom: 10,
fontSize: 18,
fontWeight: 'bold',
},
tableContainer: {
marginTop: 20,
width: 390,
borderWidth: 1,
borderColor: 'black',
borderCollapse: 'collapse', // Add this line to collapse borders
},
tableHeader: {
flexDirection: 'row',
justifyContent: 'space-between',
borderBottomWidth: 1,
borderBottomColor: 'black', // Update the property name to borderBottomColor
borderRightWidth: 1, // Add a right border to the last cell in the header row
borderRightColor: 'black', // Set the color of the right border
backgroundColor: 'lightgray',
},
tableHeaderText: {
fontWeight: 'bold',
width: 78, // Adjust the width to distribute evenly
borderRightWidth: 1, // Add a right border to each cell in the header row
borderRightColor: 'black', // Set the color of the right border
},
tableRow: {
flexDirection: 'row',
justifyContent: 'space-between',
borderBottomWidth: 1,
borderBottomColor: 'black', // Update the property name to borderBottomColor
borderRightWidth: 1, // Add a right border to the last cell in each row
borderRightColor: 'black', // Set the color of the right border
},
tableCell: {
width: 78, // Adjust the width to distribute evenly
textAlign: 'center',
borderRightWidth: 1, // Add a right border to each cell
borderRightColor: 'black', // Set the color of the right border
},
});
const LeavesToBeApprovedTable = ({ leavesToBeApproved, onApproveLeave, onDeleteLeave }) => {
return (
<View style={styles.tableContainer}>
<View style={styles.tableHeader}>
<Text style={styles.tableHeaderText}>id</Text>
<Text style={styles.tableHeaderText}>username</Text>
<Text style={styles.tableHeaderText}>StartDate</Text>
<Text style={styles.tableHeaderText}>EndDate</Text>
<Text style={styles.tableHeaderText}>Action</Text>
</View>
{leavesToBeApproved.map((leave, index) => (
<View style={styles.tableRow} key={index}>
<Text style={styles.tableCell}>{leave.id}</Text>
<Text style={styles.tableCell}>{leave.username}</Text>
<Text style={styles.tableCell}>{leave.startDate}</Text>
<Text style={styles.tableCell}>{leave.endDate}</Text>
<Button
title="Approve"
onPress={() => onApproveLeave(leave.username, leave.id)} // Pass username and id as arguments
style={styles.approveButton}
disabled={leave.leaveStatus !== 'Pending'}
/>
</View>
))}
</View>
);
};
const AppliedLeavesTable = ({ appliedLeaves }) => {
return (
<View style={styles.tableContainer}>
<View style={styles.tableHeader}>
<Text style={styles.tableHeaderText}>StartDate</Text>
<Text style={styles.tableHeaderText}>EndDate</Text>
<Text style={styles.tableHeaderText}>Number of Leaves</Text>
<Text style={styles.tableHeaderText}>Reason</Text>
<Text style={styles.tableHeaderText}>Leave Status</Text>
</View>
{appliedLeaves.map((leave, index) => (
<View style={styles.tableRow} key={index}>
<Text style={styles.tableCell}>{leave.startDate}</Text>
<Text style={styles.tableCell}>{leave.endDate}</Text>
<Text style={styles.tableCell}>{leave.numberOfLeaves}</Text>
<Text style={styles.tableCell}>{leave.reason}</Text>
<Text style={styles.tableCell}>{leave.leaveStatus}</Text>
</View>
))}
</View>
);
};
const LoginPage = ({ onLogout, username, onEnterLeaveReason }) => {
const [reason, setReason] = useState('');
const [appliedLeaves, setAppliedLeaves] = useState([]);
const [leavesToBeApproved, setLeavesToBeApproved] = useState([]);
const [startDate, setStartDate] = useState('');
const [endDate, setEndDate] = useState('');
const [showStartDatePicker, setShowStartDatePicker] = useState(false);
const [showEndDatePicker, setShowEndDatePicker] = useState(false);
const handleStartDateChange = (event, selectedDate) => {
setShowStartDatePicker(false);
if (selectedDate) {
const formattedDate = selectedDate.toISOString().split('T')[0];
setStartDate(formattedDate);
}
};
const handleEndDateChange = (event, selectedDate) => {
setShowEndDatePicker(false);
if (selectedDate) {
const formattedDate = selectedDate.toISOString().split('T')[0];
setEndDate(formattedDate);
}
};
const showStartDatePickerModal = () => {
setShowStartDatePicker(true);
};
const showEndDatePickerModal = () => {
setShowEndDatePicker(true);
};
useEffect(() => {
// clearAsyncStorage();
loadAppliedLeaves();
loadLeavesToBeApproved();
});
const clearAsyncStorage = async () => {
try {
await AsyncStorage.clear();
console.log('AsyncStorage cleared successfully.');
} catch (error) {
console.error('Error while clearing AsyncStorage:', error);
}
};
const approveLeave = async (username, id) => {
const updatedLeaves = leavesToBeApproved.map(leave => {
if (leave.username === username && leave.id === id) {
return {
...leave,
leaveStatus: 'Approved',
};
}
return leave;
});
setLeavesToBeApproved(updatedLeaves);
try {
const leavesData = await AsyncStorage.getItem('leaves');
if (leavesData) {
const leaves = JSON.parse(leavesData);
leaves[username] = updatedLeaves; // Update the leaves data for the particular user
await AsyncStorage.setItem('leaves', JSON.stringify(leaves));
}
} catch (error) {
console.error('Error occurred while saving leaves data:', error);
}
};
const loadAppliedLeaves = async () => {
try {
const leavesData = await AsyncStorage.getItem('leaves');
if (leavesData) {
const leaves = JSON.parse(leavesData);
console.log(username)
const userLeaves = leaves[username] || []; // Retrieve leaves for the particular user
console.log(userLeaves)
setAppliedLeaves(userLeaves);
}
} catch (error) {
console.error('Error occurred while loading applied leaves:', error);
}
};
const loadLeavesToBeApproved = async () => {
try {
const leavesData = await AsyncStorage.getItem('leaves');
if (leavesData) {
const leaves = JSON.parse(leavesData);
const allLeavesToBeApproved = Object.entries(leaves).flatMap(([username, leavesArray]) =>
leavesArray.map(leave => ({ username, ...leave }))
);
console.log(allLeavesToBeApproved)
setLeavesToBeApproved(allLeavesToBeApproved);
}
} catch (error) {
console.error('Error occurred while loading leaves to be approved:', error);
}
};
const saveAppliedLeaves = async (leavesData) => {
try {
const existingLeavesData = await AsyncStorage.getItem('leaves');
const existingLeaves = existingLeavesData ? JSON.parse(existingLeavesData) : {};
const updatedLeaves = {
...existingLeaves,
[username]: leavesData // Store leaves data for the particular user
};
await AsyncStorage.setItem('leaves', JSON.stringify(updatedLeaves));
} catch (error) {
console.error('Error occurred while saving applied leaves:', error);
}
};
const applyLeave = () => {
const leave = {
id: generateRandomId(),
startDate,
endDate,
reason,
numberOfLeaves: calculateNumberOfDays(),
leaveStatus : 'Pending'
};
// Function to generate a random 2-digit ID
const updatedLeaves = [...appliedLeaves, leave];
setAppliedLeaves(updatedLeaves);
saveAppliedLeaves(updatedLeaves);
// Reset the input fields
setStartDate('');
setEndDate('');
setReason('');
};
const generateRandomId = () => {
const min = 10; // Minimum value for 2-digit number
const max = 99; // Maximum value for 2-digit number
return Math.floor(Math.random() * (max - min + 1)) + min;
};
const calculateNumberOfDays = () => {
const start = new Date(startDate);
const end = new Date(endDate);
const days = Math.floor((end - start) / (1000 * 60 * 60 * 24)) + 1;
return days >= 0 ? days : 0;
};
const isStartDateValid = () => {
return startDate !== '' && new Date(startDate) <= new Date(endDate);
};
const isEndDateValid = () => {
return endDate !== '' && new Date(startDate) <= new Date(endDate);
};
const deleteLeave = index => {
const updatedLeaves = [...leavesToBeApproved];
updatedLeaves.splice(index, 1);
setLeavesToBeApproved(updatedLeaves);
};
return (
<View style={styles.container}>
<View style={styles.logoutButton}>
<Button title="Logout" onPress={onLogout} color="red" />
</View>
<Text style={styles.welcomeText}>Welcome, {username}!</Text>
<View style={styles.inputContainer}>
<Text style={styles.label}>Start of Leave:</Text>
<TextInput
placeholder="YYYY-MM-DD"
value={startDate}
onFocus={showStartDatePickerModal}
style={styles.input}
/>
{showStartDatePicker && (
<DateTimePicker
value={startDate ? new Date(startDate) : new Date()}
mode="date"
display="default"
onChange={handleStartDateChange}
/>
)}
</View>
<View style={styles.inputContainer}>
<Text style={styles.label}>End of Leave:</Text>
<TextInput
placeholder="YYYY-MM-DD"
value={endDate}
onFocus={showEndDatePickerModal}
style={styles.input}
/>
{showEndDatePicker && (
<DateTimePicker
value={endDate ? new Date(endDate) : new Date()}
mode="date"
display="default"
onChange={handleEndDateChange}
/>
)}
</View>
<View style={styles.inputContainer}>
<Text style={styles.label}>Reason for Leave:</Text>
<TextInput
placeholder="Enter reason"
value={reason}
onChangeText={setReason}
style={styles.input}
/>
</View>
<View style={styles.inputContainer}>
<Text style={styles.label}>Number of Leaves:</Text>
<TextInput
value={calculateNumberOfDays().toString()}
editable={false}
style={[styles.input, { backgroundColor: '#ddd' }]}
/>
</View>
<Button
title="Submit"
onPress={applyLeave}
style={styles.button}
color="blue"
disabled={!isStartDateValid() || !isEndDateValid()}
/>
<AppliedLeavesTable appliedLeaves={appliedLeaves} />
{username === 'sridhar' && (
<LeavesToBeApprovedTable
leavesToBeApproved={leavesToBeApproved}
onApproveLeave={approveLeave}
onDeleteLeave={deleteLeave}
/>
)}
</View>
);
};
export default LoginPage;
Editor is loading...