22/10/2023 - 18h00

recette2
cherif 2023-10-22 18:36:36 +02:00
parent 9a58edae93
commit de91f4b79b
3 changed files with 436 additions and 29 deletions

View File

@ -555,6 +555,7 @@ const Employes = (props) => {
Get_List_RH_Profils();
Get_Employee_Related_Target_Collection_Data();
Get_Partner_Object_Specific_Fields("ressource_humaine");
window.scrollTo({
top: 0,
@ -716,6 +717,7 @@ const Employes = (props) => {
const [employee_data_changed, setemployee_data_changed] = useState("");
const [employee_data_edit_mode, setemployee_data_edit_mode] = useState("");
const [GetAttendee_api, setGetAttendee_api] = useState();
const [GetAttendee_message, setGetAttendee_message] = useState();
const [GetAttendee_result, setGetAttendee_result] = useState();
@ -852,6 +854,41 @@ const Employes = (props) => {
setp_detail_resp_hierarchie_prenom("");
}
/*
* Update 22/10/2023 :
Gestion des champs spécifiques. ils commencent tous par 'my_'
*/
for (let i = 0; i < rows_champs_specifics.length; i++) {
var field_name = JSON.parse(rows_champs_specifics[i]).field_name;
if (mylocal_employe.hasOwnProperty(field_name)) {
var local_valeur = mylocal_employe[String(field_name)]
if (document.getElementById(String(field_name)))
document.getElementById(String(field_name)).value = local_valeur;
var new_val = { 'field_name': field_name, 'field_value': local_valeur }
var johnIndex = findIndexByProperty(spec_field_updated_values, 'field_name', field_name);
if (johnIndex > -1) {
spec_field_updated_values[johnIndex] = new_val;
} else {
spec_field_updated_values.push(new_val);
}
} else {
}
}
setspec_field_updated_values_hooks(spec_field_updated_values);
/*
* end Update 22/10/2023 :
*/
@ -1328,6 +1365,16 @@ const Employes = (props) => {
document.getElementsByName("detail_resp_hierarchie_id")[0].style.backgroundColor = "#ECEFF1";
}
// Pour les champs spécifiques
for (let i = 0; i < rows_champs_specifics.length; i++) {
var field_name = JSON.parse(rows_champs_specifics[i]).field_name;
if (document.getElementsByName(String(field_name))[0]) {
document.getElementsByName(String(field_name))[0].disabled = true;
document.getElementsByName(String(field_name))[0].style.backgroundColor = "#ECEFF1";
}
}
}
function Enable_Employee_DetailFields() {
@ -1392,7 +1439,15 @@ const Employes = (props) => {
document.getElementsByName("detail_resp_hierarchie_id")[0].disabled = false;
document.getElementsByName("detail_resp_hierarchie_id")[0].style.backgroundColor = "#FFFFFF";
// Pour les champs spécifiques
for (let i = 0; i < rows_champs_specifics.length; i++) {
var field_name = JSON.parse(rows_champs_specifics[i]).field_name;
if (document.getElementsByName(String(field_name))[0]) {
document.getElementsByName(String(field_name))[0].disabled = false;
document.getElementsByName(String(field_name))[0].style.backgroundColor = "#FFFFFF";
}
}
}
@ -1512,7 +1567,15 @@ const Employes = (props) => {
form.append("_id", selected_id);
//console.log(" form == ", form);
/*
Update du 22/10/2023 - Gestion des champs spécifiques ajoutés par le partenaire
*/
for (let i = 0; i < spec_field_updated_values_hooks.length; i++) {
form.append(String(spec_field_updated_values_hooks[i].field_name), String(spec_field_updated_values_hooks[i].field_value));
}
var myurl = process.env.REACT_APP_API_URL + "myclass/api/Update_Ressource_Humaine/";
@ -2888,9 +2951,6 @@ const Employes = (props) => {
local_read = true;
if (JSON.parse(x).module_name === module_nom && module_acces === "read") {
return '{"_id": "' + local_id + '", "module_name": "' + module_nom + '", "valide": "1", "locked": "0", "id": "' + localid + '", "read": ' + new_value + ', "write": ' + local_write + '}';
}
@ -3327,7 +3387,7 @@ const Employes = (props) => {
//console.log(" ## result['status'] = ", result['status'])
if (String(result['status']) === String("true")) {
console.log('Message :', result['message']);
//console.log('Message :', result['message']);
setGet_List_Of_All_PJ_result(result['message']);
setGet_List_Of_All_PJ_api("true");
@ -3359,6 +3419,142 @@ const Employes = (props) => {
// -- end gestion pièces jointes
// Gestion champs specifiques
/*
*** ALGORITHME
1 - Récuperer la liste des champs specifiques de la collection concernée - Array : list_nom_champs_spec
2 - Récupérer les caracteristiques de champs champs spécifique : "id, nom, label, type valeur, etc"
- avec un champ 'value' à vide. Mettre dans le tableau JSON, 'spec_champs_valeur'
3 - Créer une nouvelle table qui permettra de gerer les hook : const [rows_champs_specifics, setrows_champs_specifics] = useState([]);
4 - Afficher en html les elements 'rows_champs_specifics'
5 - Gerer la modification avec la fonction 'change_champs_spec_handle'
6 - On recuperer les valeur lors du click d'enregistrement.
*/
const list_nom_champs_spec = []
const [spec_champs_valeur, setspec_champs_valeur] = useState([]);
//const spec_champs_valeur = ""
const [Get_Partner_Object_Specific_Fields_api, setGet_Partner_Object_Specific_Fields_api] = useState();
const [Get_Partner_Object_Specific_Fields_message, setGet_Partner_Object_Specific_Fields_message] = useState();
const [Get_Partner_Object_Specific_Fields_result, setGet_Partner_Object_Specific_Fields_result] = useState();
function Get_Partner_Object_Specific_Fields(local_collection_obj_metier) {
var form = new FormData();
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("object_name", local_collection_obj_metier);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/get_list_specific_field_partner_by_object/";
axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) {
//console.log(" In Get_Partner_Object_Specific_Fields res.data.status = " + res.data.status);
//console.log(" In Get_Partner_Object_Specific_Fields res.data.message r_class = " + res.data.message);
setGet_Partner_Object_Specific_Fields_api("true");
setGet_Partner_Object_Specific_Fields_result(res.data.message);
setrows_champs_specifics(res.data.message);
}
else {
setGet_Partner_Object_Specific_Fields_api("false");
setGet_Partner_Object_Specific_Fields_message(res.data.message);
alert(res.data.message)
}
}).catch((error) => {
console.warn('Not good man :( Get_Partner_Object_Specific_Fields = ', error);
setGet_Partner_Object_Specific_Fields_api("false");
alert(" Impossible de recuperer la liste des collection et champs personnalisables");
//setmyApimyApiMessage("")
})
}
const [rows_champs_specifics, setrows_champs_specifics] = useState([]);
const [display_champs_specifics, setdisplay_champs_specifics] = useState("0");
function afficher_champs_spec() {
setdisplay_champs_specifics("1");
//setrows_champs_specifics(spec_champs_valeur);
}
function findIndexByProperty(data, key, value) {
for (var i = 0; i < data.length; i++) {
if (data[i][key] == value) {
return i;
}
}
return -1;
}
function findValueByProperty(data, key, value) {
for (var i = 0; i < data.length; i++) {
if (data[i][key] == value) {
var tmp_val = JSON.parse(data[i]);
return tmp_val.field_value
}
}
return "";
}
const spec_field_updated_values = []
const [spec_field_updated_values_hooks, setspec_field_updated_values_hooks] = useState([]);
function change_champs_spec_handle() {
for (let i = 0; i < rows_champs_specifics.length; i++) {
var field_name = JSON.parse(rows_champs_specifics[i]).field_name;
if (document.getElementsByName(String(field_name))[0]) {
var field_value = document.getElementsByName(String(field_name))[0].value;
var new_val = { 'field_name': field_name, 'field_value': field_value }
var johnIndex = findIndexByProperty(spec_field_updated_values, 'field_name', field_name);
if (johnIndex > -1) {
spec_field_updated_values[johnIndex] = new_val;
} else {
spec_field_updated_values.push(new_val);
}
}
}
//setrows_champs_specifics(spec_champs_valeur);
console.log(" OUTT spec_field_updated_values = ", spec_field_updated_values);
setspec_field_updated_values_hooks(spec_field_updated_values)
}
// -- end champs specifiques
return (
<div className="employes">
<Dialog
@ -4555,6 +4751,43 @@ const Employes = (props) => {
</TextField>
</div>}
<div className="div_row">
<hr />
</div>
<div className="div_row" style={{ "padding": "5px" }}> Vos champs spécifiques<br />
{rows_champs_specifics &&
rows_champs_specifics.map((champ_spec) => (
<div className="session_caract"> {JSON.parse(champ_spec).field_label} <br />
<br />
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
required
name={JSON.parse(champ_spec).field_name}
id={JSON.parse(champ_spec).field_name}
InputLabelProps={{
shrink: true,
}}
className="disabled_style"
onChange={(e) => {
change_champs_spec_handle(e.target.value);
setEmployee_data_changed("1");
}}
//onChange={change_champs_spec_handle}
/>
</div>
))}
<br />
</div>
<div className="div_row">
<hr />

View File

@ -39,6 +39,7 @@ import DialogContentText from '@mui/material/DialogContentText';
import DialogTitle from '@mui/material/DialogTitle';
import { TransitionProps } from '@mui/material/transitions';
import img_loading_spin from "./../mysy_img/mysy_spin_loading.gif";
import { Global } from "recharts";
const Partner_Commande = (props) => {
@ -525,6 +526,7 @@ const Partner_Commande = (props) => {
}
useEffect(() => {
Get_List_Partner_Clients();
@ -1190,7 +1192,7 @@ const Partner_Commande = (props) => {
if (mylocalclient) {
if (mylocalclient.email){
if (mylocalclient.email) {
setp_detail_header_email_client(mylocalclient.email);
//console.log(" ### mylocalclient.email = ", mylocalclient.email);
}
@ -2024,31 +2026,31 @@ const Partner_Commande = (props) => {
// Controle des champs obligatoires
if( !p_add_line_item || String(p_add_line_item).length < 2){
if (!p_add_line_item || String(p_add_line_item).length < 2) {
alert(" Vous devez choisir un article ");
return;
}
console.log(" ### p_add_line_item = ", p_add_line_item);
if (!p_add_line_item_qty || parseFloat(String(p_add_line_item_qty)) <= 0){
if (!p_add_line_item_qty || parseFloat(String(p_add_line_item_qty)) <= 0) {
alert(" La quantité choisie est incorrecte ");
return;
}
if (!p_add_line_item_price || parseFloat(String(p_add_line_item_price)) < 0){
if (!p_add_line_item_price || parseFloat(String(p_add_line_item_price)) < 0) {
alert(" Le prix unitaire est incorrecte ");
return;
}
if( String(p_add_line_item_type_reduction) === "percent" &&
( parseFloat(String(p_add_line_item_reduction_value)) < 0 || parseFloat(String(p_add_line_item_reduction_value)) > 100 ) ){
if (String(p_add_line_item_type_reduction) === "percent" &&
(parseFloat(String(p_add_line_item_reduction_value)) < 0 || parseFloat(String(p_add_line_item_reduction_value)) > 100)) {
alert(" Pour une reduction de type 'pourcentage', la valeur doit être comprise entre 0 et 100 ");
return;
}
if( String(p_add_line_item_type_reduction) === "fixe" &&
( parseFloat(String(p_add_line_item_reduction_value)) < 0 || parseFloat(String(p_add_line_item_reduction_value)) > parseFloat(String(p_add_line_item_price)) ) ){
if (String(p_add_line_item_type_reduction) === "fixe" &&
(parseFloat(String(p_add_line_item_reduction_value)) < 0 || parseFloat(String(p_add_line_item_reduction_value)) > parseFloat(String(p_add_line_item_price)))) {
alert(" Pour une reduction de type 'fixe', la valeur ne doit pas excéder le prix unitaire de l'article ");
return;
}
@ -2094,7 +2096,7 @@ const Partner_Commande = (props) => {
const Update_Dialog_Detail_Article_open = () => {
Add_Update_One_Order_Line_Data();
};
@ -2184,12 +2186,12 @@ const Partner_Commande = (props) => {
if( !p_add_cmd_header_client_id || String(p_add_cmd_header_client_id).length < 2 ){
if (!p_add_cmd_header_client_id || String(p_add_cmd_header_client_id).length < 2) {
alert(" Vous devez choisir un client");
return;
}
//console.log("### form = ", form);
var myurl = ""
@ -2813,6 +2815,8 @@ const Partner_Commande = (props) => {
const [isLoading, setLoading] = useState();
return (
<div className="partner_commande">
@ -2820,6 +2824,7 @@ const Partner_Commande = (props) => {
<div className="mysy_spinner"> <img src={img_loading_spin} /> </div>
</div>}
<Dialog
open={Dialog_1_open}
onClose={Dialog_1_handleClose}
@ -2858,7 +2863,7 @@ const Partner_Commande = (props) => {
{String(p_detail_header_statut_label).toLowerCase() !== "facturé" && <div className="session_caract_Dialog" > Article
<TextField
required
required
autoFocus
margin="dense"
id="ref_article"
@ -3231,7 +3236,7 @@ const Partner_Commande = (props) => {
<div className="session_caract_Dialog" > Client
<TextField
required
required
autoFocus
margin="dense"
id="ref_client"

View File

@ -25,6 +25,7 @@ import FullCalendar from "@fullcalendar/react";
import daygridPlugin from "@fullcalendar/daygrid";
import interactionPlugin from "@fullcalendar/interaction";
import { v4 as uuid } from "uuid";
import { isCompositeComponent } from "react-dom/test-utils";
const locales = {
'en-US': enUS,
@ -178,6 +179,7 @@ const TestUrl_New = (props) => {
useEffect(() => {
Get_Personnalisable_Collections();
Get_Personnalisable_Collection_and_Fields();
Get_Partner_Object_Specific_Fields("ressource_humaine");
}, [])
@ -290,6 +292,137 @@ const TestUrl_New = (props) => {
);
};
// Gestion champs specifiques
/*
*** ALGORITHME
1 - Récuperer la liste des champs specifiques de la collection concernée - Array : list_nom_champs_spec
2 - Récupérer les caracteristiques de champs champs spécifique : "id, nom, label, type valeur, etc"
- avec un champ 'value' à vide. Mettre dans le tableau JSON, 'spec_champs_valeur'
3 - Créer une nouvelle table qui permettra de gerer les hook : const [rows_champs_specifics, setrows_champs_specifics] = useState([]);
4 - Afficher en html les elements 'rows_champs_specifics'
5 - Gerer la modification avec la fonction 'change_champs_spec_handle'
6 - On recuperer les valeur lors du click d'enregistrement.
*/
const list_nom_champs_spec = []
const [spec_champs_valeur, setspec_champs_valeur] = useState([]);
//const spec_champs_valeur = ""
const [Get_Partner_Object_Specific_Fields_api, setGet_Partner_Object_Specific_Fields_api] = useState();
const [Get_Partner_Object_Specific_Fields_message, setGet_Partner_Object_Specific_Fields_message] = useState();
const [Get_Partner_Object_Specific_Fields_result, setGet_Partner_Object_Specific_Fields_result] = useState();
function Get_Partner_Object_Specific_Fields(local_collection_obj_metier) {
var form = new FormData();
const stored_cookie = getCookie('tokenmysypart');
form.append("token", stored_cookie);
form.append("object_name", local_collection_obj_metier);
var myurl = process.env.REACT_APP_API_URL + "myclass/api/get_list_specific_field_partner_by_object/";
axios.post(myurl, form).then(res => {
if (String(res.data.status) === String("true")) {
console.log(" In Get_Partner_Object_Specific_Fields res.data.status = " + res.data.status);
console.log(" In Get_Partner_Object_Specific_Fields res.data.message r_class = " + res.data.message);
setGet_Partner_Object_Specific_Fields_api("true");
setGet_Partner_Object_Specific_Fields_result(res.data.message);
setrows_champs_specifics(res.data.message);
}
else {
setGet_Partner_Object_Specific_Fields_api("false");
setGet_Partner_Object_Specific_Fields_message(res.data.message);
alert(res.data.message)
}
}).catch((error) => {
console.warn('Not good man :( Get_Partner_Object_Specific_Fields = ', error);
setGet_Partner_Object_Specific_Fields_api("false");
alert(" Impossible de recuperer la liste des collection et champs personnalisables");
//setmyApimyApiMessage("")
})
}
const [rows_champs_specifics, setrows_champs_specifics] = useState([]);
const [display_champs_specifics, setdisplay_champs_specifics] = useState("0");
function afficher_champs_spec() {
setdisplay_champs_specifics("1");
//setrows_champs_specifics(spec_champs_valeur);
}
function findIndexByProperty(data, key, value) {
for (var i = 0; i < data.length; i++) {
if (data[i][key] == value) {
return i;
}
}
return -1;
}
function findValueByProperty(data, key, value) {
for (var i = 0; i < data.length; i++) {
if (data[i][key] == value) {
var tmp_val = JSON.parse(data[i]);
return tmp_val.field_value
}
}
return "";
}
const spec_field_updated_values = []
function change_champs_spec_handle() {
for (let i = 0; i < rows_champs_specifics.length; i++) {
var field_name = JSON.parse(rows_champs_specifics[i]).field_name;
if (document.getElementsByName(String(field_name))[0]) {
var field_value = document.getElementsByName(String(field_name))[0].value;
var new_val = { 'field_name': field_name, 'field_value': field_value }
var johnIndex = findIndexByProperty(spec_field_updated_values, 'field_name', field_name);
if (johnIndex > -1) {
spec_field_updated_values[johnIndex] = new_val;
} else {
spec_field_updated_values.push(new_val);
}
}
}
//setrows_champs_specifics(spec_champs_valeur);
console.log(" OUTT spec_field_updated_values = ", spec_field_updated_values);
}
// -- end champs specifiques
return (
<div className="testurl_new">
<Helmet>
@ -304,16 +437,53 @@ const TestUrl_New = (props) => {
<h3> Page de test * testurl_new </h3>
parametres courseid = {courseid}, tabid = {tabid}
<br />
{/* <div>
<Calendar
localizer={localizer}
events={myEventsList}
startAccessor="start"
endAccessor="end"
style={{ height: 500 }}
/>
</div>*/}
<div style={{"width":"90%", "marginLeft":"1%"}}>
<Button variant="contained" className="bton_enreg"
onClick={afficher_champs_spec}>
Display Spec fields
</Button>
<br />
{rows_champs_specifics &&
rows_champs_specifics.map((champ_spec) => (
<div className="session_caract"> {JSON.parse(champ_spec).field_label} <br />
<br />
<TextField
sx={{ '& legend': { display: 'none' }, '& fieldset': { top: 0 }, }}
required
name={JSON.parse(champ_spec).field_name}
id={JSON.parse(champ_spec).field_name}
InputLabelProps={{
shrink: true,
}}
className="disabled_style"
onChange={change_champs_spec_handle}
/>
</div>
))}
<br />
<Button variant="contained" className="bton_enreg"
onClick={"get_champs_spec"}>
Display valeurs des champs spec
</Button>
<nav> Liste des valeurs des champs spec </nav>
{rows_champs_specifics &&
rows_champs_specifics.map((champ_spec) => (
<div className="session_caract"> '{champ_spec.field_value}' </div>
))}
<br />
<div style={{ "width": "90%", "marginLeft": "1%" }}>
<FullCalendar
editable
selectable
@ -338,7 +508,6 @@ const TestUrl_New = (props) => {
value={p_document_name}
onChange={(e) => {
setp_document_name(e.target.value);
}}
>
<MenuItem value="convocation" style={{ "paddingLeft": "5px", "textAlign": "left", "width": "100%" }} >Convocation &nbsp;</MenuItem>