10/12/2023 - 16h

recette2
cherif 2023-12-10 16:04:23 +01:00
parent c3244bf5c1
commit c6c891db5f
16 changed files with 1129 additions and 172 deletions

View File

@ -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 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_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_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 ladministrer en toute autonomie.
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 Cette formation permettra à lapprenant dêtre à laise 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, lapprenant sera en mesure de :
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 • De se connecter à une base de données de type Mysql et Postgresql
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 • De créer et mettre à jour et supprimer une base de base de données
MYSY_Test_AR;AR_01;01/03/2024;11/03/2024;5;;;;18/09/2023;29/02/2024;;1;0;;1;;0 • Créer et mettre jour et supprimer des tables de données, de les lier avec clés
MYSY_Test_AR;AR_02;02/12/2023;10/12/2023;9;;;;18/09/2023;01/12/2023;;1;0;;1;;0 • Dinsérer, mettre à jour et supprimer des enregistrements.
• De créer des requête SQL nécessitant la jonction entre plusieurs tables.";"Quest-ce quun système de gestion de bases de données relationnelles (SGBDR)
Stockage de linformation
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
Quest-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 à laise dans ce module, lapprenant 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 sinitier ou approfondir ses compétences en gestion des bases de données";mixte;
MYSY_Test_AP;PRATICIEN EN AROMATHERAPIE INTEGRATIVE;sante_nat;LAromathé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 lusage des huiles essentielles. <l> Faire le lien entre la composition biochimique dune huile essentielle et ses actions sur lorganisme.<l> Intégrer les bases indispensables de biochimie, danatomie et de physiologie humaine. <l> Évaluer une situation dexclusion réclamant une prise en charge médicale. <l> Analyser une situation et les attentes dun consultant pour définir une stratégie daccompagnement adaptée avec des huiles essentielles dans les domaines relevant de sa compétence. <l> Établir une formule parfaitement adaptée à une personne et un problème. <l> Être capable de fabriquer un baume, une crème, une composition huileuse. ;Modules de 3 jours par mois en présentiel. <l> Entrainement à distance avec documents, vidéos et quiz en ligne <l> Evaluation à chaque module sur le programme du module précédent;Le niveau BAC est recommandé mais pas obligatoire. <l>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 :<l> Groupe de discussion sur messagerie whatsapp. <l> Evaluations pour vérifier l'atteinte des objectifs pédagogiques. <l> Evaluation, finale des compétences <l> 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 <l> • Aux particuliers en reconversion professionnelle dans le domaine de la santé et du bien-être <l> • Aux particuliers pour une utilisation familiale ou en démarche personnelle. <l> Inclusion des personnes handicapées.;mixte;
MYSY_Test_OP;PRATICIEN EN OLFACTOTHERAPIE;sante_nat;"Les huiles essentielles au service de notre équilibre psycho-émotionnel.<l>
Les informations olfactives sont en priorité traitées dans le cerveau par le système limbique qui gère aussi la mémoire émotionnelle.<l>
Ainsi une simple odeur peut faire remonter des émotions en lien avec un vécu plus ou moins traumatique, permettant de comprendre quels besoins nont pas été entendus et qui causent des souffrances plus ou moins conscientes.<l>
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 lusage des huiles essentielles. <l> Évaluer une situation dexclusion réclamant une prise en charge différente. <l> Analyser une situation et les attentes dun consultant pour définir une stratégie daccompagnement adaptée avec des huiles essentielles dans les domaines relevant de sa compétence. <l> Proposer une HE parfaitement adaptée à une personne en demande daccompagnement psycho-émotionnel. ;Modules de 3 jours par mois en présentiel. <l> Entrainement à distance avec documents, vidéos et quiz en ligne ;Aucun prérequis nest 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 :<l> Groupe de discussion sur messagerie whatsapp. <l> Entrainements à la consultation avec clients volontaires. <l> Evaluation, finale des compétences <l> Rédaction d'un travail personnel de synthèse.<l> 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 nest demandé, cette formation est ouverte à toute personne motivée à travailler sur elle pour pouvoir mieux accompagner lAutre.<l>
Elle est tout particulièrement conseillée aux sophrologues, praticiens en hypnose, aux psychothérapeutes et praticiens en relation daide désirant acquérir un outil complémentaire qui décuplera lefficacité de leurs propres techniques.";mixte;
MYSY_Test_AR;PRATICIEN EN AROMATHERAPIE INTEGRATIVE;sante_nat;LAromathé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 lusage des huiles essentielles. <l> Faire le lien entre la composition biochimique dune huile essentielle et ses actions sur lorganisme.<l> Intégrer les bases indispensables de biochimie, danatomie et de physiologie humaine. <l> Évaluer une situation dexclusion réclamant une prise en charge médicale. <l> Analyser une situation et les attentes dun consultant pour définir une stratégie daccompagnement adaptée avec des huiles essentielles dans les domaines relevant de sa compétence. <l> Établir une formule parfaitement adaptée à une personne et un problème. <l> Être capable de fabriquer un baume, une crème, une composition huileuse. ;Modules de 3 jours par mois en présentiel. <l> Entrainement à distance avec documents, vidéos et quiz en ligne <l> 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. <l> Groupe de discussion sur messagerie whatsapp. <l> Evaluations pour vérifier l'atteinte des objectifs pédagogiques. <l> Evaluation, finale des compétences <l> Rédaction d'un travail de synthèse avec sujet au choix.;AROMATHERAPIE, HUILES ESSENTIELLES, AROMA;dev_perso;1;1;;;mixte;

