Commit abae4a5d by Sergio Cubero León

Merge branch 'SergioDev' into Desarrollo

# Conflicts (solo ficheros de datos):
#	.gitignore
#	assets/data/load/listaMatRes.json
#	assets/data/load/usuarios.json
parents 4648e55c 75121575
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
# node.js
#
node_modules/ node_modules/
android/ npm-debug.log
ios/ yarn-error.log
__tests__/
# BUCK
buck-out/
\.buckd/
*.keystore
!debug.keystore
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/
*/fastlane/report.xml
*/fastlane/Preview.html
*/fastlane/screenshots
# Bundle artifact
*.jsbundle
# Ruby / CocoaPods
/ios/Pods/
/vendor/bundle/
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow strict-local
*/
import React, {useState} from 'react';
import type {Node} from 'react';
import {
SafeAreaView,
ScrollView,
StatusBar,
StyleSheet,
Text,
useColorScheme,
View,
Button,
TextInput,
Image,
TouchableOpacity,
Alert
} from 'react-native';
import {
Colors,
DebugInstructions,
Header,
LearnMoreLinks,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
import {Picker} from '@react-native-picker/picker';
import DateTimePicker from '@react-native-community/datetimepicker';
import DatePicker from 'react-native-date-picker';
import * as RNFS from 'react-native-fs';
const Section = ({children, title}): Node => {
const isDarkMode = useColorScheme() === 'dark';
return (
<View style={styles.sectionContainer}>
<Text
style={[
styles.sectionTitle,
{
color: isDarkMode ? Colors.white : Colors.black,
},
]}>
{title}
</Text>
<Text
style={[
styles.sectionDescription,
{
color: isDarkMode ? Colors.light : Colors.dark,
},
]}>
{children}
</Text>
</View>
);
};
{/*Arreglo para la fecha del calendario...*/}
function format(inputDate) {
let date, month, year;
date = inputDate.getDate();
month = inputDate.getMonth()+1;
year = inputDate.getFullYear();
date = date
.toString()
.padStart(2, '0');
month = month
.toString()
.padStart(2, '0');
return `${date}/${month}/${year}`;
};
{/*Funcion para añadir datos en el sistema...*/}
function insertData(usuario, idInstalacion, fecha, horario, idActual, navigation, route){
//const jsonReservasInstalaciones = require('./assets/data/load/reservasInstalaciones.json');
//const idActual = Object.keys(jsonReservasInstalaciones).length;
//Aqui tenemos el JSON para cargar en el fichero de reservas
var json = '{"id":'+(idActual+1)+',"usuarioReserva":"'+usuario+'","idInstalacion":"'+idInstalacion+'","fecha":"'+fecha+'","horario":"'+horario+'","borrado":"0"}';
//Antes de cargar el fichero... podemos comprobar los estados del sistema...
if(horario == 0 || typeof(horario) == "undefined"){
//Aviso de Error
//Obtener los datos necesarios para realizar el JSON... (Nota: borrado=0 y debemos saber el último identificador)
Alert.alert(
'Error en Operación',
"Debe seleccionar una hora de las disponibles",
[
{
text: 'Aceptar',
style: 'cancel',
},
],
);
}else{
//Comprobaciones con el horario...
//Convertimos la fecha a interpretacion
const fechaSeparada = fecha.split("/");
const horaSeparada = horario.split(" - ")[0].split(":");
const date1 = new Date(fechaSeparada[2],fechaSeparada[1]-1,fechaSeparada[0],horaSeparada[0],horaSeparada[1]);
const actual = new Date();
if((actual > date1)){
Alert.alert(
'Error en Operación',
"Debe seleccionar una fecha/hora futura",
[
{
text: 'Aceptar',
style: 'cancel',
},
],
);
}else{
//TODO!: Falta comprobar el dia de la semana... para realizar la reserva...
//EN ESTE PUNTO... SE HA COMPROBADO TANTO EL HORARIO, COMO LA FECHA... SE PROCEDE A INSERTAR EL JSON...
const path = RNFS.DocumentDirectoryPath+"/reservasInstalaciones.json";
//PASO 1: Comprobamos que no existe el fichero... si existe, usamos append
RNFS.exists(path)
.then( (exists) => {
if(exists) {
console.log("Se sobreescribe el fichero...");
RNFS.appendFile(path, ","+json, 'utf8');
}else{
console.log("Se inicializa el fichero...");
RNFS.writeFile(path, json, 'utf8');
}
});
Alert.alert(
"Instalacion Reservada",
"Instalacion reservada con éxito.",
[
{
text: 'Aceptar',
onPress: () => navigation.goBack(),
style: 'accept',
},
],
);
//TODO: Refrescar la vista de datos
}
}
}
const AddReservaInstalacion = ({navigation, route}) => {
{/*Preparamos los elementos dinamicos del json...*/}
const [files, setFiles] = useState(() => {
(async () => {
try {
const filesArr = JSON.parse("["+await RNFS.readFile(RNFS.DocumentDirectoryPath+"/reservasInstalaciones.json")+"]");
setFiles(filesArr);
}catch (e) {
console.log('error', e);
}
})();
return () => null;
}, []);
const idActual = files.length;
const isDarkMode = useColorScheme() === 'dark';
const backgroundStyle = {
backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
};
{/*Inicializacion del datepicker*/}
const [date, setDate] = useState(new Date());
const [open, setOpen] = useState(false);
const onChange = (event, selectedDate) => {
const currentDate = selectedDate;
setDate(currentDate);
};
{/*Cargamos los datos de las instalaciones desde JSON*/}
const jsonInstalaciones = require('./assets/data/load/instalaciones.json');
const elementos = Object.keys(jsonInstalaciones).length;
{/*Inicializacion de la lista 1...*/}
const [selectedInstallation, setSelectedInstallation] = useState([1]);
{/*Inicializacion de la lista 2...*/}
const [selectedHorario, setSelectedHorario] = useState();
return (
<ScrollView contentContainerStyle={[{flexGrow: 1, justifyContent:'space-between'}]}>
<View style={[styles.container, { flexDirection: "column"}]}>
{/*Primer elemento: Desplegable...*/}
<View style={[{ flexDirection: "column", backgroundColor:"transparent" /*Contenedor de perfil superior*/}]}>
<View style={[styles.selector]}>
<Text style={[styles.leyenda]}>Selecciona una instalación</Text>
{<Picker mode="dropdown" selectedValue={selectedInstallation} onValueChange={(itemValue, itemIndex) => setSelectedInstallation(itemValue)}>
{ Object.keys(jsonInstalaciones).map((item)=>
<Picker.Item label={jsonInstalaciones[item].NombreSala} value={item} key={item} />
)}
</Picker>}
<View style={[styles.hr]} />
</View>
</View>
{/*Segundo elemento: Selecto de fecha...*/}
<View style={[{flexDirection: "column", backgroundColor:"transparent" /*Contenedor de perfil superior*/}]}>
<View style={[styles.selector]}>
<Text style={[styles.leyenda]}>Fecha de Reserva</Text>
<TouchableOpacity style={[styles.datePicker, { flexDirection: "row"}]} onPress={() => setOpen(true)}>
<View style={{ flex: 0.9, backgroundColor: "transparent"}}>
<Text style={[styles.dateText]}> {format(date)}</Text>
</View>
<View style={{ flex: 0.1, backgroundColor: "transparent"}}>
<Image style={styles.calendar} source={require('./assets/img/icons/Calendario.png')} />
</View>
<DatePickerAddReservaInstalaciones open={open} setOpen={setOpen} date={date} setDate={setDate} />
</TouchableOpacity>
<View style={[styles.hr2]} />
</View>
</View>
{/*Tercer elemento: Desplegable...*/}
<View style={[{flexDirection: "column", marginTop:15, backgroundColor:"transparent" /*Contenedor de perfil superior*/}]}>
<View style={[styles.selector]}>
<Text style={[styles.leyenda]}>Hora de Reserva</Text>
{<Picker mode="dropdown" selectedValue={selectedHorario} onValueChange={(itemValue, itemIndex) => setSelectedHorario(itemValue)}>
<Picker.Item label="Seleccione una hora..." value="0" />
{ Object.keys(jsonInstalaciones[selectedInstallation].Horarios).map((item)=>
<Picker.Item label={jsonInstalaciones[selectedInstallation].Horarios[item]} value={jsonInstalaciones[selectedInstallation].Horarios[item]} key={jsonInstalaciones[selectedInstallation].Horarios[item]}/>
)}
</Picker>}
<View style={[styles.hr]} />
</View>
</View>
<View style={[{flex: 1, backgroundColor:"transparent" /*Contenedor de perfil superior*/}]}/ >
{/*Cuarto elemento: Botón...*/}
<TouchableOpacity style={styles.Boton} onPress={() => insertData(route.params.id, selectedInstallation, format(date), selectedHorario, idActual, navigation, route)}>
<Text style={{color:'white', fontWeight: 'bold'}}>RESERVAR INSTALACION</Text>
</TouchableOpacity>
</View>
</ScrollView>
);
};
{/*Estilo del selector de fecha*/}
const DatePickerAddReservaInstalaciones = (props) => {
return (
<DatePicker
modal
open={props.open}
date={props.date}
locale='es'
mode='date'
title="Selecciona una fecha"
confirmText='Confirmar'
cancelText='Cancelar'
onConfirm={(date) => {
props.setOpen(false)
props.setDate(date)
}}
onCancel={() => {
props.setOpen(false)
}}
/>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
},
leyenda: {
fontSize: 12.0,
color: '#8492A6',
top: 10
},
hr: {
borderColor: 'black',
borderBottomWidth: 0.4,
bottom: 7
},
picker: {
textAlign: 'right'
},
datePicker: {
textAlign: 'right',
marginTop: 10,
top: 5
},
dateText: {
fontSize: 15.0,
color: 'black'
},
calendar: {
width: 22,
height: 22,
resizeMode: 'contain',
},
hr2: {
borderColor: 'black',
borderBottomWidth: 0.4,
bottom: -15
},
Boton:{
marginTop:40,
alignItems:'center',
justifyContent:'center',
backgroundColor:'#7D9BFF',
height:45,
borderRadius:3
}
});
export default AddReservaInstalacion;
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow strict-local
*/
import React, {useState, useEffect} from 'react';
import {
StyleSheet,
Text,
useColorScheme,
View,
Image,
TouchableOpacity,
} from 'react-native';
import {
Colors,
} from 'react-native/Libraries/NewAppScreen';
import { DocumentDirectoryPath, writeFile, readDir, readFile, read } from 'react-native-fs';
const Inicio = ({navigation, route}) => {
{/*Componentes para ver las instalaciones disponibles...*/}
{/*Preparamos los elementos dinamicos del json...*/}
const [files, setFiles] = useState(() => {
(async () => {
try {
var filesArr = JSON.parse("["+await readFile(DocumentDirectoryPath+"/reservasInstalaciones.json")+"]");
filesArr = filesArr.filter(item => item.borrado === "0");
filesArr = filesArr.filter(item => item.usuarioReserva === route.params.id);
setFiles(filesArr);
}catch (e) {
console.log('error', e);
}
})();
return () => null;
}, []);
{/*Consultaremos cada segundo, las posibles actualizaciones que haga sobre los datos la aplicación*/}
const [count, setCount] = useState(0);
useEffect(() => {
// Intervalo de actualizacion
const interval = setInterval(() => {
(async () => {
try {
var filesArr = JSON.parse("["+await readFile(DocumentDirectoryPath+"/reservasInstalaciones.json")+"]");
filesArr = filesArr.filter(item => item.borrado === "0");
filesArr = filesArr.filter(item => item.usuarioReserva === route.params.id);
setFiles(filesArr);
}catch (e) {
console.log('error', e);
}
})();
}, 1000);
// Subscribe for the focus Listener
const unsubscribe = navigation.addListener('focus', () => {
setCount(0);
});
return () => {
// Clear setInterval in case of screen unmount
clearTimeout(interval);
// Unsubscribe for the focus Listener
unsubscribe;
};
}, [navigation]);
{/*Reservas de materiales y guardias*/}
const dateInicio = new Date();
const dateFin = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000); {/*Reservas y guardias de los ultimos 7 dias*/}
const jsonUsuarios = require('./assets/data/load/usuarios.json');
const jsonMateriales = require('./assets/data/load/listaMatRes.json');
const jsonGuardias = require('./assets/data/load/listaGuardias.json');
var countMateriales = 0;
var countGuardias = 0;
var countInstalaciones = 0;
{/*Obtenemos la lista de reservas acotada en fecha*/}
for(let userObject of jsonUsuarios[route.params.id].idListaMaterial){
const horaSeparada = (jsonMateriales[userObject].horaInicio).split(":");
const dateItem = new Date(jsonMateriales[userObject].año, jsonMateriales[userObject].mes-1, jsonMateriales[userObject].dia, horaSeparada[0], horaSeparada[1], 0);
if(dateItem > dateInicio && dateItem < dateFin){
countMateriales++;
}
}
{/*Obtenemos la lista de guardias acotadas a rango de fecha de 7 días*/}
for(let userObject of jsonUsuarios[route.params.id].idGuardias){
const horaSeparada = (jsonGuardias[userObject].horaInicio).split(":");
const dateItem = new Date(jsonGuardias[userObject].año, jsonGuardias[userObject].mes-1, jsonGuardias[userObject].dia, horaSeparada[0], horaSeparada[1], 0);
if(dateItem > dateInicio && dateItem < dateFin){
countGuardias++;
}
}
{/*Obtenemos la lista de instalaciones reservadas a rango de 7 días*/}
for(let userObject of files){
const fechaSeparada = (userObject.fecha).split("/");
const horaSeparada = (userObject.horario).split(" - ")[0].split(":");
const dateItem = new Date(fechaSeparada[2],fechaSeparada[1]-1,fechaSeparada[0],horaSeparada[0],horaSeparada[1], 0);
if(dateItem > dateInicio && dateItem < dateFin){
countInstalaciones++;
}
}
const isDarkMode = useColorScheme() === 'dark';
const backgroundStyle = {
backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
};
const jsonInicio = require('./assets/data/load/usuarios.json');
return (
<View style={[styles.container, { flexDirection: "column" /*Contenedor principal*/}]}>
<View style={{ flex: 1 }}>
<View style={[styles.header, { flexDirection: "row" /*Contenedor de perfil superior*/}]}>
<TouchableOpacity style={{ flex: 0.8 }} onPress={() => navigation.navigate("Perfil")}>
<Image style={styles.perfil} source={require('./assets/img/photoprofiles/profile.png')} />
</TouchableOpacity>
<View style={{ flex: 2 /*Contenedor de los textos de cabecera*/}}>
<Text style={[styles.bienvenida]}>Bienvenido, {jsonInicio[route.params.id].Nombre}</Text>
<Text style={[styles.nombreCentro]}>IES Jabalcuz</Text>
</View>
</View>
</View>
<View style={{ flex: 4.6 }}>
<Text style={[styles.estaSemana]}>Esta semana</Text>
<View style={[styles.hr /*_______________________________________*/]}/>
<View style={[styles.botonera, { flexDirection: "column" /*Contenedor de las botoneras*/}]}>
<View style={{ flex: 1.5, backgroundColor: "#FCCE90" }}>
<TouchableOpacity style={[{flexDirection: "row" }]} onPress={() => navigation.navigate("Guardias")} >
<View style={[styles.botonGuardias, { flex: 1 }]}>
<Image style={styles.iconoGuardias} source={require('./assets/img/icons/alert.png')} />
</View>
<View style={[styles.botonGuardias, { flex: 3 }]}>
<Text style={[styles.textoGuardias]}>Tiene {countGuardias} guardias{"\n"}pendientes</Text>
</View>
</TouchableOpacity>
</View>
<View style={{ flex: 0.8, backgroundColor: "white", top: 30 }}>
<View style={[styles.hr2 /*_______________________________________*/]}/>
</View>
<View style={{ flex: 3.2 }}>
<View style={[styles.botonesHorizonales, { flexDirection: "column"}]}>
<View style={{ flex: 1.4, backgroundColor: "#A1B6FC" }}>
<TouchableOpacity style={[styles.contenedorBoton, { flexDirection: "row"}]} onPress={() => navigation.navigate("Instalaciones")}>
<View style={{ flex: 0.9}}>
<Text style={[styles.numerosTarea]}>{countInstalaciones}</Text>
</View>
<View style={{ flex: 1.4}}>
<Text style={[styles.textoTarea]}>Instalaciones{"\n"}Rerservadas</Text>
</View>
</TouchableOpacity>
</View>
<View style={{ flex: 0.2 }} />
<View style={{ flex: 1.4, backgroundColor: "#AEE58F" }}>
<TouchableOpacity style={[styles.contenedorBoton, { flexDirection: "row"}]} onPress={()=>navigation.navigate("Material")}>
<View style={{ flex: 0.9}}>
<Text style={[styles.numerosTarea]}>{countMateriales}</Text>
</View>
<View style={{ flex: 1.4}}>
<Text style={[styles.textoTarea]}>Listas de materiales{"\n"}reservadas</Text>
</View>
</TouchableOpacity>
</View>
</View>
</View>
</View>
</View>
<View style={{ flex: 0.5 /*Espacio preparado para taskbar*/}} />
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 20,
},
header: {
flex: 1,
padding: 0,
},
botonera: {
flex: 1,
padding: 0,
},
botonesHorizonales: {
flex: 1,
padding: 0,
},
hr: { /*Linea divisoria baso "Esta Semana"*/
borderWidth: 0.5,
borderColor: 'grey',
marginTop: 3,
marginBottom: 10,
},
hr2: { /*Linea divisoria que separa los dos tipos de botones */
borderWidth: 0.6,
borderColor: 'grey',
marginTop: 0,
marginBottom: 0,
},
estaSemana: {
fontSize: 18.0,
color: '#8492A6',
},
bienvenida: {
fontSize: 30.0,
color: '#1F2D3D',
top: 5
},
nombreCentro: {
fontSize: 19.0,
color: '#8492A6',
top: 7
},
numerosTarea: {
fontSize: 70.0,
textAlign: 'center',
color: '#1F2D3D',
bottom: 2,
marginRight: 13,
},
textoTarea: {
fontSize: 22.0,
color: '#1F2D3D',
textAlign: 'right',
marginRight: 15,
top: 19
},
contenedorBoton: {
flex: 1,
marginLeft: 15,
marginTop: 10,
},
botonGuardias: {
marginTop: 35
},
textoGuardias: {
fontSize: 20.0,
color: '#1F2D3D',
textAlign: 'right',
marginRight: 35,
bottom: 5
},
iconoGuardias: {
width: 80,
height: 80,
resizeMode: 'contain',
bottom: 20,
left: 40
},
perfil: {
width: 85,
height: 85,
resizeMode: 'contain',
borderRadius: 100
},
textoAusencias: {
fontSize: 222.0,
color: '#1F2D3D',
textAlign: 'center',
top: 20
},
});
export default Inicio;
/**
* Sample React Native App
* https://github.com/facebook/react-native
*
* @format
* @flow strict-local
*/
import React, {useState, useEffect} from 'react';
import type {Node} from 'react';
import {
SafeAreaView,
ScrollView,
StatusBar,
StyleSheet,
Text,
useColorScheme,
View,
Image,
Dimensions,
FlatList,
TouchableOpacity,
Alert,
} from 'react-native';
import {
Colors,
DebugInstructions,
Header,
LearnMoreLinks,
ReloadInstructions,
} from 'react-native/Libraries/NewAppScreen';
import { DocumentDirectoryPath, writeFile, readDir, readFile, read } from 'react-native-fs';
{/*Para ajustar los elementos al ancho-alto de la ventana del dispositivo*/}
const win = Dimensions.get('window');
const ratio = win.width/541; //541 is actual image width
function eliminarElemento(idElemento, usuarioReserva, idInstalacion, fecha, horario, nombreSala){
//Preguntamos antes de hacer una orden destructiva
Alert.alert(
"Advertencia",
"¿Desea eliminar la reserva de la sala '"+nombreSala+"' ?",
[
{
text: 'Cancelar',
style: 'cancel'
},
{
text: 'Aceptar',
onPress: (async () => {
try {
// +++++++++++++ ELIMINACION ++++++++++++
//Con el id del elemento en marcha, sólo nos queda modificar su atributo de eliminación de item...
// ++++++++++++++++++++++++++++++++++++++
//Obtenemos el fichero primigenio
var filesArr = await readFile(DocumentDirectoryPath+"/reservasInstalaciones.json");
//Buscamos patron y remplazamiento
var stringBuscar = '{"id":'+idElemento+',"usuarioReserva":"'+usuarioReserva+'","idInstalacion":"'+idInstalacion+'","fecha":"'+fecha+'","horario":"'+horario+'","borrado":"0"}';
var replace = '{"id":'+idElemento+',"usuarioReserva":"'+usuarioReserva+'","idInstalacion":"'+idInstalacion+'","fecha":"'+fecha+'","horario":"'+horario+'","borrado":"1"}';
//Machacamos
filesArr = filesArr.replace(stringBuscar, replace);
//Ejecutamos al fichero
await writeFile(DocumentDirectoryPath+"/reservasInstalaciones.json", filesArr);
//Mensaje de borrado...
Alert.alert(
"Elemento Eliminado",
"La sala '"+nombreSala+"' se ha eliminado con éxito.",
[
{
text: 'Aceptar',
style: 'accept',
},
],
);
}catch (e) {
console.log('error', e);
}
})
},
],
{
cancelable: true,
}
);
/**/
}
const Instalaciones = ({navigation, route}) => {
{/*Preparamos los elementos dinamicos del json...*/}
const [files, setFiles] = useState(() => {
(async () => {
try {
var filesArr = JSON.parse("["+await readFile(DocumentDirectoryPath+"/reservasInstalaciones.json")+"]");
filesArr = filesArr.filter(item => item.borrado === "0");
filesArr = filesArr.filter(item => item.usuarioReserva === route.params.id);
setFiles(filesArr);
}catch (e) {
console.log('error', e);
}
})();
return () => null;
}, []);
{/*Consultaremos cada segundo, las posibles actualizaciones que haga sobre los datos la aplicación*/}
const [count, setCount] = useState(0);
useEffect(() => {
// Intervalo de actualizacion
const interval = setInterval(() => {
(async () => {
try {
var filesArr = JSON.parse("["+await readFile(DocumentDirectoryPath+"/reservasInstalaciones.json")+"]");
filesArr = filesArr.filter(item => item.borrado === "0");
filesArr = filesArr.filter(item => item.usuarioReserva === route.params.id);
setFiles(filesArr);
}catch (e) {
console.log('error', e);
}
})();
}, 1000);
// Subscribe for the focus Listener
const unsubscribe = navigation.addListener('focus', () => {
setCount(0);
});
return () => {
// Clear setInterval in case of screen unmount
clearTimeout(interval);
// Unsubscribe for the focus Listener
unsubscribe;
};
}, [navigation]);
{/*Ahora, le toca a los 2 json: El de reservas y el de instalaciones... y filramos por el usuario activo y por las reservas sin borrar*/}
const jsonInstalaciones = require('./assets/data/load/instalaciones.json');
//var jsonReservasInstalaciones = require('./assets/data/load/reservasInstalaciones.json');
//var jsonReservasInstalaciones = Object.entries(json);
var jsonReservasInstalaciones = files;
{/*Falta el cribado de tiempo con la fecha actual...*/}
const isDarkMode = useColorScheme() === 'dark';
const backgroundStyle = {
backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
};
{/*Recursos gráficos de la aplicacion de reservas de instalaciones*/}
const recursos = {
"polideportiva_derecha.jpg": {
uri: require('./assets/img/installations/polideportiva_derecha.jpg')
},
"polideportiva_izquierda.jpg": {
uri: require('./assets/img/installations/polideportiva_izquierda.jpg')
},
"polideportiva_interior.jpg": {
uri: require('./assets/img/installations/polideportiva_interior.jpg')
},
"sala_musica.jpg": {
uri: require('./assets/img/installations/sala_musica.jpg')
},
"sala_informatica.jpg": {
uri: require('./assets/img/installations/sala_informatica.jpg')
},
};
return (
<View style={{flex: 1, backgroundColor:'rgba(52, 52, 52, 0.1)'}}>
<FlatList
data={jsonReservasInstalaciones}
renderItem={({item}) => <View style={[styles.container, { flex: 1, backgroundColor: "#EFF2F7" }]}>
<Image style={styles.imagen} source={recursos[jsonInstalaciones[item.idInstalacion].ImagenRecurso].uri} />
<View style={[styles.containerTexto, { flex: 0.27, backgroundColor: "white" }]}>
<Text style={[styles.textoPista]}>{jsonInstalaciones[item.idInstalacion].NombreSala}</Text>
<Text style={[styles.textoInfoPista]}>Rervada: {item.fecha} / Hora: {item.horario}</Text>
<TouchableOpacity onPress={() => eliminarElemento(item.id, route.params.id, item.idInstalacion, item.fecha, item.horario, jsonInstalaciones[item.idInstalacion].NombreSala)}><Text style={[styles.textoAnular]}>CANCELAR RESERVA</Text></TouchableOpacity>
</View>
</View>}
keyExtractor={item => item.id}
ListEmptyComponent = {<Text style={[styles.noReservas]}>No hay reservas disponibles.</Text>}
/>
<TouchableOpacity style={styles.botonPos} onPress={() => navigation.navigate('AddReservaInstalacion', {id: route.params.id})}>
<View style={styles.contenedorBoton}>
<Image style={styles.contenedorImage} source={require("./assets/img/icons/iconoAdd.png")}></Image>
</View>
</TouchableOpacity>
</View>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
},
containerTexto: {
width: win.width-20,
left: 10,
top: 5,
height: win.height/6
},
imagen: {
width: win.width-20,
height: win.height/4,
resizeMode: 'cover',
left: 10,
top: 5,
},
textoPista: {
fontSize: 25.0,
color: '#47525E',
left: 25,
top: 10
},
textoInfoPista: {
fontSize: 13.0,
color: '#8492A6',
left: 25,
top: 15
},
textoAnular: {
fontSize: 15.0,
color: '#F95F62',
left: 25,
top: 25
},
noReservas: {
fontSize: 25.0,
color: '#F95F62',
left: 25,
top: 10,
marginBottom: 20
},
contenedorBoton: {
backgroundColor: '#7D9BFF',
borderRadius: 100,
width: 60,
height: 60,
justifyContent: 'center'
},
contenedorImage: {
width: 20,
height: 20,
tintColor: 'white',
alignSelf: 'center'
},
botonPos: {
position: 'absolute',
bottom: 20,
right: 20
}
});
export default Instalaciones;
[
{
"horaInicio": "08:00",
"horaFin": "09:00"
},
{
"horaInicio": "09:00",
"horaFin": "10:00"
},
{
"horaInicio": "10:00",
"horaFin": "11:00"
},
{
"horaInicio": "11:00",
"horaFin": "12:00"
},
{
"horaInicio": "12:00",
"horaFin": "13:00"
},
{
"horaInicio": "13:00",
"horaFin": "14:00"
}
]
\ No newline at end of file
{
"1":{
"NombreSala": "Aula de Informática",
"LimiteReservas": "2",
"DiaReserva": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"Horarios": ["08:00 - 09:00", "09:00 - 10:00", "10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00", "13:00 - 14:00"],
"ImagenRecurso": "sala_informatica.jpg",
},
"2":{
"NombreSala": "Pista deportiva derecha",
"LimiteReservas": "2",
"DiaReserva": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"Horarios": ["08:00 - 09:00", "09:00 - 10:00", "10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00", "13:00 - 14:00"],
"ImagenRecurso": "polideportiva_derecha.jpg",
},
"3":{
"NombreSala": "Pista deportiva izquierda",
"LimiteReservas": "2",
"DiaReserva": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"Horarios": ["08:00 - 09:00", "09:00 - 10:00", "10:00 - 11:00", "11:00 - 12:00", "12:00 - 13:00", "13:00 - 14:00"],
"ImagenRecurso": "polideportiva_izquierda.jpg",
},
"4":{
"NombreSala": "Aula de Música",
"LimiteReservas": "2",
"DiaReserva": ["Monday","Tuesday","Wednesday","Thursday","Friday"],
"Horarios": ["08:30 - 09:30", "09:30 - 10:30", "10:30 - 11:30", "11:30 - 12:30", "12:30 - 13:30", "13:30 - 14:30"],
"ImagenRecurso": "sala_musica.jpg",
}
}
\ No newline at end of file
{
"guardia1": {
"dia": "19",
"mes": "01",
"año": "2023",
"horaInicio": "10:00",
"horaFin": "11:00",
"clase": "Clase de 1 ESO A",
"tareas": ["Escribir un poema siguiendo las indicaciones del apartado 2 de la página 17 del libro de Lengua",
"Análisis sintáctico de las siguientes frases: \n\n - Me encontré con Pablo en el parque \n\n - Anduve sin rumbo durante un tiempo \n\n - Lo escucho desde que era pequeño",
"Leer y resumir el fragmento de la obra de Romeo y Julieta de la página 65 del libro de Lengua",
"Responda razonadamente las preguntas de la siguiente página relacionadas con el fragmento mencionado"]
},
"guardia2": {
"dia": "20",
"mes": "01",
"año": "2023",
"horaInicio": "11:00",
"horaFin": "12:00",
"clase": "Clase de 2 BACH D",
"tareas": ["Ejercicios 5, 6 y 7 de la página 44 del libro de Lengua"]
},
"guardia3": {
"dia": "20",
"mes": "01",
"año": "2023",
"horaInicio": "09:00",
"horaFin": "10:00",
"clase": "Clase de 2 ESO B",
"tareas":[]
},
"guardia4": {
"dia": "25",
"mes": "01",
"año": "2023",
"horaInicio": "13:00",
"horaFin": "14:00",
"clase": "Clase de 4 ESO B",
"tareas":["Ejercicios 1, 3 y 7 de la página 23 del libro de Ciencias Sociales"]
},
"guardia5": {
"dia": "25",
"mes": "01",
"año": "2023",
"horaInicio": "12:00",
"horaFin": "13:00",
"clase": "Clase de 1 BACH A",
"tareas":["Resumen de la página 43 del libro de Historia"]
}
}
\ No newline at end of file
{ {
"listaResMat0": { "listaResMat0": {
"dia": "19", "dia": "18",
"mes": "01", "mes": "1",
"año": "2023", "año": "2023",
"horaInicio": "10:00", "horaInicio": "10:00",
"horaFin": "11:00", "horaFin": "11:00",
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
}, },
"listaResMat1": { "listaResMat1": {
"dia": "20", "dia": "20",
"mes": "01", "mes": "1",
"año": "2023", "año": "2023",
"horaInicio": "11:00", "horaInicio": "11:00",
"horaFin": "12:00", "horaFin": "12:00",
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
}, },
"listaResMat2": { "listaResMat2": {
"dia": "20", "dia": "20",
"mes": "01", "mes": "1",
"año": "2023", "año": "2023",
"horaInicio": "09:00", "horaInicio": "09:00",
"horaFin": "10:00", "horaFin": "10:00",
...@@ -73,11 +73,11 @@ ...@@ -73,11 +73,11 @@
}, },
{ {
"cantidadMaterial": 4, "cantidadMaterial": 4,
"material": "Pelotas de baloncesto" "material": "Balones de baloncesto"
}, },
{ {
"cantidadMaterial": 4, "cantidadMaterial": 4,
"material": "Pelotas de fúbtol" "material": "Balón de fútbol"
} }
] ]
} }
......
[
{
"nombreMaterial": "Balones de baloncesto",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 20
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 10
}
]
},
{
"nombreMaterial": "Conos",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 15
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 20
}
]
},
{
"nombreMaterial": "Balón de fútbol",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 18
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 21
}
]
},
{
"nombreMaterial": "Cinta métrica",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 1
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 2
}
]
},
{
"nombreMaterial": "Balones medicinales",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 5
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 5
}
]
},
{
"nombreMaterial": "Pelotas de goma",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 7
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 7
}
]
},
{
"nombreMaterial": "Pelotas de balonmano",
"cantidades": [
{
"fecha": "15/1/2023",
"hora": "08:00 - 09:00",
"cantidad": 8
},
{
"fecha": "20/1/2023",
"hora": "09:00 - 10:00",
"cantidad": 16
}
]
}
]
\ No newline at end of file
[
{
"id": 1,
"usuarioReserva": "dgh00001",
"idInstalacion": "1",
"fecha": "25-01-2023",
"horario": "13:00 - 14:00",
"borrado": "0"
},
{
"id": 2,
"usuarioReserva": "dgh00001",
"idInstalacion": "2",
"fecha": "25-01-2023",
"horario": "12:00 - 13:00",
"borrado": "1"
},
{
"id": 3,
"usuarioReserva": "icl00001",
"idInstalacion": "4",
"fecha": "25-01-2023",
"horario": "13:00 - 14:00",
"borrado": "0"
},
{
"id": 4,
"usuarioReserva": "icl00001",
"idInstalacion": "1",
"fecha": "25-01-2023",
"horario": "12:00 - 13:00",
"borrado": "0"
},
]
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment