From dc02896fdd51b34f1e66ab1269b1f37a1066ea0c Mon Sep 17 00:00:00 2001 From: Rochas Date: Sat, 13 Dec 2025 12:31:32 +0100 Subject: [PATCH] selectEngins --- app/(tabs)/addChantier.tsx | 9 +- components/selectChefChantier.tsx | 3 - components/selectEngins.tsx | 170 ++++++++++++++++++++++++++++++ 3 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 components/selectEngins.tsx diff --git a/app/(tabs)/addChantier.tsx b/app/(tabs)/addChantier.tsx index 829eec6..e0dd0ae 100644 --- a/app/(tabs)/addChantier.tsx +++ b/app/(tabs)/addChantier.tsx @@ -18,6 +18,7 @@ import DateTimePicker, { DateTimePickerEvent } from '@react-native-community/dat import Constants from 'expo-constants'; //pour connaître la taille de la barre menu de l'OS en haut import SelectChafChantier from '@/components/selectChefChantier'; +import SelectEngins from '@/components/selectEngins'; //Uniquement accessible par le RESPONSSABLE du chantier //Pour créer ou modifier un chantier @@ -36,7 +37,8 @@ export default function AddChantier() { const [adresse, setAdresse] = useState(''); const [duree, setDuree] = useState(''); const [contact, setContact] = useState(''); - const [vehicule, setVehicule] = useState(''); + const [engins, setEngins] = useState(); //de type enfin /!\ + const [materiels, setMateriels] = useState(); //de type material (outils) /!\ const [showDateSelect,setSowDateSelect] = useState(false); const [openConfirmation,setOpenConfirmation] = useState(false); @@ -166,7 +168,10 @@ export default function AddChantier() { {renderInut("Estimation de la durée (en demi-journées)","14",duree,setDuree,false)} {renderInut("Adresse","1 Rue de la Coutellerie, Paris",adresse,setAdresse,false)} {renderInut("Contact client","07 01 02 03 04 05",contact,setContact,true)} - {renderInut("Vehicule","TODO Ouvrir un menu",vehicule,setVehicule,false)} + + Engins: + + Chef de chantier: diff --git a/components/selectChefChantier.tsx b/components/selectChefChantier.tsx index ccdbffa..a99b379 100644 --- a/components/selectChefChantier.tsx +++ b/components/selectChefChantier.tsx @@ -18,11 +18,8 @@ type Props = { export default function SelectChafChantier({style,sendChefChantier , ...otherProps }: Props) { - const { chantier, setChantier} = useChantier(); const [chefDeChantier, setChefDeChantier] = useState(); - const [tempStatus, setTempStatus] = useState(""); const [isOpen,setIsOpen] = useState(false); - const [openConfirmation,setOpenConfirmation] = useState(false); const [users,setUsers] = useState([]); const AnimatedThemedView = Animated.createAnimatedComponent(ThemedView); diff --git a/components/selectEngins.tsx b/components/selectEngins.tsx new file mode 100644 index 0000000..c10ee10 --- /dev/null +++ b/components/selectEngins.tsx @@ -0,0 +1,170 @@ +import { useChantier } from '@/app/ContextChantier'; +import { changeChantierStatus } from "@/services/ressourcesService"; +import { useEffect, useState } from 'react'; +import { Dimensions, FlatList, LayoutAnimation, Modal, Pressable, ScrollView, StyleProp, StyleSheet, View, ViewStyle } from 'react-native'; +import Animated, { LinearTransition } from 'react-native-reanimated'; +import { ThemedButton } from './theme/themed-button'; +import { ThemedText } from './theme/themed-text'; +import { ThemedView } from "./theme/themed-view"; +import { Ressources, User } from '@/class/class'; +import { getRessources } from "@/services/ressourcesService"; + +const { width, height } = Dimensions.get("window"); + +type Props = { + sendEngins: (engins: Ressources[]) => void; + style?: StyleProp; +}; + +export default function SelectEngins({style,sendEngins: sendEngins , ...otherProps }: Props) { + + const { chantier, setChantier} = useChantier(); + const [engins, setEngins] = useState([]); + const [tempStatus, setTempStatus] = useState(""); + const [isOpen,setIsOpen] = useState(false); + const [openConfirmation,setOpenConfirmation] = useState(false); + const [listEngins,setListEngins] = useState([]); + + const AnimatedThemedView = Animated.createAnimatedComponent(ThemedView); + + useEffect(() => { + async function loadData() { + try { + const data = await getRessources();//TODO engin/vehicule uniquement + setListEngins(data); + } catch (error) { + console.error("Erreur lors du chargement :", error); + } + } + loadData(); + }, []); + + + function onPressOpen(): void { + setIsOpen(!isOpen); + } + + function onPressRessource(engin: Ressources): void{ + const exists = engins.some(item => item.name === engin.name); + if(exists){ + setEngins(prev => prev.filter(item => item.name !== engin.name)); + } + else{ + setEngins(prevItem => [...prevItem, engin]); + } + sendEngins(engins); + //setIsOpen(false); + } + + const EnginsSummary = ({ item }: { item: Ressources }) => { + if (!item) return null; + const exists = engins.some(i => i.name === item.name); + return( + + {onPressRessource(item)}}> + {item.id} + {item.name} + {item.quantity} + {item.type} + + + ) + } + + + const EnginsSearch = () => { + return( + + + + Rechercher un engin : + index.toString()} + /> + + + setIsOpen(false)}> + Valider + + + + + ) + } + + return( + onPressOpen()}> + {engins?engins.length+" engin(s) sélectionné":"sélectionner des engin(s)"} + {isOpen && EnginsSearch()} + + + + ) +} + +const styles = StyleSheet.create({ + + windowBox:{ + zIndex: 2, + //backgroundColor: '#00FFFF40', + width:"100%", + padding: 10, + paddingLeft: 0, + //overflow: 'hidden', + }, + window:{ + borderRadius:15, + //backgroundColor: '#00FF00', + overflow: 'hidden', + position: 'relative', + }, + autoClose: { + + position: 'absolute', + top: -height, + left: -width, + width:width*2, + height:height*2, + //backgroundColor: 'rgba(255, 0, 0, 0.5)', + }, + button:{ + width:'100%', + margin: 0, + borderRadius: 15, + padding: 10, + height:40, + justifyContent: 'center', + }, + centeredText:{ + textAlign: 'center', + }, + overlay:{ + backgroundColor:'#00000080', + padding:"5%", + paddingVertical:"20%", + width:"100%", + height:"100%", + }, + overlayView:{ + borderRadius: 20, + padding: 20, + alignItems: "center", + width: "100%", + height: "100%", + //backgroundColor:'#ff0000', + }, + buttonValid:{ + //borderWidth: 2, + width:'100%', + margin: 0, + borderRadius: 15, + padding: 10, + height:60, + alignItems: "center", + justifyContent: 'center', + }, + +});