diff --git a/public/sample/template_import_session_formation.csv b/public/sample/template_import_session_formation.csv index 3428bc3..d2a3935 100644 --- a/public/sample/template_import_session_formation.csv +++ b/public/sample/template_import_session_formation.csv @@ -1,7 +1,41 @@ -formation_code_externe;code_session;date_debut;date_fin;nb_participant;adresse;code_postal;ville;date_debut_inscription;date_fin_inscription;formateur;distanciel;presentiel;prix_session;session_status;lms_class_code;session_etape -MYSY_Test_AP;AP_01;11/10/2023;13/10/2023;20;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 -MYSY_Test_AP;AP_02;14/11/2023;16/11/2023;15;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 -MYSY_Test_OP;OP_01;21/11/2023;23/11/2023;10;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 -MYSY_Test_OP;OP_02;28/11/2023;30/11/2023;15;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 -MYSY_Test_AR;AR_01;01/03/2024;11/03/2024;5;;;;18/09/2023;29/02/2024;;1;0;;1;;0 -MYSY_Test_AR;AR_02;02/12/2023;10/12/2023;9;;;;18/09/2023;01/12/2023;;1;0;;1;;0 +external_code;titre;domaine;description;formateur;formateur_email;objectif;programme;prerequis;cpf;institut_formation;distantiel;presentiel;prix;note;img_url;url;duree;duree_unite;plus_produit;mots_cle;metier;certif;publie;zone_diffusion;pourqui;support;img_banner_detail_class +MySy_SGBD_01;Introduction à la gestion des bases de données - SQL;autre;"Par ce cours, nous permettrons à un apprenant de maitriser les concepts de base des bases de données, de la créer, de l’administrer en toute autonomie. +Cette formation permettra à l’apprenant d’être à l’aise avec les bases de données et d’être employable comme gestionnaire de base de base de données dans une entreprise.";mysy;cherif.balde@yahoo.fr;"A la fin de ce module, l’apprenant sera en mesure de : +• De se connecter à une base de données de type Mysql et Postgresql +• De créer et mettre à jour et supprimer une base de base de données +• Créer et mettre jour et supprimer des tables de données, de les lier avec clés +• D’insérer, mettre à jour et supprimer des enregistrements. +• De créer des requête SQL nécessitant la jonction entre plusieurs tables.";"Qu’est-ce qu’un système de gestion de bases de données relationnelles (SGBDR) +Stockage de l’information +Les relations entre les tables ou cardinalité + +La modélisation : Méthode Merise Vs Méthode UML + +Les types de bases de données +• Bases de données relationnelles (SGBDR) : +• Bases de données NoSQL : +• Bases de données orientées graphe + +Qu’est-ce que le langage SQL +Les base des données MariaDB/MySQL +Connexion à une base données MariaDB +Les Requêtes SQL : +• Créer une table +• Insérer un enregistrement dans la table +• Modifier les informations dans une table + +Avancé : +• Les index +• Les triggers +• Les procédures +";Pour être à l’aise dans ce module, l’apprenant devra maitriser les outils informatiques (ordinateurs, logiciels, etc);1;mysy;1;0;4500;4;;;5;jour;En alliant des sessions en live et des sessions à distance, des exercice et travaux dirigés en ligne, vous apprenez plus facilement avec des cas pratiques.;"Bdd ;administration ;sql";autre;1;1;;"Cette formation est destinée aux personnes souhaitant exercer dans une entreprise les fonctions de : +• Administrateur de base de données +• Analyste fonctionnelle +Elle est également adressée à toute personne souhaitant s’initier ou approfondir ses compétences en gestion des bases de données";mixte; +MYSY_Test_AP;PRATICIEN EN AROMATHERAPIE INTEGRATIVE;sante_nat;L’Aromathérapie Intégrative© est un enseignement scientifique qui ne se limite pas à connaître les propriétés des huiles essentielles pour supprimer des symptômes, mais qui intègre leur utilisation dans une stratégie thérapeutique globale de santé, fondée sur une bonne compréhension de l'anatomie, de la physiologie et de la biochimie, afin d’être capable de proposer des solutions individualisées et efficaces.;ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI);;Intégrer les règles de sécurité pour utiliser et conseiller l’usage des huiles essentielles. Faire le lien entre la composition biochimique d’une huile essentielle et ses actions sur l’organisme. Intégrer les bases indispensables de biochimie, d’anatomie et de physiologie humaine. Évaluer une situation d’exclusion réclamant une prise en charge médicale. Analyser une situation et les attentes d’un consultant pour définir une stratégie d’accompagnement adaptée avec des huiles essentielles dans les domaines relevant de sa compétence. Établir une formule parfaitement adaptée à une personne et un problème. Être capable de fabriquer un baume, une crème, une composition huileuse. ;Modules de 3 jours par mois en présentiel. Entrainement à distance avec documents, vidéos et quiz en ligne Evaluation à chaque module sur le programme du module précédent;Le niveau BAC est recommandé mais pas obligatoire. Solide motivation.;0;ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI);0;1;2590;5;https://img.mysy-training.com/ecole_aroma/img/logo_ecole_arome_vert.jpg;;21;jour;Mode hybride avec présentiel ( théorie, pratique, supports papier) et distanciel asynchrone : vidéos et quiz d'entrainement sur une plateforme dédiée : Groupe de discussion sur messagerie whatsapp. Evaluations pour vérifier l'atteinte des objectifs pédagogiques. Evaluation, finale des compétences Rédaction d'un travail de synthèse avec sujet au choix, à présenter devant un jury extérieur à l'école.;AROMATHERAPIE, HUILES ESSENTIELLES, AROMA;dev_perso;1;1;;• Aux professionnels du bien-être et de la santé qui désirent acquérir un outil complémentaire • Aux particuliers en reconversion professionnelle dans le domaine de la santé et du bien-être • Aux particuliers pour une utilisation familiale ou en démarche personnelle. Inclusion des personnes handicapées.;mixte; +MYSY_Test_OP;PRATICIEN EN OLFACTOTHERAPIE;sante_nat;"Les huiles essentielles au service de notre équilibre psycho-émotionnel​. +Les informations olfactives sont en priorité traitées dans le cerveau par le système limbique qui gère aussi la mémoire émotionnelle. +Ainsi une simple odeur peut faire remonter des émotions en lien avec un vécu plus ou moins traumatique, permettant de comprendre quels besoins n’ont pas été entendus et qui causent des souffrances plus ou moins conscientes. +L'olfactothérapie invite à se mettre en chemin pour évoluer vers un plus grand respect de Soi et plus de sérénité́ dans la Vie.";ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI);;Maîtriser les règles de sécurité pour utiliser et conseiller l’usage des huiles essentielles. Évaluer une situation d’exclusion réclamant une prise en charge différente. Analyser une situation et les attentes d’un consultant pour définir une stratégie d’accompagnement adaptée avec des huiles essentielles dans les domaines relevant de sa compétence. Proposer une HE parfaitement adaptée à une personne en demande d’accompagnement psycho-émotionnel. ;Modules de 3 jours par mois en présentiel. Entrainement à distance avec documents, vidéos et quiz en ligne ;Aucun prérequis n’est demandé excepté la motivation de partir à la découverte de Soi et de l'Autre.;0;ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI);0;1;2590;5;https://img.mysy-training.com/ecole_aroma/img/logo_ecole_arome_vert.jpg;;21;jour;Mode hybride avec présentiel ( théorie, expérimentation, supports papier) et distanciel asynchrone : vidéos et quiz d'entrainement sur une plateforme dédiée : Groupe de discussion sur messagerie whatsapp. Entrainements à la consultation avec clients volontaires. Evaluation, finale des compétences Rédaction d'un travail personnel de synthèse. Compte-rendus de 21 séances à rendre dans les mois qui suivent la formation pour obtenir la certification.;OLFACTOTHERAPIE, HUILES ESSENTIELLES;dev_perso;1;1;;"Aucun prérequis n’est demandé, cette formation est ouverte à toute personne motivée à travailler sur elle pour pouvoir mieux accompagner l’Autre. +Elle est tout particulièrement conseillée aux sophrologues, praticiens en hypnose, aux psychothérapeutes et praticiens en relation d’aide désirant acquérir un outil complémentaire qui décuplera l’efficacité de leurs propres techniques.";mixte; +MYSY_Test_AR;PRATICIEN EN AROMATHERAPIE INTEGRATIVE;sante_nat;L’Aromathérapie Intégrative© est un enseignement scientifique qui ne se limite pas à connaître les propriétés des huiles essentielles pour supprimer des symptômes, mais qui intègre leur utilisation dans une stratégie thérapeutique globale de santé, fondée sur une bonne compréhension de l'anatomie, de la physiologie et de la biochimie, afin d’être capable de proposer des solutions individualisées et efficaces.;ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI);;Intégrer les règles de sécurité pour utiliser et conseiller l’usage des huiles essentielles. Faire le lien entre la composition biochimique d’une huile essentielle et ses actions sur l’organisme. Intégrer les bases indispensables de biochimie, d’anatomie et de physiologie humaine. Évaluer une situation d’exclusion réclamant une prise en charge médicale. Analyser une situation et les attentes d’un consultant pour définir une stratégie d’accompagnement adaptée avec des huiles essentielles dans les domaines relevant de sa compétence. Établir une formule parfaitement adaptée à une personne et un problème. Être capable de fabriquer un baume, une crème, une composition huileuse. ;Modules de 3 jours par mois en présentiel. Entrainement à distance avec documents, vidéos et quiz en ligne Evaluation à chaque module sur le programme du module précédent;Le niveau BAC est recommandé mais pas obligatoire. Solide motivation.;0;ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI);0;1;1650;5;https://img.mysy-training.com/ecole_aroma/img/logo_ecole_arome_vert.jpg;;12;jour;Mode hybride avec présentiel ( théorie, pratique, supports papier) et distanciel asynchrone : vidéos et quiz d'entrainement sur une plateforme dédiée. Groupe de discussion sur messagerie whatsapp. Evaluations pour vérifier l'atteinte des objectifs pédagogiques. Evaluation, finale des compétences Rédaction d'un travail de synthèse avec sujet au choix.;AROMATHERAPIE, HUILES ESSENTIELLES, AROMA;dev_perso;1;1;;;mixte; diff --git a/public/sample/template_import_session_formation_old.csv b/public/sample/template_import_session_formation_old.csv new file mode 100644 index 0000000..3428bc3 --- /dev/null +++ b/public/sample/template_import_session_formation_old.csv @@ -0,0 +1,7 @@ +formation_code_externe;code_session;date_debut;date_fin;nb_participant;adresse;code_postal;ville;date_debut_inscription;date_fin_inscription;formateur;distanciel;presentiel;prix_session;session_status;lms_class_code;session_etape +MYSY_Test_AP;AP_01;11/10/2023;13/10/2023;20;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 +MYSY_Test_AP;AP_02;14/11/2023;16/11/2023;15;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 +MYSY_Test_OP;OP_01;21/11/2023;23/11/2023;10;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 +MYSY_Test_OP;OP_02;28/11/2023;30/11/2023;15;2 passage de la Providence;75020;Paris;01/09/2023;30/09/2023;MySy_Trainer;1;0;750;1;;0 +MYSY_Test_AR;AR_01;01/03/2024;11/03/2024;5;;;;18/09/2023;29/02/2024;;1;0;;1;;0 +MYSY_Test_AR;AR_02;02/12/2023;10/12/2023;9;;;;18/09/2023;01/12/2023;;1;0;;1;;0 diff --git a/src/components/AddClassManual.js b/src/components/AddClassManual.js index 8b67b4f..7a27c76 100644 --- a/src/components/AddClassManual.js +++ b/src/components/AddClassManual.js @@ -1551,12 +1551,12 @@ const AddClassManual = (props) => { - {String(datamodification) === "1" &&
+ {/*String(datamodification) === "1" &&
{ /> -
} +
*/}
diff --git a/src/components/AddPartnerClient.js b/src/components/AddPartnerClient.js index 2a18c91..9316e2b 100644 --- a/src/components/AddPartnerClient.js +++ b/src/components/AddPartnerClient.js @@ -93,6 +93,9 @@ const AddParnerClient = (props) => { const [p_contact_civilite, setp_contact_civilite] = useState(""); + const [selected_contact_id, setelected_contact_id] = useState(""); + + function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); @@ -430,9 +433,9 @@ const AddParnerClient = (props) => { const stored_cookie = getCookie('tokenmysypart'); form.append("token", stored_cookie); - form.append("email", val); + form.append("_id", props.client_id); - var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Partner_Client/"; + var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Partner_Client_From_Id/"; axios.post(myurl, form).then(res => { if (String(res.data.status) === String("true")) { @@ -444,10 +447,20 @@ const AddParnerClient = (props) => { if (mylocalclient) { - document.getElementsByName("client_email")[0].value = mylocalclient.email; - document.getElementsByName("client_nom")[0].value = mylocalclient.nom; - setclient_nom(mylocalclient.nom); - setclient_email(mylocalclient.email); + + + if (mylocalclient.nom) { + setclient_nom(mylocalclient.nom); + } else { + setclient_nom(""); + } + + if (mylocalclient.email) { + setclient_email(mylocalclient.email); + } else { + setclient_email(""); + } + if (mylocalclient.raison_sociale) { @@ -573,10 +586,10 @@ const AddParnerClient = (props) => { const stored_cookie = getCookie('tokenmysypart'); form.append("token", stored_cookie); - form.append("email", p_client_email); - form.append("nom", p_client_nom); + form.append("_id", props.client_id); - var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Partner_Client/"; + + var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Partner_Client_From_Id/"; axios.post(myurl, form).then(res => { if (String(res.data.status) === String("true")) { @@ -664,9 +677,9 @@ const AddParnerClient = (props) => { const stored_cookie = getCookie('tokenmysypart'); form.append("token", stored_cookie); - form.append("email", val); + form.append("_id", props.client_id); - var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Partner_Client/"; + var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Partner_Client_From_Id/"; axios.post(myurl, form).then(res => { if (String(res.data.status) === String("true")) { @@ -759,7 +772,7 @@ const AddParnerClient = (props) => { form.append("token", stored_cookie); form.append("related_collection", related_collection); - form.append("related_collection_owner_email", props.client_mail); + form.append("related_collection_owner_id", props.client_id); var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_List_Entity_Contact/"; @@ -1251,6 +1264,8 @@ const AddParnerClient = (props) => { const stored_cookie = getCookie('tokenmysypart'); form.append("token", stored_cookie); + form.append("_id", props.client_id); + // Recupeation des données à enregister var client_email = "" @@ -1684,13 +1699,13 @@ const AddParnerClient = (props) => { if (current_contact_recid && String(current_contact_recid).length > 3) { // Il s'agit d'un mise à jour. on a une valeur dans le current_activite_recid myurl = process.env.REACT_APP_API_URL + "myclass/api/Update_Contact/"; - form.append("contact_recid", current_contact_recid); + form.append("_id", selected_contact_id); } else { // Il s'agit d'un ajout d'une nouvelle activité. on a rien dans le current_activite_recid myurl = process.env.REACT_APP_API_URL + "myclass/api/Add_Contact/"; form.append("related_collection", "partner_client"); - form.append("related_collection_owner_email", p_client_email); + form.append("related_collection_owner_id", props.client_id); } @@ -1831,15 +1846,19 @@ const AddParnerClient = (props) => { var contactmail = event.currentTarget.getAttribute('contactmail'); + var contact_id = event.currentTarget.getAttribute('contact_id'); + + setelected_contact_id(contact_id); + const stored_cookie = getCookie('tokenmysypart'); form.append("token", stored_cookie); - form.append("email", contactmail); + form.append("_id", contact_id); // Recupeation des données à enregister form.append("related_collection", "partner_client"); - form.append("related_collection_owner_email", p_client_email); + form.append("related_collection_owner_id", props.client_id); - console.log(" ### contactmail = ", contactmail); + //console.log(" ### contactmail = ", contactmail); var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Given_Contact/"; @@ -2573,7 +2592,7 @@ const AddParnerClient = (props) => { {Get_List_Contact_Of_client_Part_result && String(Get_List_Contact_Of_client_Part_api) === "true" && Get_List_Contact_Of_client_Part_result.map((client) => ( -
+
{(JSON.parse(client).nom || JSON.parse(client).prenom) && } {JSON.parse(client).fonction && } {JSON.parse(client).email && } diff --git a/src/components/Config_Champs_Personnalise.js b/src/components/Config_Champs_Personnalise.js index 1eab225..07e9e53 100644 --- a/src/components/Config_Champs_Personnalise.js +++ b/src/components/Config_Champs_Personnalise.js @@ -1383,11 +1383,13 @@ const Config_Champs_Personnalise = (props) => {
- +
+ +
diff --git a/src/components/DisplayPartnerSession.js b/src/components/DisplayPartnerSession.js index 9d93790..16b23d8 100644 --- a/src/components/DisplayPartnerSession.js +++ b/src/components/DisplayPartnerSession.js @@ -6,7 +6,6 @@ import Button from '@mui/material/Button'; import axios from "axios"; import { getCookie, setCookie } from 'react-use-cookie'; import { useHistory } from "react-router-dom"; -import CheckOut from "./CheckOut"; import { DataGrid, GridToolbar, frFR } from '@mui/x-data-grid'; import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css"; import { Editor } from '@tinymce/tinymce-react'; @@ -20,6 +19,7 @@ import participants from "../mysy_img/participants.png"; import fileDownload from 'js-file-download' import Popup from 'reactjs-popup'; import 'reactjs-popup/dist/index.css'; +import { FcSearch } from "react-icons/fc"; import { FcCancel, FcApproval, FcAcceptDatabase, FcPrint, FcAlarmClock, FcMultipleSmartphones, FcWorkflow } from "react-icons/fc"; import DatePicker from "react-datepicker"; import "react-datepicker/dist/react-datepicker.css"; @@ -121,8 +121,8 @@ const DisplayPartnerSession = (props) => { { field: 'id', headerName: 'id', hide: true }, { field: '_id', headerName: '_id', hide: true }, { field: 'class_internal_url', headerName: 'class_internal_url', hide: true }, - { field: 'code_session', headerName: 'Code session', hide: false, flex: 1, minWidth: 150 }, - { field: 'session_title', headerName: 'Titre', hide: false, flex: 1, minWidth: 150 }, + { field: 'code_session', headerName: 'Code session', hide: false, minWidth: 100, flex: 1, maxWidth: 150 }, + { field: 'session_title', headerName: 'Titre', hide: false, flex: 1, minWidth: 250 }, { field: 'statut', headerName: 'Statut', hide: true, width: datagrid_columns_size_model2, @@ -166,9 +166,9 @@ const DisplayPartnerSession = (props) => { }, }, { field: 'formateur', headerName: 'Formateur', minWidth: datagrid_columns_size_model1, hide: true, hideable: true, }, - { field: 'nb_participant', headerName: 'Nb Parti.', width: datagrid_columns_size_model2, align: "center", }, + { field: 'nb_participant', headerName: 'Nb Parti.', minWidth: datagrid_columns_size_model2, align: "center", hide: true, }, { - field: 'taux_remplissage', headerName: 'Remplissage', align: "center", flex: 1, + field: 'taux_remplissage', headerName: 'Remplissage', align: "center", flex: 1, minWidth: 100, maxWidth: 150, flex: 1, align: "left", renderCell: (params) => { return ( @@ -187,14 +187,14 @@ const DisplayPartnerSession = (props) => { ); }, }, - { field: 'nb_inscrit', headerName: 'Inscrits', width: datagrid_columns_size_model2, align: "center", hide: true, hideable: true, }, - { field: 'nb_preinscrit', headerName: 'Preinscrits', width: datagrid_columns_size_model2, align: "center", hide: true, hideable: true, }, - { field: 'prix_session', headerName: 'Prix', minWidth: datagrid_columns_size_model2, align: "center", }, + { field: 'nb_inscrit', headerName: 'Inscrits', minWidth: 20, align: "center", hide: true, hideable: true, }, + { field: 'nb_preinscrit', headerName: 'Preinscrits', minWidth: 20, align: "center", hide: true, hideable: true, }, + { field: 'prix_session', headerName: 'Prix', minWidth: 20, align: "center", }, { field: 'title', headerName: 'Formation', minWidth: 250, flex: 1, align: "center", hide: true, hideable: true, }, - { field: 'domaine', headerName: 'Domaine', width: datagrid_columns_size_model1, align: "center", hide: true, hideable: true, }, - { field: 'published', headerName: 'publié', width: datagrid_columns_size_model1, align: "center", hide: true, hideable: true, }, + { field: 'domaine', headerName: 'Domaine', minWidth: datagrid_columns_size_model1, align: "center", hide: true, hideable: true, }, + { field: 'published', headerName: 'publié', minWidth: datagrid_columns_size_model1, align: "center", hide: true, hideable: true, }, - { field: 'duration', headerName: 'Durée', width: datagrid_columns_size_model2, align: "center", }, + { field: 'duration', headerName: 'Durée', minWidth: datagrid_columns_size_model2, align: "center", hide: true, hideable: true, }, { field: "Detail", headerName: 'Voir detail', renderCell: (cellValues) => { @@ -689,7 +689,7 @@ const DisplayPartnerSession = (props) => { } + {String(selected_convention_type) === "pdf" && + } +
+ + + +
+ +
+ + + + + +

Vos sessions de formation

Utilisez les filtres !
@@ -8294,6 +8922,24 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair backgroundColor: '#566573', color: 'white', }, + "& .MuiDataGrid-columnHeaders": { + backgroundColor: "#c8cfd5", + color: "black", + fontSize: 14 + }, + + '& .line--statut--selected': { + backgroundColor: '#FBF2EF', + color: 'black', + }, + '& .line--statut--pair': { + backgroundColor: 'rgba(235, 235, 235, .7)', + color: 'black', + }, + '& .line--statut--impair': { + backgroundColor: '#FFFFFF', + color: 'black', + }, }} > @@ -8346,6 +8992,7 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair className="datagridclass" onRowDoubleClick={(newSelectionModel) => { + setgridline_id(newSelectionModel.row.id); setaddOneSession("0"); setEdite_session("0"); //handleClick_edit_session_From_Line(newSelectionModel.row.id); @@ -8366,7 +9013,7 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair components={{ Toolbar: GridToolbar, }} - sx={datagridSx} + //sx={datagridSx} getCellClassName={(params) => { //field === 'distantiel' if (params.field === 'distantiel' && String(params.value) === "1") { @@ -8402,6 +9049,17 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair return 'cell--etape--annule'; } + // Pour la gestion de la couleur de zone double cliquée + if (String(params.row.id) === String(gridline_id)) { + return 'line--statut--selected'; + } + else if (parseInt(String(params.row.id)) % 2 === 0) { + return 'line--statut--pair'; + } + else if (parseInt(String(params.row.id)) % 2 !== 0) { + return 'line--statut--impair'; + } + }} @@ -8540,8 +9198,36 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair {String(submenu) === String("detail_session") &&
+ + {String(addOneSession) !== "1" &&
+ +
+ cherif convention +
+   +
+ +
+
+ +
+
+ +
+ +
+
Formation
Création automatique + className="detail_class_submenu bton_add_session bton_add_session_create_automatic" style={{ "width": "40%" }} + id='menu_import_participant' name='menu_import_participant'>Création automatique @@ -11843,7 +12529,7 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
- +

@@ -12380,13 +13066,13 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
} - {String(submenu) === String("historique") &&
+ {String(submenu) === String("historique") &&
- -
} + +
}
diff --git a/src/components/DisplayPartnerStagiaires.js b/src/components/DisplayPartnerStagiaires.js index bc14a34..fcab208 100644 --- a/src/components/DisplayPartnerStagiaires.js +++ b/src/components/DisplayPartnerStagiaires.js @@ -74,7 +74,7 @@ const DisplayPartnerStagiaires = (props) => { { value: 'certif', label: 'Certification' } ] - + const [gridline_id, setgridline_id] = useState(""); const [datagrid_columns_size_model1, setdatagrid_columns_size_model1] = useState(200); const [datagrid_columns_size_model2, setdatagrid_columns_size_model2] = useState(80); @@ -85,10 +85,11 @@ const DisplayPartnerStagiaires = (props) => { { field: 'id', headerName: 'id', hide: true }, { field: 'class_internal_url', headerName: 'class_internal_url', hide: true, editable: false }, - { field: 'email', headerName: 'email', width: 150, hideable: false, editable: false }, - { field: 'nom', headerName: 'nom', width: 150, hide: false, editable: false, editable: false }, - { field: 'prenom', headerName: 'prenom', width: 150, hide: false, editable: false }, - { field: 'employeur', headerName: 'Employeur', width: 150, hide: true, editable: false }, + + { field: 'nom', headerName: 'Nom', minWidth: 150, flex:1, hide: false, editable: false, editable: false }, + { field: 'prenom', headerName: 'Prénom', minWidth: 150, flex:1, hide: false, editable: false }, + { field: 'email', headerName: 'Email', minWidth: 200, flex:1,hideable: false, editable: false }, + { field: 'employeur', headerName: 'Employeur', minWidth: 150, hide: true, editable: false }, { field: 'status', headerName: 'Statut', hide: false, width: datagrid_columns_size_model2, valueFormatter: (params) => { @@ -104,8 +105,8 @@ const DisplayPartnerStagiaires = (props) => { return "???"; }, }, - { field: 'code_session', headerName: 'Code session', hideable: true, editable: false }, - { field: 'title', headerName: 'Formation', width: datagrid_columns_size_model1, align: "center", hideable: true, editable: false }, + { field: 'code_session', headerName: 'Code session', hideable: true, editable: false, minWidth: 150, flex:1}, + { field: 'title', headerName: 'Formation', minWidth: datagrid_columns_size_model1, align: "center", hideable: true, editable: false, hide:true }, { field: 'distantiel', headerName: 'Distantiel', hideable: false, width: datagrid_columns_size_model2, valueFormatter: (params) => { @@ -129,9 +130,9 @@ const DisplayPartnerStagiaires = (props) => { }, }, - { field: 'domaine', headerName: 'Domaine', width: datagrid_columns_size_model2, align: "center", hide: true, hideable: true, editable: false }, - { field: 'date_debut', headerName: 'Du', width: datagrid_columns_size_model1, hideable: true, editable: false }, - { field: 'date_fin', headerName: 'Au', width: datagrid_columns_size_model1, hideable: true, editable: false }, + { field: 'domaine', headerName: 'Domaine', minWidth: datagrid_columns_size_model2, align: "center", hide: true, hideable: true, editable: false }, + { field: 'date_debut', headerName: 'Du', minWidth: 90, maxWidth:100, flex:1, hideable: true, editable: false }, + { field: 'date_fin', headerName: 'Au', minWidth: 90, maxWidth:100, flex:1, hideable: true, editable: false }, { field: 'class_internal_url', headerName: 'class_internal_url', hide: true, editable: false }, { field: "Detail", headerName: 'Voir detail', @@ -141,6 +142,7 @@ const DisplayPartnerStagiaires = (props) => { -
} +
*/}
{
+
 
+   + {!createtraining &&
+ + + +
} } diff --git a/src/components/Employes.js b/src/components/Employes.js index 6e59efa..6016f84 100644 --- a/src/components/Employes.js +++ b/src/components/Employes.js @@ -46,6 +46,7 @@ import VisibilityOff from '@mui/icons-material/VisibilityOff'; import { Fab } from "@material-ui/core"; import { IoMdAddCircle, IoIosRemoveCircleOutline } from "react-icons/io"; import { AiTwotoneEdit, AiTwotoneSave } from "react-icons/ai"; +import { ConsoleView } from "react-device-detect"; const Employes = (props) => { @@ -83,9 +84,23 @@ const Employes = (props) => { const columns = [ { field: '_id', headerName: '_id', hide: true }, { field: 'id', headerName: 'id', hide: true }, - { field: 'email', headerName: 'email', flex: 1, hideable: false, }, - { field: 'nom', headerName: 'nom', flex: 1, hide: false, }, - { field: 'prenom', headerName: 'prenom', flex: 1, hide: false, }, + { + field: 'civilite', headerName: 'Civilité', width: 90, hide: false, + valueFormatter: (params) => { + if (String(params.value) === "0") + return "Mme"; + else if (String(params.value) === "1") + return "M"; + else if (String(params.value) === "-1") + return " "; + else + return String(params.value); + }, + }, + + { field: 'nom', headerName: 'Nom', flex: 1, hide: false, minWidth: 150 }, + { field: 'prenom', headerName: 'Prénom', flex: 1, hide: false, minWidth: 150 }, + { field: 'email', headerName: 'Email', flex: 1, hideable: false, minWidth: 200 }, { field: 'ismanager', headerName: 'Manager', width: 150, hide: false, valueFormatter: (params) => { @@ -99,19 +114,7 @@ const Employes = (props) => { }, }, { field: 'telephone_mobile', headerName: 'Mobile', width: 150, hide: false, }, - { - field: 'civilite', headerName: 'Civilité', width: 150, hide: false, - valueFormatter: (params) => { - if (String(params.value) === "0") - return "Mme"; - else if (String(params.value) === "1") - return "M"; - else if (String(params.value) === "-1") - return " "; - else - return String(params.value); - }, - }, + { field: 'profil', headerName: 'profil', width: 150, hide: false, }, { field: 'fonction', headerName: 'Fonction', width: 150, hide: false, }, @@ -569,6 +572,10 @@ const Employes = (props) => { const [display_detail_employe, setdisplay_detail_employe] = React.useState(); const [selected_id, setselected_id] = useState(""); + + const [gridline_id, setgridline_id] = useState(""); + + const [selected_employe_email, setselected_employe_email] = useState(""); function handleClick_edit_employee_From_Line(selected_row_id) { @@ -4165,6 +4172,7 @@ const Employes = (props) => { backgroundColor: '#F7F2E0', color: 'black', }, + /*"& .MuiDataGrid-virtualScrollerRenderZone": { "& .MuiDataGrid-row": { @@ -4176,6 +4184,19 @@ const Employes = (props) => { color: "black", fontSize: 14 }, + + '& .line--statut--selected': { + backgroundColor: '#FBF2EF', + color: 'black', + }, + '& .line--statut--pair': { + backgroundColor: 'rgba(235, 235, 235, .7)', + color: 'black', + }, + '& .line--statut--impair': { + backgroundColor: '#FFFFFF', + color: 'black', + }, }} > @@ -4206,6 +4227,7 @@ const Employes = (props) => { profil: JSON.parse(item).profil, fonction: JSON.parse(item).fonction, ismanager: JSON.parse(item).ismanager, + } ))} @@ -4215,6 +4237,7 @@ const Employes = (props) => { className="datagridclass" onRowDoubleClick={(newSelectionModel) => { + setgridline_id(newSelectionModel.row.id); handleClick_edit_employee_From_Line(newSelectionModel.row.id); }} @@ -4227,6 +4250,12 @@ const Employes = (props) => { //sx={datagridSx} getCellClassName={(params) => { //field === 'distantiel' + + + //console.log(" ### params.field = ", params.field) + + + if (params.field === 'distantiel' && String(params.value) === "1") { return 'cell--distantiel'; } @@ -4250,6 +4279,16 @@ const Employes = (props) => { }} getRowClassName={(params) => { + // Pour la gestion de la couleur de zone double cliquée + if (String(params.row.id) === String(gridline_id)) { + return 'line--statut--selected'; + } + else if( parseInt(String(params.row.id)) % 2 === 0){ + return 'line--statut--pair'; + } + else if( parseInt(String(params.row.id)) % 2 !== 0){ + return 'line--statut--impair'; + } if (String(params.row.status) === "-1") { return 'line--statut--annule'; diff --git a/src/components/Partner_Client.js b/src/components/Partner_Client.js index c6e7733..8a5116d 100644 --- a/src/components/Partner_Client.js +++ b/src/components/Partner_Client.js @@ -65,6 +65,10 @@ const Partner_Client = (props) => { const [rows_list_clients, setrows_list_clients] = useState([]); const [selectionModel, setSelectionModel] = React.useState([]); + + const [selected_id, setselected_id] = useState(""); + + const columns_clients = [ { field: 'id', headerName: 'id', hide: true }, { field: '_id', headerName: '_id', hide: true }, @@ -92,58 +96,58 @@ const Partner_Client = (props) => { return ( { - // handleClick_delete(event, cellValues); - }} + onClick={(event) => { + // handleClick_delete(event, cellValues); + }} + > + + + } + modal + nested + position="center center" > - + {close => ( +
+ +
MySy Information
+
+ {' '} - } - modal - nested - position="center center" - > - {close => ( -
- -
MySy Information
-
- {' '} - - En confirmant cette opération, le client sera définitivement supprimé.
+ En confirmant cette opération, le client sera définitivement supprimé.
Avant, assurez-vous de n'avoir aucun stagiaire, un devis ou commande rattaché au client. -
-
-
- -
-
- + }}> Valider + +
+
+ +
-
- )} - + )} + + - ); } @@ -379,12 +383,12 @@ const Partner_Client = (props) => { height: 60, lineHeight: "59px !important" } - },*/ + }, "& .MuiDataGrid-virtualScrollerRenderZone": { "& .MuiDataGrid-row": { "&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" } } - }, + },*/ "& .MuiDataGrid-columnHeaders": { backgroundColor: "#c8cfd5", color: "black", @@ -395,20 +399,24 @@ const Partner_Client = (props) => { function handleClick_edit_session_From_Line(selected_row_id) { if (rows_list_clients[selected_row_id]) { - - + + var line = JSON.parse(rows_list_clients[selected_row_id]); var clientmail = String(line.email); + + var client_id = String(line._id); + setselected_id(client_id); + setClient_email(clientmail); setEdite_Client("1"); - + window.scrollTo({ top: 800, left: 0, behavior: "smooth", }); - - + + } } @@ -438,6 +446,8 @@ const Partner_Client = (props) => { }); } + const [gridline_id, setgridline_id] = useState(""); + const myRef_detail_client = useRef(null) return ( @@ -623,7 +633,24 @@ const Partner_Client = (props) => { fontWeight: 'bold', }, - + "& .MuiDataGrid-columnHeaders": { + backgroundColor: "#c8cfd5", + color: "black", + fontSize: 14 + }, + + '& .line--statut--selected': { + backgroundColor: '#FBF2EF', + color: 'black', + }, + '& .line--statut--pair': { + backgroundColor: 'rgba(235, 235, 235, .7)', + color: 'black', + }, + '& .line--statut--impair': { + backgroundColor: '#FFFFFF', + color: 'black', + }, }} > @@ -649,21 +676,40 @@ const Partner_Client = (props) => { components={{ Toolbar: GridToolbar, }} - sx={datagridSx} + //sx={datagridSx} onSelectionModelChange={(newSelectionModel) => { setSelectionModel(newSelectionModel); - if (newSelectionModel.length === 1){ - - handleClick_edit_session_From_Line(newSelectionModel); - } - - else{ - setEdite_Client(); - } + /* if (newSelectionModel.length === 1){ + + handleClick_edit_session_From_Line(newSelectionModel); + } + + else{ + setEdite_Client(); + }*/ }} selectionModel={selectionModel} + onRowDoubleClick={(newSelectionModel) => { + setgridline_id(newSelectionModel.row.id); + handleClick_edit_session_From_Line(newSelectionModel.row.id); + + }} + + getRowClassName={(params) => { + // Pour la gestion de la couleur de zone double cliquée + if (String(params.row.id) === String(gridline_id)) { + return 'line--statut--selected'; + } + else if( parseInt(String(params.row.id)) % 2 === 0){ + return 'line--statut--pair'; + } + else if( parseInt(String(params.row.id)) % 2 !== 0){ + return 'line--statut--impair'; + } + }} + />
@@ -715,7 +761,8 @@ const Partner_Client = (props) => {
Detail client : {Client_email}
- +
} @@ -723,7 +770,7 @@ const Partner_Client = (props) => {
Detail client : {Client_email}
 
- } diff --git a/src/components/Partner_Commande.js b/src/components/Partner_Commande.js index 99f9e21..d54246b 100644 --- a/src/components/Partner_Commande.js +++ b/src/components/Partner_Commande.js @@ -2673,7 +2673,7 @@ const Partner_Commande = (props) => { } - + const [Make_Order_Ready_To_Invoice_api, setMake_Order_Ready_To_Invoice_api] = useState(); const [Make_Order_Ready_To_Invoice_message, setMake_Order_Ready_To_Invoice_message] = useState(); const [Make_Order_Ready_To_Invoice_result, setMake_Order_Ready_To_Invoice_result] = useState(); @@ -2939,7 +2939,7 @@ const Partner_Commande = (props) => { } const [isLoading, setLoading] = useState(); - + const [gridline_id, setgridline_id] = useState(""); return ( @@ -3890,6 +3890,19 @@ const Partner_Commande = (props) => { color: "black", fontSize: 14 }, + + '& .line--statut--selected': { + backgroundColor: '#FBF2EF', + color: 'black', + }, + '& .line--statut--pair': { + backgroundColor: 'rgba(235, 235, 235, .7)', + color: 'black', + }, + '& .line--statut--impair': { + backgroundColor: '#FFFFFF', + color: 'black', + }, }} > @@ -3970,6 +3983,17 @@ const Partner_Commande = (props) => { if (String(params.row.status) === "1") { return 'line--statut--inscrit'; } + // Pour la gestion de la couleur de zone double cliquée + if (String(params.row.id) === String(gridline_id)) { + return 'line--statut--selected'; + } + else if (parseInt(String(params.row.id)) % 2 === 0) { + return 'line--statut--pair'; + } + else if (parseInt(String(params.row.id)) % 2 !== 0) { + return 'line--statut--impair'; + } + }} @@ -4227,7 +4251,7 @@ const Partner_Commande = (props) => { id="detail_header_date_cmd" selected={new Date(moment(p_detail_header_date_cmd_val, "DD/MM/YYYY HH:mm:ss"))} onChange={(date) => { - setp_detail_header_date_cmd_val(format(date, 'dd/MM/yyyy')); + setp_detail_header_date_cmd_val(format(date, 'dd/MM/yyyy')); setOrder_data_changed("1"); } } @@ -5091,8 +5115,8 @@ const Partner_Commande = (props) => { onRowDoubleClick={(newSelectionModel) => { handleClick_edit_order_From_Line(newSelectionModel.row.id); - - }} + + }} rowsPerPageOptions={[10]} //disableSelectionOnClick diff --git a/src/components/Partner_Config_Jours_Travail.js b/src/components/Partner_Config_Jours_Travail.js index 4c1dec6..a5df1da 100644 --- a/src/components/Partner_Config_Jours_Travail.js +++ b/src/components/Partner_Config_Jours_Travail.js @@ -1742,6 +1742,8 @@ const Partner_Configuration_Jours_Travail = (props) => { }, []) + const [gridline_id, setgridline_id] = useState(""); + return (
{isLoading &&
diff --git a/src/components/Partner_Config_Technique.js b/src/components/Partner_Config_Technique.js index 3e63a8b..8486620 100644 --- a/src/components/Partner_Config_Technique.js +++ b/src/components/Partner_Config_Technique.js @@ -375,7 +375,7 @@ const Partner_Configuration_Technique = (props) => { }) } - + const [gridline_id, setgridline_id] = useState(""); return (
@@ -536,6 +536,19 @@ const Partner_Configuration_Technique = (props) => { color: "black", fontSize: 14 }, + + '& .line--statut--selected': { + backgroundColor: '#FBF2EF', + color: 'black', + }, + '& .line--statut--pair': { + backgroundColor: 'rgba(235, 235, 235, .7)', + color: 'black', + }, + '& .line--statut--impair': { + backgroundColor: '#FFFFFF', + color: 'black', + }, }} > @@ -543,8 +556,8 @@ const Partner_Configuration_Technique = (props) => { checkboxSelection onSelectionModelChange={(newSelectionModel) => { setSelectionModel(newSelectionModel); - if (newSelectionModel.length === 1) - handleClick_edit_config_From_Line(newSelectionModel); + /*if (newSelectionModel.length === 1) + handleClick_edit_config_From_Line(newSelectionModel);*/ if (newSelectionModel.length !== 1) { setp_detail_config_valeur(); setp_detail_config_point(); @@ -571,6 +584,14 @@ const Partner_Configuration_Technique = (props) => { pageSize={10} className="datagridclass" + onRowDoubleClick={(newSelectionModel) => { + setgridline_id(newSelectionModel.row.id); + + handleClick_edit_config_From_Line(newSelectionModel.row.id); + + }} + + rowsPerPageOptions={[10]} //disableSelectionOnClick components={{ @@ -610,6 +631,17 @@ const Partner_Configuration_Technique = (props) => { if (String(params.row.status) === "1") { return 'line--statut--inscrit'; } + + // Pour la gestion de la couleur de zone double cliquée + if (String(params.row.id) === String(gridline_id)) { + return 'line--statut--selected'; + } + else if (parseInt(String(params.row.id)) % 2 === 0) { + return 'line--statut--pair'; + } + else if (parseInt(String(params.row.id)) % 2 !== 0) { + return 'line--statut--impair'; + } }} diff --git a/src/components/Partner_Facture.js b/src/components/Partner_Facture.js index 6bf1e1d..d98f15b 100644 --- a/src/components/Partner_Facture.js +++ b/src/components/Partner_Facture.js @@ -45,7 +45,7 @@ const Partner_Facture = (props) => { const [rows_invoice_lines, setrows_invoice_lines] = useState([]); const [selectionModel_invoice_lines, setselectionModel_invoice_lines] = React.useState([]); - + const [gridline_id, setgridline_id] = useState(""); var date_today_90j = new Date(); date_today_90j.setDate(date_today_90j.getDate() + 90); diff --git a/src/styles/components/_config_champs_personnalise.scss b/src/styles/components/_config_champs_personnalise.scss index 474b596..3a766f1 100644 --- a/src/styles/components/_config_champs_personnalise.scss +++ b/src/styles/components/_config_champs_personnalise.scss @@ -1904,7 +1904,8 @@ .bton_add_session { background: #c8cfd5; color: black; - width: 30% !important; + width: 40% !important; + margin-left: 10px; } .bton_import_excel { diff --git a/src/styles/components/_displaypartnertrainingpagination.scss b/src/styles/components/_displaypartnertrainingpagination.scss index 31127e0..cfad783 100644 --- a/src/styles/components/_displaypartnertrainingpagination.scss +++ b/src/styles/components/_displaypartnertrainingpagination.scss @@ -457,7 +457,7 @@ } .icon_plus { - width: 8%; + width: 6%; } .session_data { @@ -468,6 +468,12 @@ border-radius: 10px; margin-top: 10px; margin-bottom: 10px; + } + + .bton_add_session { + background: #c8cfd5; + color: black; + width: 100%; } } @@ -888,7 +894,7 @@ } .icon_plus { - width: 8%; + width: 6%; } .session_data { @@ -900,6 +906,12 @@ margin-top: 10px; margin-bottom: 10px; + } + + .bton_add_session { + background: #c8cfd5; + color: black; + width: 50%; } } @@ -1332,6 +1344,12 @@ border-radius: 10px; margin-top: 10px; margin-bottom: 10px; + } + + .bton_add_session { + background: #c8cfd5; + color: black; + width: 40%; } } @@ -1749,7 +1767,7 @@ } .icon_plus { - width: 10%; + width: 8%; } .session_data { @@ -1760,6 +1778,12 @@ border-radius: 10px; margin-top: 10px; margin-bottom: 10px; + } + + .bton_add_session { + background: #c8cfd5; + color: black; + width: 20% !important; } }