1 formation_code_externe external_code code_session titre date_debut domaine date_fin description nb_participant formateur adresse formateur_email code_postal objectif ville programme date_debut_inscription prerequis date_fin_inscription cpf institut_formation distanciel distantiel presentiel prix_session prix session_status note lms_class_code img_url session_etape url duree duree_unite plus_produit mots_cle metier certif publie zone_diffusion pourqui support img_banner_detail_class
2 MYSY_Test_AP MySy_SGBD_01 AP_01 Introduction à la gestion des bases de données - SQL 11/10/2023 autre 13/10/2023 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. 20 MySy_Trainer mysy 2 passage de la Providence cherif.balde@yahoo.fr 75020 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. Paris 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 01/09/2023 Pour être à l’aise dans ce module, l’apprenant devra maitriser les outils informatiques (ordinateurs, logiciels, etc) 30/09/2023 1 mysy 1 1 0 750 4500 1 4 0 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
3 MYSY_Test_AP MYSY_Test_AP AP_02 PRATICIEN EN AROMATHERAPIE INTEGRATIVE 14/11/2023 sante_nat 16/11/2023 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. 15 MySy_Trainer ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI) 2 passage de la Providence 75020 Intégrer les règles de sécurité pour utiliser et conseiller l’usage des huiles essentielles. <l> Faire le lien entre la composition biochimique d’une huile essentielle et ses actions sur l’organisme.<l> Intégrer les bases indispensables de biochimie, d’anatomie et de physiologie humaine. <l> Évaluer une situation d’exclusion réclamant une prise en charge médicale. <l> 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. <l> Établir une formule parfaitement adaptée à une personne et un problème. <l> Être capable de fabriquer un baume, une crème, une composition huileuse. Paris Modules de 3 jours par mois en présentiel. <l> Entrainement à distance avec documents, vidéos et quiz en ligne <l> Evaluation à chaque module sur le programme du module précédent 01/09/2023 Le niveau BAC est recommandé mais pas obligatoire. <l>Solide motivation. 30/09/2023 0 ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI) 1 0 0 1 750 2590 1 5 https://img.mysy-training.com/ecole_aroma/img/logo_ecole_arome_vert.jpg 0 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 :<l> Groupe de discussion sur messagerie whatsapp. <l> Evaluations pour vérifier l'atteinte des objectifs pédagogiques. <l> Evaluation, finale des compétences <l> 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 <l> • Aux particuliers en reconversion professionnelle dans le domaine de la santé et du bien-être <l> • Aux particuliers pour une utilisation familiale ou en démarche personnelle. <l> Inclusion des personnes handicapées. mixte
4 MYSY_Test_OP MYSY_Test_OP OP_01 PRATICIEN EN OLFACTOTHERAPIE 21/11/2023 sante_nat 23/11/2023 Les huiles essentielles au service de notre équilibre psycho-émotionnel​.<l> Les informations olfactives sont en priorité traitées dans le cerveau par le système limbique qui gère aussi la mémoire émotionnelle.<l> 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> 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. 10 MySy_Trainer ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI) 2 passage de la Providence 75020 Maîtriser les règles de sécurité pour utiliser et conseiller l’usage des huiles essentielles. <l> Évaluer une situation d’exclusion réclamant une prise en charge différente. <l> 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. <l> Proposer une HE parfaitement adaptée à une personne en demande d’accompagnement psycho-émotionnel. Paris Modules de 3 jours par mois en présentiel. <l> Entrainement à distance avec documents, vidéos et quiz en ligne 01/09/2023 Aucun prérequis n’est demandé excepté la motivation de partir à la découverte de Soi et de l'Autre. 30/09/2023 0 ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI) 1 0 0 1 750 2590 1 5 https://img.mysy-training.com/ecole_aroma/img/logo_ecole_arome_vert.jpg 0 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 :<l> Groupe de discussion sur messagerie whatsapp. <l> Entrainements à la consultation avec clients volontaires. <l> Evaluation, finale des compétences <l> Rédaction d'un travail personnel de synthèse.<l> 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.<l> 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
5 MYSY_Test_OP MYSY_Test_AR OP_02 PRATICIEN EN AROMATHERAPIE INTEGRATIVE 28/11/2023 sante_nat 30/11/2023 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. 15 MySy_Trainer ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI) 2 passage de la Providence 75020 Intégrer les règles de sécurité pour utiliser et conseiller l’usage des huiles essentielles. <l> Faire le lien entre la composition biochimique d’une huile essentielle et ses actions sur l’organisme.<l> Intégrer les bases indispensables de biochimie, d’anatomie et de physiologie humaine. <l> Évaluer une situation d’exclusion réclamant une prise en charge médicale. <l> 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. <l> Établir une formule parfaitement adaptée à une personne et un problème. <l> Être capable de fabriquer un baume, une crème, une composition huileuse. Paris Modules de 3 jours par mois en présentiel. <l> Entrainement à distance avec documents, vidéos et quiz en ligne <l> Evaluation à chaque module sur le programme du module précédent 01/09/2023 Le niveau BAC est recommandé mais pas obligatoire. Solide motivation. 30/09/2023 0 ÉCOLE FRANCAISE D'AROMATHERAPIE INTEGRATIVE (EFAI) 1 0 0 1 750 1650 1 5 https://img.mysy-training.com/ecole_aroma/img/logo_ecole_arome_vert.jpg 0 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. <l> Groupe de discussion sur messagerie whatsapp. <l> Evaluations pour vérifier l'atteinte des objectifs pédagogiques. <l> Evaluation, finale des compétences <l> Rédaction d'un travail de synthèse avec sujet au choix. AROMATHERAPIE, HUILES ESSENTIELLES, AROMA dev_perso 1 1 mixte
6 MYSY_Test_AR AR_01 01/03/2024 11/03/2024 5 18/09/2023 29/02/2024 1 1 0
7 MYSY_Test_AR AR_02 02/12/2023 10/12/2023 9 18/09/2023 01/12/2023 1 1 0
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

View File

@ -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
1 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
2 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
3 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
4 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
5 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
6 MYSY_Test_AR AR_01 01/03/2024 11/03/2024 5 18/09/2023 29/02/2024 1 0 1 0
7 MYSY_Test_AR AR_02 02/12/2023 10/12/2023 9 18/09/2023 01/12/2023 1 0 1 0

View File

