10/03/2025 - 13h

recette2
cherif 2025-03-10 12:36:09 +01:00
parent 6f197dbdbf
commit b0b2108cae
6 changed files with 953 additions and 87 deletions

View File

@ -12,6 +12,13 @@
<priority>1.0000</priority>
</url>
<url>
<loc>https://mysy-training.com/</loc>
<lastmod>2025-02-16T11:35:41+00:00</lastmod>
<changefreq>daily</changefreq>
<priority>1.0000</priority>
</url>
<url>
<loc>https://www.mysy-training.com/fonctionnalites</loc>
<lastmod>2025-02-16T11:35:41+00:00</lastmod>

View File

@ -223,6 +223,17 @@ function App() {
<Route path="/signup/" exact component={New_Sign_Up_2025} />
<Route path="/tarif/" exact component={New_Tarif_2025} />
<Route path="/contact/" exact component={New_Contact_2025} />
{/*
09/03/25 : un redirection a été faite dans cloudflaire pour les lignes ci-dessous
<Route path="/ContactezNous" exact component={New_Contact_2025} />
*/}
<Route path="/display-detail-article/:articleId" exact component={New_Article_Detail_2025} />
<Route path="/Display-Detail-Article/:articleId" exact component={New_Article_Detail_2025} />
@ -233,6 +244,15 @@ function App() {
<Route path="/fonctionnalites/" exact component={New_Fonctionnalite_2025} />
<Route path="/apropos/" exact component={New_A_Propos_2025} />
{/*
09/03/25 : un redirection a été faite dans cloudflaire pour les lignes ci-dessous
<Route path="/QuiSommesNous" exact component={New_A_Propos_2025} />
<Route path="/QuiSommesNous_v3" exact component={New_A_Propos_2025} />
<Route path="/qui-sommes-nous" exact component={New_A_Propos_2025} />
*/}
<Route path="/" exact component={New_Home_Page_2025} />
@ -260,12 +280,6 @@ function App() {
<Route path="/mysy-user-account" exact component={Account} />
<Route path="/Ajout-Article-formation" exact component={AddArticle} />
<Route path="/ResetUserPwd/:token/:accounttype" exact component={ResetUserPwd} />
<Route path="/QuiSommesNous" exact component={New_A_Propos_2025} />
<Route path="/QuiSommesNous_v3" exact component={New_A_Propos_2025} />
<Route path="/qui-sommes-nous" exact component={New_A_Propos_2025} />
<Route path="/ContactezNous" exact component={New_Contact_2025} />
<Route path="/DeleteUserAccount/:token" exact component={DeleteUserAccount} />

View File

@ -70,8 +70,8 @@ import RadioGroup from '@mui/material/RadioGroup';
import FormControlLabel from '@mui/material/FormControlLabel';
import FormControl from '@mui/material/FormControl';
import FormLabel from '@mui/material/FormLabel';
import allLocales from '@fullcalendar/core/locales-all'
import { FaUserPen } from "react-icons/fa6";
import allLocales from '@fullcalendar/core/locales-all';
import listPlugin from '@fullcalendar/list';
import multiMonthPlugin from '@fullcalendar/multimonth'
@ -2484,7 +2484,7 @@ const DisplayPartnerSession = (props) => {
const [Get_List_Partner_Clients_api, setGet_List_Partner_Clients_api] = useState();
const [Get_List_Partner_Clients_message, setGet_List_Partner_Clients_message] = useState();
const [Get_List_Partner_Clients_result, setGet_List_Partner_Clients_result] = useState();
const [Get_List_Partner_Clients_result, setGet_List_Partner_Clients_result] = useState([]);
function Get_List_Partner_Clients(event) {
var form = new FormData();
@ -3338,6 +3338,62 @@ const DisplayPartnerSession = (props) => {
})
}
const [Update_PresInsc_Data_With_Nb_Personne_By_Client_api, setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_api] = useState();
const [Update_PresInsc_Data_With_Nb_Personne_By_Client_message, setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_message] = useState();
const [Update_PresInsc_Data_With_Nb_Personne_By_Client_result, setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_result] = useState();
function Update_PresInsc_Data_With_Nb_Personne_By_Client() {
var form = new FormData();
//form.append("token","K3cw63eKokKSbV4spjQ48SUNnfy80yrXfA");
// console.log(" #### local_liste_class = ", local_liste_class)
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("client_id", p_maj_preinsc_client_id);
form.append("session_id", selected_session_id);
form.append("max_presinscrit", p_maj_preinsc_nb_participant);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Prepare_request_For_Preinsciption_Creation_By_Customer/";
setLoading(true);
axios.post(myurl, form).then(res => {
setLoading(false);
//console.log(" In Update_PresInsc_Data_With_Nb_Personne_By_Client res.data.status = " + res.data.status);
//console.log(" In Update_PresInsc_Data_With_Nb_Personne_By_Client res.data.message r_class = " + res.data.message);
if (String(res.data.status) === String("true")) {
setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_api("true");
setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_result(res.data.message);
Dialog_MAJ_Preinsc_Client_handleClose_buton();
// alert(res.data.message);
setdisplay_alert_mysy("1");
setalert_message(res.data.message);
setalert_type("success");
}
else {
setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_api("false");
setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_message(res.data.message);
// alert(res.data.message);
setdisplay_alert_mysy("1");
setalert_message(res.data.message);
setalert_type("error");
}
}).catch((error) => {
setLoading(false);
console.warn('Update_PresInsc_Data_With_Nb_Personne_By_Client : Not good man :( mysearchtext = ' + error);
setUpdate_PresInsc_Data_With_Nb_Personne_By_Client_api("false");
alert(" Impossible d'envoyer la demande de mise à jour");
})
}
const [Refuse_List_Inscritpion_api, setRefuse_List_Inscritpion_api] = useState();
const [Refuse_List_Inscritpion_message, setRefuse_List_Inscritpion_message] = useState();
const [Refuse_List_Inscritpion_result, setRefuse_List_Inscritpion_result] = useState();
@ -13960,6 +14016,31 @@ const DisplayPartnerSession = (props) => {
const [dup_p_session_etape, setdup_p_session_etape] = useState("");
const [dup_p_session_formateur_id, setdup_p_session_formateur_id] = useState("");
const [Dialog_MAJ_Preinsc_Client_message, setDialog_MAJ_Preinsc_Client_message] = React.useState(false);
const [Dialog_MAJ_Preinsc_Client_open, setDialog_MAJ_Preinsc_Client_open] = React.useState(false);
function Dialog_MAJ_Preinsc_Client_handle_change_participant_session(message) {
setDialog_MAJ_Preinsc_Client_message(message);
setDialog_MAJ_Preinsc_Client_open(true);
}
const Dialog_MAJ_Preinsc_Client_handleClose = () => {
//alert(" Utiliser le bouton 'fermer' ");
//setOpen(false);
};
const Dialog_MAJ_Preinsc_Client_handleClose_buton = () => {
setp_maj_preinsc_client_id("");
setp_maj_preinsc_nb_participant("");
setDialog_MAJ_Preinsc_Client_open(false);
};
const [p_maj_preinsc_client_id, setp_maj_preinsc_client_id] = useState("");
const [p_maj_preinsc_nb_participant, setp_maj_preinsc_nb_participant] = useState("1");
return (
<div className="displaypartnersession">
@ -14013,7 +14094,6 @@ const DisplayPartnerSession = (props) => {
aria-labelledby="draggable-dialog-title"
>
<DialogTitle style={{ cursor: 'move' }} id="draggable-dialog-title"> Dupliquer : <i>{dup_list_session_code} </i> </DialogTitle>
<DialogContent className="DialogContent_width" style={{ "minHeight": "20rem" }}>
<DialogContentText>
@ -14166,6 +14246,129 @@ const DisplayPartnerSession = (props) => {
{/* FIN Dialog pour gerer les DUPLIQUER SESSION*/}
{/* Dialog pour gerer les PREINSCRIPTION PAR CLIENT*/}
<Dialog
open={Dialog_MAJ_Preinsc_Client_open}
// onClose={Dialog_MAJ_Preinsc_Client_handleClose}
//className="displaypartnersession"
className="displaypartnersession"
static
onClose={() => null}
PaperProps={{
className: classes.paper, // Apply the paper style
style: {
overflowY: 'unset',
position: 'absolute',
top: '7rem',
margin: "2px",
},
}}
hideBackdrop={true}
disableScrollLock
classes={{
paper: classes.dialog
}}
PaperComponent={PaperComponent}
aria-labelledby="draggable-dialog-title"
>
<DialogTitle style={{ cursor: 'move' }} id="draggable-dialog-title"> Préinscription par le client zzz </DialogTitle>
<DialogContent className="DialogContent_width" style={{ "minHeight": "20rem" }}>
<DialogContentText>
{Dialog_1_message}
</DialogContentText>
{New_Get_List_Partner_Clients_result && New_Get_List_Partner_Clients_result.length > 0 && <div className="session_caract_Dialog"> Client <br />
<Autocomplete
disablePortal
name="maj_preinsc_client_id"
id="maj_preinsc_client_id"
className="disabled_style"
value={New_Get_List_Partner_Clients_result.filter((data) => (data)._id === String(p_maj_preinsc_client_id))[0].label}
options={New_Get_List_Partner_Clients_result}
onChange={(event, value) => {
if (value && value._id) {
setp_maj_preinsc_client_id(value._id);
} else {
setp_maj_preinsc_client_id("");
}
}}
renderInput={(params) => <TextField {...params} label="" placeholder="Choisir une option"
inputProps={{ ...params.inputProps, style: { fontSize: 12, height: "1.4rem" } }}
/>
}
/>
</div>}
<div className="session_caract_Dialog">Maximum préinscription <br />
<TextField
name="maj_nb_participant"
id="maj_nb_participant"
type="number"
InputLabelProps={{
shrink: true,
}}
inputProps={{ min: "1", max: "99", step: "1" }}
disabled={false}
className="disabled_style"
value={p_maj_preinsc_nb_participant}
onChange={(e) => {
setp_maj_preinsc_nb_participant(e.target.value);
}
}
/>
</div>
</DialogContent>
<DialogActions>
<IconButton
autoFocus
onClick={Dialog_MAJ_Preinsc_Client_handleClose_buton}
color="primary"
className={classes.customizedButton}
>
<CancelPresentationIcon />
</IconButton>
<div className="div_row">
<div className="div_row_gauche">
{String(p_maj_preinsc_client_id).length > 5 && String(p_maj_preinsc_nb_participant) > 0 &&
<Button onClick={(e) => {
Update_PresInsc_Data_With_Nb_Personne_By_Client();
}}
className="bton_enreg_dialog">Envoyer </Button>}
</div>
<div className="div_row_droite" style={{ "textAlign": 'center' }}>
<Button onClick={Dialog_MAJ_Preinsc_Client_handleClose_buton} className="bton_annule_dialog" >Fermer</Button>
</div>
</div>
</DialogActions>
</Dialog>
{/* FIN Dialog pour gerer les PREINSCRIPTION PAR CLIENT*/}
{/* Dialog pour gerer les CONVENTIONS ENTREPRISE*/}
@ -19930,7 +20133,7 @@ const DisplayPartnerSession = (props) => {
onChange={liste_sessions_file_change}
/>
<a href='/sample/template_import_session_formation.csv' download>Télécharger un fichier modèle</a>
<a href='/sample/template_import_session_formation.csv' download>Télécharger un fichier modèle </a>
</div>
</div>
<div className="div_row" ref={myRef_add_session} id="myRef_add_session"> &nbsp; </div>
@ -22844,6 +23047,24 @@ const DisplayPartnerSession = (props) => {
<img src={participants} alt="ajout un participant" className="icon_plus" />
</Button>
<Tooltip className="tooltip_css" id="tooltip_maj_client" />
<a data-tooltip-id="tooltip_maj_client" data-tooltip-html=" Demander au client de saisir la liste des participants">
<Button variant="outlined"
onClick={(event) => {
setp_maj_preinsc_client_id("");
setp_maj_preinsc_nb_participant("1");
setDialog_MAJ_Preinsc_Client_open(true);
}}
className="detail_class_submenu bton_add_session"
id='menu_one_participant' name='menu_one_participant'>MAJ Client &nbsp; zzzz<FaUserPen style={{ fontSize: '16px' }} />
</Button>
</a>
<br />
<a href='/sample/template_import_stagiaires.csv' download>Télécharger un fichier modèle</a>
<br />

View File

@ -20,10 +20,7 @@ import img_met_graphisme from "../mysy_img/metier_graphisme.jpg";
import img_met_autre from "../mysy_img/met_autre.jpg";
import img_met_digital from "../mysy_img/met_digital.jpg";
import img_met_management from "../mysy_img/met_management.jpg";
import img_met_projet from "../mysy_img/met_projet.jpg";
import img_met_market from "../mysy_img/met_market.jpg";
import img_met_autre2 from "../mysy_img/met_autre2.jpg";
import img_met_dev_perso from "../mysy_img/metier_dev_perso.jpg";
import img_met_rh from "../mysy_img/met_rh.jpg";

View File

@ -25,13 +25,58 @@ import Link from '@mui/material/Link';
import { PiDotsThree } from "react-icons/pi";
import Popup from 'reactjs-popup';
import 'reactjs-popup/dist/index.css';
import TextField from '@mui/material/TextField';
import Display_Action_And_Class from "./Display_Action_And_Class";
import Module_Alert_Confirmation from "./Module_Alert_Confirmation";
import AddCircleOutlineIcon from '@mui/icons-material/AddCircleOutline';
import Dialog from '@mui/material/Dialog';
import DialogActions from '@mui/material/DialogActions';
import DialogContent from '@mui/material/DialogContent';
import DialogContentText from '@mui/material/DialogContentText';
import DialogTitle from '@mui/material/DialogTitle';
import { IconButton } from '@material-ui/core';
import CancelPresentationIcon from '@mui/icons-material/CancelPresentation';
import { makeStyles } from "@material-ui/core/styles";
import Paper from '@material-ui/core/Paper';
import Draggable from 'react-draggable';
function PaperComponent(props) {
return (
<Draggable
handle="#draggable-dialog-title"
cancel={'[class*="MuiDialogContent-root"]'}
>
<Paper {...props} />
</Draggable>
);
}
const useStyles = makeStyles((theme) => ({
dialog: {
position: 'absolute',
// left: 10,
top: 400
},
paper: {
overflowY: 'unset',
},
customizedButton: {
position: 'absolute',
left: '98%',
top: '-3%',
backgroundColor: 'lightgray',
color: 'gray',
},
}));
function UpdateAttendeeList() {
const classes = useStyles();
const history = useHistory();
const { client_id, session_id, partner_owner_recid } = useParams();
const [isLoading, setLoading] = useState();
@ -74,6 +119,7 @@ function UpdateAttendeeList() {
const columns_preinscrit = [
{ field: 'id', headerName: 'id', hide: true },
{ field: '_id', headerName: '_id', hide: true },
{
field: 'civilite', headerName: 'Civ.', minWidth: 100, flex: 1, maxWidth: 100, hide: false, editable: true,
type: "singleSelect",
@ -101,10 +147,133 @@ function UpdateAttendeeList() {
{ field: 'prenom', headerName: 'prenom', minWidth: 150, flex: 1, hide: false, editable: true, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{ field: 'email', headerName: 'email', minWidth: 150, flex: 1, editable: true, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{
field: 'status', headerName: 'Statut', minWidth: 150, flex: 1, editable: false,
renderCell: (cellValues) => {
return (
<div style={{ paddingLeft: "5px", paddingRight: "15px", "display": "block", wordBreak: "break-all" }}>
{cellValues.row.status && String(cellValues.row.status) === "1" && "Validé"}
{cellValues.row.status && String(cellValues.row.status) === "0" && "PréIns"}
{cellValues.row.pres_dist_hyp && String(cellValues.row.status) !== "0"
&& String(cellValues.row.status) === "1" && "N/A"}
</div>
);
}
},
]
const columns_preinscrit_with_add_delete_bton = [
{ field: 'id', headerName: 'id', hide: true },
{ field: '_id', headerName: '_id', hide: true },
{
field: 'civilite', headerName: 'Civ.', minWidth: 100, flex: 1, maxWidth: 100, hide: false, editable: true,
type: "singleSelect",
valueOptions: [
{ value: 'm', label: 'M' },
{ value: 'mme', label: 'Mme' },
{ value: 'neutre', label: 'Neutre' }
],
renderCell: (params) => {
return (
<div style={{ paddingLeft: "5px", paddingRight: "15px", "display": "block", wordBreak: "break-all" }}>
{params.value && String(params.value) === "m" && "M"}
{params.value && String(params.value) === "mme" && "Mme"}
{params.value && String(params.value) === "neutre" && "Neutre"}
</div>
);
}
},
{ field: 'nom', headerName: 'nom', minWidth: 150, flex: 1, hide: false, editable: true, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{ field: 'prenom', headerName: 'prenom', minWidth: 150, flex: 1, hide: false, editable: true, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{ field: 'email', headerName: 'email', minWidth: 150, flex: 1, editable: true, renderCell: (params) => <ExpandableCell_50 {...params} />, },
{
field: 'status', headerName: 'Statut', minWidth: 150, flex: 1, editable: false,
renderCell: (cellValues) => {
return (
<div style={{ paddingLeft: "5px", paddingRight: "15px", "display": "block", wordBreak: "break-all" }}>
{cellValues.row.status && String(cellValues.row.status) === "1" && "Validé"}
{cellValues.row.status && String(cellValues.row.status) === "0" && "PréIns"}
{cellValues.row.pres_dist_hyp && String(cellValues.row.status) !== "0"
&& String(cellValues.row.status) === "1" && "N/A"}
</div>
);
}
},
{
field: "delete", headerName: 'Supprimer',
renderCell: (cellValues) => {
return (
<Popup
trigger={<Button
>
<CiTrash />
</Button>}
modal
nested
position="center center"
>
{close => (
<div>
<button className="gest_close" onClick={close}>
&times;
</button>
<div className="gest_header"> MySy Information </div>
<div className="gest_content">
{' '}
En confirmant cette opération, la ligne sera <i><font color="red"> définitivement supprimée </font></i>. <br />
</div>
<div className="gest_actions">
<div style={{ "width": "45%", "float": "left" }}>
<button className="gest_bton_popup" onClick={(event) => {
delete_data_grid_line(event, cellValues);
//console.log('modal closed ');
close();
}}> Valider </button>
</div>
<div style={{ "width": "45%", "float": "right" }}>
<button
className="gest_bton_popup"
onClick={() => {
//console.log('modal closed ');
close();
}}
>
Annuler
</button>
</div>
</div>
</div>
)}
</Popup>
);
}
},
]
const [document_checked, setdocument_checked] = useState("0");
const [Getall_Client_Communication_Contact_api, setGetall_Client_Communication_Contact_api] = useState();
@ -159,6 +328,8 @@ function UpdateAttendeeList() {
const [Partner_Recid, setPartner_Recid] = useState("");
const [class_internal_url, setclass_internal_url] = useState("");
const [max_presinscrit, setmax_presinscrit] = useState("");
const [is_client_preinsc_update_request, setis_client_preinsc_update_request] = useState("");
@ -186,25 +357,29 @@ function UpdateAttendeeList() {
setLoading(false);
if (String(res.data.status) === String("true")) {
//console.log(" In Getall_TrainingParticipant res.data.status = " + res.data.status);
//console.log(" In Getall_TrainingParticipant res.data.message r_class = " + res.data.message);
//console.log(" In Getall_TrainingParticipant res.data.message r_class = " + res.data.message, " -- message_global_data = ", res.data.message_global_data);
setGetall_TrainingParticipant_api("true");
setGetall_TrainingParticipant_result(res.data.message);
setRows_preinsc(res.data.message);
setmax_presinscrit(String(JSON.parse(res.data.message_global_data).max_presinscrit))
setis_client_preinsc_update_request(String(JSON.parse(res.data.message_global_data).is_client_preinsc_update_request))
var new_data2 = [];
const new_data = res.data.message.map((x) => {
//---
var localid = JSON.parse(x).id;
var local_id = JSON.parse(x)._id;
var local_status = JSON.parse(x).status;
var local_nom = JSON.parse(x).nom;
var local_prenom = JSON.parse(x).prenom;
var local_email = JSON.parse(x).email;
var local_civilite = JSON.parse(x).civilite;
setPartner_Recid(String(JSON.parse(x).partner_owner_recid))
setclass_internal_url(String(JSON.parse(x).class_internal_url))
setPartner_Recid(String(JSON.parse(x).partner_owner_recid));
setclass_internal_url(String(JSON.parse(x).class_internal_url));
//---
var node = {
@ -214,6 +389,7 @@ function UpdateAttendeeList() {
"prenom": local_prenom,
"email": local_email,
"civilite": local_civilite,
"status": local_status,
};
new_data2.push(node);
@ -281,7 +457,7 @@ function UpdateAttendeeList() {
tmp['prenom'] = (x).prenom;
tmp['email'] = (x).email;
tmp['civilite'] = (x).civilite;
tmp['status'] = (x).status;
return tmp;
@ -295,6 +471,7 @@ function UpdateAttendeeList() {
tmp['prenom'] = new_value;
tmp['email'] = (x).email;
tmp['civilite'] = (x).civilite;
tmp['status'] = (x).status;
return tmp;
}
@ -307,6 +484,7 @@ function UpdateAttendeeList() {
tmp['prenom'] = (x).prenom;
tmp['email'] = (x).email;
tmp['civilite'] = new_value;
tmp['status'] = (x).status;
return tmp;
}
@ -319,6 +497,7 @@ function UpdateAttendeeList() {
tmp['prenom'] = (x).prenom;
tmp['email'] = new_value;
tmp['civilite'] = (x).civilite;
tmp['status'] = (x).status;
return tmp;
}
@ -331,6 +510,7 @@ function UpdateAttendeeList() {
tmp['prenom'] = (x).prenom;
tmp['email'] = (x).email;
tmp['civilite'] = (x).civilite;
tmp['status'] = (x).status;
return tmp;
@ -359,7 +539,7 @@ function UpdateAttendeeList() {
const new_attende_dat_JSON = JSON.stringify(New_Getall_TrainingParticipant_result);
// console.log(" Record_New_Attendee_Data New_Getall_TrainingParticipant_result = ", New_Getall_TrainingParticipant_result);
// console.log(" Record_New_Attendee_Data New_Getall_TrainingParticipant_result = ", New_Getall_TrainingParticipant_result);
const stored_cookie = getCookie('tokenmysypart');
form.append("client_id", client_id);
@ -371,8 +551,8 @@ function UpdateAttendeeList() {
setLoading(true);
axios.post(myurl, form).then(res => {
console.log(" In Record_New_Attendee_Data res.data.status = " + res.data.status);
console.log(" In Record_New_Attendee_Data res.data.message r_class = " + res.data.message);
// console.log(" In Record_New_Attendee_Data res.data.status = " + res.data.status);
// console.log(" In Record_New_Attendee_Data res.data.message r_class = " + res.data.message);
setLoading(false);
if (String(res.data.status) === String("true")) {
@ -387,7 +567,7 @@ function UpdateAttendeeList() {
else {
setRecord_New_Attendee_Data_api("false");
setRecord_New_Attendee_Data_message(res.data.message);
// alert(res.data.message);
// alert(res.data.message);
setdisplay_alert_mysy("1");
setalert_message(res.data.message);
setalert_type("error");
@ -416,6 +596,132 @@ function UpdateAttendeeList() {
setdisplay_alert_mysy("");
}
function add_one_ligne_to_datagrid() {
if (New_Getall_TrainingParticipant_result.length >= String(max_presinscrit)) {
setdisplay_alert_mysy("1");
setalert_message("Vous avez atteint le nombre maximum d'inscriptions autorisé");
setalert_type("warning");
return;
}
if (String(is_client_preinsc_update_request) === "1" && New_Getall_TrainingParticipant_result.length < String(max_presinscrit)) {
var new_data2 = [];
const new_data = New_Getall_TrainingParticipant_result.map((x) => {
//---
var localid = (x).id;
var local_id = (x)._id;
var local_nom = (x).nom;
var local_prenom = (x).prenom;
var local_email = (x).email;
var local_civilite = (x).civilite;
var local_status = (x).status;
//---
var node = {
"_id": local_id,
"id": localid,
"nom": local_nom,
"prenom": local_prenom,
"email": local_email,
"civilite": local_civilite,
"status": local_status,
};
new_data2.push(node);
});
//---
var node = {
"_id": "",
"id": String(New_Getall_TrainingParticipant_result.length),
"nom": "new_nom",
"prenom": "new_prenom",
"email": "new_email@email.com",
"civilite": "neutre",
"status": "0",
};
new_data2.push(node);
if (new_data2.length > 0) {
setNew_Getall_TrainingParticipant_result(new_data2);
}
}
}
function delete_data_grid_line(event, cellValues) {
if (cellValues.row.status !== "0") {
setdisplay_alert_mysy("1");
setalert_message("Le statut soit être à 'Preins' pour être supprimable. Merci de contacter le gestionnaire de formation");
setalert_type("warning");
return;
}
if (String(is_client_preinsc_update_request) === "1" && New_Getall_TrainingParticipant_result.length <= String(max_presinscrit)) {
var new_data2 = [];
const new_data = New_Getall_TrainingParticipant_result.map((x) => {
if ((x).id != cellValues.row.id) {
//---
var localid = (x).id;
var local_id = (x)._id;
var local_nom = (x).nom;
var local_prenom = (x).prenom;
var local_email = (x).email;
var local_civilite = (x).civilite;
var local_status = (x).status;
//---
var node = {
"_id": local_id,
"id": localid,
"nom": local_nom,
"prenom": local_prenom,
"email": local_email,
"civilite": local_civilite,
"status": local_status,
};
new_data2.push(node);
}
});
if (new_data2.length > 0) {
setNew_Getall_TrainingParticipant_result(new_data2);
}
}
}
const [Dialog_preinscrit_message, setDialog_preinscrit_message] = React.useState(false);
const [Dialog_preinscrit_open, setDialog_preinscrit_open] = React.useState(false);
function Dialog_preinscrit_handle_change_participant_session(message) {
setDialog_preinscrit_message(message);
setDialog_preinscrit_open(true);
}
const Dialog_preinscrit_handleClose = () => {
//alert(" Utiliser le bouton 'fermer' ");
//setOpen(false);
};
const Dialog_preinscrit_handleClose_buton = () => {
setDialog_preinscrit_open(false);
};
const [Dialog_1_message, setDialog_1_message] = React.useState(false);
return (
<div className="updateattendeelist">
@ -424,7 +730,7 @@ function UpdateAttendeeList() {
<div className="mysy_spinner"> <img src={img_loading_spin} /> </div>
</div>}
{/*** Affichage des messages d'alerte*/}
{/*** Affichage des messages d'alerte*/}
{display_alert_mysy && String(display_alert_mysy) === "1" &&
<Module_Alert_Confirmation alert_message={alert_message}
alert_type={alert_type}
@ -435,41 +741,196 @@ function UpdateAttendeeList() {
}
{/*** FIN Affichage des messages d'alerte*/}
<div className="div_row">
&nbsp;
</div>
{Getall_Client_Communication_Contact_result && Getall_Client_Communication_Contact_result.length > 0 && <div className="div_row" style={{ "width": "90%", "marginLeft": "5%", "background": "white", }}>
<div style={{ textAlign: 'left' }}>
<nav style={{ textAlign: 'left' }}>
<b> Bonjour {JSON.parse(Getall_Client_Communication_Contact_result).civilite} {JSON.parse(Getall_Client_Communication_Contact_result).nom} </b>
{/* Dialog pour gerer Un PRE/INSCRIT */}
<Dialog
open={Dialog_preinscrit_open}
// onClose={Dialog_preinscrit_handleClose}
//className="displaypartnersession"
</nav>
className="displaypartnersession"
static
onClose={() => null}
PaperProps={{
className: classes.paper, // Apply the paper style
style: {
overflowY: 'unset',
position: 'absolute',
top: '7rem',
margin: "2px",
},
}}
hideBackdrop={true}
disableScrollLock
classes={{
paper: classes.dialog
}}
PaperComponent={PaperComponent}
aria-labelledby="draggable-dialog-title"
>
<DialogTitle style={{ cursor: 'move' }} id="draggable-dialog-title"> Apprenant </DialogTitle>
<DialogContent className="DialogContent_width" style={{ "minHeight": "20rem" }}>
<DialogContentText>
{Dialog_1_message}
</DialogContentText>
<div className="session_caract_Dialog">Etape <br />
{/*<Autocomplete
disablePortalNew
name="duplicate_session_etape"
id="duplicate_session_etape"
className="disabled_style"
options={New_Getall_Parter_OR_Default_Session_Steps_result}
value={New_Getall_Parter_OR_Default_Session_Steps_result.filter((data) => (data).session_step_name === String(dup_p_session_etape))[0].session_step_name}
onChange={(event, value) => {
if (value && value.session_step_name) {
setdup_p_session_etape(value.session_step_name);
} else {
setdup_p_session_etape("");
}
}}
renderInput={(params) => <TextField {...params} label="" placeholder="Choisir une option"
inputProps={{ ...params.inputProps, style: { fontSize: 12, height: "1.4rem" } }}
/>
}
/>*/}
Merci de completer les informations des participants à session de formation ci-dessous. <br />
</div>
<br />
{Getall_TrainingParticipant_result && Getall_TrainingParticipant_result.length > 0 &&
<div style={{ textAlign: 'left' }}>
<b> Formation : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).title} <br />
<b> Code Session : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).title} <br />
<b> Titre Session : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).session_titre} <br />
<b> Date début : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).date_du} <br />
<b> Date fin : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).date_au} <br />
</div>
}
<br />
</div>}
{/*
<div className="session_caract_Dialog" > Date Session<br />
<div style={{ width: "45%", float: "left", textAlign: "left" }}>
<DatePicker
name="date_du"
id="date_du"
selected={new Date(moment(dup_p_date_du, "DD/MM/YYYY"))}
onChange={(date) => {
setdup_p_date_du(format(date, 'd/MM/yyyy'));
}
}
showTimeSelect={false}
dateFormat="dd/MM/yyyy"
className="disabled_style enable_style datepicker_complement"
locale='fr-FR'
/>
</div>
<div style={{ float: "left", textAlign: "center", paddingTop: "20px", fontSize: "12px" }}>
Au
</div>
<div style={{ width: "45%", float: "left", textAlign: "right" }}>
<DatePicker
name="date_du"
id="date_du"
selected={new Date(moment(dup_p_date_au, "DD/MM/YYYY"))}
onChange={(date) => {
setdup_p_date_au(format(date, 'd/MM/yyyy'));
}
}
showTimeSelect={false}
dateFormat="dd/MM/yyyy"
className="disabled_style enable_style datepicker_complement"
locale='fr-FR'
/>
</div>
</div> */}
</DialogContent>
<DialogActions>
<IconButton
autoFocus
onClick={Dialog_preinscrit_handleClose_buton}
color="primary"
className={classes.customizedButton}
>
<CancelPresentationIcon />
</IconButton>
<div className="div_row">
<div className="div_row_gauche">
<Button onClick={(e) => {
}}
className="bton_enreg_dialog">Dupliquer </Button>
</div>
<div className="div_row_droite" style={{ "textAlign": 'center' }}>
<Button onClick={Dialog_preinscrit_handleClose_buton} className="bton_annule_dialog" >Fermer</Button>
</div>
</div>
</DialogActions>
</Dialog>
{/* FIN Dialog pour gerer Un PRE/INSCRIT */}
<div className="div_row">
&nbsp;
</div>
{New_Getall_TrainingParticipant_result && New_Getall_TrainingParticipant_result.length > 0 && <div style={{ "width": "90%", "marginLeft": "5%", "background": "white", }}>
{Getall_Client_Communication_Contact_result && Getall_Client_Communication_Contact_result.length > 0 &&
<div className="div_row" style={{ "width": "90%", "marginLeft": "5%", "background": "white", }}>
<div style={{ textAlign: 'left' }}>
<nav style={{ textAlign: 'left' }}>
<b> Bonjour {JSON.parse(Getall_Client_Communication_Contact_result).civilite} {JSON.parse(Getall_Client_Communication_Contact_result).nom} </b>
</nav>
Merci de completer les informations des participants à session de formation ci-dessous. <br />
</div>
<br />
{Getall_TrainingParticipant_result && Getall_TrainingParticipant_result.length > 0 &&
<div style={{ textAlign: 'left' }}>
<b> Formation : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).title} <br />
<b> Code Session : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).title} <br />
<b> Titre Session : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).session_titre} <br />
<b> Date début : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).date_du} <br />
<b> Date fin : </b> {JSON.parse(Getall_TrainingParticipant_result[0]).date_au} <br />
</div>
}
<br />
</div>}
<div className="div_row">
&nbsp;
</div>
{String(is_client_preinsc_update_request) !== "1" && New_Getall_TrainingParticipant_result && New_Getall_TrainingParticipant_result.length > 0 && <div style={{ "width": "90%", "marginLeft": "5%", "background": "white", }}>
<div className="session_data" >
@ -484,7 +945,7 @@ function UpdateAttendeeList() {
[`& .${gridClasses.cell}`]: {
py: 1,
},
'& .line--statut--invoiced': {
'& .line--inscription--done': {
backgroundColor: '#EAFAF1',
color: '#239B56',
fontWeight: '700'
@ -518,10 +979,12 @@ function UpdateAttendeeList() {
{
id: index,
_id: item._id,
_id: item._id,
nom: item.nom,
prenom: (item).prenom,
email: (item).email,
civilite: (item).civilite,
status: (item).status,
}
))}
@ -534,6 +997,17 @@ function UpdateAttendeeList() {
components={{
Toolbar: GridToolbar,
}}
getRowClassName={(params) => {
// Pour la gestion de la couleur de zone double cliquée
if (String(params.row.status) === "1") {
return 'line--inscription--done';
}
}}
getEstimatedRowHeight={() => 200}
getRowHeight={() => "auto"}
sx={{
@ -554,7 +1028,162 @@ function UpdateAttendeeList() {
</div>
<br />
<div className="div_row_gauche" style={{ "textAlign": 'left', 'marginLeft': '15px' }}>
</div>}
<div className="div_row">
{String(is_client_preinsc_update_request) !== "1" && String(document_checked) === "1" && (!Getall_TrainingParticipant_result || Getall_TrainingParticipant_result.length <= 0) && <div style={{
height: "40vh", "width": "100%",
"background": "#F2F4F4", overflow: "auto", "paddingBottom": "1rem",
"marginTop": "5rem", "color": "red", fontWeight: '700', "fontSize": "20px"
}}>
Le document est invalide
</div>}
{String(is_client_preinsc_update_request) === "1" && String(max_presinscrit) > "0" &&
<div>
<div className="div_row" style={{ "width": "90%", "marginLeft": "5%", "background": "white", "textAlign": 'left', "marginBottom": "2rem" }}>
<b> Inscrire ou mettre à jour les participants à la formation. Maxium autorisé : {max_presinscrit} </b><br />
Procedure : <br />
Pour mettre à jour une cellule : Double cliquer sur la cellule et modifier l'information. <br />
Pour ajouter ou supprimer une ligne : Utiliser les boutons.
<br />
</div>
{New_Getall_TrainingParticipant_result && New_Getall_TrainingParticipant_result.length > 0 && <div style={{ "width": "90%", "marginLeft": "5%", "background": "white", }}>
<div className="session_data" >
<div style={{ height: 550, width: '100%', paddingRight: '5px' }}>
<Box
sx={{
height: 500,
width: '100%',
paddingRight: '2px',
[`& .${gridClasses.cell}`]: {
py: 1,
},
'& .line--inscription--done': {
backgroundColor: '#EAFAF1',
color: '#239B56',
fontWeight: '700'
},
"& .MuiDataGrid-columnHeaders": {
backgroundColor: "#c8cfd5",
color: "black",
fontSize: 14
},
}}
>
<DataGrid
onCellEditCommit={OnchangeCellDataGrid}
editMode="cell"
checkboxSelection
onSelectionModelChange={(newSelectionModel) => {
setselectionModel_preinsc(newSelectionModel);
//console.log("ch selected--" + newSelectionModel);
}}
selectionModel={selectionModel_preinsc}
localeText={frFR.components.MuiDataGrid.defaultProps.localeText}
rows={New_Getall_TrainingParticipant_result.map((item, index) => (
{
id: index,
_id: item._id,
nom: item.nom,
prenom: (item).prenom,
email: (item).email,
civilite: (item).civilite,
status: (item).status,
}
))}
columns={columns_preinscrit_with_add_delete_bton}
isCellEditable={(params) => params.row.status === "0"}
pageSize={10}
className="datagridclass"
rowsPerPageOptions={[10]}
disableSelectionOnClick
components={{
Toolbar: GridToolbar,
}}
getRowClassName={(params) => {
// Pour la gestion de la couleur de zone double cliquée
if (String(params.row.status) === "1") {
return 'line--inscription--done';
}
}}
getEstimatedRowHeight={() => 200}
getRowHeight={() => "auto"}
sx={{
"& .MuiDataGrid-cellContent": {
minHeight: 50,
},
[`& .${gridClasses.cell}`]: {
py: 1,
},
}}
/>
</Box>
<br />
</div>
<div className="div_row" style={{ "border": "None", marginBottom: "1rem" }}>
<div className="div_row_gauche" style={{ "textAlign": 'left', 'marginLeft': '15px' }}>
&nbsp;
</div>
<div className="div_row_droite" style={{ "textAlign": 'right', 'marginRight': '15px' }} >
<nav style={{
"textAlign": 'right', width: '15rem', color: '#1976d2',
boxSizing: 'border-box', border: 'none', margin: 'auto', 'marginRight': '10px',
'cursor': 'pointer'
}} onClick={(event) => {
add_one_ligne_to_datagrid();
}}> <AddCircleOutlineIcon />1 ligne </nav>
</div>
</div>
</div>
<br />
</div>}
</div>}
</div>
<br />
<div className="div_row" style={{ width: '90%', marginLeft: '5%', marginTop: '1rem' }}>
<div className="div_row_gauche" style={{ "textAlign": 'left', }}>
<Popup
trigger={
@ -605,44 +1234,34 @@ function UpdateAttendeeList() {
</div>
<div className="div_row_droite" style={{ "textAlign": 'right', 'marginRight': '15px' }} >
<div className="div_row_droite" style={{ "textAlign": 'right' }} >
<Button variant="contained" className="bton_annule" onClick={(event) => {
history.push("/");
}} >Annuler
</Button>
</div>
<div className="div_row" style={{ "border": "None" }}>
&nbsp;
</div>
<div style={{ "width": "100%", "background": "#F2F4F4", overflow: "auto", "paddingBottom": "1rem" }}>
<br />
{class_internal_url && String(class_internal_url).length > 2 && <div className="question_box_entete">
<Display_Action_And_Class classId={class_internal_url} action={""} />
</div>}
</div>
</div>}
<div className="div_row">
{String(document_checked) === "1" && (!Getall_TrainingParticipant_result || Getall_TrainingParticipant_result.length <= 0) && <div style={{
height: "40vh", "width": "100%",
"background": "#F2F4F4", overflow: "auto", "paddingBottom": "1rem",
"marginTop":"5rem", "color":"red", fontWeight:'700', "fontSize":"20px"
}}>
Le document est invalide
</div>}
</div>
<div className="div_row">
&nbsp;
</div>
<div className="div_row" style={{ "border": "None" }}>
&nbsp;
</div>
<div style={{ "width": "100%", "background": "#F2F4F4", overflow: "auto", "paddingBottom": "1rem" }}>
<br />
{class_internal_url && String(class_internal_url).length > 2 && <div className="question_box_entete">
<Display_Action_And_Class classId={class_internal_url} action={""} />
</div>}
</div>
</div>
);
}

View File

@ -1,7 +1,7 @@
import React, { useRef, useState, useEffect } from "react";
import moment from "moment";
import "./new_homepage.css";
import { Helmet } from "react-helmet";
import WhyUsLayout from './WhyUsLayout.js';
import LogoCloud from './LogoCloud.js';
import VisionSection from './VisionSection.js';
@ -25,6 +25,14 @@ const New_C_A_Propos_2025 = (props) => {
return (
<div className="new_homepage_2025">
<Helmet>
<title>Éditeur Français de logiciels de gestion pour organismes de formation - Gestion administrative, CRM, E-Learning, Marketplace</title>
<meta name="description" content="Éditeur Français de logiciels pour organismes de formation. Avec notre solution Tout-en-Un, Nous automatisons les étapes Qualiopi (Inscription, Documents personnalisés, Les émargements sécurisés, Les évaluations, etc). Votre Le bilan pédagogique et financier est généré automatiquement." />
<meta name="robots" content="index,follow" />
<meta name="title" content="Éditeur Français de logiciels de gestion pour organismes de formation - Gestion administrative, CRM, E-Learning, Marketplace" />
<link rel="canonical" href={window.location.href} />
</Helmet>
<div className="fonctionnalite_Background">
<div className="title_and_cat">