diff --git a/package-lock.json b/package-lock.json index d809984..80f6145 100644 --- a/package-lock.json +++ b/package-lock.json @@ -141,6 +141,7 @@ "react-search-autocomplete": "^7.2.2", "react-select": "^5.2.2", "react-share": "^4.4.1", + "react-signature-canvas": "^1.0.6", "react-simple-modal": "^1.1.5", "react-simple-modal-cb": "^2.0.4", "react-simple-star-rating": "^4.1.1", @@ -26807,6 +26808,20 @@ "react": "^16.3.0 || ^17.0.0 || ^18.0.0" } }, + "node_modules/react-signature-canvas": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.6.tgz", + "integrity": "sha512-NoMHomYu9HxFeLjUGbIeV9abPdWSROfFxFNDekGdwmmaIx+w5ziOEiU2C34X0Ao4GxFnwqyUy/BpYlA4lCD1CA==", + "dependencies": { + "signature_pad": "^2.3.2", + "trim-canvas": "^0.1.0" + }, + "peerDependencies": { + "prop-types": "^15.5.8", + "react": "0.14 - 18", + "react-dom": "0.14 - 18" + } + }, "node_modules/react-simple-modal": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/react-simple-modal/-/react-simple-modal-1.1.5.tgz", @@ -29560,6 +29575,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/signature_pad": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-2.3.2.tgz", + "integrity": "sha512-peYXLxOsIY6MES2TrRLDiNg2T++8gGbpP2yaC+6Ohtxr+a2dzoaqWosWDY9sWqTAAk6E/TyQO+LJw9zQwyu5kA==" + }, "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -31371,6 +31391,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-canvas": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz", + "integrity": "sha512-nd4Ga3iLFV94mdhW9JFMLpQbHUyCQuhFOD71PEAt1NjtMD5wbZctzhX8c3agHNybMR5zXD1XTGoIEWk995E6pQ==" + }, "node_modules/tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", @@ -53852,6 +53877,15 @@ "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.2.tgz", "integrity": "sha512-PVjOcvVOyIILrYoyGEpDN3vmYNLdy1CajSFNt4TDsVQC5KpTijDvWVoR+/7Rz2xT978D8/ZtFceXxzsPwZEDvw==" }, + "react-signature-canvas": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/react-signature-canvas/-/react-signature-canvas-1.0.6.tgz", + "integrity": "sha512-NoMHomYu9HxFeLjUGbIeV9abPdWSROfFxFNDekGdwmmaIx+w5ziOEiU2C34X0Ao4GxFnwqyUy/BpYlA4lCD1CA==", + "requires": { + "signature_pad": "^2.3.2", + "trim-canvas": "^0.1.0" + } + }, "react-simple-modal": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/react-simple-modal/-/react-simple-modal-1.1.5.tgz", @@ -56012,6 +56046,11 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "signature_pad": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/signature_pad/-/signature_pad-2.3.2.tgz", + "integrity": "sha512-peYXLxOsIY6MES2TrRLDiNg2T++8gGbpP2yaC+6Ohtxr+a2dzoaqWosWDY9sWqTAAk6E/TyQO+LJw9zQwyu5kA==" + }, "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", @@ -57403,6 +57442,11 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "trim-canvas": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/trim-canvas/-/trim-canvas-0.1.2.tgz", + "integrity": "sha512-nd4Ga3iLFV94mdhW9JFMLpQbHUyCQuhFOD71PEAt1NjtMD5wbZctzhX8c3agHNybMR5zXD1XTGoIEWk995E6pQ==" + }, "tryer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", diff --git a/package.json b/package.json index 69b95a8..ec04ec4 100644 --- a/package.json +++ b/package.json @@ -136,6 +136,7 @@ "react-search-autocomplete": "^7.2.2", "react-select": "^5.2.2", "react-share": "^4.4.1", + "react-signature-canvas": "^1.0.6", "react-simple-modal": "^1.1.5", "react-simple-modal-cb": "^2.0.4", "react-simple-star-rating": "^4.1.1", diff --git a/public/sample/template_import_formations.csv b/public/sample/template_import_formations.csv index 91863e5..5019787 100644 --- a/public/sample/template_import_formations.csv +++ b/public/sample/template_import_formations.csv @@ -1,8 +1,2 @@ external_code;titre;domaine;description;formateur;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;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; +MYSY_Demo_AP_v2;DEMO 1 PRATICIEN EN AROMATHERAPIE INTEGRATIVE_v2;FR_DOM01 ;DEMO 1 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;;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; diff --git a/public/sample/template_import_session_formation.csv b/public/sample/template_import_session_formation.csv index 651f451..d1fd302 100644 --- a/public/sample/template_import_session_formation.csv +++ b/public/sample/template_import_session_formation.csv @@ -1,6 +1,3 @@ formation_code_externe;code_session;date_debut;date_fin;nb_participant;adresse;code_postal;ville;pays;date_debut_inscription;date_fin_inscription;distanciel;presentiel;prix_session;session_status;lms_class_code;session_etape;formateur_email;titre;location_type;is_bpf -MySy_SGBD_01;401_SGDB_01;05/02/2024;09/02/2024;10;2 passage de la Providence 01;75001;Paris 1;France;03/01/2024;04/02/2024;1;0;1550;1;;0;emp_nom01@mysy.com;Ttre_01;intra;1 -MySy_SGBD_01;401_SGDB_02;20/03/2024;24/03/2024;15;3 passage de la Providence 03;75001;Paris 2;France;04/01/2024;19/03/2024;0;1;1550;1;;0;emp_nom03@mysy.com;Ttre_02;extra;1 -MYSY_Test_OP;401_OP_01;17/01/2024;21/01/2024;20;4 passage de la Providence 02;75002;Paris 3;France;05/01/2024;16/01/2024;1;0;2550;1;;0;emp_nom01@mysy.com;Ttre_03;;0 -MYSY_Test_AR;401_AR_01;09/02/2024;13/02/2024;10;5 passage de la Providence 04;75001;Paris 4;France;06/01/2024;08/02/2024;0;1;1000;1;;0;emp_nom03@mysy.com;Ttre_04;intra;0 -MYSY_Test_AR;401_AR_02;15/03/2024;19/03/2024;15;6 passage de la Providence 05;75003;Paris 5;France;07/01/2024;14/03/2024;1;1;1800;1;;0;testnom01@mysy.com;Ttre_05;extra;1 +MYSY_Demo_AP_v2;SESS_01_DEMO_AP_V2;05/07/2024;15/07/2024;10;2 passage de la Providence 01;75001;Paris 1;France;03/01/2024;05/07/2024;1;0;1550;1;;0;;Session Fev;intra;1 +MYSY_Demo_AP_v2;SESS_02_DEMO_AP_V2;20/08/2024;30/08/2024;15;3 passage de la Providence 03;75001;Paris 2;France;04/01/2024;20/08/2024;0;1;1550;1;;0;;Session Avril;extra;1 diff --git a/public/sample/template_import_session_formation_old.csv b/public/sample/template_import_session_formation_old.csv deleted file mode 100644 index 3428bc3..0000000 --- a/public/sample/template_import_session_formation_old.csv +++ /dev/null @@ -1,7 +0,0 @@ -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/public/sample/template_import_stagiaires.csv b/public/sample/template_import_stagiaires.csv index 18198b5..2eb99ed 100644 --- a/public/sample/template_import_stagiaires.csv +++ b/public/sample/template_import_stagiaires.csv @@ -1,7 +1,6 @@ formation_code_externe;code_session;client_rattachement_email;client_rattachement_nom;prenom;nom;employeur;telephone;email;adresse;code_postal;ville;pays;modefinancement;opco;status;prix -MYSY_Test_AP;AP_01;;;part 2;part nom2;employeur 2;10101;AP_01_line1@mysy.fr;adresse01;code_postal01;ville01;pays01;modefinancement;opco;0;150 -MYSY_Test_AP;AP_01;;;part 3;part nom3;employeur 3;10101;AP_01_line2@mysy.fr;adresse02;code_postal02;ville02;pays02;modefinancement;;1;180 -MYSY_Test_OP;OP_02;;;part 4;part nom4;employeur 4;10101;OP_02_line3@mysy.fr;adresse03;code_postal03;ville03;pays03;modefinancement;;0;110 -MYSY_Test_OP;OP_02;;;part 5;part nom5;employeur 5;10102;OP_02_line4@mysy.fr;adresse04;code_postal04;ville04;pays04;modefinancement;;0;1200 -MYSY_Test_AR;AR_01;;;part 6;part nom6;employeur 6;10103;AR_01_line5@mysy.fr;adresse05;code_postal05;ville05;pays05;modefinancement;;1;800 -MYSY_Test_AR;AR_02;;;part 7;part nom7;employeur 7;10104;AR_02_line6@mysy.fr;adresse06;code_postal06;ville06;pays06;modefinancement;;0;154 +MYSY_Demo_AP_v2;SESS_01_DEMO_AP_V2;;;part 2;part nom2;employeur 2;10101;mysytraining+apprenant1@gmail.com;adresse01;code_postal01;ville01;pays01;modefinancement;opco;0;1500 +MYSY_Demo_AP_v2;SESS_01_DEMO_AP_V2;mysytraining+client1@gmail.com ;Client 1 ;part 3;part nom3_client;employeur 3;10101;mysytraining+apprenant2@gmail.com;adresse02;code_postal02;ville02;pays02;modefinancement;;0;1500 +MYSY_Demo_AP_v2;SESS_01_DEMO_AP_V2;mysytraining+client1@gmail.com ;Client 1 ;part 4;part nom4_client;employeur 4;10101;mysytraining+apprenant3@gmail.com;adresse03;code_postal03;ville03;pays03;modefinancement;;0;1500 +MYSY_Demo_AP_v2;SESS_01_DEMO_AP_V2;mysytraining+client2@gmail.com;Client 2;part 5;part nom5_client;employeur 5;10101; mysylaplumedepierrot+01@gmail.com;adresse04;code_postal04;ville04;pays04;modefinancement;;0;1500 +MYSY_Demo_AP_v2;SESS_01_DEMO_AP_V2;mysytraining+client2@gmail.com;Client 2;part 6;part nom6_client;employeur 6;10101;mysylaplumedepierrot+02@gmail.com;adresse05;code_postal05;ville05;pays05;modefinancement;;0;1500 diff --git a/src/components/DisplayPartnerSession.js b/src/components/DisplayPartnerSession.js index 5032969..6a636ff 100644 --- a/src/components/DisplayPartnerSession.js +++ b/src/components/DisplayPartnerSession.js @@ -978,6 +978,23 @@ const DisplayPartnerSession = (props) => { ); } }, + { field: 'signature', headerName: 'Signature', Width: 150, hide: false, editable: false, + + + + renderCell: (cellValues) => { + return ( + +
+ {cellValues.row.signature && } + +
+ + ); + }, + + }, + ] @@ -8941,8 +8958,13 @@ const DisplayPartnerSession = (props) => { //form.append("token","K3cw63eKokKSbV4spjQ48SUNnfy80yrXfA"); const stored_cookie = getCookie('tokenmysypart'); form.append("token", stored_cookie); - form.append("tab_ids", liste_emargement_id); - var myurl = process.env.REACT_APP_API_URL + "myclass/api/EmargementMail/"; + form.append("tab_emargement_ids", liste_emargement_id); + form.append("session_id", selected_session_id); + //var myurl = process.env.REACT_APP_API_URL + "myclass/api/EmargementMail/"; + + var myurl = process.env.REACT_APP_API_URL + "myclass/api/Create_Emargement_Send_Email_From_Inscription/"; + + console.log(' ### form = ', form); setLoading(true); axios.post(myurl, form).then(res => { @@ -18996,6 +19018,7 @@ const DisplayPartnerSession = (props) => { statut: JSON.parse(item).statut, date_envoi: JSON.parse(item).date_envoi, date_emargement: JSON.parse(item).date_emargement, + signature: JSON.parse(item).mysy_manual_signature_img, } ))} diff --git a/src/components/Emarge_QR_Code.js b/src/components/Emarge_QR_Code.js index 247b337..06efc01 100644 --- a/src/components/Emarge_QR_Code.js +++ b/src/components/Emarge_QR_Code.js @@ -50,6 +50,7 @@ import { Document, Page } from 'react-pdf' import { gridClasses } from '@mui/x-data-grid'; import Link from '@mui/material/Link'; import { PiDotsThree } from "react-icons/pi"; +import SignatureCanvas from 'react-signature-canvas'; function Emarge_QR_Code() { @@ -251,13 +252,17 @@ function Emarge_QR_Code() { form.append("tab_emargement_ids", tab_emargement); form.append("is_present", local_option); + form.append("signature_img_selected", userimgclassprofil); + if (isimgclassSelectedfile) form.append('signature_img', isimgclassSelected); else form.append('signature_img', ""); - //console.log(" isimgclassSelected #### = ", isimgclassSelected); + console.log(" isimgclassSelected #### = ", isimgclassSelected); + + setLoading(true); axios.post(myurl, form).then(res => { @@ -270,7 +275,7 @@ function Emarge_QR_Code() { setSignature_E_Document_api("true"); alert(res.data.message); - + history.push("/"); //setDialog_Message_open(true); @@ -378,6 +383,14 @@ function Emarge_QR_Code() { const [userimgclassprofil, setuserimgclassprofil] = useState(); const [userimgclassprofilchanged, setuserimgclassprofilchanged] = useState(""); + + function reader(file, callback) { + const fr = new FileReader(); + fr.onload = () => callback(null, fr.result); + fr.onerror = (err) => callback(err); + fr.readAsDataURL(file); + } + const imglogoclasschangeHandler = (event) => { @@ -399,17 +412,115 @@ function Emarge_QR_Code() { setisimgclassSelected(event.target.files[0]); setisimgclassSelectedfile(true); - setuserimgclassprofil(URL.createObjectURL(event.target.files[0])); + //setuserimgclassprofil(URL.createObjectURL(event.target.files[0])); setuserimgclassprofilchanged("1"); + + + reader(event.target.files[0], (err, res) => { + console.log(res); // Base64 `data:image/...` String result. + setuserimgclassprofil(res); + }); + + + + }; const [isimgclassSaved, setisimgclassSaved] = useState(""); const [isimgclassSaved_message, setisimgclassSaved_message] = useState(""); + const [Dialog_SIGN_MANUSCRITE_open, setDialog_SIGN_MANUSCRITE_open] = React.useState(false); + + + const Dialog_SIGN_MANUSCRITE_handleClose = () => { + //alert(" Utiliser le bouton 'fermer' "); + //setOpen(false); + }; + + const Dialog_SIGN_MANUSCRITE_handleClose_buton = () => { + setDialog_SIGN_MANUSCRITE_open(false); + + }; + + + + const signatureCanvasRef = useRef(null); + + // API method examples + const checkIfEmpty = () => { + const isEmpty = signatureCanvasRef.current.isEmpty(); + + if (signatureCanvasRef) { + setuserimgclassprofil(signatureCanvasRef.current.toDataURL()); + setisimgclassSelected(signatureCanvasRef.current.toDataURL()) + } + + setuserimgclassprofilchanged("1"); + + Dialog_SIGN_MANUSCRITE_handleClose_buton(); + }; + + const clearCanvas = () => { + signatureCanvasRef.current.clear(); + }; + + const [pad_signature_img, setpad_signature_img] = React.useState(""); + + return (
+ + {/* POUR SIGNATURE MANUSCRITE */} + + + Signature Manuscrite + + +
+ +
+ +
+ + + +
+ + + +
+ + +
+
+ +
+
+ +
+ +
+ +
+
+ + {/* FIN POUR SIGNATURE MANUSCRITE */} + + {/* POUR SIGNATURE E-DOCUMENT */}
- {/*
+ {/*
Télephone Charger une signature
- - {String(userimgclassprofilchanged) === "1" && } + + {isimgclassSelected && String(isimgclassSaved) === "0" && }
@@ -794,7 +908,7 @@ function Emarge_QR_Code() { Signature_E_Document(1); close(); }} - + > Valider
diff --git a/src/components/TestUrl_new.js b/src/components/TestUrl_new.js index 39c8a99..c0818a7 100644 --- a/src/components/TestUrl_new.js +++ b/src/components/TestUrl_new.js @@ -44,6 +44,7 @@ import ReactDOM from 'react-dom'; import Draggable from 'react-draggable'; +import SignatureCanvas from 'react-signature-canvas'; const locales = { 'en-US': enUS, @@ -576,6 +577,26 @@ const TestUrl_New = (props) => { const handleClose25 = () => { setContextMenu(null); }; + + const signatureCanvasRef = useRef(null); + + // API method examples + const checkIfEmpty = () => { + const isEmpty = signatureCanvasRef.current.isEmpty(); + console.log('Is signature pad empty?', isEmpty); + if (signatureCanvasRef) { + console.log(signatureCanvasRef); + setpad_signature_img(signatureCanvasRef.current.toDataURL()) + + } + }; + + const clearCanvas = () => { + signatureCanvasRef.current.clear(); + }; + + const [pad_signature_img, setpad_signature_img] = React.useState(""); + return (
@@ -622,7 +643,21 @@ const TestUrl_New = (props) => {

Page de test * testurl_new

parametres courseid = {courseid}, tabid = {tabid}
+

Signature padd

+ + + +
+ image signé : + + +

FIN Signature padd

I can now be moved around!