@ -1551,12 +1551,12 @@ const AddClassManual = (props) => {
</TextField> </TextField>
</div> </div>
{String(datamodification) === "1" && <div className="training_caract"> {/*String(datamodification) === "1" && <div className="training_caract">
<TextField <TextField
required required
name="formateur_label" name="formateur_label"
label="Formateur" label="Formateur"
select
InputLabelProps={{ InputLabelProps={{
shrink: true, shrink: true,
}} }}
@ -1566,7 +1566,7 @@ const AddClassManual = (props) => {
/> />
</div>} </div>*/}
<div className="training_caract"> <div className="training_caract">

View File

@ -93,6 +93,9 @@ const AddParnerClient = (props) => {
const [p_contact_civilite, setp_contact_civilite] = useState(""); const [p_contact_civilite, setp_contact_civilite] = useState("");
const [selected_contact_id, setelected_contact_id] = useState("");
function sleep(ms) { function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms)); return new Promise(resolve => setTimeout(resolve, ms));
@ -430,9 +433,9 @@ const AddParnerClient = (props) => {
const stored_cookie = getCookie('tokenmysypart'); const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie); 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 => { axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) { if (String(res.data.status) === String("true")) {
@ -444,10 +447,20 @@ const AddParnerClient = (props) => {
if (mylocalclient) { if (mylocalclient) {
document.getElementsByName("client_email")[0].value = mylocalclient.email;
document.getElementsByName("client_nom")[0].value = mylocalclient.nom;
setclient_nom(mylocalclient.nom); if (mylocalclient.nom) {
setclient_email(mylocalclient.email); setclient_nom(mylocalclient.nom);
} else {
setclient_nom("");
}
if (mylocalclient.email) {
setclient_email(mylocalclient.email);
} else {
setclient_email("");
}
if (mylocalclient.raison_sociale) { if (mylocalclient.raison_sociale) {
@ -573,10 +586,10 @@ const AddParnerClient = (props) => {
const stored_cookie = getCookie('tokenmysypart'); const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie); form.append("token", stored_cookie);
form.append("email", p_client_email); form.append("_id", props.client_id);
form.append("nom", p_client_nom);
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 => { axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) { if (String(res.data.status) === String("true")) {
@ -664,9 +677,9 @@ const AddParnerClient = (props) => {
const stored_cookie = getCookie('tokenmysypart'); const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie); 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 => { axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) { if (String(res.data.status) === String("true")) {
@ -759,7 +772,7 @@ const AddParnerClient = (props) => {
form.append("token", stored_cookie); form.append("token", stored_cookie);
form.append("related_collection", related_collection); 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/"; 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'); const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie); form.append("token", stored_cookie);
form.append("_id", props.client_id);
// Recupeation des données à enregister // Recupeation des données à enregister
var client_email = "" var client_email = ""
@ -1684,13 +1699,13 @@ const AddParnerClient = (props) => {
if (current_contact_recid && String(current_contact_recid).length > 3) { 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 // 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/"; 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 { } else {
// Il s'agit d'un ajout d'une nouvelle activité. on a rien dans le current_activite_recid // 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/"; myurl = process.env.REACT_APP_API_URL + "myclass/api/Add_Contact/";
form.append("related_collection", "partner_client"); 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 contactmail = event.currentTarget.getAttribute('contactmail');
var contact_id = event.currentTarget.getAttribute('contact_id');
setelected_contact_id(contact_id);
const stored_cookie = getCookie('tokenmysypart'); const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie); form.append("token", stored_cookie);
form.append("email", contactmail); form.append("_id", contact_id);
// Recupeation des données à enregister // Recupeation des données à enregister
form.append("related_collection", "partner_client"); 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/"; 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 && String(Get_List_Contact_Of_client_Part_api) === "true" &&
Get_List_Contact_Of_client_Part_result.map((client) => ( Get_List_Contact_Of_client_Part_result.map((client) => (
<div contactmail={String(JSON.parse(client).email)} onClick={Display_Part_Client_Contact}> <div contactmail={String(JSON.parse(client).email)} contact_id={String(JSON.parse(client)._id)} onClick={Display_Part_Client_Contact}>
{(JSON.parse(client).nom || JSON.parse(client).prenom) && <nav className="grid_title"> {String(JSON.parse(client).prenom)} &nbsp; {String(JSON.parse(client).nom)} <hr /> </nav>} {(JSON.parse(client).nom || JSON.parse(client).prenom) && <nav className="grid_title"> {String(JSON.parse(client).prenom)} &nbsp; {String(JSON.parse(client).nom)} <hr /> </nav>}
{JSON.parse(client).fonction && <nav> {String(JSON.parse(client).fonction)} </nav>} {JSON.parse(client).fonction && <nav> {String(JSON.parse(client).fonction)} </nav>}
{JSON.parse(client).email && <nav> {String(JSON.parse(client).email)} </nav>} {JSON.parse(client).email && <nav> {String(JSON.parse(client).email)} </nav>}

View File

@ -1383,11 +1383,13 @@ const Config_Champs_Personnalise = (props) => {
</div> </div>
<div className="div_row" style={{ "border": "None" }}> <div className="div_row" style={{ "border": "None" }}>
<Button variant="outlined" onClick={submenu_add_one_personal_field} <div className="div_row_gauche" style={{ "border": "None" }}>
className="detail_class_submenu bton_add_session" <Button variant="outlined" onClick={submenu_add_one_personal_field}
id='menu_import_participant' name='menu_import_participant'>Ajout 1 champ &nbsp; className="detail_class_submenu bton_add_session"
<img src={add_plus} alt="ajout session" className="icon_plus" /> id='menu_import_participant' name='menu_import_participant'>Ajout 1 champ &nbsp;
</Button> <img src={add_plus} alt="ajout session" className="icon_plus" />
</Button>
</div>
</div> </div>
</div> </div>

View File

@ -6,7 +6,6 @@ import Button from '@mui/material/Button';
import axios from "axios"; import axios from "axios";
import { getCookie, setCookie } from 'react-use-cookie'; import { getCookie, setCookie } from 'react-use-cookie';
import { useHistory } from "react-router-dom"; import { useHistory } from "react-router-dom";
import CheckOut from "./CheckOut";
import { DataGrid, GridToolbar, frFR } from '@mui/x-data-grid'; import { DataGrid, GridToolbar, frFR } from '@mui/x-data-grid';
import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css"; import "react-draft-wysiwyg/dist/react-draft-wysiwyg.css";
import { Editor } from '@tinymce/tinymce-react'; import { Editor } from '@tinymce/tinymce-react';
@ -20,6 +19,7 @@ import participants from "../mysy_img/participants.png";
import fileDownload from 'js-file-download' import fileDownload from 'js-file-download'
import Popup from 'reactjs-popup'; import Popup from 'reactjs-popup';
import 'reactjs-popup/dist/index.css'; 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 { FcCancel, FcApproval, FcAcceptDatabase, FcPrint, FcAlarmClock, FcMultipleSmartphones, FcWorkflow } from "react-icons/fc";
import DatePicker from "react-datepicker"; import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css"; 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: '_id', headerName: '_id', hide: true }, { field: '_id', headerName: '_id', hide: true },
{ field: 'class_internal_url', headerName: 'class_internal_url', 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: 'code_session', headerName: 'Code session', hide: false, minWidth: 100, flex: 1, maxWidth: 150 },
{ field: 'session_title', headerName: 'Titre', hide: false, flex: 1, minWidth: 150 }, { field: 'session_title', headerName: 'Titre', hide: false, flex: 1, minWidth: 250 },
{ {
field: 'statut', headerName: 'Statut', hide: true, width: datagrid_columns_size_model2, 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: '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", align: "left",
renderCell: (params) => { renderCell: (params) => {
return ( 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_inscrit', headerName: 'Inscrits', minWidth: 20, align: "center", hide: true, hideable: true, },
{ field: 'nb_preinscrit', headerName: 'Preinscrits', width: datagrid_columns_size_model2, 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: datagrid_columns_size_model2, align: "center", }, { field: 'prix_session', headerName: 'Prix', minWidth: 20, align: "center", },
{ field: 'title', headerName: 'Formation', minWidth: 250, flex: 1, align: "center", hide: true, hideable: true, }, { 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: 'domaine', headerName: 'Domaine', minWidth: 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: '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', field: "Detail", headerName: 'Voir detail',
renderCell: (cellValues) => { renderCell: (cellValues) => {
@ -689,7 +689,7 @@ const DisplayPartnerSession = (props) => {
<Button <Button
onClick={(event) => { onClick={(event) => {
handleClick_valide_emargement(event, cellValues); handleClick_valide_emargement(event, cellValues);
}} }}
> >
<FcApproval /> <FcApproval />
@ -2350,7 +2350,7 @@ const DisplayPartnerSession = (props) => {
const [gridline_id, setgridline_id] = useState("");
function GetSelectedRows_Sequence_Ids() { function GetSelectedRows_Sequence_Ids() {
@ -6969,7 +6969,7 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
form.append("related_target_collection", new_ressource_type); form.append("related_target_collection", new_ressource_type);
form.append("related_target_collection_id", new_ressource_id); form.append("related_target_collection_id", new_ressource_id);
if(String("new_ressource_type") === "ressource_humaine" && String(new_ressource_poste).trim() === ""){ if (String("new_ressource_type") === "ressource_humaine" && String(new_ressource_poste).trim() === "") {
alert(" Vous devez préciser le poste occupé pour cette ressrouce"); alert(" Vous devez préciser le poste occupé pour cette ressrouce");
return; return;
} }
@ -7414,7 +7414,7 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
fileDownload(res.data, nom_liste_emarge) fileDownload(res.data, nom_liste_emarge)
}).catch((error) => { }).catch((error) => {
setLoading(false); setLoading(false);
alert(" Impossible de recuperer la liste d'émargement" ); alert(" Impossible de recuperer la liste d'émargement");
console.error('Error:', error); console.error('Error:', error);
}); });
@ -7540,6 +7540,354 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
setDialog_tuteur_1_open(false); setDialog_tuteur_1_open(false);
}; };
// -- debut convention
// -- convention
const [sessions_file_change_1_convention_api, setsessions_file_change_1_convention_api] = useState();
const [sessions_file_change_1_convention_result, setsessions_file_change_1_convention_result] = useState();
const [sessions_file_change_1_convention_message, setsessions_file_change_1_convention_message] = useState();
const sessions_file_change_1_convention = event => {
const fileUploaded = event.target.files[0];
let file_size = event.target.files[0].size;
let file_type = event.target.files[0].type;
if (file_type !== "application/pdf") {
alert("Le fichier n'est pas de type PDF");
return;
}
if (file_size > 10000000) {
alert("Le fichier ne doit pas depasser un 1 Méga octets");
console.log("Le fichier ne doit pas depasser un 1 Méga octets");
return;
}
//var new_node = {'name':event.target.files[0].name, 'type':event.target.files[0].type}
var new_tmp = [];
if (tab_convention_pieces_jointes_result && tab_convention_pieces_jointes_result.length > 0) {
tab_convention_pieces_jointes_result.map((x) => {
new_tmp.push(x);
});
}
new_tmp.push(event.target.files[0])
settab_convention_pieces_jointes_result(new_tmp);
console.log(" tab_convention_pieces_jointes_result = ", tab_convention_pieces_jointes_result)
return;
};
const [tab_convention_pieces_jointes_result, settab_convention_pieces_jointes_result] = useState([]);
const [Dialog_convention_message, setDialog_convention_message] = React.useState(false);
const [Dialog_convention_open, setDialog_convention_open] = React.useState(false);
function Dialog_convention_handle_change_participant_session(message) {
setDialog_convention_message(message);
setDialog_convention_open(true);
}
const Dialog_convention_handleClose = () => {
//alert(" Utiliser le bouton 'fermer' ");
//setOpen(false);
};
const Dialog_convention_handleClose_buton = () => {
setDialog_convention_open(false);
setselected_convention_id();
setselected_convention_type();
setselected_convention_email_destinataire_prod();
setselected_convention_email_test();
setactionmass_ftion_val();
setSelectionModel([]);
settab_convention_pieces_jointes_result([])
};
const [selected_convention_id, setselected_convention_id] = useState();
const [selected_convention_type, setselected_convention_type] = useState("");
const [selected_convention_email_destinataire_prod, setselected_convention_email_destinataire_prod] = useState("");
const [selected_convention_email_test, setselected_convention_email_test] = useState("");
const [Get_List_Stagiaire_Conventions_api, setGet_List_Stagiaire_Conventions_api] = useState();
const [Get_List_Stagiaire_Conventions_message, setGet_List_Stagiaire_Conventions_message] = useState();
const [Get_List_Stagiaire_Conventions_result, setGet_List_Stagiaire_Conventions_result] = useState();
function Get_List_Stagiaire_Conventions(event) {
var form = new FormData();
form.append("class_internal_url", selected_internal_url);
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
//form.append("inscription_id", selected_id);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_List_Conventions_Stagiaire/";
axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) {
//console.log(" In Get_List_Stagiaire_Conventions res.data.status = " + res.data.status);
//console.log(" In Get_List_Stagiaire_Conventions res.data.message r_class = " + res.data.message);
setGet_List_Stagiaire_Conventions_api("true");
setGet_List_Stagiaire_Conventions_result(res.data.message);
}
else {
setGet_List_Stagiaire_Conventions_api("false");
setGet_List_Stagiaire_Conventions_message(res.data.message);
alert(res.data.message);
}
}).catch((error) => {
console.warn('Not good man :( Get_List_Stagiaire_Conventions = ', error);
setGet_List_Stagiaire_Conventions_api("false");
alert("Impossible de récupérer les modèles de convention");
//setmyApimyApiMessage("")
})
}
const [Send_Stagiaire_Conventions_By_Email_api, setSend_Stagiaire_Conventions_By_Email_api] = useState();
const [Send_Stagiaire_Conventions_By_Email_message, setSend_Stagiaire_Conventions_By_Email_message] = useState();
const [Send_Stagiaire_Conventions_By_Email_result, setSend_Stagiaire_Conventions_By_Email_result] = useState();
function Send_Stagiaire_Conventions_By_Email(event) {
var form = new FormData();
form.append("class_internal_url", selected_internal_url);
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("session_id", selected_session_id);
form.append("courrier_template_id", selected_convention_id);
form.append("email_test", selected_convention_email_test);
form.append("email_production", selected_convention_email_destinataire_prod);
// pièce jointe
form.append("file_business_object", "");
var list_files = new FormData();
for (let i = 0; i < tab_convention_pieces_jointes_result.length; i++) {
form.append('File', tab_convention_pieces_jointes_result[i]);
}
//form.append("File", list_files);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Prepare_and_Send_Convention_From_Session_By_Email/";
axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) {
//console.log(" In Send_Stagiaire_Conventions_By_Email res.data.status = " + res.data.status);
//console.log(" In Send_Stagiaire_Conventions_By_Email res.data.message r_class = " + res.data.message);
setSend_Stagiaire_Conventions_By_Email_api("true");
setSend_Stagiaire_Conventions_By_Email_result(res.data.message);
alert(res.data.message);
Dialog_convention_handleClose_buton()
}
else {
setSend_Stagiaire_Conventions_By_Email_api("false");
setSend_Stagiaire_Conventions_By_Email_message(res.data.message);
alert(res.data.message);
}
}).catch((error) => {
console.warn('Not good man :( Send_Stagiaire_Conventions_By_Email = ', error);
setSend_Stagiaire_Conventions_By_Email_api("false");
alert("Impossible d'envoyer la convention par email");
//setmyApimyApiMessage("")
})
}
function Download_Stagiaire_Conventions_PDF() {
const stored_cookie = getCookie('tokenmysypart');
var nom_fichier_cmd = "Convention.pdf";
var url = process.env.REACT_APP_API_URL + "myclass/api/Download_Convention_Stagiaire_PDF/" + stored_cookie + "/" + selected_session_id + "/" + selected_convention_id;
//console.log(" nom_fichier_cmd = ", nom_fichier_cmd, " --- selected_id = ", selected_id, " --- url =", url);
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 convention (2) ");
} else {
fileDownload(res.data, nom_fichier_cmd)
}
}).catch((error) => {
setLoading(false);
console.error('Error:', error);
alert(" Impossible de télécharger la convention ")
});
}
const [Send_Stagiaire_Conventions_By_Email_Test_api, setSend_Stagiaire_Conventions_By_Email_Test_api] = useState();
const [Send_Stagiaire_Conventions_By_Email_Test_message, setSend_Stagiaire_Conventions_By_Email_Test_message] = useState();
const [Send_Stagiaire_Conventions_By_Email_Test_result, setSend_Stagiaire_Conventions_By_Email_Test_result] = useState();
function Send_Stagiaire_Conventions_By_Email_Test(event) {
var form = new FormData();
form.append("class_internal_url", selected_internal_url);
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("session_id", selected_session_id);
form.append("courrier_template_id", selected_convention_id);
form.append("email_test", selected_convention_email_test);
form.append("email_production", "");
// pièce jointe
form.append("file_business_object", "");
var list_files = new FormData();
for (let i = 0; i < tab_convention_pieces_jointes_result.length; i++) {
form.append('File', tab_convention_pieces_jointes_result[i]);
}
//form.append("File", list_files);
setLoading(true);
fetch(
process.env.REACT_APP_API_URL + "myclass/api/Prepare_and_Send_Convention_From_Session_By_Email/",
{
method: 'POST',
body: form,
}
)
.then((response) => response.json())
.then((result) => {
setLoading(false);
console.log(" In Send_Stagiaire_Conventions_By_Email_Test res.data.status = " + result['status']);
console.log(" In Send_Stagiaire_Conventions_By_Email_Test res.data.message r_class = " + result['message']);
if (String(result['status']) === String("true")) {
setSend_Stagiaire_Conventions_By_Email_Test_api("true");
setSend_Stagiaire_Conventions_By_Email_Test_result(result['message']);
alert(result['message']);
Dialog_convention_handleClose_buton()
}
else {
setSend_Stagiaire_Conventions_By_Email_Test_api("false");
setSend_Stagiaire_Conventions_By_Email_Test_message(result['message']);
alert(result['message']);
}
}).catch((error) => {
setLoading(false);
console.warn('Not good man :( Send_Stagiaire_Conventions_By_Email_Test = ', error);
setSend_Stagiaire_Conventions_By_Email_Test_api("false");
alert("Impossible d'envoyer l'email de test ");
//setmyApimyApiMessage("")
})
}
const [Get_Stagiaire_List_Email_Com_api, setGet_Stagiaire_List_Email_Com_api] = useState();
const [Get_Stagiaire_List_Email_Com_message, setGet_Stagiaire_List_Email_Com_message] = useState();
const [Get_Stagiaire_List_Email_Com_result, setGet_Stagiaire_List_Email_Com_result] = useState();
function Get_Stagiaire_List_Email_Com(event) {
var form = new FormData();
form.append("class_internal_url", selected_internal_url);
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("session_id", selected_session_id);
setLoading(true);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Get_Stagiaire_Communication_List_Email/";
axios.post(myurl, form).then(res => {
setLoading(false);
if (String(res.data.status) === String("true")) {
//console.log(" In Get_Stagiaire_List_Email_Com res.data.status = " + res.data.status);
//console.log(" In Get_Stagiaire_List_Email_Com res.data.message r_class = " + res.data.message);
setGet_Stagiaire_List_Email_Com_api("true");
setGet_Stagiaire_List_Email_Com_result(res.data.message);
var tab_email_prod = []
res.data.message.map((x) => {
tab_email_prod.push(String(JSON.parse(x).email));
}
);
var liste_email_prod = tab_email_prod.join()
setselected_convention_email_destinataire_prod(liste_email_prod);
}
else {
setGet_Stagiaire_List_Email_Com_api("false");
setGet_Stagiaire_List_Email_Com_message(res.data.message);
alert(res.data.message);
}
}).catch((error) => {
setLoading(false);
console.warn('Not good man :( Get_Stagiaire_List_Email_Com = ', error);
setGet_Stagiaire_List_Email_Com_api("false");
alert("Impossible de récupérer les adresses email de communication");
//setmyApimyApiMessage("")
})
}
const [Get_Convention_List_Of_All_PJ_result, setGet_Convention_List_Of_All_PJ_result] = useState([]);
function Delete_Convention_Attached_Doc(event) {
var doc_to_del_name = event.target.id;
const myArray = tab_convention_pieces_jointes_result;
let new_myArray = myArray.filter(file => file.name !== String(doc_to_del_name));
console.log(" new_myArray = ", new_myArray);
var new_tab = []
for (let i = 0; i < new_myArray.length; i++) {
new_tab.push(new_myArray[i]);
}
settab_convention_pieces_jointes_result(new_tab);
}
// -- end convention
return ( return (
<div className="displaypartnersession"> <div className="displaypartnersession">
@ -8045,6 +8393,286 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
</Dialog> </Dialog>
<Dialog
open={Dialog_convention_open}
onClose={Dialog_convention_handleClose}
className="displaypartnersession"
>
<DialogTitle>MySy Information</DialogTitle>
<DialogContent className="DialogContent_width">
<div className="session_caract_Dialog" > Choisir une convention
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
name="event_dialog_version_convention"
id="event_dialog_version_convention"
select
fullWidth
value={selected_convention_id}
onChange={(e) => {
setselected_convention_id(e.target.value);
var result2 = Get_List_Stagiaire_Conventions_result.filter((local_mymanager) => JSON.parse(local_mymanager)._id === String(e.target.value))
setselected_convention_type(JSON.parse(result2).type_doc);
settab_convention_pieces_jointes_result([]);
}
}
>
{Get_List_Stagiaire_Conventions_result &&
Get_List_Stagiaire_Conventions_result.map((myclient) => (
<MenuItem key={JSON.parse(myclient)._id} value={JSON.parse(myclient)._id}
style={{ "paddingLeft": "5px", "textAlign": "left", "width": "100%" }}>
{JSON.parse(myclient).nom}&nbsp; <b>{JSON.parse(myclient).type_doc} </b>
</MenuItem>
))}
</TextField>
</div>
{String(selected_convention_type) === "email" && <div className="session_caract_Dialog" > Type Document<br />
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, width: '75%' }}
name="event_dialog_type_convention"
id="event_dialog_type_convention"
select
value={selected_convention_type}
onChange={(e) => {
setselected_convention_type(e.target.value);
}
}
>
<MenuItem value="email" style={{ "paddingLeft": "5px", "textAlign": "left", "width": "100%" }} >Email &nbsp;</MenuItem>
<MenuItem value="pdf" style={{ "paddingLeft": "5px", "textAlign": "left", "width": "100%" }} >PDF &nbsp;</MenuItem>
</TextField>
{String(selected_convention_type) === "email" && <label className="bton_image_class" style={{ "width": "20%", "float": "right", "height": "3.5rem", "paddingTop": "15px" }} onClick={(e) => {
if (selected_convention_email_test) {
var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/;
if (!selected_convention_email_test.match(validRegex)) {
alert("L'adresse email de test est invalide.");
return;
}
Send_Stagiaire_Conventions_By_Email_Test();
} else {
alert("L'adresse email de test est invalide.");
}
}} > <FcSearch /> &nbsp; Test</label>}
</div>}
{String(selected_convention_type) === "pdf" && <div className="session_caract_Dialog" > Type Document<br />
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 } }}
name="event_dialog_type_convention"
id="event_dialog_type_convention"
select
fullWidth
value={selected_convention_type}
onChange={(e) => {
setselected_convention_type(e.target.value);
}
}
>
<MenuItem value="email" style={{ "paddingLeft": "5px", "textAlign": "left", "width": "100%" }} >Email &nbsp;</MenuItem>
<MenuItem value="pdf" style={{ "paddingLeft": "5px", "textAlign": "left", "width": "100%" }} >PDF &nbsp;</MenuItem>
</TextField>
</div>}
{String(selected_convention_type) === "email" && <div className="session_caract_Dialog" > Recevoir un pré-envoie
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
name="event_dialog_email_test_convention"
id="event_dialog_email_test_convention"
fullWidth
value={selected_convention_email_test}
onChange={(e) => {
setselected_convention_email_test(e.target.value);
}
}
/>
</div>
}
{String(selected_convention_type) === "pdf" && <div className="session_caract_Dialog" > Recevoir un pré-envoie
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
name="event_dialog_email_test_convention"
id="event_dialog_email_test_convention"
fullWidth
value=""
/>
</div>
}
{String(selected_convention_type) === "email" &&
String(actionmass_ftion_val) !== String("convention") && <div className="session_caract_Dialog" > Email destinaitaire
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
name="event_dialog_email_production_convention"
id="event_dialog_email_production_convention"
fullWidth
value={selected_convention_email_destinataire_prod}
onChange={(e) => {
setselected_convention_email_destinataire_prod(e.target.value);
}
}
/>
</div>
}
{String(selected_convention_type) === "pdf" &&
String(actionmass_ftion_val) !== String("convention") && <div className="session_caract_Dialog" > Email destinaitaire
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
name="event_dialog_email_production_convention"
id="event_dialog_email_production_convention"
fullWidth
value=""
/>
</div>
}
{String(selected_convention_type) === "email" && <div>
<div>
<div className="div_row" style={{ "border": "None" }}>
<hr className="hr_break" />
</div>
<div className="div_row" style={{ "border": "None", "fontSize": "22px", "fontWeight": "600", "padding": "5px" }}>
Pièces jointes Convention
</div>
<div className="div_row" style={{ "padding": "5px" }}>
<div style={{ "fontSize": "12px" }}>
<label htmlFor="upload_convention_file">
<input
style={{ display: "none" }}
id="upload_convention_file"
name="upload_convention_file"
type="file"
onChange={sessions_file_change_1_convention}
/>
<Fab
color="secondary"
size="small"
component="span"
aria-label="add"
variant="extended"
>
<IoMdAddCircle /> <nav style={{ "fontSize": "12px" }}> Ajouter un fichier </nav>
</Fab>
</label>
</div>
</div>
{tab_convention_pieces_jointes_result && <div className="div_row" style={{ "padding": "5px" }}>
<div className="div_row">
Liste des pièces jointes <br />
{<div className="div_row">
{tab_convention_pieces_jointes_result && tab_convention_pieces_jointes_result.map((val) => (
<div className="div_row_list_pj_convention" >
<nav style={{ "color": "green", "cursor": "pointer" }}
onClick={(e) => {
Delete_Convention_Attached_Doc(e);
}}
name={val.name} id={val.name}> Supprimer {val.name} </nav> <br />
</div>
))}
</div>}
</div>
</div>}
</div>
</div>}
</DialogContent>
<DialogActions>
<div className="div_row">
<div className="div_row_gauche">
{String(selected_convention_type) === "email" && <Button onClick={(e) => {
if (String(selected_convention_email_test).length > 2) {
const response = window.confirm(" Vous allez envoyer la convention au destinaitaire final. Continuer ?");
if (!response) {
return;
}
Send_Stagiaire_Conventions_By_Email();
Dialog_convention_handleClose_buton();
}
}}
className="bton_enreg_dialog">Envoyer mail aaa</Button>}
{String(selected_convention_type) === "pdf" &&
<Button className="bton_enreg_dialog" onClick={(e) => {
Download_Stagiaire_Conventions_PDF();
Dialog_convention_handleClose_buton();
}}
>Télécharger bbb</Button>}
</div>
<div className="div_row_droite" style={{ "textAlign": 'center' }}>
<Button onClick={Dialog_convention_handleClose_buton} className="bton_annule_dialog" >Fermer</Button>
</div>
</div>
</DialogActions>
</Dialog>
<h3> Vos sessions de formation </h3> <h3> Vos sessions de formation </h3>
<div className="titre1"> Utilisez les filtres !</div> <div className="titre1"> Utilisez les filtres !</div>
@ -8294,6 +8922,24 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
backgroundColor: '#566573', backgroundColor: '#566573',
color: 'white', 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" className="datagridclass"
onRowDoubleClick={(newSelectionModel) => { onRowDoubleClick={(newSelectionModel) => {
setgridline_id(newSelectionModel.row.id);
setaddOneSession("0"); setaddOneSession("0");
setEdite_session("0"); setEdite_session("0");
//handleClick_edit_session_From_Line(newSelectionModel.row.id); //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={{ components={{
Toolbar: GridToolbar, Toolbar: GridToolbar,
}} }}
sx={datagridSx} //sx={datagridSx}
getCellClassName={(params) => { getCellClassName={(params) => {
//field === 'distantiel' //field === 'distantiel'
if (params.field === 'distantiel' && String(params.value) === "1") { 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'; 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") && <div style={{ "border": "None" }}> {String(submenu) === String("detail_session") && <div style={{ "border": "None" }}>
{String(addOneSession) !== "1" && <div className="session_data" onChange={IssessionChanged}> {String(addOneSession) !== "1" && <div className="session_data" onChange={IssessionChanged}>
<div className="div_row" style={{ "marginTop": "1rem", "marginBottom": "1rem" }}>
cherif convention
<div className="div_row_gauche">
&nbsp;
</div>
<div className="div_row_droite">
<div style={{ "marginLeft": "2rem", "marginRight": "2rem" }}>
<label className="bton_image_class" onClick={(e) => {
Get_List_Stagiaire_Conventions();
setselected_convention_id();
setselected_convention_type();
setselected_convention_email_destinataire_prod();
setselected_convention_email_test();
///Get_Stagiaire_List_Email_Com();
setDialog_convention_open(true);
}} >Editer une convention</label><br />
</div>
</div>
</div>
<div className="session_caract"> Formation <br /> <div className="session_caract"> Formation <br />
<TextField <TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }} sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
@ -10228,7 +10914,7 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
<Popup <Popup
trigger={ trigger={
<Button variant="outlined" <Button variant="outlined"
className="detail_class_submenu bton_add_session bton_add_session_create_automatic" style={{"width":"40%"}} 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 id='menu_import_participant' name='menu_import_participant'>Création automatique
<FcMultipleSmartphones /> <FcMultipleSmartphones />
</Button> </Button>
@ -12380,13 +13066,13 @@ Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenair
</div>} </div>}
{String(submenu) === String("historique") && <div style={{ "border": "None" }}> {String(submenu) === String("historique") && <div style={{ "border": "None" }}>
<Module_Historique_Action related_collection="session_formation" <Module_Historique_Action related_collection="session_formation"
related_collection_recid={selected_session_id} related_collection_recid={selected_session_id}
read_access={props.read_access} read_access={props.read_access}
write_access={props.write_access} /> write_access={props.write_access} />
</div>} </div>}
</div> </div>

View File

@ -74,7 +74,7 @@ const DisplayPartnerStagiaires = (props) => {
{ value: 'certif', label: 'Certification' } { 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_model1, setdatagrid_columns_size_model1] = useState(200);
const [datagrid_columns_size_model2, setdatagrid_columns_size_model2] = useState(80); 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: 'id', headerName: 'id', hide: true },
{ field: 'class_internal_url', headerName: 'class_internal_url', hide: true, editable: false }, { 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: 'nom', headerName: 'Nom', minWidth: 150, flex:1, hide: false, editable: false, editable: false },
{ field: 'prenom', headerName: 'prenom', width: 150, hide: false, editable: false }, { field: 'prenom', headerName: 'Prénom', minWidth: 150, flex:1, hide: false, editable: false },
{ field: 'employeur', headerName: 'Employeur', width: 150, hide: true, 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, field: 'status', headerName: 'Statut', hide: false, width: datagrid_columns_size_model2,
valueFormatter: (params) => { valueFormatter: (params) => {
@ -104,8 +105,8 @@ const DisplayPartnerStagiaires = (props) => {
return "???"; return "???";
}, },
}, },
{ field: 'code_session', headerName: 'Code session', hideable: true, editable: false }, { field: 'code_session', headerName: 'Code session', hideable: true, editable: false, minWidth: 150, flex:1},
{ field: 'title', headerName: 'Formation', width: datagrid_columns_size_model1, align: "center", hideable: true, editable: false }, { 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, field: 'distantiel', headerName: 'Distantiel', hideable: false, width: datagrid_columns_size_model2,
valueFormatter: (params) => { 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: 'domaine', headerName: 'Domaine', minWidth: 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_debut', headerName: 'Du', minWidth: 90, maxWidth:100, flex:1, hideable: true, editable: false },
{ field: 'date_fin', headerName: 'Au', width: datagrid_columns_size_model1, 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: 'class_internal_url', headerName: 'class_internal_url', hide: true, editable: false },
{ {
field: "Detail", headerName: 'Voir detail', field: "Detail", headerName: 'Voir detail',
@ -141,6 +142,7 @@ const DisplayPartnerStagiaires = (props) => {
<Button <Button
onClick={(event) => { onClick={(event) => {
setgridline_id(cellValues.row.id);
handleClick_edit_session_From_Line(cellValues.row.id); handleClick_edit_session_From_Line(cellValues.row.id);
}} }}
> >
@ -152,7 +154,7 @@ const DisplayPartnerStagiaires = (props) => {
} }
}, },
{ {
field: 'Action', headerName: 'Action', hide: false, width: 200, field: 'Action', headerName: 'Action', hide: false, minWidth: 100, maxWidth:150, flex:1,
renderCell: (cellValues) => { renderCell: (cellValues) => {
return ( return (
@ -4231,6 +4233,8 @@ const DisplayPartnerStagiaires = (props) => {
}) })
} }
// -- convention
const [Dialog_convention_message, setDialog_convention_message] = React.useState(false); const [Dialog_convention_message, setDialog_convention_message] = React.useState(false);
const [Dialog_convention_open, setDialog_convention_open] = React.useState(false); const [Dialog_convention_open, setDialog_convention_open] = React.useState(false);
function Dialog_convention_handle_change_participant_session(message) { function Dialog_convention_handle_change_participant_session(message) {
@ -5608,6 +5612,19 @@ const DisplayPartnerStagiaires = (props) => {
fontSize: 14 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',
},
}} }}
> >
<DataGrid <DataGrid
@ -5654,6 +5671,7 @@ const DisplayPartnerStagiaires = (props) => {
className="datagridclass" className="datagridclass"
onRowDoubleClick={(newSelectionModel) => { onRowDoubleClick={(newSelectionModel) => {
setgridline_id(newSelectionModel.row.id);
handleClick_edit_session_From_Line(newSelectionModel.row.id); handleClick_edit_session_From_Line(newSelectionModel.row.id);
}} }}
@ -5699,6 +5717,17 @@ const DisplayPartnerStagiaires = (props) => {
if (String(params.row.status) === "1") { if (String(params.row.status) === "1") {
return 'line--statut--inscrit'; 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';
}
}} }}

View File

@ -236,16 +236,16 @@ const DistplayPartnerTraningsPage = (props) => {
{ field: 'lms_class_code', headerName: 'lms_class_code', hide: true }, { field: 'lms_class_code', headerName: 'lms_class_code', hide: true },
{ field: 'zone_diffusion', headerName: 'zone_diffusion', hide: true }, { field: 'zone_diffusion', headerName: 'zone_diffusion', hide: true },
{ field: 'internal_url', headerName: 'internal_url', hide: true }, { field: 'internal_url', headerName: 'internal_url', hide: true },
{ field: 'external_code', headerName: 'Code Formation', flex: 1, hideable: false, resizable: true }, { field: 'external_code', headerName: 'Code Formation', hideable: false, minWidth: 100, flex: 1, maxWidth: 250, editable: false },
{ field: 'title', headerName: 'Titre', flex: 1, hideable: false, }, { field: 'title', headerName: 'Titre', flex: 1, hideable: false, minWidth: 250, flex: 1, editable: false },
{ field: 'domain', headerName: 'Domaine', width: datagrid_columns_size_model1, hideable: true, }, { field: 'domain', headerName: 'Domaine', minWidth: datagrid_columns_size_model1, hideable: true, },
{ field: 'metier', headerName: 'Métier', width: datagrid_columns_size_model1, hideable: true, hide: true }, { field: 'metier', headerName: 'Métier', minWidth: datagrid_columns_size_model1, hideable: true, hide: true },
{ field: 'url', headerName: 'lien', width: datagrid_columns_size_model1, hideable: true, hide: true }, { field: 'url', headerName: 'lien', minWidth: datagrid_columns_size_model1, hideable: true, hide: true },
{ field: 'description', headerName: 'Description', hide: true, resizable: true, with: 1 }, { field: 'description', headerName: 'Description', hide: true, resizable: true, minWidth: 100, maxWidth: 150, flex: 1 },
{ field: 'price', headerName: 'Prix', width: datagrid_columns_size_model2, align: "center", resizable: true, hide: ismobilephone_columns_hide }, { field: 'price', headerName: 'Prix', minWidth: datagrid_columns_size_model2, align: "center", resizable: true, hide: ismobilephone_columns_hide },
{ {
field: 'published', headerName: 'Publié', width: datagrid_columns_size_model2, align: "center", resizable: true, field: 'published', headerName: 'Publié', minWidth: datagrid_columns_size_model2, align: "center", resizable: true,
valueFormatter: (params) => { valueFormatter: (params) => {
if (String(params.value) === "0") if (String(params.value) === "0")
return "Non"; return "Non";
@ -1470,7 +1470,7 @@ const DistplayPartnerTraningsPage = (props) => {
{String(myApiResponse) === "True" && {String(myApiResponse) === "True" &&
<div style={{ height: "800px", width: '100%', paddingRight: '1px' }}> <div style={{ height: "800px", width: '100%', paddingRight: '1px' }}>
&nbsp; &nbsp;
{!createtraining && <div className='div_row' > {/*!createtraining && <div className='div_row' >
<Button variant="outlined" onClick={Createtraining} <Button variant="outlined" onClick={Createtraining}
className="detail_class_submenu bton_add_session" className="detail_class_submenu bton_add_session"
@ -1478,12 +1478,12 @@ const DistplayPartnerTraningsPage = (props) => {
<img src={add_plus} alt="ajout session" className="icon_plus" /> <img src={add_plus} alt="ajout session" className="icon_plus" />
</Button> </Button>
</div>} </div>*/}
<div className="session_data"> <div className="session_data">
<div style={{ "border": "None" }}> <div style={{ "border": "None" }}>
<Box <Box
sx={{ sx={{
height: "700px", height: "500px",
width: '100%', width: '100%',
paddingRight: '2px', paddingRight: '2px',
'& .cell--published': { '& .cell--published': {
@ -1581,6 +1581,17 @@ const DistplayPartnerTraningsPage = (props) => {
</Box> </Box>
</div> </div>
</div> </div>
<div className="div_row"> &nbsp; </div>
&nbsp;
{!createtraining && <div className='div_row' >
<Button variant="outlined" onClick={Createtraining}
className="detail_class_submenu bton_add_session"
id='menu_import_participant' name='menu_import_participant' style={{ "marginRight": "10px" }}>Formation &nbsp;
<img src={add_plus} alt="ajout session" className="icon_plus" />
</Button>
</div>}
</div>} </div>}
</div> </div>

View File

@ -46,6 +46,7 @@ import VisibilityOff from '@mui/icons-material/VisibilityOff';
import { Fab } from "@material-ui/core"; import { Fab } from "@material-ui/core";
import { IoMdAddCircle, IoIosRemoveCircleOutline } from "react-icons/io"; import { IoMdAddCircle, IoIosRemoveCircleOutline } from "react-icons/io";
import { AiTwotoneEdit, AiTwotoneSave } from "react-icons/ai"; import { AiTwotoneEdit, AiTwotoneSave } from "react-icons/ai";
import { ConsoleView } from "react-device-detect";
const Employes = (props) => { const Employes = (props) => {
@ -83,9 +84,23 @@ const Employes = (props) => {
const columns = [ const columns = [
{ field: '_id', headerName: '_id', hide: true }, { field: '_id', headerName: '_id', hide: true },
{ 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: 'civilite', headerName: 'Civilité', width: 90, hide: false,
{ field: 'prenom', headerName: 'prenom', flex: 1, 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, field: 'ismanager', headerName: 'Manager', width: 150, hide: false,
valueFormatter: (params) => { valueFormatter: (params) => {
@ -99,19 +114,7 @@ const Employes = (props) => {
}, },
}, },
{ field: 'telephone_mobile', headerName: 'Mobile', width: 150, hide: false, }, { 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: 'profil', headerName: 'profil', width: 150, hide: false, },
{ field: 'fonction', headerName: 'Fonction', 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 [display_detail_employe, setdisplay_detail_employe] = React.useState();
const [selected_id, setselected_id] = useState(""); const [selected_id, setselected_id] = useState("");
const [gridline_id, setgridline_id] = useState("");
const [selected_employe_email, setselected_employe_email] = useState(""); const [selected_employe_email, setselected_employe_email] = useState("");
function handleClick_edit_employee_From_Line(selected_row_id) { function handleClick_edit_employee_From_Line(selected_row_id) {
@ -4166,6 +4173,7 @@ const Employes = (props) => {
color: 'black', color: 'black',
}, },
/*"& .MuiDataGrid-virtualScrollerRenderZone": { /*"& .MuiDataGrid-virtualScrollerRenderZone": {
"& .MuiDataGrid-row": { "& .MuiDataGrid-row": {
"&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" } "&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" }
@ -4177,6 +4185,19 @@ const Employes = (props) => {
fontSize: 14 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',
},
}} }}
> >
<DataGrid <DataGrid
@ -4207,6 +4228,7 @@ const Employes = (props) => {
fonction: JSON.parse(item).fonction, fonction: JSON.parse(item).fonction,
ismanager: JSON.parse(item).ismanager, ismanager: JSON.parse(item).ismanager,
} }
))} ))}
@ -4215,6 +4237,7 @@ const Employes = (props) => {
className="datagridclass" className="datagridclass"
onRowDoubleClick={(newSelectionModel) => { onRowDoubleClick={(newSelectionModel) => {
setgridline_id(newSelectionModel.row.id);
handleClick_edit_employee_From_Line(newSelectionModel.row.id); handleClick_edit_employee_From_Line(newSelectionModel.row.id);
}} }}
@ -4227,6 +4250,12 @@ const Employes = (props) => {
//sx={datagridSx} //sx={datagridSx}
getCellClassName={(params) => { getCellClassName={(params) => {
//field === 'distantiel' //field === 'distantiel'
//console.log(" ### params.field = ", params.field)
if (params.field === 'distantiel' && String(params.value) === "1") { if (params.field === 'distantiel' && String(params.value) === "1") {
return 'cell--distantiel'; return 'cell--distantiel';
} }
@ -4250,6 +4279,16 @@ const Employes = (props) => {
}} }}
getRowClassName={(params) => { 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") { if (String(params.row.status) === "-1") {
return 'line--statut--annule'; return 'line--statut--annule';

View File

@ -65,6 +65,10 @@ const Partner_Client = (props) => {
const [rows_list_clients, setrows_list_clients] = useState([]); const [rows_list_clients, setrows_list_clients] = useState([]);
const [selectionModel, setSelectionModel] = React.useState([]); const [selectionModel, setSelectionModel] = React.useState([]);
const [selected_id, setselected_id] = useState("");
const columns_clients = [ const columns_clients = [
{ field: 'id', headerName: 'id', hide: true }, { field: 'id', headerName: 'id', hide: true },
{ field: '_id', headerName: '_id', hide: true }, { field: '_id', headerName: '_id', hide: true },
@ -92,56 +96,56 @@ const Partner_Client = (props) => {
return ( return (
<Popup <Popup
trigger={<Button trigger={<Button
onClick={(event) => { onClick={(event) => {
// handleClick_delete(event, cellValues); // handleClick_delete(event, cellValues);
}} }}
>
<CiTrash />
</Button>}
modal
nested
position="center center"
> >
<CiTrash /> {close => (
<div>
<button className="gest_close" onClick={close}>
&times;
</button>
<div className="gest_header"> MySy Information </div>
<div className="gest_content">
{' '}
</Button>} En confirmant cette opération, le client sera <i><font color="red"> définitivement supprimé</font></i>. <br />
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, le client sera <i><font color="red"> définitivement supprimé</font></i>. <br />
Avant, assurez-vous de n'avoir aucun stagiaire, un devis ou commande rattaché au client. Avant, assurez-vous de n'avoir aucun stagiaire, un devis ou commande rattaché au client.
</div>
<div className="gest_actions">
<div style={{ "width": "45%", "float": "left" }}>
<button className="gest_bton_popup" onClick={(event) => {
handleClick_supprimer(event, cellValues);
//console.log('modal closed ');
close();
}}> Valider </button>
</div> </div>
<div style={{ "width": "45%", "float": "right" }}> <div className="gest_actions">
<button <div style={{ "width": "45%", "float": "left" }}>
className="gest_bton_popup" <button className="gest_bton_popup" onClick={(event) => {
onClick={() => { handleClick_supprimer(event, cellValues);
//console.log('modal closed '); //console.log('modal closed ');
close(); close();
}} }}> Valider </button>
>
Annuler </div>
</button> <div style={{ "width": "45%", "float": "right" }}>
<button
className="gest_bton_popup"
onClick={() => {
//console.log('modal closed ');
close();
}}
>
Annuler
</button>
</div>
</div> </div>
</div> </div>
</div> )}
)} </Popup>
</Popup>
@ -379,12 +383,12 @@ const Partner_Client = (props) => {
height: 60, height: 60,
lineHeight: "59px !important" lineHeight: "59px !important"
} }
},*/ },
"& .MuiDataGrid-virtualScrollerRenderZone": { "& .MuiDataGrid-virtualScrollerRenderZone": {
"& .MuiDataGrid-row": { "& .MuiDataGrid-row": {
"&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" } "&:nth-child(2n)": { backgroundColor: "rgba(235, 235, 235, .7)" }
} }
}, },*/
"& .MuiDataGrid-columnHeaders": { "& .MuiDataGrid-columnHeaders": {
backgroundColor: "#c8cfd5", backgroundColor: "#c8cfd5",
color: "black", color: "black",
@ -399,6 +403,10 @@ const Partner_Client = (props) => {
var line = JSON.parse(rows_list_clients[selected_row_id]); var line = JSON.parse(rows_list_clients[selected_row_id]);
var clientmail = String(line.email); var clientmail = String(line.email);
var client_id = String(line._id);
setselected_id(client_id);
setClient_email(clientmail); setClient_email(clientmail);
setEdite_Client("1"); setEdite_Client("1");
@ -438,6 +446,8 @@ const Partner_Client = (props) => {
}); });
} }
const [gridline_id, setgridline_id] = useState("");
const myRef_detail_client = useRef(null) const myRef_detail_client = useRef(null)
return ( return (
@ -623,7 +633,24 @@ const Partner_Client = (props) => {
fontWeight: 'bold', 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={{ components={{
Toolbar: GridToolbar, Toolbar: GridToolbar,
}} }}
sx={datagridSx} //sx={datagridSx}
onSelectionModelChange={(newSelectionModel) => { onSelectionModelChange={(newSelectionModel) => {
setSelectionModel(newSelectionModel); setSelectionModel(newSelectionModel);
if (newSelectionModel.length === 1){ /* if (newSelectionModel.length === 1){
handleClick_edit_session_From_Line(newSelectionModel); handleClick_edit_session_From_Line(newSelectionModel);
} }
else{ else{
setEdite_Client(); setEdite_Client();
} }*/
}} }}
selectionModel={selectionModel} 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';
}
}}
/> />
</Box> </Box>
<br /> <br />
@ -715,7 +761,8 @@ const Partner_Client = (props) => {
<div className="titre1"> Detail client : {Client_email}</div> <div className="titre1"> Detail client : {Client_email}</div>
<AddParnerClient client_mail={Client_email} close_detail_client={close_detail_client} father_scroll_to_top={father_scroll_to_top} /> <AddParnerClient client_mail={Client_email} close_detail_client={close_detail_client} father_scroll_to_top={father_scroll_to_top}
client_id={selected_id} />
</div>} </div>}
@ -723,7 +770,7 @@ const Partner_Client = (props) => {
<div className="titre1"> Detail client : {Client_email}</div> <div className="titre1"> Detail client : {Client_email}</div>
<div ref={myRef_add_client}> &nbsp;</div> <div ref={myRef_add_client}> &nbsp;</div>
<AddParnerClient client_mail={Client_email} close_detail_client={close_detail_client} new_customer="1" <AddParnerClient client_mail={Client_email} close_detail_client={close_detail_client} new_customer="1" client_id={selected_id}
Get_List_Partner_Clients={Get_List_Partner_Clients} father_scroll_to_top={father_scroll_to_top} /> Get_List_Partner_Clients={Get_List_Partner_Clients} father_scroll_to_top={father_scroll_to_top} />
</div>} </div>}

View File

@ -2939,7 +2939,7 @@ const Partner_Commande = (props) => {
} }
const [isLoading, setLoading] = useState(); const [isLoading, setLoading] = useState();
const [gridline_id, setgridline_id] = useState("");
return ( return (
@ -3891,6 +3891,19 @@ const Partner_Commande = (props) => {
fontSize: 14 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',
},
}} }}
> >
<DataGrid <DataGrid
@ -3970,6 +3983,17 @@ const Partner_Commande = (props) => {
if (String(params.row.status) === "1") { if (String(params.row.status) === "1") {
return 'line--statut--inscrit'; 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';
}
}} }}
@ -5092,7 +5116,7 @@ const Partner_Commande = (props) => {
onRowDoubleClick={(newSelectionModel) => { onRowDoubleClick={(newSelectionModel) => {
handleClick_edit_order_From_Line(newSelectionModel.row.id); handleClick_edit_order_From_Line(newSelectionModel.row.id);
}} }}
rowsPerPageOptions={[10]} rowsPerPageOptions={[10]}
//disableSelectionOnClick //disableSelectionOnClick

View File

@ -1742,6 +1742,8 @@ const Partner_Configuration_Jours_Travail = (props) => {
}, []) }, [])
const [gridline_id, setgridline_id] = useState("");
return ( return (
<div className="partner_configuration_jours_travail"> <div className="partner_configuration_jours_travail">
{isLoading && <div className="loader-container"> {isLoading && <div className="loader-container">

View File

@ -375,7 +375,7 @@ const Partner_Configuration_Technique = (props) => {
}) })
} }
const [gridline_id, setgridline_id] = useState("");
return ( return (
<div className="partner_configuration_technique"> <div className="partner_configuration_technique">
@ -537,14 +537,27 @@ const Partner_Configuration_Technique = (props) => {
fontSize: 14 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',
},
}} }}
> >
<DataGrid <DataGrid
checkboxSelection checkboxSelection
onSelectionModelChange={(newSelectionModel) => { onSelectionModelChange={(newSelectionModel) => {
setSelectionModel(newSelectionModel); setSelectionModel(newSelectionModel);
if (newSelectionModel.length === 1) /*if (newSelectionModel.length === 1)
handleClick_edit_config_From_Line(newSelectionModel); handleClick_edit_config_From_Line(newSelectionModel);*/
if (newSelectionModel.length !== 1) { if (newSelectionModel.length !== 1) {
setp_detail_config_valeur(); setp_detail_config_valeur();
setp_detail_config_point(); setp_detail_config_point();
@ -571,6 +584,14 @@ const Partner_Configuration_Technique = (props) => {
pageSize={10} pageSize={10}
className="datagridclass" className="datagridclass"
onRowDoubleClick={(newSelectionModel) => {
setgridline_id(newSelectionModel.row.id);
handleClick_edit_config_From_Line(newSelectionModel.row.id);
}}
rowsPerPageOptions={[10]} rowsPerPageOptions={[10]}
//disableSelectionOnClick //disableSelectionOnClick
components={{ components={{
@ -610,6 +631,17 @@ const Partner_Configuration_Technique = (props) => {
if (String(params.row.status) === "1") { if (String(params.row.status) === "1") {
return 'line--statut--inscrit'; 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';
}
}} }}

View File

@ -45,7 +45,7 @@ const Partner_Facture = (props) => {
const [rows_invoice_lines, setrows_invoice_lines] = useState([]); const [rows_invoice_lines, setrows_invoice_lines] = useState([]);
const [selectionModel_invoice_lines, setselectionModel_invoice_lines] = React.useState([]); const [selectionModel_invoice_lines, setselectionModel_invoice_lines] = React.useState([]);
const [gridline_id, setgridline_id] = useState("");
var date_today_90j = new Date(); var date_today_90j = new Date();
date_today_90j.setDate(date_today_90j.getDate() + 90); date_today_90j.setDate(date_today_90j.getDate() + 90);

View File

@ -1904,7 +1904,8 @@
.bton_add_session { .bton_add_session {
background: #c8cfd5; background: #c8cfd5;
color: black; color: black;
width: 30% !important; width: 40% !important;
margin-left: 10px;
} }
.bton_import_excel { .bton_import_excel {

View File

@ -457,7 +457,7 @@
} }
.icon_plus { .icon_plus {
width: 8%; width: 6%;
} }
.session_data { .session_data {
@ -468,6 +468,12 @@
border-radius: 10px; border-radius: 10px;
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
}
.bton_add_session {
background: #c8cfd5;
color: black;
width: 100%;
} }
} }
@ -888,7 +894,7 @@
} }
.icon_plus { .icon_plus {
width: 8%; width: 6%;
} }
.session_data { .session_data {
@ -900,6 +906,12 @@
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
}
.bton_add_session {
background: #c8cfd5;
color: black;
width: 50%;
} }
} }
@ -1332,6 +1344,12 @@
border-radius: 10px; border-radius: 10px;
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
}
.bton_add_session {
background: #c8cfd5;
color: black;
width: 40%;
} }
} }
@ -1749,7 +1767,7 @@
} }
.icon_plus { .icon_plus {
width: 10%; width: 8%;
} }
.session_data { .session_data {
@ -1760,6 +1778,12 @@
border-radius: 10px; border-radius: 10px;
margin-top: 10px; margin-top: 10px;
margin-bottom: 10px; margin-bottom: 10px;
}
.bton_add_session {
background: #c8cfd5;
color: black;
width: 20% !important;
} }
} }