17/05/25 - 12h

recette2
cherif 2025-05-17 12:19:26 +02:00
parent da34ce1096
commit 2b3e56c6fe
2 changed files with 252 additions and 90 deletions

View File

@ -150,6 +150,8 @@ const Jury = (props) => {
const [selected_agenda_id, setselected_agenda_id] = React.useState("");
const [selected_jury_soutenance_id, setselected_jury_soutenance_id] = React.useState("");
const [selected_ue_id, setselected_ue_id] = React.useState("");
const [selected_ue_code, setselected_ue_code] = React.useState("");
@ -404,12 +406,10 @@ const Jury = (props) => {
const columns_jury_seance_planning = [
{ field: '_id', headerName: '_id', hide: true },
{ field: 'id', headerName: 'id', hide: true },
{ field: 'session_id', headerName: 'id', hide: true },
{ field: 'ue_id', headerName: 'ue_id', hide: true },
{ field: 'event_linked_collection', headerName: 'event_linked_collection', hide: true },
{ field: 'event_linked_collection_recid', headerName: 'event_linked_collection_recid', hide: true },
{ field: 'event_type', headerName: 'Type', hide: true },
{ field: 'jury_soutenance_id', headerName: 'jury_soutenance_id', hide: true },
{ field: 'event_title', headerName: 'Titre', hide: true },
{
field: 'event_start', headerName: 'Debut', flex: 1, hide: false, editable: false,
@ -423,7 +423,6 @@ const Jury = (props) => {
return moment(params.value).format('D/MM/YYYY - H:mm');
},
},
{ field: 'ue_code', headerName: 'UE', hide: true },
{
field: "apprenant", headerName: 'Apprenant', disableExport: true,
@ -433,8 +432,9 @@ const Jury = (props) => {
<Button onClick={(e) => {
setStartDate(new Date(cellValues.row.event_start));
setendDate(new Date(cellValues.row.event_end));
Get_Jury_List_Apprenant_Seance(cellValues.row._id);
Get_Jury_List_Apprenant_Seance(cellValues.row._id, cellValues.row.jury_soutenance_id);
setselected_agenda_id(cellValues.row._id);
setselected_jury_soutenance_id(cellValues.row.jury_soutenance_id);
GetListeInscrit();
setDialog_Jury_Apprenant_open(true);
settab_selected_apprenant([]);
@ -475,14 +475,14 @@ const Jury = (props) => {
<div className="gest_content">
{' '}
En confirmant cette opération, la ance sera <i><font color="red"> définitivement supprimée</font></i>. <br />
En confirmant cette opération, la Soutenance 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_Given_Jury_Seance(cellValues.row._id);
Delete_Given_Jury_Seance(cellValues.row.jury_soutenance_id);
//console.log('modal closed ');
close();
}}> Valider </button>
@ -758,7 +758,7 @@ const Jury = (props) => {
setDelete_Given_Jury_Apprenant_api("true");
setDelete_Given_Jury_Apprenant_result(res.data.message);
Get_Jury_List_Apprenant_Seance(selected_agenda_id);
Get_Jury_List_Apprenant_Seance(selected_agenda_id, selected_jury_soutenance_id);
setdisplay_alert_mysy("1");
setalert_message(res.data.message);
setalert_type("success");
@ -786,14 +786,14 @@ const Jury = (props) => {
const [Delete_Given_Jury_Seance_api, setDelete_Given_Jury_Seance_api] = useState();
const [Delete_Given_Jury_Seance_message, setDelete_Given_Jury_Seance_message] = useState();
const [Delete_Given_Jury_Seance_result, setDelete_Given_Jury_Seance_result] = useState();
function Delete_Given_Jury_Seance(local_jury_agenda_id) {
function Delete_Given_Jury_Seance(local_jury_soutenance_id) {
var form = new FormData();
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("jury_id", selected_id);
form.append("jury_seance_agenda_id", local_jury_agenda_id);
form.append("jury_soutenance_id", local_jury_soutenance_id);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Delete_Jury_Seance/";
setLoading(true);
@ -825,7 +825,7 @@ const Jury = (props) => {
setLoading(false);
console.warn('Delete_Given_Jury_Seance : Not good man :( mysearchtext = ' + error);
setDelete_Given_Jury_Seance_api("false");
alert(" Impossible de supprimer la ance ");
alert(" Impossible de supprimer la Soutenance ");
})
}
@ -968,7 +968,19 @@ const Jury = (props) => {
{ "id": "2", "label": "Conv. Membre Jury", "value": "convocation_jury" },
]
const New_Option_Jury_Seance = [
{ "id": "0", "label": "Supprimer", "value": "supprimer" },
{ "id": "1", "label": "Conv. Apprenant", "value": "convocation_apprenant" },
]
const New_Option_jury_membre = [
{ "id": "delete_jury_membre", "label": "Supprimer les membres", "value": "delete_jury_membre" },
{ "id": "convocation", "label": "Env. Convocation", "value": "convocation" },
{ "id": "", "label": "", "value": "" },
]
const [actionmass_ftion_val, setactionmass_ftion_val] = useState();
const actionmass_ftion = (event) => {
const value = event.target.value;
@ -981,11 +993,42 @@ const Jury = (props) => {
}
}
const New_Option_jury_membre = [
{ "id": "delete_jury_membre", "label": "Supprimer les membres", "value": "delete_jury_membre" },
{ "id": "convocation", "label": "Env. Convocation", "value": "convocation" },
{ "id": "", "label": "", "value": "" },
]
const [actionmass_jury_seance, setactionmass_jury_seance] = useState();
const func_actionmass_jury_seance = (event) => {
const value = event.target.value;
if (String(value) === "supprimer") {
actionmass_jury_seance(value);
}
else if (String(value) === "convocation_apprenant") {
actionmass_jury_seance(value);
}
else {
actionmass_jury_seance();
}
}
const [actionmass_jury_membre, setactionmass_jury_membre] = useState();
const func_actionmass_jury_membre = (event) => {
const value = event.target.value;
if (String(value) === "supprimer") {
setactionmass_jury_membre(value);
}
else if (String(value) === "convocation_membre") {
setactionmass_jury_membre(value);
}
else {
setactionmass_jury_membre();
}
}
const [history_securite_read, sethistory_securite_read] = useState("");
@ -1657,6 +1700,7 @@ const Jury = (props) => {
form.append("_id", selected_id);
form.append("tab_inscriptions_ids", tab_inscrit_ids);
form.append("agenda_id", selected_agenda_id);
form.append("jury_soutenance_id", selected_jury_soutenance_id);
form.append("jury_seance_ue_id", jury_seance_ue_id);
form.append("event_start", new_start_date);
@ -1677,17 +1721,18 @@ const Jury = (props) => {
if (String(res.data.status) === String("true")) {
//console.log(" In Add_Apprenant_To_Jury res.data.message r_class = ", res.data);
setselected_agenda_id(res.data.agenda_id);
setselected_jury_soutenance_id(res.data.soutenance_id);
setAdd_Apprenant_To_Jury_api("true");
setAdd_Apprenant_To_Jury_result(res.data.message);
Get_Jury_List_Apprenant_Seance(res.data.agenda_id);
Get_Jury_List_Apprenant_Seance(res.data.agenda_id, res.data.soutenance_id);
Get_List_Agenda_Events_For_Given_User(selected_id);
// Dialog_Jury_Apprenant_handleClose_buton();
// alert(res.data.message);
setdisplay_alert_mysy("1");
setalert_message(res.data.message);
setalert_type("success");
@ -2586,8 +2631,8 @@ const Jury = (props) => {
const [p_detail_justified, setp_detail_justified] = useState(false);
const [p_detail_event_type, setp_detail_event_type] = useState();
// Ici il s'agit de liée la ance a une session de formation
// En gros, le sens de lecture est : Le jury XXXX a une ance le jj/mm/aaaa hhhh pour la session de formation
// Ici il s'agit de liée la Soutenance a une session de formation
// En gros, le sens de lecture est : Le jury XXXX a une Soutenance le jj/mm/aaaa hhhh pour la session de formation
const [p_detail_linked_collection, setp_detail_linked_collection] = useState("");
const [p_detail_linked_collection_recid, setp_detail_linked_collection_recid] = useState("");
@ -2747,10 +2792,10 @@ const Jury = (props) => {
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("related_collection", "jury");
form.append("related_collection_recid", local_selected_id);
form.append("jury_id", local_selected_id);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/get_Agenda_Event_List/";
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_List_Jury_Soutenenace/";
setLoading(true);
@ -2773,52 +2818,17 @@ const Jury = (props) => {
}
var bg_color = "";
var local_sequence_session_id = "";
if (JSON.parse(obj).sequence_session_id) {
local_sequence_session_id = String(JSON.parse(obj).sequence_session_id);
bg_color = "Olive"
}
var local_linked_collection = "";
if (JSON.parse(obj).linked_collection) {
local_linked_collection = String(JSON.parse(obj).linked_collection);
}
var local_linked_collection_recid = "";
if (JSON.parse(obj).linked_collection_recid) {
local_linked_collection_recid = String(JSON.parse(obj).linked_collection_recid);
}
var ue_id = "";
if (JSON.parse(obj).ue_id) {
ue_id = String(JSON.parse(obj).ue_id);
}
var ue_code = "";
if (JSON.parse(obj).ue_code) {
ue_code = String(JSON.parse(obj).ue_code);
}
//console.log( " ### obj = ", obj)
local_val = {
'title': String(JSON.parse(obj).event_title),
'start': String(JSON.parse(obj).event_start),
'end': String(JSON.parse(obj).event_end),
'id': String(JSON.parse(obj)._id),
'_id': String(JSON.parse(obj)._id),
'comment': String(local_comment),
'sequence_session_id': String(local_sequence_session_id),
'backgroundColor': bg_color,
'type': String(JSON.parse(obj).event_type),
'justified': String(JSON.parse(obj).justified),
'title': String(JSON.parse(obj).soutenance_agenda_event_title),
'start': String(JSON.parse(obj).soutenance_agenda_event_start),
'end': String(JSON.parse(obj).soutenance_agenda_event_end),
'id': String(JSON.parse(obj).soutenance_agenda_id),
'_id': String(JSON.parse(obj).soutenance_agenda_id),
'jury_soutenance_id': String(JSON.parse(obj)._id),
'linked_collection': String(local_linked_collection),
'linked_collection_recid': String(local_linked_collection_recid),
'ue_id': String(ue_id),
'ue_code': String(ue_code),
}
tab_event.push(local_val);
@ -2827,7 +2837,7 @@ const Jury = (props) => {
});
// console.log('### tab_event = ', tab_event)
// console.log('### tab_event = ', tab_event)
setmysy_events(tab_event);
}
@ -3262,7 +3272,7 @@ const Jury = (props) => {
const [Get_Jury_List_Apprenant_Seance_insc_api, setGet_Jury_List_Apprenant_Seance_insc_api] = useState();
const [Get_Jury_List_Apprenant_Seance_insc_meassage, setGet_Jury_List_Apprenant_Seance_insc_meassage] = useState();
const [Get_Jury_List_Apprenant_Seance_insc_result, setGet_Jury_List_Apprenant_Seance_insc_result] = useState([])
function Get_Jury_List_Apprenant_Seance(local_agenda_id) {
function Get_Jury_List_Apprenant_Seance(local_agenda_id, local_soutenance_id) {
var form = new FormData();
//form.append("token","K3cw63eKokKSbV4spjQ48SUNnfy80yrXfA");
@ -3270,6 +3280,8 @@ const Jury = (props) => {
form.append("token", stored_cookie);
form.append("_id", selected_id);
form.append("agenda_id", local_agenda_id);
form.append("jury_soutenance_id", local_soutenance_id);
// console.log(" #### OKKKK ")
setLoading(true);
@ -3535,18 +3547,15 @@ const Jury = (props) => {
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("ref_interne", "JURY_CONVOCATION_APPRENANT");
form.append("type_doc", type_doc);
form.append("courrier_template_type_document_ref_interne", "JURY_CONVOCATION_APPRENANT");
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_List_Convocations_Stagiaire_With_Filter/";
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_List_Partner_Document_with_filter_No_HTML_Fields/";
setLoading(true);
axios.post(myurl, form).then(res => {
//console.log(" In Get_List_JURY_APPRENANT_Convocations res.data.status = " + res.data.status);
//console.log(" In Get_List_JURY_APPRENANT_Convocations res.data.message r_class = " + res.data.message);
// console.log(" In Get_List_JURY_APPRENANT_Convocations res.data.status = " + res.data.status);
// console.log(" In Get_List_JURY_APPRENANT_Convocations res.data.message r_class = " + res.data.message);
setLoading(false);
if (String(res.data.status) === String("true")) {
@ -3589,6 +3598,7 @@ const Jury = (props) => {
if (new_data2.length > 0)
setNew_Get_List_JURY_APPRENANT_Convocations_result(new_data2);
}
else {
setGet_List_JURY_APPRENANT_Convocations_api("false");
@ -3615,6 +3625,50 @@ const Jury = (props) => {
{ "id": "pdf", "label": "PDF", "value": "pdf" },
]
function Download_Jury_Seance_Membre_Convocation_PDF() {
const stored_cookie = getCookie('tokenmysypart');
var nom_fichier_cmd = "Convocation_Soutenance_Jury.zip";
if (String(selected_jury_convention_apprenant_id).trim() === "") {
alert(" Vous devez choisir un modèle de document ");
return;
}
var url = process.env.REACT_APP_API_URL + "myclass/api/Send_Jury_Apprenant_Soutenance_Convocation_By_PDF/" + stored_cookie + "/" + selected_session_id + "/" + selected_jury_convention_apprenant_id;
if (String(selected_jury_convention_apprenant_id) === "default_pdf") {
// Il s'agit d'envoyer les convention par defaut de type mail
// url = process.env.REACT_APP_API_URL + "myclass/api/Prepare_and_Send_Default_Convocation_From_Session_By_PDF/" + stored_cookie + "/" + selected_session_id + "/" + selected_convention_id;
}
//console.log(" ### url = ", url);
//console.log(" nom_fichier_cmd = ", nom_fichier_cmd, " --- selected_session_id = ", selected_session_id, " --- selected_convention_id =", selected_convention_id);
setLoading(true);
axios.get(url, { responseType: 'blob', },)
.then((res) => {
setLoading(false);
//console.log(" In Download_Stagiaire_Conventions_PDF res.data = " + res.data);
if (String(res.data) === String("false")) {
alert("Impossible de télécharger la convocation (2) ");
} else {
fileDownload(res.data, nom_fichier_cmd);
// Getall_Editable_Document_By_Partner_By_Collection();
}
}).catch((error) => {
setLoading(false);
console.error('Error:', error);
alert(" Impossible de télécharger la convocation ")
});
}
return (
<div className="jurys">
@ -3675,7 +3729,7 @@ const Jury = (props) => {
</DialogContentText>
<div className="session_caract_Dialog" > Type Document<br />
<div className="session_caract_Dialog" > <b> Type Document </b> <br />
<Autocomplete
disablePortal
@ -3690,6 +3744,7 @@ const Jury = (props) => {
setselected_jury_convention_apprenant_type(value.value);
Get_List_JURY_APPRENANT_Convocations(String(value.value));
}
}}
renderInput={(params) => <TextField {...params} label="" placeholder="Choisir une option"
@ -3704,7 +3759,7 @@ const Jury = (props) => {
</div>
{(String(selected_jury_convention_apprenant_type) === "email" || String(selected_jury_convention_apprenant_type) === "pdf") &&
<div className="session_caract_Dialog" > Choisir une convocation
<div className="session_caract_Dialog" > <b> Choisir une convocation </b>
<Autocomplete
disablePortal
name="event_dialog_version_convention"
@ -3725,6 +3780,8 @@ const Jury = (props) => {
setselected_jury_convention_apprenant_type("pdf");
} else {
var result2 = Get_List_JURY_APPRENANT_Convocations_result.filter((local_mymanager) => JSON.parse(local_mymanager)._id === String(value._id))
setselected_jury_convention_apprenant_type(JSON.parse(result2).type_doc);
}
settab_jury_convention_apprenant_pieces_jointes_result([]);
@ -3931,7 +3988,7 @@ const Jury = (props) => {
{String(selected_jury_convention_apprenant_type) === "pdf" &&
<Button className="bton_enreg_dialog" onClick={(e) => {
// Download_Session_Convocation_PDF();
Download_Jury_Seance_Membre_Convocation_PDF();
Dialog_CONVOCATION_JURY_APPRENANT_handleClose_buton();
}}
>Télécharger </Button>}
@ -5257,7 +5314,7 @@ const Jury = (props) => {
selected_id && String(selected_id).length > 5 && <div className="div_row">
<Button variant="outlined" onClick={submenu_detail} className="detail_class_submenu" id='detail_jury' name='detail_jury'>Détail Jury</Button>
<Button variant="outlined" onClick={submenu_membres} className="detail_class_submenu" id='membres' name='membres'>Membres </Button>
<Button variant="outlined" onClick={submenu_planning} className="detail_class_submenu" id='planning' name='planning'>Planning & Apprenant </Button>
<Button variant="outlined" onClick={submenu_planning} className="detail_class_submenu" id='planning' name='planning'>Soutenance </Button>
<Button variant="outlined" onClick={submenu_piece_jointe} className="detail_class_submenu" id='piece_jointe' name='piece_jointe'>Pièces Jointes </Button>
{String(history_securite_read) === "1" && <Button variant="outlined" onClick={submenu_historique} className="detail_class_submenu" id='historique' name='historique'>Historique </Button>}
@ -6422,6 +6479,7 @@ const Jury = (props) => {
>
<DataGrid
disableRowSelectionOnClick
checkboxSelection
onSelectionModelChange={(newSelectionModel) => {
setselectionModel_columns_jury_seance(newSelectionModel);
/* if (newSelectionModel.length === 1)
@ -6446,13 +6504,8 @@ const Jury = (props) => {
event_title: (item).title,
event_start: (item).start,
event_end: (item).end,
event_type: (item).type,
justified: (item).justified,
event_comment: (item).comment,
event_linked_collection: (item).linked_collection,
event_linked_collection_recid: (item).linked_collection_recid,
ue_id: (item).ue_id,
ue_code: (item).ue_code,
jury_soutenance_id: (item).jury_soutenance_id,
}
))}
@ -6465,6 +6518,7 @@ const Jury = (props) => {
setselected_agenda_id(newSelectionModel.row._id);
setselected_ue_id(newSelectionModel.row.ue_id);
setselected_jury_soutenance_id(newSelectionModel.row.jury_soutenance_id);
setp_detail_linked_collection_recid(newSelectionModel.row.event_linked_collection_recid);
setsubmenu_detail_seance("display_jury_seance");
@ -6533,6 +6587,108 @@ const Jury = (props) => {
</div>
<div className="div_row">
{selectionModel_columns_jury_seance && selectionModel_columns_jury_seance.length >= 1 && <div className="block_en_mass">
<nav >Traitement en masse </nav>
&nbsp;
<Autocomplete
disablePortal
id="combo-box-demo"
className="block_en_mass_select"
options={New_Option_Jury_Seance}
onChange={(event, value) => {
if (value && value.value) {
if (String(value.value) === "supprimer"
|| String(value.value) === "convocation_apprenant"
) {
setactionmass_jury_seance(value.value);
}
else {
setactionmass_jury_seance();
}
}
}}
renderInput={(params) => <TextField {...params} label="" placeholder="Choisir une option"
inputProps={{ ...params.inputProps, style: { fontSize: 12, height: "1.4rem" } }}
/>
}
/>
{actionmass_jury_seance && String(actionmass_jury_seance) === "convocation_apprenant" && <nav className='block_en_mass_bton_action'>
<Button className="bton_enreg" style={{ "width": "90%" }} onClick={(event) => {
setDialog_CONVOCATION_JURY_APPRENANT_open(true);
}}>
<FcAcceptDatabase /> Traiter
</Button>
</nav>}
{actionmass_jury_seance && String(actionmass_jury_seance) === "supprimer" && <nav className='block_en_mass_bton_action'>
<Popup
trigger={<Button className="bton_enreg" style={{ "width": "90%" }}>
<FcAcceptDatabase /> Traiter
</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">
{' '}
{String(actionmass_ftion_val) === "supprimer" &&
<font color="red"> Confirmer la suppression de {selectionModel_columns_jury_seance.length} Soutenance(s).
</font>}
{String(actionmass_ftion_val) === "convocation_apprenant" &&
<font> Envoyer la convocation aux apprenants
</font>}
</div>
<div className="gest_actions">
<div style={{ "width": "45%", "float": "left" }}>
<button className="gest_bton_popup" onClick={(event) => {
func_actionmass_jury_seance();
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>
</nav>
}
</div>}
</div>
</div>
</div>
@ -6543,7 +6699,8 @@ const Jury = (props) => {
onClick={(event) => {
GetListeInscrit();
setGet_Jury_List_Apprenant_Seance_insc_result([]);
setselected_agenda_id("");
setselected_jury_soutenance_id("new");
setselected_agenda_id("new");
settab_selected_apprenant([]);
var current_date_add_1h = new Date();
@ -6556,7 +6713,7 @@ const Jury = (props) => {
// iiii
}}
className="detail_class_submenu bton_add_session"
id='menu_import_participant' name='menu_import_participant'>Ajout 1 Séance &nbsp;
id='menu_import_participant' name='menu_import_participant'>Ajout 1 Soutenance &nbsp;
<IoAddCircleOutline style={{ "fontSize": "x-large", "color": "green" }} />
</Button>
</div>

View File

@ -594,6 +594,7 @@
}
.block_en_mass {
padding: 10px;
width: 100%;
float: left;
margin-bottom: 1rem;
@ -1207,6 +1208,7 @@
}
.block_en_mass {
padding: 10px;
width: 50%;
float: left;
margin-bottom: 1rem;
@ -1755,6 +1757,7 @@
}
.block_en_mass {
padding: 10px;
width: 50%;
float: left;
margin-bottom: 1rem;
@ -2014,6 +2017,7 @@
.block_en_mass {
padding: 10px;
width: 50%;
float: left;
margin-bottom: 1rem;
@ -2379,6 +2383,7 @@
}
.block_en_mass {
padding: 10px;
width: 50%;
float: left;
margin-bottom: 1rem;