22/05/23 - 23h

recette2
cherif 2023-05-22 22:27:30 +02:00
parent 397afe0652
commit 59312c18c9
9 changed files with 75796 additions and 30 deletions

75629
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -15,6 +15,7 @@
"@mantine/hooks": "^4.2.10", "@mantine/hooks": "^4.2.10",
"@mantine/rte": "^4.2.10", "@mantine/rte": "^4.2.10",
"@material-ui/core": "^4.12.4", "@material-ui/core": "^4.12.4",
"@material/tooltip": "^14.0.0",
"@mui/icons-material": "^5.4.2", "@mui/icons-material": "^5.4.2",
"@mui/material": "^5.4.2", "@mui/material": "^5.4.2",
"@mui/x-data-grid": "^5.5.1", "@mui/x-data-grid": "^5.5.1",
@ -42,6 +43,7 @@
"gatsby-plugin-cookie-gdpr-axeptio": "^1.0.2", "gatsby-plugin-cookie-gdpr-axeptio": "^1.0.2",
"google-map-react": "^2.1.10", "google-map-react": "^2.1.10",
"html-react-parser": "^2.0.0", "html-react-parser": "^2.0.0",
"install": "^0.13.0",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"js-file-download": "^0.4.12", "js-file-download": "^0.4.12",
"js-video-url-parser": "^0.5.1", "js-video-url-parser": "^0.5.1",
@ -49,6 +51,7 @@
"mui-daterange-picker": "^1.0.5", "mui-daterange-picker": "^1.0.5",
"next": "^12.0.10", "next": "^12.0.10",
"next-link": "^2.0.0", "next-link": "^2.0.0",
"npm": "^9.6.7",
"popups": "^1.1.3", "popups": "^1.1.3",
"powerbi-client": "^2.19.1", "powerbi-client": "^2.19.1",
"powerbi-client-react": "^1.3.3", "powerbi-client-react": "^1.3.3",
@ -111,6 +114,7 @@
"react-swipeable-views": "^0.14.0", "react-swipeable-views": "^0.14.0",
"react-time-picker": "^4.5.0", "react-time-picker": "^4.5.0",
"react-toastify": "^9.0.0", "react-toastify": "^9.0.0",
"react-tooltip": "^5.13.1",
"react-use-cookie": "^1.3.0", "react-use-cookie": "^1.3.0",
"react-video-js-player": "^1.1.1", "react-video-js-player": "^1.1.1",
"reactjs-popup": "^2.0.5", "reactjs-popup": "^2.0.5",

View File

@ -22,6 +22,9 @@ import { IoArrowUndoCircle } from "react-icons/io5";
import { GrUserAdmin, GrOrderedList } from "react-icons/gr"; import { GrUserAdmin, GrOrderedList } from "react-icons/gr";
import parse from 'html-react-parser'; import parse from 'html-react-parser';
import 'react-tooltip/dist/react-tooltip.css'
import { Tooltip } from 'react-tooltip'
import GestionAdministrative from "./GestionAdministrative"; import GestionAdministrative from "./GestionAdministrative";
const AddClassManual = (props) => { const AddClassManual = (props) => {
@ -32,6 +35,7 @@ const AddClassManual = (props) => {
const [mypublished, setmypublished] = useState(""); const [mypublished, setmypublished] = useState("");
const [mydistance, setmydistance] = useState(""); const [mydistance, setmydistance] = useState("");
const [mytrainingsupport, setmytrainingsupport] = useState("n/a"); const [mytrainingsupport, setmytrainingsupport] = useState("n/a");
const [mytrainingdurationunit, setmytrainingdurationunit] = useState("");
const [mycpf, setmycpf] = useState(""); const [mycpf, setmycpf] = useState("");
const [mycertif, setmycertif] = useState(""); const [mycertif, setmycertif] = useState("");
const [importmessage, setimportmessage] = useState(""); const [importmessage, setimportmessage] = useState("");
@ -69,6 +73,15 @@ const AddClassManual = (props) => {
} }
const handleChangeDurationUnit = (event) => {
const name = event.target.name;
const value = event.target.value;
setmytrainingdurationunit(value);
setdatamodification("1");
}
const handleChangecpf = (event) => { const handleChangecpf = (event) => {
const name = event.target.name; const name = event.target.name;
const value = event.target.value; const value = event.target.value;
@ -149,6 +162,30 @@ const AddClassManual = (props) => {
]; ];
const duration_unit_list = [
{
value: 'heure',
label: 'Heures',
},
{
value: 'jour',
label: 'Jours',
},
{
value: 'semaine',
label: 'Semaines',
},
{
value: 'mois',
label: 'Mois',
},
{
value: 'user_rythme',
label: 'Rythme stagiaire',
}
];
const publiee = [ const publiee = [
{ {
@ -164,9 +201,6 @@ const AddClassManual = (props) => {
function handleOnClose(event) { function handleOnClose(event) {
setShowModal(false); setShowModal(false);
} }
@ -374,6 +408,15 @@ const AddClassManual = (props) => {
setmytrainingsupport("n/a"); setmytrainingsupport("n/a");
} }
if (mylocaltraining.duration_unit) {
setmytrainingdurationunit(mylocaltraining.duration_unit);
//console.log(" ### duration_unit = ", mylocaltraining.duration_unit);
}
else {
setmytrainingdurationunit("");
}
if (mylocaltraining.certif) { if (mylocaltraining.certif) {
setmycertif(mylocaltraining.certif); setmycertif(mylocaltraining.certif);
@ -391,7 +434,7 @@ const AddClassManual = (props) => {
if (mylocaltraining.domaine) { if (mylocaltraining.domaine) {
setmytrainingdomaine(mylocaltraining.domaine); setmytrainingdomaine(mylocaltraining.domaine);
console.log(" ### mylocaltraining.domaine = ", mylocaltraining.domaine); //console.log(" ### mylocaltraining.domaine = ", mylocaltraining.domaine);
} }
else else
setmytrainingdomaine(""); setmytrainingdomaine("");
@ -399,7 +442,7 @@ const AddClassManual = (props) => {
if (mylocaltraining.metier) { if (mylocaltraining.metier) {
setmytrainingmetier(mylocaltraining.metier); setmytrainingmetier(mylocaltraining.metier);
console.log(" ### mylocaltraining.metier = ", mylocaltraining.metier); //console.log(" ### mylocaltraining.metier = ", mylocaltraining.metier);
} }
else else
setmytrainingmetier(""); setmytrainingmetier("");
@ -656,6 +699,7 @@ const AddClassManual = (props) => {
formData.append('distantiel', distentiel); formData.append('distantiel', distentiel);
formData.append('price', price); formData.append('price', price);
formData.append('duration', duree); formData.append('duration', duree);
formData.append('duration_unit', mytrainingdurationunit);
formData.append('url', url); formData.append('url', url);
formData.append('class_inscription_url', class_inscription_url); formData.append('class_inscription_url', class_inscription_url);
formData.append('mots_cle', mots_cle); formData.append('mots_cle', mots_cle);
@ -1369,7 +1413,7 @@ const AddClassManual = (props) => {
<TextField <TextField
name="duree" name="duree"
label="Duree (jour)" label="Duree"
type="number" type="number"
InputLabelProps={{ InputLabelProps={{
shrink: true, shrink: true,
@ -1378,6 +1422,32 @@ const AddClassManual = (props) => {
className="disabled_style" className="disabled_style"
/> />
</div> </div>
<Tooltip id="my-tooltip11" />
<a data-tooltip-id="my-tooltip11" data-tooltip-content="Les durée autorisées sont : 'heure', 'jour', 'semaine', 'mois', 'annee', 'rythme participant'">
<div className="training_caract">
<TextField
name="duration_unit"
id="duration_unit"
select
label="Unité de durée"
value={mytrainingdurationunit}
InputLabelProps={{
shrink: true,
}}
onChange={handleChangeDurationUnit}
disabled={false}
className="disabled_style"
>
{duration_unit_list.map((option) => (
<MenuItem key={option.value} value={option.value} >
{option.label} &nbsp; <br />
</MenuItem>
))}
</TextField>
</div>
</a>
<div className="training_caract"> <div className="training_caract">
<TextField <TextField

View File

@ -1172,14 +1172,18 @@ const DisplayDetailClass_new_v2 = (props) => {
</div> </div>
{String(DetailTraining["price"]) && String(DetailTraining["price"]) === String("0") &&
<div className="mob_price">Gratuit
</div>
}
{DetailTraining["price"] && (!DetailTraining.business_prices || Object.keys(DetailTraining.business_prices).length <= 0) {String(DetailTraining["price"]) && String(DetailTraining["price"]) !== String("0") && String(DetailTraining["price"]) === String("0") && (!DetailTraining.business_prices || Object.keys(DetailTraining.business_prices).length <= 0)
&& &&
<div className="mob_price"> <div className="mob_price">
{String(DetailTraining["price"])} HT {String(DetailTraining["price"])} HT
</div>} </div>}
{DetailTraining["price"] && DetailTraining.business_prices && Object.keys(DetailTraining.business_prices).length > 0 {String(DetailTraining["price"]) && String(DetailTraining["price"]) !== String("0") && DetailTraining.business_prices && Object.keys(DetailTraining.business_prices).length > 0
&& <div className="mob_price"> && <div className="mob_price">
<nav className="discounted_price">{String(DetailTraining.business_prices[0].discounted_price)} HT</nav> <nav className="discounted_price">{String(DetailTraining.business_prices[0].discounted_price)} HT</nav>
@ -1263,10 +1267,17 @@ const DisplayDetailClass_new_v2 = (props) => {
Durée : Durée :
</div> </div>
{String(DetailTraining["duration_unit"]) !== "user_rythme" &&
<div className="mob_caracteristic_list_title_desc_desc"> <div className="mob_caracteristic_list_title_desc_desc">
{DetailTraining["duration"]} &nbsp; {DetailTraining["duration_unit"]} (s) {DetailTraining["duration"]} &nbsp; {DetailTraining["duration_unit"]} (s)
</div> </div>
}
{String(DetailTraining["duration_unit"]) === "user_rythme" &&
<div className="mob_caracteristic_list_title_desc_desc">
A votre rythme
</div>
}
</div> </div>
@ -2002,10 +2013,16 @@ const DisplayDetailClass_new_v2 = (props) => {
<div className="block_sticky_info"> <div className="block_sticky_info">
{DetailTraining["price"] && (!DetailTraining.business_prices || Object.keys(DetailTraining.business_prices).length <= 0)
{String(DetailTraining["price"]) && String(DetailTraining["price"]) === String("0") &&
<div className="block_sticky_info_price">Gratuit
</div>
}
{String(DetailTraining["price"]) && String(DetailTraining["price"]) !== String("0") && (!DetailTraining.business_prices || Object.keys(DetailTraining.business_prices).length <= 0)
&& <div className="block_sticky_info_price"> {String(DetailTraining["price"])} HT </div>} && <div className="block_sticky_info_price"> {String(DetailTraining["price"])} HT </div>}
{DetailTraining["price"] && DetailTraining.business_prices && Object.keys(DetailTraining.business_prices).length > 0 {String(DetailTraining["price"]) && String(DetailTraining["price"]) !== String("0") && DetailTraining.business_prices && Object.keys(DetailTraining.business_prices).length > 0
&& <div className="block_sticky_info_price"> && <div className="block_sticky_info_price">
<nav className="discounted_price">{String(DetailTraining.business_prices[0].discounted_price)} HT</nav> <nav className="discounted_price">{String(DetailTraining.business_prices[0].discounted_price)} HT</nav>
@ -2084,12 +2101,19 @@ const DisplayDetailClass_new_v2 = (props) => {
<div className="block_sticky_info_caracteristique_list_title_desc_title"> <div className="block_sticky_info_caracteristique_list_title_desc_title">
Durée : Durée :
</div> </div>
{String(DetailTraining["duration_unit"]) !== "user_rythme" &&
<div className="block_sticky_info_caracteristique_list_title_desc_desc"> <div className="block_sticky_info_caracteristique_list_title_desc_desc">
{DetailTraining["duration"]} &nbsp; {DetailTraining["duration_unit"]} (s) {DetailTraining["duration"]} &nbsp; {DetailTraining["duration_unit"]} (s)
</div> </div>
}
{String(DetailTraining["duration_unit"]) === "user_rythme" &&
<div className="block_sticky_info_caracteristique_list_title_desc_desc">
A votre rythme
</div>
}
</div> </div>
</li> </li>

View File

@ -210,6 +210,11 @@ const DistplayPartnerTraningsPage = (props) => {
function Visualiser(event, cellValues) { function Visualiser(event, cellValues) {
// On ne visualise que les formations publiées
if( cellValues.row.published !== "1" ){
alert(" Vous devez publier la formation pour la visualiser ");
return;
}
window.open( window.open(
"/Display-Detail-formation/" + cellValues.row.internal_url, "/Display-Detail-formation/" + cellValues.row.internal_url,
'_blank' '_blank'

View File

@ -409,6 +409,16 @@ const Formation = (props) => {
{props.formation.duration} mois(s) {props.formation.duration} mois(s)
</div>} </div>}
{String(props.formation.duration_unit) === "semaine" &&
<div className="criteres ftion_tab_droite">
{props.formation.duration} Sem (s)
</div>}
{String(props.formation.duration_unit) === "user_rythme" &&
<div className="criteres ftion_tab_droite">
A votre rythme
</div>}
</div> </div>
} }

View File

@ -32,6 +32,10 @@ import { PaymentElement } from '@stripe/react-stripe-js';
import Popup from 'reactjs-popup'; import Popup from 'reactjs-popup';
import SendIcon from '@mui/icons-material/Send'; import SendIcon from '@mui/icons-material/Send';
import 'react-tooltip/dist/react-tooltip.css'
import { Tooltip } from 'react-tooltip'
const stripePromise = loadStripe('pk_test_51LUUfAAbmaEugrFTI25uZBD3IFjbtaL6jUfRV83diDf7nco8worna4NGKhMHbPP71WCwT5EHFRdDNatxPrJWwgZ300kgH5EO4p'); const stripePromise = loadStripe('pk_test_51LUUfAAbmaEugrFTI25uZBD3IFjbtaL6jUfRV83diDf7nco8worna4NGKhMHbPP71WCwT5EHFRdDNatxPrJWwgZ300kgH5EO4p');
//const stripePromise_PROD = loadStripe('pk_live_51LUUfAAbmaEugrFTyfNe4Dj0vbxc5qXQqNs0rztjAKy8oSlc5EEQyJGjA8Z5kXmP2gvUMcYLUBYCIyWWzLCw59RY00PtGInkVf'); //const stripePromise_PROD = loadStripe('pk_live_51LUUfAAbmaEugrFTyfNe4Dj0vbxc5qXQqNs0rztjAKy8oSlc5EEQyJGjA8Z5kXmP2gvUMcYLUBYCIyWWzLCw59RY00PtGInkVf');
@ -561,8 +565,14 @@ function HebergementLms(props) {
id='menu_import_formation' name='menu_import_formation'>Choisir une image &nbsp; <br /> id='menu_import_formation' name='menu_import_formation'>Choisir une image &nbsp; <br />
</Button><br /> </Button><br />
<nav className="koUpdateData" style={{ "color": "orange" }}> <i> Important : Taille du logo : longueur entre 140px et 250px et largeur entre 60px et 150px, au format PNG <br /> <nav className="koUpdateData" style={{ "color": "orange" }}>
Le nom du fichier ne contient que des caractères alphanumériques </i> </nav> <Tooltip id="tooltip_2" />
<a data-tooltip-id="tooltip_2" data-tooltip-content="Respecter ces critères vous aide à avoir un meilleur affichage">
<i> Important : Taille du logo : longueur entre 140px et 250px et largeur entre 60px et 150px, au format PNG <br />
Le nom du fichier ne contient que des caractères alphanumériques </i>
</a>
</nav>
{logo_file_name && <nav className="okUpdateData"><i>{logo_file_name}</i></nav>} {logo_file_name && <nav className="okUpdateData"><i>{logo_file_name}</i></nav>}
<input type="file" <input type="file"
accept=".png" accept=".png"
@ -627,8 +637,14 @@ function HebergementLms(props) {
id='menu_import_formation' name='menu_import_formation'>Choisir une image bannière &nbsp; <br /> id='menu_import_formation' name='menu_import_formation'>Choisir une image bannière &nbsp; <br />
</Button><br /> </Button><br />
<nav className="koUpdateData" style={{ "color": "orange" }}> <i> Important : Taille de la bannière : longueur entre 1500px et 1930px et largeur entre 150px et 195px, au format PNG <br /> <nav className="koUpdateData" style={{ "color": "orange" }}>
Le nom du fichier ne contient que des caractères alphanumériques </i> </nav> <Tooltip id="tooltip_1" />
<a data-tooltip-id="tooltip_1" data-tooltip-content="Respecter ces critères vous aide à avoir un meilleur affichage">
<i> Important : Taille de la bannière : longueur entre 1500px et 1930px et largeur entre 150px et 195px, au format PNG <br />
Le nom du fichier ne contient que des caractères alphanumériques </i>
</a>
</nav>
{bg_file_name && <nav className="okUpdateData"><i>{bg_file_name}</i></nav>} {bg_file_name && <nav className="okUpdateData"><i>{bg_file_name}</i></nav>}
<input type="file" <input type="file"

View File

@ -26,7 +26,7 @@ import * as V from 'victory';
import { VictoryBar, VictoryLine, VictoryScatter, VictoryChart } from 'victory'; import { VictoryBar, VictoryLine, VictoryScatter, VictoryChart } from 'victory';
import Canvas from 'react-canvas-js' import Canvas from 'react-canvas-js'
import { ResponsiveContainer, LineChart, Line, BarChart, Bar, CartesianGrid, XAxis, YAxis, Tooltip, Legend } from 'recharts'; import { ResponsiveContainer, LineChart, Line, BarChart, Bar, CartesianGrid, XAxis, YAxis, Legend } from 'recharts';
import Chart from 'react-apexcharts' import Chart from 'react-apexcharts'
import 'react-date-range/dist/styles.css'; // main style file import 'react-date-range/dist/styles.css'; // main style file
@ -52,7 +52,8 @@ import {
useElements, useElements,
} from '@stripe/react-stripe-js'; } from '@stripe/react-stripe-js';
import 'react-tooltip/dist/react-tooltip.css'
import { Tooltip } from 'react-tooltip'
// pour le payement stripe : https://stripe.com/docs/payments/quickstart?client=react&lang=python // pour le payement stripe : https://stripe.com/docs/payments/quickstart?client=react&lang=python
const stripePromise = loadStripe('pk_test_51LUUfAAbmaEugrFTI25uZBD3IFjbtaL6jUfRV83diDf7nco8worna4NGKhMHbPP71WCwT5EHFRdDNatxPrJWwgZ300kgH5EO4p'); const stripePromise = loadStripe('pk_test_51LUUfAAbmaEugrFTI25uZBD3IFjbtaL6jUfRV83diDf7nco8worna4NGKhMHbPP71WCwT5EHFRdDNatxPrJWwgZ300kgH5EO4p');
@ -892,6 +893,11 @@ Cette fonction recuperer les stats des TOP 5 formations sur la periode saisie pa
<h2> cartouche formaion </h2> <h2> cartouche formaion </h2>
<Tooltip id="my-tooltip" />
<a data-tooltip-id="my-tooltip" data-tooltip-content="Hello world!">
info bull infobulle
</a>
<button onClick={loading} id="finalise"> loading .....</button> <button onClick={loading} id="finalise"> loading .....</button>
<div> <div>

View File

@ -24,6 +24,8 @@ const NotFound = () => {
<div className="div_mobile"> <div className="div_mobile">
<br/>
<br/>
<div className="nom_prenom"> Cette formation n'est pas active ou n'existe pas.</div> <div className="nom_prenom"> Cette formation n'est pas active ou n'existe pas.</div>
<div className="nom_prenom"> <a href={process.env.REACT_APP_BASE_URL}> Retour vers le moteur de recherche </a> </div> <div className="nom_prenom"> <a href={process.env.REACT_APP_BASE_URL}> Retour vers le moteur de recherche </a> </div>
</div> </div>