18650 lines
		
	
	
		
			345 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			18650 lines
		
	
	
		
			345 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| /**
 | |
| 
 | |
|  * ---------------------------------------------------------------------
 | |
| 
 | |
|  * GLPI - Gestionnaire Libre de Parc Informatique
 | |
| 
 | |
|  * Copyright (C) 2015-2020 Teclib' and contributors.
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * http://glpi-project.org
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * based on GLPI - Gestionnaire Libre de Parc Informatique
 | |
| 
 | |
|  * Copyright (C) 2003-2014 by the INDEPNET Development Team.
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * ---------------------------------------------------------------------
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * LICENSE
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * This file is part of GLPI.
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * GLPI is free software; you can redistribute it and/or modify
 | |
| 
 | |
|  * it under the terms of the GNU General Public License as published by
 | |
| 
 | |
|  * the Free Software Foundation; either version 2 of the License, or
 | |
| 
 | |
|  * (at your option) any later version.
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * GLPI is distributed in the hope that it will be useful,
 | |
| 
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 
 | |
|  * GNU General Public License for more details.
 | |
| 
 | |
|  *
 | |
| 
 | |
|  * You should have received a copy of the GNU General Public License
 | |
| 
 | |
|  * along with GLPI. If not, see <http://www.gnu.org/licenses/>.
 | |
| 
 | |
|  * ---------------------------------------------------------------------
 | |
| 
 | |
|  */
 | |
| 
 | |
| 
 | |
| 
 | |
| use Glpi\Cache\SimpleCache;
 | |
| 
 | |
| use ScssPhp\ScssPhp\Compiler;
 | |
| 
 | |
| 
 | |
| 
 | |
| if (!defined('GLPI_ROOT')) {
 | |
| 
 | |
|    die("Sorry. You can't access this file directly");
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
|  function getHtmlSubUsers($idUser){
 | |
| 
 | |
| 	
 | |
| 
 | |
| 		global $DB;	
 | |
| 
 | |
| 		$subUsers = array();
 | |
| 
 | |
| 
 | |
| 
 | |
| 		$query = "SELECT id , CONCAT(realname,' ', firstname) as fullname  from glpi_users where users_id_supervisor ='".$idUser."' ";
 | |
| 
 | |
| 		$result = $DB->query($query);
 | |
| 
 | |
| 		  
 | |
| 
 | |
| 		if ($result->num_rows > 0) {
 | |
| 
 | |
| 			$rows = array();	 
 | |
| 
 | |
| 			while($row = $result->fetch_assoc()) {
 | |
| 
 | |
| 				$subUsers[] = $row;
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			return $subUsers;		 
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 
 | |
| 		return $subUsers;
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 
 | |
| $_SESSION['SophalLanguages'] = [
 | |
| 
 | |
| 	   //Code       Name in native lang          LANG FILE      jquery tinymce english name            standard plural number
 | |
| 
 | |
| 	   'ar_SA'  => [
 | |
| 
 | |
| 	                0 => 'الإدارة العامة',
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					1 => 'العرض السنوي',
 | |
| 
 | |
| 					2 => 'Plan Directeur Commercial' ,
 | |
| 
 | |
| 					3 => 'Plan Directeur Marketing' ,
 | |
| 
 | |
| 					4 => 'Plan Directeur Production' ,
 | |
| 
 | |
| 					5 => 'Plan Directeur Approvisionnement' ,
 | |
| 
 | |
| 					6 => 'Plan Directeur Ressources Humaines' ,
 | |
| 
 | |
| 					7 => 'Plan Directeur Système Information' ,
 | |
| 
 | |
| 					8 => 'Plan Budgétisation Entreprise' ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					9 => 'العرض الشهري' ,
 | |
| 
 | |
| 					10 => 'Suivi Commercial' ,
 | |
| 
 | |
| 					11 => 'Suivi Marketing' ,
 | |
| 
 | |
| 					12 => 'Suivi Production' ,
 | |
| 
 | |
| 					13 => ' Suivi Approvisionnement' ,
 | |
| 
 | |
| 					14 => 'Suivi Ressources Humaines' ,
 | |
| 
 | |
| 					15 => 'Suivi Système Information' ,
 | |
| 
 | |
| 					16 => 'Suivi Budgétisation Entreprise' ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					17 => 'المراجعة أسبوعية'                ,
 | |
| 
 | |
| 					18 => 'Difficultés'                     ,
 | |
| 
 | |
| 					19 => 'Changements'                     ,
 | |
| 
 | |
| 					20 => 'Planning'                        ,
 | |
| 
 | |
| 					21 => 'Statistiques'                    , 
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					22 => 'الوسائل العامة'                 ,
 | |
| 
 | |
| 					23 => 'النقل'                       , 
 | |
| 
 | |
| 					24 => 'طلب مركبة'             ,
 | |
| 
 | |
|                     25 => 'مطالبة'                     ,	
 | |
| 
 | |
|                     26 => 'Intégration Employé'	            ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					27 => 'HSE'                             ,
 | |
| 
 | |
| 					28 => 'Demande Nettoyage'               ,
 | |
| 
 | |
| 					29 => 'Accidents De Travail'            ,
 | |
| 
 | |
| 					30 => 'Demande De Desinsectisation'     ,
 | |
| 
 | |
| 					31 => 'Demande Evacuation'              ,
 | |
| 
 | |
| 					32 => 'Demande Incineration'            ,
 | |
| 
 | |
| 					33 => 'Constats'                        ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					34 => 'Sécurité'                        ,
 | |
| 
 | |
| 					35 => 'Registre Des Mouvements'         ,
 | |
| 
 | |
| 					36 => 'Constats'                        ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					37 => 'Divers'                          ,
 | |
| 
 | |
| 					38 => 'Parc : Demande de Maintenance'   ,
 | |
| 
 | |
| 					39 => 'Travaux : Demande De Manoeuvres' , 
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					40 => 'الموارد البشرية'             ,
 | |
| 
 | |
| 					41 => 'الادارة'                  ,
 | |
| 
 | |
| 					42 => 'تصريح الخروج'              ,
 | |
| 
 | |
| 					43 => 'Requete Administrative'          ,
 | |
| 
 | |
| 					44 => 'طلب عطلة'                ,
 | |
| 
 | |
| 					45 => 'إجازة غياب'          ,
 | |
| 
 | |
| 					46 => 'تصريح الدخول'           ,
 | |
| 
 | |
|                78 => 'إذن للحصول على الراتب'           ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					47 => 'التقييمات'                     ,
 | |
| 
 | |
| 					48 => 'Evaluation personnel'            ,
 | |
| 
 | |
| 					49 => 'Evaluation compétence'           ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					50 => 'مجلداتي'                    ,
 | |
| 
 | |
| 					51 => 'قسيمة راتب'                   ,
 | |
| 
 | |
| 					52 => 'Mon dossier RH'                  ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					53 => 'التواصل'                  ,
 | |
| 
 | |
| 					54 => 'صندوق الاقتراحات'                   ,
 | |
| 
 | |
| 					55 => 'صندوق المطالبات'            ,
 | |
| 
 | |
| 					56 => 'أفضل موظف'                ,
 | |
| 
 | |
| 					57 => 'Valeur Entreprise'               ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					58 => 'عام'                          ,
 | |
| 
 | |
| 					59 => 'النظام الداخلي للمؤسسة'             ,
 | |
| 
 | |
| 					60 => 'ملاحظات'                       ,
 | |
| 
 | |
| 					61 => 'الصحة المهنية'             ,
 | |
| 
 | |
| 					62 => 'روابط أخبار'              ,
 | |
| 
 | |
| 
 | |
| 
 | |
|                76 => 'Configuration'                   ,
 | |
| 
 | |
|                77 => 'Période de paie'                 ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					63 => 'المساعدة'                ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					64 => 'الإعدادات',
 | |
| 
 | |
| 					65 => 'Demande de recrutement' ,
 | |
| 
 | |
| 					66 => 'Divers' ,
 | |
| 
 | |
| 					67 => 'Rapport Impression',
 | |
| 
 | |
| 					68 => 'Heures supplémentaires',
 | |
| 
 | |
| 					69 => 'Demande ordre de mission',
 | |
| 
 | |
| 					70 => 'Configuration des evaluations',
 | |
| 
 | |
| 					71 => 'Suivis des evaluations' ,
 | |
| 
 | |
| 					72 => 'Congé de récupération',
 | |
| 
 | |
|                73 => 'Journal authentification',
 | |
| 
 | |
|                74 => 'Demande de congé statutaire',
 | |
| 
 | |
|                75 => 'النشرة الإخبارية'
 | |
| 
 | |
| 				   ],  
 | |
| 
 | |
| 	   'en_GB'  => [
 | |
| 
 | |
| 	                0 => 'Executive Management',
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					1 => 'Annual Review',					
 | |
| 
 | |
| 					2 => 'Plan Directeur Commercial' ,
 | |
| 
 | |
| 					3 => 'Plan Directeur Marketing' ,
 | |
| 
 | |
| 					4 => 'Plan Directeur Production' ,
 | |
| 
 | |
| 					5 => 'Plan Directeur Approvisionnement' ,
 | |
| 
 | |
| 					6 => 'Plan Directeur Ressources Humaines' ,
 | |
| 
 | |
| 					7 => 'Plan Directeur Système Information' ,
 | |
| 
 | |
| 					8 => 'Plan Budgétisation Entreprise' ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					9 => 'Monthly Review',
 | |
| 
 | |
| 					10 => 'Suivi Commercial' ,
 | |
| 
 | |
| 					11 => 'Suivi Marketing' ,
 | |
| 
 | |
| 					12 => 'Suivi Production' ,
 | |
| 
 | |
| 					13 => ' Suivi Approvisionnement' ,
 | |
| 
 | |
| 					14 => 'Suivi Ressources Humaines' ,
 | |
| 
 | |
| 					15 => 'Suivi Système Information' ,
 | |
| 
 | |
| 					16 => 'Suivi Budgétisation Entreprise' ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					17 => 'Weekly Review'                   ,
 | |
| 
 | |
| 					18 => 'Problems'                     ,
 | |
| 
 | |
| 					19 => 'Changes'                     ,
 | |
| 
 | |
| 					20 => 'Planning'                        ,
 | |
| 
 | |
| 					21 => 'Statistics'                    , 
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					22 => 'General Means'                 ,
 | |
| 
 | |
| 					23 => 'Transport'                       , 
 | |
| 
 | |
| 					24 => 'Demande de véhicule'             ,
 | |
| 
 | |
|                     25 => 'Réclamation'                     ,	
 | |
| 
 | |
|                     26 => 'Intégration Employé'	            ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					27 => 'HSE'                             ,
 | |
| 
 | |
| 					28 => 'Demande Nettoyage'               ,
 | |
| 
 | |
| 					29 => 'Accidents De Travail'            ,
 | |
| 
 | |
| 					30 => 'Demande De Desinsectisation'     ,
 | |
| 
 | |
| 					31 => 'Demande Evacuation'              ,
 | |
| 
 | |
| 					32 => 'Demande Incineration'            ,
 | |
| 
 | |
| 					33 => 'Constats'                        ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					34 => 'Sécurité'                        ,
 | |
| 
 | |
| 					35 => 'Registre Des Mouvements'         ,
 | |
| 
 | |
| 					36 => 'Constats'                        ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					37 => 'Divers'                          ,
 | |
| 
 | |
| 					38 => 'Parc : Demande de Maintenance'   ,
 | |
| 
 | |
| 					39 => 'Travaux : Demande De Manoeuvres' , 
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					40 => 'Ressources Humaines'             ,
 | |
| 
 | |
| 					41 => 'Administration'                  ,
 | |
| 
 | |
| 					42 => 'Bulletin de sortie'              ,
 | |
| 
 | |
| 					43 => 'Requete Administrative'          ,
 | |
| 
 | |
| 					44 => 'Demande de conge'                ,
 | |
| 
 | |
| 					45 => 'Autorisation d"absence'          ,
 | |
| 
 | |
| 					46 => 'Autorisation d"entree'           ,
 | |
| 
 | |
|                78 => 'Autorisation de paie'      ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					47 => 'Evaluations'                     ,
 | |
| 
 | |
| 					48 => 'Evaluation personnel'            ,
 | |
| 
 | |
| 					49 => 'Evaluation compétence'           ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					50 => 'Mes dossiers'                    ,
 | |
| 
 | |
| 					51 => 'Fiche de paie'                   ,
 | |
| 
 | |
| 					52 => 'Mon dossier RH'                  ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					53 => 'Communications'                  ,
 | |
| 
 | |
| 					54 => 'boite à idées'                   ,
 | |
| 
 | |
| 					55 => 'boite à réclamations'            ,
 | |
| 
 | |
| 					56 => 'Meilleur Employé'                ,
 | |
| 
 | |
| 					57 => 'Valeur Entreprise'               ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					58 => 'Divers'                          ,
 | |
| 
 | |
| 					59 => 'Règlement Intérieur'             ,
 | |
| 
 | |
| 					60 => 'Notes DRH'                       ,
 | |
| 
 | |
| 					61 => 'Médecine du travail'             ,
 | |
| 
 | |
| 					62 => 'Fil d'actualité'            ,
 | |
| 
 | |
| 
 | |
| 
 | |
|                76 => 'Configuration'                   ,
 | |
| 
 | |
|                77 => 'Période de paie'                 ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					63 => 'System Information'              ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					64 => 'Setting' ,
 | |
| 
 | |
| 					65 => 'Demande de recrutement' ,
 | |
| 
 | |
| 					66 => 'Divers' ,
 | |
| 
 | |
| 					67 => 'Rapport Impression',
 | |
| 
 | |
| 					68 => 'Heures supplémentaires',
 | |
| 
 | |
| 					69 => 'Demande ordre de mission',
 | |
| 
 | |
| 					70 => 'Configuration des evaluations',
 | |
| 
 | |
| 					71 => 'Suivis des evaluations' ,
 | |
| 
 | |
| 					72 => 'Congé de récupération',
 | |
| 
 | |
| 					73 => 'Journal authentification',
 | |
| 
 | |
|                    74 => 'Demande de congé statutaire',
 | |
| 
 | |
|                    75 => 'Newsletter'
 | |
| 
 | |
| 				   ], 
 | |
| 
 | |
| 	   'fr_FR'  => [
 | |
| 
 | |
| 	                0 => 'Direction Générale' ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					1 => 'Revue Annuelle' ,
 | |
| 
 | |
| 					2 => 'Plan Directeur Commercial' ,
 | |
| 
 | |
| 					3 => 'Plan Directeur Marketing' ,
 | |
| 
 | |
| 					4 => 'Plan Directeur Production' ,
 | |
| 
 | |
| 					5 => 'Plan Directeur Approvisionnement' ,
 | |
| 
 | |
| 					6 => 'Plan Directeur Ressources Humaines' ,
 | |
| 
 | |
| 					7 => 'Plan Directeur Système Information' ,
 | |
| 
 | |
| 					8 => 'Plan Budgétisation Entreprise'    ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					9 => 'Revue Mensuelle'                  ,
 | |
| 
 | |
| 					10 => 'Suivi Commercial'                ,
 | |
| 
 | |
| 					11 => 'Suivi Marketing'                 ,
 | |
| 
 | |
| 					12 => 'Suivi Production'                ,
 | |
| 
 | |
| 					13 => ' Suivi Approvisionnement'        ,
 | |
| 
 | |
| 					14 => 'Suivi Ressources Humaines'       ,
 | |
| 
 | |
| 					15 => 'Suivi Système Information'       ,
 | |
| 
 | |
| 					16 => 'Suivi Budgétisation Entreprise'  ,
 | |
| 
 | |
| 										
 | |
| 
 | |
| 					17 => 'Revue Hebdomadaire'              ,
 | |
| 
 | |
| 					18 => 'Difficultés'                       ,
 | |
| 
 | |
| 					19 => 'Changements'                     ,
 | |
| 
 | |
| 					20 => 'Planning'                        ,
 | |
| 
 | |
| 					21 => 'Statistiques'                    , 
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					22 => 'Moyens Généraux'                 ,
 | |
| 
 | |
| 					23 => 'Transport'                       , 
 | |
| 
 | |
| 					24 => 'Demande de véhicule'             ,
 | |
| 
 | |
|                     25 => 'Réclamation'                     ,	
 | |
| 
 | |
|                     26 => 'Intégration Employé'	            ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					27 => 'HSE'                             ,
 | |
| 
 | |
| 					28 => 'Demande Nettoyage'               ,
 | |
| 
 | |
| 					29 => 'Accidents De Travail'            ,
 | |
| 
 | |
| 					30 => 'Demande De Desinsectisation'     ,
 | |
| 
 | |
| 					31 => 'Demande Evacuation'              ,
 | |
| 
 | |
| 					32 => 'Demande Incineration'            ,
 | |
| 
 | |
| 					33 => 'Constats'                        ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					34 => 'Sécurité'                        ,
 | |
| 
 | |
| 					35 => 'Registre Des Mouvements'         ,
 | |
| 
 | |
| 					36 => 'Constats'                        ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					37 => 'Divers'                          ,
 | |
| 
 | |
| 					38 => 'Parc : Demande de Maintenance'   ,
 | |
| 
 | |
| 					39 => 'Travaux : Demande De Manoeuvres' , 
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					40 => 'Ressources Humaines'             ,
 | |
| 
 | |
| 					41 => 'Administration'                  ,
 | |
| 
 | |
| 					42 => 'Bulletin de sortie'              ,
 | |
| 
 | |
| 					43 => 'Requete Administrative'          ,
 | |
| 
 | |
| 					44 => 'Demande de conge'                ,
 | |
| 
 | |
| 					45 => 'Autorisation d"absence'          ,
 | |
| 
 | |
| 					46 => 'Autorisation d"entree'           ,
 | |
| 
 | |
|                78 => 'Autorisation de paie'         ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					47 => 'Evaluations'                     ,
 | |
| 
 | |
| 					48 => 'Evaluation personnel'            ,
 | |
| 
 | |
| 					49 => 'Evaluation compétence'           ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					50 => 'Mes dossiers'                    ,
 | |
| 
 | |
| 					51 => 'Fiche de paie'                   ,
 | |
| 
 | |
| 					52 => 'Mon dossier RH'                  ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					53 => 'Communications'                  ,
 | |
| 
 | |
| 					54 => 'boite à idées'                   ,
 | |
| 
 | |
| 					55 => 'boite à réclamations'            ,
 | |
| 
 | |
| 					56 => 'Meilleur Employé'                ,
 | |
| 
 | |
| 					57 => 'Valeur Entreprise'               ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					58 => 'Divers'                          ,
 | |
| 
 | |
| 					59 => 'Règlement Intérieur'             ,
 | |
| 
 | |
| 					60 => 'Notes DRH'                       ,
 | |
| 
 | |
| 					61 => 'Médecine du travail'             ,
 | |
| 
 | |
| 					62 => 'Fil d'actualité'            ,
 | |
| 
 | |
| 
 | |
| 
 | |
|                76 => 'Configuration'                   ,
 | |
| 
 | |
|                77 => 'Période de paie'                 ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					63 => 'Systèmes Informations'           ,
 | |
| 
 | |
| 					
 | |
| 
 | |
| 					64 => 'Paramétrage' ,
 | |
| 
 | |
| 					65 => 'Demande de recrutement' ,
 | |
| 
 | |
| 					66 => 'Divers' ,
 | |
| 
 | |
| 					67 => 'Rapport Impression',
 | |
| 
 | |
| 					68 => 'Heures supplémentaires',
 | |
| 
 | |
| 					69 => 'Demande ordre de mission',
 | |
| 
 | |
| 					70 => 'Configuration des evaluations',
 | |
| 
 | |
| 					71 => 'Suivis des evaluations' ,
 | |
| 
 | |
| 					72 => 'Congé de récupération',
 | |
| 
 | |
| 					73 => 'Journal authentification',
 | |
| 
 | |
|                74 => 'Demande de congé statutaire',
 | |
| 
 | |
|                75 => 'Newsletter'
 | |
| 
 | |
| 				   ] 
 | |
| 
 | |
| 	];
 | |
| 
 | |
| /**
 | |
| 
 | |
|  * Html Class
 | |
| 
 | |
|  * Inpired from Html/FormHelper for several functions
 | |
| 
 | |
| **/
 | |
| 
 | |
| class Html {
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Clean display value deleting html tags
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $value      string value
 | |
| 
 | |
|     * @param boolean $striptags  strip all html tags
 | |
| 
 | |
|     * @param integer $keep_bad
 | |
| 
 | |
|     *          1 : neutralize tag anb content,
 | |
| 
 | |
|     *          2 : remove tag and neutralize content
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function clean($value, $striptags = true, $keep_bad = 2) {
 | |
| 
 | |
|       $value = Html::entity_decode_deep($value);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Clean MS office tags
 | |
| 
 | |
|       $value = str_replace(["<![if !supportLists]>", "<![endif]>"], '', $value);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($striptags) {
 | |
| 
 | |
|          // Strip ToolTips
 | |
| 
 | |
|          $specialfilter = ['@<div[^>]*?tooltip_picture[^>]*?>.*?</div[^>]*?>@si',
 | |
| 
 | |
|                                 '@<div[^>]*?tooltip_text[^>]*?>.*?</div[^>]*?>@si',
 | |
| 
 | |
|                                 '@<div[^>]*?tooltip_picture_border[^>]*?>.*?</div[^>]*?>@si',
 | |
| 
 | |
|                                 '@<div[^>]*?invisible[^>]*?>.*?</div[^>]*?>@si'];
 | |
| 
 | |
|          $value         = preg_replace($specialfilter, '', $value);
 | |
| 
 | |
| 
 | |
| 
 | |
|          $value = preg_replace("/<(p|br|div)( [^>]*)?".">/i", "\n", $value);
 | |
| 
 | |
|          $value = preg_replace("/( | |\xC2\xA0)+/", " ", $value);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $search = ['@<script[^>]*?>.*?</script[^>]*?>@si', // Strip out javascript
 | |
| 
 | |
|                       '@<style[^>]*?>.*?</style[^>]*?>@si', // Strip out style
 | |
| 
 | |
|                       '@<title[^>]*?>.*?</title[^>]*?>@si', // Strip out title
 | |
| 
 | |
|                       '@<!DOCTYPE[^>]*?>@si', // Strip out !DOCTYPE
 | |
| 
 | |
|                        ];
 | |
| 
 | |
|       $value = preg_replace($search, '', $value);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Neutralize not well formatted html tags
 | |
| 
 | |
|       $value = preg_replace("/(<)([^>]*<)/", "<$2", $value);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $value = htmLawed(
 | |
| 
 | |
|          $value,
 | |
| 
 | |
|          [
 | |
| 
 | |
|             'elements'         => ($striptags) ? 'none' : '',
 | |
| 
 | |
|             'deny_attribute'   => 'on*',
 | |
| 
 | |
|             'keep_bad'         => $keep_bad, // 1: neutralize tag and content, 2 : remove tag and neutralize content
 | |
| 
 | |
|             'comment'          => 1, // 1: remove
 | |
| 
 | |
|             'cdata'            => 1, // 1: remove
 | |
| 
 | |
|             'direct_list_nest' => 1, // 1: Allow usage of ul/ol tags nested in other ul/ol tags
 | |
| 
 | |
|             'schemes'          => '*: aim, app, feed, file, ftp, gopher, http, https, irc, mailto, news, nntp, sftp, ssh, tel, telnet'
 | |
| 
 | |
|          ]
 | |
| 
 | |
|       );
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Special case : remove the 'denied:' for base64 img in case the base64 have characters
 | |
| 
 | |
|       // combinaison introduce false positive
 | |
| 
 | |
|       foreach (['png', 'gif', 'jpg', 'jpeg'] as $imgtype) {
 | |
| 
 | |
|          $value = str_replace('src="denied:data:image/'.$imgtype.';base64,',
 | |
| 
 | |
|                'src="data:image/'.$imgtype.';base64,', $value);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $value = str_replace(["\r\n", "\r"], "\n", $value);
 | |
| 
 | |
|       $value = preg_replace("/(\n[ ]*){2,}/", "\n\n", $value, -1);
 | |
| 
 | |
| 
 | |
| 
 | |
|       return trim($value);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Recursivly execute html_entity_decode on an array
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string|array $value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string|array
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function entity_decode_deep($value) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       return (is_array($value) ? array_map([__CLASS__, 'entity_decode_deep'], $value)
 | |
| 
 | |
|                                : html_entity_decode($value, ENT_QUOTES, "UTF-8"));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Recursivly execute htmlentities on an array
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string|array $value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string|array
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function entities_deep($value) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       return (is_array($value) ? array_map([__CLASS__, 'entities_deep'], $value)
 | |
| 
 | |
|                                : htmlentities($value, ENT_QUOTES, "UTF-8"));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Convert a date YY-MM-DD to DD-MM-YY for calendar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string       $time    Date to convert
 | |
| 
 | |
|     * @param integer|null $format  Date format
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return null|string
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @see Toolbox::getDateFormats()
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function convDate($time, $format = null) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_null($time) || trim($time) == '' || in_array($time, ['NULL', '0000-00-00', '0000-00-00 00:00:00'])) {
 | |
| 
 | |
|          return null;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!isset($_SESSION["glpidate_format"])) {
 | |
| 
 | |
|          $_SESSION["glpidate_format"] = 0;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!$format) {
 | |
| 
 | |
|          $format = $_SESSION["glpidate_format"];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       try {
 | |
| 
 | |
|          $date = new \DateTime($time);
 | |
| 
 | |
|       } catch (\Exception $e) {
 | |
| 
 | |
|          Toolbox::logWarning("Invalid date $time!");
 | |
| 
 | |
|          Session::addMessageAfterRedirect(
 | |
| 
 | |
|             sprintf(
 | |
| 
 | |
|                __('%1$s %2$s'),
 | |
| 
 | |
|                $time,
 | |
| 
 | |
|                _x('adjective', 'Invalid')
 | |
| 
 | |
|             )
 | |
| 
 | |
|          );
 | |
| 
 | |
|          return $time;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $mask = 'Y-m-d';
 | |
| 
 | |
| 
 | |
| 
 | |
|       switch ($format) {
 | |
| 
 | |
|          case 1 : // DD-MM-YYYY
 | |
| 
 | |
|             $mask = 'd-m-Y';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 2 : // MM-DD-YYYY
 | |
| 
 | |
|             $mask = 'm-d-Y';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $date->format($mask);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Convert a date YY-MM-DD HH:MM to DD-MM-YY HH:MM for display in a html table
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string       $time    Datetime to convert
 | |
| 
 | |
|     * @param integer|null $format  Datetime format
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return null|string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function convDateTime($time, $format = null) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_null($time) || ($time == 'NULL')) {
 | |
| 
 | |
|          return null;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return self::convDate($time, $format).' '. substr($time, 11, 5);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Clean string for input text field
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $string
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function cleanInputText($string) {
 | |
| 
 | |
|       return preg_replace( '/\'/', ''', preg_replace('/\"/', '"', $string));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Clean all parameters of an URL. Get a clean URL
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $url
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function cleanParametersURL($url) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $url = preg_replace("/(\/[0-9a-zA-Z\.\-\_]+\.php).*/", "$1", $url);
 | |
| 
 | |
|       return preg_replace("/\?.*/", "", $url);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Recursivly execute nl2br on an array
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string|array $value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string|array
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function nl2br_deep($value) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       return (is_array($value) ? array_map([__CLASS__, 'nl2br_deep'], $value)
 | |
| 
 | |
|                                : nl2br($value));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     *  Resume text for followup
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $string  string to resume
 | |
| 
 | |
|     * @param integer $length  resume length (default 255)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function resume_text($string, $length = 255) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (Toolbox::strlen($string) > $length) {
 | |
| 
 | |
|          $string = Toolbox::substr($string, 0, $length)." (...)";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $string;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     *  Resume a name for display
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $string  string to resume
 | |
| 
 | |
|     * @param integer $length  resume length (default 255)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     **/
 | |
| 
 | |
|    static function resume_name($string, $length = 255) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (strlen($string) > $length) {
 | |
| 
 | |
|          $string = Toolbox::substr($string, 0, $length)."...";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $string;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Clean post value for display in textarea
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function cleanPostForTextArea($value) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($value)) {
 | |
| 
 | |
|          return array_map([__CLASS__, __METHOD__], $value);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $order   = ['\r\n',
 | |
| 
 | |
|                        '\n',
 | |
| 
 | |
|                        "\\'",
 | |
| 
 | |
|                        '\"',
 | |
| 
 | |
|                        '\\\\'];
 | |
| 
 | |
|       $replace = ["\n",
 | |
| 
 | |
|                        "\n",
 | |
| 
 | |
|                        "'",
 | |
| 
 | |
|                        '"',
 | |
| 
 | |
|                        "\\"];
 | |
| 
 | |
|       return str_replace($order, $replace, $value);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Convert a number to correct display
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param float   $number        Number to display
 | |
| 
 | |
|     * @param boolean $edit          display number for edition ? (id edit use . in all case)
 | |
| 
 | |
|     * @param integer $forcedecimal  Force decimal number (do not use default value) (default -1)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function formatNumber($number, $edit = false, $forcedecimal = -1) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Php 5.3 : number_format() expects parameter 1 to be double,
 | |
| 
 | |
|       if ($number == "") {
 | |
| 
 | |
|          $number = 0;
 | |
| 
 | |
| 
 | |
| 
 | |
|       } else if ($number == "-") { // used for not defines value (from Infocom::Amort, p.e.)
 | |
| 
 | |
|          return "-";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $number  = doubleval($number);
 | |
| 
 | |
|       $decimal = $CFG_GLPI["decimal_number"];
 | |
| 
 | |
|       if ($forcedecimal>=0) {
 | |
| 
 | |
|          $decimal = $forcedecimal;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Edit : clean display for mysql
 | |
| 
 | |
|       if ($edit) {
 | |
| 
 | |
|          return number_format($number, $decimal, '.', '');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Display : clean display
 | |
| 
 | |
|       switch ($_SESSION['glpinumber_format']) {
 | |
| 
 | |
|          case 0 : // French
 | |
| 
 | |
|             return str_replace(' ', ' ', number_format($number, $decimal, '.', ' '));
 | |
| 
 | |
| 
 | |
| 
 | |
|          case 2 : // Other French
 | |
| 
 | |
|             return str_replace(' ', ' ', number_format($number, $decimal, ',', ' '));
 | |
| 
 | |
| 
 | |
| 
 | |
|          case 3 : // No space with dot
 | |
| 
 | |
|             return number_format($number, $decimal, '.', '');
 | |
| 
 | |
| 
 | |
| 
 | |
|          case 4 : // No space with comma
 | |
| 
 | |
|             return number_format($number, $decimal, ',', '');
 | |
| 
 | |
| 
 | |
| 
 | |
|          default: // English
 | |
| 
 | |
|             return number_format($number, $decimal, '.', ',');
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Make a good string from the unix timestamp $sec
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param integer $time         timestamp
 | |
| 
 | |
|     * @param boolean $display_sec  display seconds ?
 | |
| 
 | |
|     * @param boolean $use_days     use days for display ?
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function timestampToString($time, $display_sec = true, $use_days = true) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $sign = '';
 | |
| 
 | |
|       if ($time < 0) {
 | |
| 
 | |
|          $sign = '- ';
 | |
| 
 | |
|          $time = abs($time);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $time = floor($time);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Force display seconds if time is null
 | |
| 
 | |
|       if ($time < MINUTE_TIMESTAMP) {
 | |
| 
 | |
|          $display_sec = true;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $units = Toolbox::getTimestampTimeUnits($time);
 | |
| 
 | |
|       if ($use_days) {
 | |
| 
 | |
|          if ($units['day'] > 0) {
 | |
| 
 | |
|             if ($display_sec) {
 | |
| 
 | |
|                //TRANS: %1$s is the sign (-or empty), %2$d number of days, %3$d number of hours,
 | |
| 
 | |
|                //       %4$d number of minutes, %5$d number of seconds
 | |
| 
 | |
|                return sprintf(__('%1$s%2$d days %3$d hours %4$d minutes %5$d seconds'), $sign,
 | |
| 
 | |
|                               $units['day'], $units['hour'], $units['minute'], $units['second']);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             //TRANS:  %1$s is the sign (-or empty), %2$d number of days, %3$d number of hours,
 | |
| 
 | |
|             //        %4$d number of minutes
 | |
| 
 | |
|             return sprintf(__('%1$s%2$d days %3$d hours %4$d minutes'),
 | |
| 
 | |
|                            $sign, $units['day'], $units['hour'], $units['minute']);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          if ($units['day'] > 0) {
 | |
| 
 | |
|             $units['hour'] += 24*$units['day'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($units['hour'] > 0) {
 | |
| 
 | |
|          if ($display_sec) {
 | |
| 
 | |
|             //TRANS:  %1$s is the sign (-or empty), %2$d number of hours, %3$d number of minutes,
 | |
| 
 | |
|             //        %4$d number of seconds
 | |
| 
 | |
|             return sprintf(__('%1$s%2$d hours %3$d minutes %4$d seconds'),
 | |
| 
 | |
|                            $sign, $units['hour'], $units['minute'], $units['second']);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          //TRANS: %1$s is the sign (-or empty), %2$d number of hours, %3$d number of minutes
 | |
| 
 | |
|          return sprintf(__('%1$s%2$d hours %3$d minutes'), $sign, $units['hour'], $units['minute']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($units['minute'] > 0) {
 | |
| 
 | |
|          if ($display_sec) {
 | |
| 
 | |
|             //TRANS:  %1$s is the sign (-or empty), %2$d number of minutes,  %3$d number of seconds
 | |
| 
 | |
|             return sprintf(__('%1$s%2$d minutes %3$d seconds'), $sign, $units['minute'],
 | |
| 
 | |
|                            $units['second']);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          //TRANS: %1$s is the sign (-or empty), %2$d number of minutes
 | |
| 
 | |
|          return sprintf(_n('%1$s%2$d minute', '%1$s%2$d minutes', $units['minute']), $sign,
 | |
| 
 | |
|                         $units['minute']);
 | |
| 
 | |
| 
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($display_sec) {
 | |
| 
 | |
|          //TRANS:  %1$s is the sign (-or empty), %2$d number of seconds
 | |
| 
 | |
|          return sprintf(_n('%1$s%2$s second', '%1$s%2$s seconds', $units['second']), $sign,
 | |
| 
 | |
|                         $units['second']);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return '';
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Format a timestamp into a normalized string (hh:mm:ss).
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param integer $time
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function timestampToCsvString($time) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($time < 0) {
 | |
| 
 | |
|          $time = abs($time);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $time = floor($time);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $units = Toolbox::getTimestampTimeUnits($time);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($units['day'] > 0) {
 | |
| 
 | |
|          $units['hour'] += 24*$units['day'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return str_pad($units['hour'], 2, '0', STR_PAD_LEFT)
 | |
| 
 | |
|          . ':'
 | |
| 
 | |
|          . str_pad($units['minute'], 2, '0', STR_PAD_LEFT)
 | |
| 
 | |
|          . ':'
 | |
| 
 | |
|          . str_pad($units['second'], 2, '0', STR_PAD_LEFT);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Extract url from web link
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function weblink_extract($value) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $value = preg_replace('/<a\s+href\="([^"]+)"[^>]*>[^<]*<\/a>/i', "$1", $value);
 | |
| 
 | |
|       return $value;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Redirection to $_SERVER['HTTP_REFERER'] page
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function back() {
 | |
| 
 | |
|       self::redirect(self::getBackUrl());
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Redirection hack
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $dest string: Redirection destination
 | |
| 
 | |
|     * @param $http_response_code string: Forces the HTTP response code to the specified value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function redirect($dest, $http_response_code = 302) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $toadd = '';
 | |
| 
 | |
|       $dest = addslashes($dest);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!headers_sent() && !Toolbox::isAjax()) {
 | |
| 
 | |
|           header("Location: $dest", true, $http_response_code);
 | |
| 
 | |
|           exit();
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (strpos($dest, "?") !== false) {
 | |
| 
 | |
|          $toadd = '&tokonq='.Toolbox::getRandomString(5);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $toadd = '?tokonq='.Toolbox::getRandomString(5);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<script type='text/javascript'>
 | |
| 
 | |
|             NomNav = navigator.appName;
 | |
| 
 | |
|             if (NomNav=='Konqueror') {
 | |
| 
 | |
|                window.location='".$dest.$toadd."';
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                window.location='".$dest."';
 | |
| 
 | |
|             }
 | |
| 
 | |
|          </script>";
 | |
| 
 | |
|       exit();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Redirection to Login page
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $params  param to add to URL (default '')
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function redirectToLogin($params = '') {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $dest     = $CFG_GLPI["root_doc"] . "/index.php";
 | |
| 
 | |
|       $url_dest = preg_replace(
 | |
| 
 | |
|          '/^' . preg_quote($CFG_GLPI["root_doc"], '/') . '/',
 | |
| 
 | |
|          '',
 | |
| 
 | |
|          $_SERVER['REQUEST_URI']
 | |
| 
 | |
|       );
 | |
| 
 | |
|       $dest    .= "?redirect=".rawurlencode($url_dest);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($params)) {
 | |
| 
 | |
|          $dest .= '&'.$params;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::redirect($dest);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display common message for item not found
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayNotFoundError() {
 | |
| 
 | |
|       global $CFG_GLPI, $HEADER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$HEADER_LOADED) {
 | |
| 
 | |
|          if (!Session::getCurrentInterface()) {
 | |
| 
 | |
|             self::nullHeader(__('Access denied'));
 | |
| 
 | |
| 
 | |
| 
 | |
|          } else if (Session::getCurrentInterface() == "central") {
 | |
| 
 | |
|             self::header(__('Access denied'));
 | |
| 
 | |
| 
 | |
| 
 | |
|          } else if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
|             self::helpHeader(__('Access denied'));
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "<div class='center'><br><br>";
 | |
| 
 | |
|       echo "<img src='" . $CFG_GLPI["root_doc"] . "/pics/warning.png' alt='".__s('Warning')."'>";
 | |
| 
 | |
|       echo "<br><br><span class='b'>" . __('Item not found') . "</span></div>";
 | |
| 
 | |
|       self::nullFooter();
 | |
| 
 | |
|       exit ();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display common message for privileges errors
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayRightError() {
 | |
| 
 | |
|       self::displayErrorAndDie(__("You don't have permission to perform this action."));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display a div containing messages set in session in the previous page
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayMessageAfterRedirect() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Affichage du message apres redirection
 | |
| 
 | |
|       if (isset($_SESSION["MESSAGE_AFTER_REDIRECT"])
 | |
| 
 | |
|           && count($_SESSION["MESSAGE_AFTER_REDIRECT"]) > 0) {
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($_SESSION['MESSAGE_AFTER_REDIRECT'] as $msgtype => $messages) {
 | |
| 
 | |
|             //get messages
 | |
| 
 | |
|             if (count($messages) > 0) {
 | |
| 
 | |
|                $html_messages = implode('<br/>', $messages);
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                continue;
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             //set title and css class
 | |
| 
 | |
|             switch ($msgtype) {
 | |
| 
 | |
|                case ERROR:
 | |
| 
 | |
|                   $title = __s('Error');
 | |
| 
 | |
|                   $class = 'err_msg';
 | |
| 
 | |
|                   break;
 | |
| 
 | |
|                case WARNING:
 | |
| 
 | |
|                   $title = __s('Warning');
 | |
| 
 | |
|                   $class = 'warn_msg';
 | |
| 
 | |
|                   break;
 | |
| 
 | |
|                case INFO:
 | |
| 
 | |
|                   $title = _sn('Information', 'Information', 1);
 | |
| 
 | |
|                   $class = 'info_msg';
 | |
| 
 | |
|                   break;
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             echo "<div id=\"message_after_redirect_$msgtype\" title=\"$title\">";
 | |
| 
 | |
|             echo $html_messages;
 | |
| 
 | |
|             echo "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             $scriptblock = "
 | |
| 
 | |
|                $(function() {
 | |
| 
 | |
|                   var _of = window;
 | |
| 
 | |
|                   var _at = 'right-20 bottom-20';
 | |
| 
 | |
|                   //calculate relative dialog position
 | |
| 
 | |
|                   $('.message_after_redirect').each(function() {
 | |
| 
 | |
|                      var _this = $(this);
 | |
| 
 | |
|                      if (_this.attr('aria-describedby') != 'message_after_redirect_$msgtype') {
 | |
| 
 | |
|                         _of = _this;
 | |
| 
 | |
|                         _at = 'right top-' + (10 + _this.outerHeight());
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
| 
 | |
| 
 | |
|                   $('#message_after_redirect_$msgtype').dialog({
 | |
| 
 | |
|                      dialogClass: 'message_after_redirect $class',
 | |
| 
 | |
|                      minHeight: 40,
 | |
| 
 | |
|                      minWidth: 200,
 | |
| 
 | |
|                      position: {
 | |
| 
 | |
|                         my: 'right bottom',
 | |
| 
 | |
|                         at: _at,
 | |
| 
 | |
|                         of: _of,
 | |
| 
 | |
|                         collision: 'none'
 | |
| 
 | |
|                      },
 | |
| 
 | |
|                      autoOpen: false,
 | |
| 
 | |
|                      show: {
 | |
| 
 | |
|                        effect: 'slide',
 | |
| 
 | |
|                        direction: 'down',
 | |
| 
 | |
|                        'duration': 800
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   })
 | |
| 
 | |
|                   .dialog('open');";
 | |
| 
 | |
| 
 | |
| 
 | |
|             //do not autoclose errors
 | |
| 
 | |
|             if ($msgtype != ERROR) {
 | |
| 
 | |
|                $scriptblock .= "
 | |
| 
 | |
| 
 | |
| 
 | |
|                   // close dialog on outside click
 | |
| 
 | |
|                   $(document.body).on('click', function(e){
 | |
| 
 | |
|                      if ($('#message_after_redirect_$msgtype').dialog('isOpen')
 | |
| 
 | |
|                          && !$(e.target).is('.ui-dialog, a')
 | |
| 
 | |
|                          && !$(e.target).closest('.ui-dialog').length) {
 | |
| 
 | |
|                         $('#message_after_redirect_$msgtype').remove();
 | |
| 
 | |
|                         // redo focus on initial element
 | |
| 
 | |
|                         e.target.focus();
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });";
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             $scriptblock .= "
 | |
| 
 | |
| 
 | |
| 
 | |
|                });
 | |
| 
 | |
|             ";
 | |
| 
 | |
| 
 | |
| 
 | |
|             echo Html::scriptBlock($scriptblock);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Clean message
 | |
| 
 | |
|       $_SESSION["MESSAGE_AFTER_REDIRECT"] = [];
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    static function displayAjaxMessageAfterRedirect() {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo Html::scriptBlock("
 | |
| 
 | |
|       displayAjaxMessageAfterRedirect = function() {
 | |
| 
 | |
|          // attach MESSAGE_AFTER_REDIRECT to body
 | |
| 
 | |
|          $('.message_after_redirect').remove();
 | |
| 
 | |
|          $.ajax({
 | |
| 
 | |
|             url:  '".$CFG_GLPI['root_doc']."/ajax/displayMessageAfterRedirect.php',
 | |
| 
 | |
|             success: function(html) {
 | |
| 
 | |
|                $('body').append(html);
 | |
| 
 | |
|             }
 | |
| 
 | |
|          });
 | |
| 
 | |
|       }");
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Common Title Function
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string        $ref_pic_link    Path to the image to display (default '')
 | |
| 
 | |
|     * @param string        $ref_pic_text    Alt text of the icon (default '')
 | |
| 
 | |
|     * @param string        $ref_title       Title to display (default '')
 | |
| 
 | |
|     * @param array|string  $ref_btts        Extra items to display array(link=>text...) (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayTitle($ref_pic_link = "", $ref_pic_text = "", $ref_title = "", $ref_btts = "") {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $ref_pic_text = htmlentities($ref_pic_text, ENT_QUOTES, 'UTF-8');
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<div class='center'><table class='tab_glpi'><tr>";
 | |
| 
 | |
|       if ($ref_pic_link!="") {
 | |
| 
 | |
|          $ref_pic_text = self::clean($ref_pic_text);
 | |
| 
 | |
|          echo "<td>".Html::image($ref_pic_link, ['alt' => $ref_pic_text])."</td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($ref_title != "") {
 | |
| 
 | |
|          echo "<td><span class='vsubmit'> ".$ref_title." </span></td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($ref_btts) && count($ref_btts)) {
 | |
| 
 | |
|          foreach ($ref_btts as $key => $val) {
 | |
| 
 | |
|             echo "<td><a class='vsubmit' href='".$key."'>".$val."</a></td>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</tr></table></div>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|    * Clean Display of Request
 | |
| 
 | |
|    *
 | |
| 
 | |
|    * @since 0.83.1
 | |
| 
 | |
|    *
 | |
| 
 | |
|    * @param string $request  SQL request
 | |
| 
 | |
|    *
 | |
| 
 | |
|    * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function cleanSQLDisplay($request) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $request = str_replace("<", "<", $request);
 | |
| 
 | |
|       $request = str_replace(">", ">", $request);
 | |
| 
 | |
|       $request = str_ireplace("UNION", "<br/>UNION<br/>", $request);
 | |
| 
 | |
|       $request = str_ireplace("UNION ALL", "<br/>UNION ALL<br/>", $request);
 | |
| 
 | |
|       $request = str_ireplace("FROM", "<br/>FROM", $request);
 | |
| 
 | |
|       $request = str_ireplace("WHERE", "<br/>WHERE", $request);
 | |
| 
 | |
|       $request = str_ireplace("INNER JOIN", "<br/>INNER JOIN", $request);
 | |
| 
 | |
|       $request = str_ireplace("LEFT JOIN", "<br/>LEFT JOIN", $request);
 | |
| 
 | |
|       $request = str_ireplace("ORDER BY", "<br/>ORDER BY", $request);
 | |
| 
 | |
|       $request = str_ireplace("SORT", "<br/>SORT", $request);
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $request;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display Debug Information
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param boolean $with_session with session information (true by default)
 | |
| 
 | |
|     * @param boolean $ajax         If we're called from ajax (false by default)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayDebugInfos($with_session = true, $ajax = false) {
 | |
| 
 | |
|       global $CFG_GLPI, $DEBUG_SQL, $SQL_TOTAL_REQUEST, $DEBUG_AUTOLOAD;
 | |
| 
 | |
|       $GLPI_CACHE = Config::getCache('cache_db');
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Only for debug mode so not need to be translated
 | |
| 
 | |
|       if ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) { // mode debug
 | |
| 
 | |
|          $rand = mt_rand();
 | |
| 
 | |
|          echo "<div class='debug ".($ajax?"debug_ajax":"")."'>";
 | |
| 
 | |
|          if (!$ajax) {
 | |
| 
 | |
|             echo "<span class='fa-stack fa-lg' id='see_debug'>
 | |
| 
 | |
|                      <i class='fa fa-circle fa-stack-2x primary-fg-inverse'></i>
 | |
| 
 | |
|                      <a href='#' class='fa fa-bug fa-stack-1x primary-fg' title='" . __s('Display GLPI debug informations')  . "'>
 | |
| 
 | |
|                         <span class='sr-only'>See GLPI DEBUG</span>
 | |
| 
 | |
|                      </a>
 | |
| 
 | |
|             </span>";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "<div id='debugtabs$rand'><ul>";
 | |
| 
 | |
|          if ($CFG_GLPI["debug_sql"]) {
 | |
| 
 | |
|             echo "<li><a href='#debugsql$rand'>SQL REQUEST</a></li>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          if ($CFG_GLPI["debug_vars"]) {
 | |
| 
 | |
|             echo "<li><a href='#debugautoload$rand'>AUTOLOAD</a></li>";
 | |
| 
 | |
|             echo "<li><a href='#debugpost$rand'>POST VARIABLE</a></li>";
 | |
| 
 | |
|             echo "<li><a href='#debugget$rand'>GET VARIABLE</a></li>";
 | |
| 
 | |
|             if ($with_session) {
 | |
| 
 | |
|                echo "<li><a href='#debugsession$rand'>SESSION VARIABLE</a></li>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "<li><a href='#debugserver$rand'>SERVER VARIABLE</a></li>";
 | |
| 
 | |
|             if ($GLPI_CACHE instanceof SimpleCache) {
 | |
| 
 | |
|                echo "<li><a href='#debugcache$rand'>CACHE VARIABLE</a></li>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "</ul>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ($CFG_GLPI["debug_sql"]) {
 | |
| 
 | |
|             echo "<div id='debugsql$rand'>";
 | |
| 
 | |
|             echo "<div class='b'>".$SQL_TOTAL_REQUEST." Queries ";
 | |
| 
 | |
|             echo "took  ".array_sum($DEBUG_SQL['times'])."s</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             echo "<table class='tab_cadre'><tr><th>N° </th><th>Queries</th><th>Time</th>";
 | |
| 
 | |
|             echo "<th>Errors</th></tr>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             foreach ($DEBUG_SQL['queries'] as $num => $query) {
 | |
| 
 | |
|                echo "<tr class='tab_bg_".(($num%2)+1)."'><td>$num</td><td>";
 | |
| 
 | |
|                echo self::cleanSQLDisplay($query);
 | |
| 
 | |
|                echo "</td><td>";
 | |
| 
 | |
|                echo $DEBUG_SQL['times'][$num];
 | |
| 
 | |
|                echo "</td><td>";
 | |
| 
 | |
|                if (isset($DEBUG_SQL['errors'][$num])) {
 | |
| 
 | |
|                   echo $DEBUG_SQL['errors'][$num];
 | |
| 
 | |
|                } else {
 | |
| 
 | |
|                   echo " ";
 | |
| 
 | |
|                }
 | |
| 
 | |
|                echo "</td></tr>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</table>";
 | |
| 
 | |
|             echo "</div>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          if ($CFG_GLPI["debug_vars"]) {
 | |
| 
 | |
|             echo "<div id='debugautoload$rand'>".implode(', ', $DEBUG_AUTOLOAD)."</div>";
 | |
| 
 | |
|             echo "<div id='debugpost$rand'>";
 | |
| 
 | |
|             self::printCleanArray($_POST, 0, true);
 | |
| 
 | |
|             echo "</div>";
 | |
| 
 | |
|             echo "<div id='debugget$rand'>";
 | |
| 
 | |
|             self::printCleanArray($_GET, 0, true);
 | |
| 
 | |
|             echo "</div>";
 | |
| 
 | |
|             if ($with_session) {
 | |
| 
 | |
|                echo "<div id='debugsession$rand'>";
 | |
| 
 | |
|                self::printCleanArray($_SESSION, 0, true);
 | |
| 
 | |
|                echo "</div>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "<div id='debugserver$rand'>";
 | |
| 
 | |
|             self::printCleanArray($_SERVER, 0, true);
 | |
| 
 | |
|             echo "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if ($GLPI_CACHE instanceof SimpleCache) {
 | |
| 
 | |
|                echo "<div id='debugcache$rand'>";
 | |
| 
 | |
|                $cache_keys = $GLPI_CACHE->getAllKnownCacheKeys();
 | |
| 
 | |
|                $cache_contents = $GLPI_CACHE->getMultiple($cache_keys);
 | |
| 
 | |
|                self::printCleanArray($cache_contents, 0, true);
 | |
| 
 | |
|                echo "</div>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo Html::scriptBlock("
 | |
| 
 | |
|             $('#debugtabs$rand').tabs({
 | |
| 
 | |
|                collapsible: true
 | |
| 
 | |
|             }).addClass( 'ui-tabs-vertical ui-helper-clearfix' );
 | |
| 
 | |
| 
 | |
| 
 | |
|             $('<li class=\"close\"><button id= \"close_debug$rand\">close debug</button></li>')
 | |
| 
 | |
|                .appendTo('#debugtabs$rand ul');
 | |
| 
 | |
| 
 | |
| 
 | |
|             $('#close_debug$rand').button({
 | |
| 
 | |
|                icons: {
 | |
| 
 | |
|                   primary: 'ui-icon-close'
 | |
| 
 | |
|                },
 | |
| 
 | |
|                text: false
 | |
| 
 | |
|             }).click(function() {
 | |
| 
 | |
|                 $('#debugtabs$rand').css('display', 'none');
 | |
| 
 | |
|             });
 | |
| 
 | |
| 
 | |
| 
 | |
|             $('#see_debug').click(function(e) {
 | |
| 
 | |
|                e.preventDefault();
 | |
| 
 | |
|                console.log('see_debug #debugtabs$rand');
 | |
| 
 | |
|                $('#debugtabs$rand').css('display', 'block');
 | |
| 
 | |
|             });
 | |
| 
 | |
|          ");
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "</div></div>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display a Link to the last page using http_referer if available else use history.back
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayBackLink() {
 | |
| 
 | |
|       $url_referer = self::getBackUrl();
 | |
| 
 | |
|       if ($url_referer !== false) {
 | |
| 
 | |
|          echo "<a href='$url_referer'>".__('Back')."</a>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo "<a href='javascript:history.back();'>".__('Back')."</a>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Return an url for getting back to previous page.
 | |
| 
 | |
|     * Remove `forcetab` parameter if exists to prevent bad tab display
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $url_in optional url to return (without forcetab param), if empty, we will user HTTP_REFERER from server
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return mixed [string|boolean] false, if failed, else the url string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function getBackUrl($url_in = "") {
 | |
| 
 | |
|       if (isset($_SERVER['HTTP_REFERER'])
 | |
| 
 | |
|           && strlen($url_in) == 0) {
 | |
| 
 | |
|          $url_in = $_SERVER['HTTP_REFERER'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (strlen($url_in) > 0) {
 | |
| 
 | |
|          $url = parse_url($url_in);
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (isset($url['query'])) {
 | |
| 
 | |
|             parse_str($url['query'], $parameters);
 | |
| 
 | |
|             unset($parameters['forcetab']);
 | |
| 
 | |
|             $new_query = http_build_query($parameters);
 | |
| 
 | |
|             return str_replace($url['query'], $new_query, $url_in);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          return $url_in;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return false;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Simple Error message page
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $message  displayed before dying
 | |
| 
 | |
|     * @param boolean $minimal  set to true do not display app menu (false by default)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayErrorAndDie ($message, $minimal = false) {
 | |
| 
 | |
|       global $CFG_GLPI, $HEADER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$HEADER_LOADED) {
 | |
| 
 | |
|          if ($minimal || !Session::getCurrentInterface()) {
 | |
| 
 | |
|             self::nullHeader(__('Access denied'), '');
 | |
| 
 | |
| 
 | |
| 
 | |
|          } else if (Session::getCurrentInterface() == "central") {
 | |
| 
 | |
|             self::header(__('Access denied'), '');
 | |
| 
 | |
| 
 | |
| 
 | |
|          } else if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
|             self::helpHeader(__('Access denied'), '');
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "<div class='center'><br><br>";
 | |
| 
 | |
|       echo Html::image($CFG_GLPI["root_doc"] . "/pics/warning.png", ['alt' => __('Warning')]);
 | |
| 
 | |
|       echo "<br><br><span class='b'>$message</span></div>";
 | |
| 
 | |
|       self::nullFooter();
 | |
| 
 | |
|       exit ();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Add confirmation on button or link before action
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $string             string   to display or array of string for using multilines
 | |
| 
 | |
|     * @param $additionalactions  string   additional actions to do on success confirmation
 | |
| 
 | |
|     *                                     (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function addConfirmationOnAction($string, $additionalactions = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       return "onclick=\"".Html::getConfirmationOnActionScript($string, $additionalactions)."\"";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get confirmation on button or link before action
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $string             string   to display or array of string for using multilines
 | |
| 
 | |
|     * @param $additionalactions  string   additional actions to do on success confirmation
 | |
| 
 | |
|     *                                     (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string confirmation script
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getConfirmationOnActionScript($string, $additionalactions = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!is_array($string)) {
 | |
| 
 | |
|          $string = [$string];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $string            = Toolbox::addslashes_deep($string);
 | |
| 
 | |
|       $additionalactions = trim($additionalactions);
 | |
| 
 | |
|       $out               = "";
 | |
| 
 | |
|       $multiple          = false;
 | |
| 
 | |
|       $close_string      = '';
 | |
| 
 | |
|       // Manage multiple confirmation
 | |
| 
 | |
|       foreach ($string as $tab) {
 | |
| 
 | |
|          if (is_array($tab)) {
 | |
| 
 | |
|             $multiple      = true;
 | |
| 
 | |
|             $out          .="if (window.confirm('";
 | |
| 
 | |
|             $out          .= implode('\n', $tab);
 | |
| 
 | |
|             $out          .= "')){ ";
 | |
| 
 | |
|             $close_string .= "return true;} else { return false;}";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // manage simple confirmation
 | |
| 
 | |
|       if (!$multiple) {
 | |
| 
 | |
|             $out          .="if (window.confirm('";
 | |
| 
 | |
|             $out          .= implode('\n', $string);
 | |
| 
 | |
|             $out          .= "')){ ";
 | |
| 
 | |
|             $close_string .= "return true;} else { return false;}";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= $additionalactions.(substr($additionalactions, -1)!=';'?';':'').$close_string;
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Manage progresse bars
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id                 HTML ID of the progress bar
 | |
| 
 | |
|     * @param $options    array   progress status
 | |
| 
 | |
|     *                    - create    do we have to create it ?
 | |
| 
 | |
|     *                    - message   add or change the message
 | |
| 
 | |
|     *                    - percent   current level
 | |
| 
 | |
|     *
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     **/
 | |
| 
 | |
|    static function progressBar($id, array $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $params            = [];
 | |
| 
 | |
|       $params['create']  = false;
 | |
| 
 | |
|       $params['message'] = null;
 | |
| 
 | |
|       $params['percent'] = -1;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $params[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['create']) {
 | |
| 
 | |
|          echo "<div class='doaction_cadre'>";
 | |
| 
 | |
|          echo "<div class='doaction_progress' id='$id'>";
 | |
| 
 | |
|          echo "<div class='doaction_progress_text' id='".$id."_text' > </div>";
 | |
| 
 | |
|          echo "</div>";
 | |
| 
 | |
|          echo "</div><br>";
 | |
| 
 | |
|          echo Html::scriptBlock(self::jsGetElementbyID($id).".progressbar();");
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['message'] !== null) {
 | |
| 
 | |
|          echo Html::scriptBlock(self::jsGetElementbyID($id.'_text').".text(\"".
 | |
| 
 | |
|                                 addslashes($params['message'])."\");");
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (($params['percent'] >= 0)
 | |
| 
 | |
|           && ($params['percent'] <= 100)) {
 | |
| 
 | |
|          echo Html::scriptBlock(self::jsGetElementbyID($id).".progressbar('option', 'value', ".
 | |
| 
 | |
|                                 $params['percent']." );");
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$params['create']) {
 | |
| 
 | |
|          self::glpi_flush();
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Create a Dynamic Progress Bar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $msg  initial message (under the bar)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     **/
 | |
| 
 | |
|    static function createProgressBar($msg = " ") {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $options = ['create' => true];
 | |
| 
 | |
|       if ($msg != " ") {
 | |
| 
 | |
|          $options['message'] = $msg;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::progressBar('doaction_progress', $options);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Change the Message under the Progress Bar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $msg message under the bar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function changeProgressBarMessage($msg = " ") {
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::progressBar('doaction_progress', ['message' => $msg]);
 | |
| 
 | |
|       self::glpi_flush();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Change the Progress Bar Position
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param float  $crt   Current Value (less then $tot)
 | |
| 
 | |
|     * @param float  $tot   Maximum Value
 | |
| 
 | |
|     * @param string $msg   message inside the bar (default is %)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function changeProgressBarPosition($crt, $tot, $msg = "") {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $options = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$tot) {
 | |
| 
 | |
|          $options['percent'] = 0;
 | |
| 
 | |
|       } else if ($crt>$tot) {
 | |
| 
 | |
|          $options['percent'] = 100;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $options['percent'] = 100*$crt/$tot;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($msg != "") {
 | |
| 
 | |
|          $options['message'] = $msg;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::progressBar('doaction_progress', $options);
 | |
| 
 | |
|       self::glpi_flush();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display a simple progress bar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param integer $width       Width   of the progress bar
 | |
| 
 | |
|     * @param float   $percent     Percent of the progress bar
 | |
| 
 | |
|     * @param array   $options     possible options:
 | |
| 
 | |
|     *            - title : string title to display (default Progesssion)
 | |
| 
 | |
|     *            - simple : display a simple progress bar (no title / only percent)
 | |
| 
 | |
|     *            - forcepadding : boolean force str_pad to force refresh (default true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function displayProgressBar($width, $percent, $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $param['title']        = __('Progress');
 | |
| 
 | |
|       $param['simple']       = false;
 | |
| 
 | |
|       $param['forcepadding'] = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $param[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $percentwidth = floor($percent*$width/100);
 | |
| 
 | |
|       $output       = "<div class='center'><table class='tab_cadre' width='".($width+20)."px'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$param['simple']) {
 | |
| 
 | |
|          $output .= "<tr><th class='center'>".$param['title']." ".$percent."%</th></tr>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $output .= "<tr><td>
 | |
| 
 | |
|                   <table class='tabcompact'><tr><td class='center' style='background:url(".$CFG_GLPI["root_doc"].
 | |
| 
 | |
|                    "/pics/loader.png) repeat-x; padding: 0px;font-size: 10px;' width='".
 | |
| 
 | |
|                    $percentwidth." px' height='12'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($param['simple']) {
 | |
| 
 | |
|          $output .= $percent."%";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $output .= ' ';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output .= "</td></tr></table></td>";
 | |
| 
 | |
|       $output .= "</tr></table>";
 | |
| 
 | |
|       $output .= "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$param['forcepadding']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo Toolbox::str_pad($output, 4096);
 | |
| 
 | |
|          self::glpi_flush();
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Include common HTML headers
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $title   title used for the page (default '')
 | |
| 
 | |
|     * @param string $sector  sector in which the page displayed is
 | |
| 
 | |
|     * @param string $item    item corresponding to the page displayed
 | |
| 
 | |
|     * @param string $option  option corresponding to the page displayed
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function includeHeader($title = '', $sector = 'none', $item = 'none', $option = '') {
 | |
| 
 | |
|       global $CFG_GLPI, $DB, $PLUGIN_HOOKS;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // complete title with id if exist
 | |
| 
 | |
|       if (isset($_GET['id']) && $_GET['id']) {
 | |
| 
 | |
|          $title = sprintf(__('%1$s - %2$s'), $title, $_GET['id']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Send UTF8 Headers
 | |
| 
 | |
|       header("Content-Type: text/html; charset=UTF-8");
 | |
| 
 | |
|       // Allow only frame from same server to prevent click-jacking
 | |
| 
 | |
|       header('x-frame-options:SAMEORIGIN');
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Send extra expires header
 | |
| 
 | |
|       self::header_nocache();
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Start the page
 | |
| 
 | |
|       echo "<!DOCTYPE html>\n";
 | |
| 
 | |
|       echo "<html lang=\"{$CFG_GLPI["languages"][$_SESSION['glpilanguage']][3]}\">";
 | |
| 
 | |
|       echo "<head><title>PORTAIL SOPHAL - ".$title."</title>";
 | |
| 
 | |
|       echo "<meta charset=\"utf-8\">";
 | |
| 
 | |
| 
 | |
| 
 | |
|       //prevent IE to turn into compatible mode...
 | |
| 
 | |
|       echo "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // auto desktop / mobile viewport
 | |
| 
 | |
|       echo "<meta name='viewport' content='width=device-width, initial-scale=1'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       //detect theme
 | |
| 
 | |
|       $theme = isset($_SESSION['glpipalette']) ? $_SESSION['glpipalette'] : 'auror';
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo Html::css('public/lib/base.css');
 | |
| 
 | |
|       //JSTree JS part is loaded on demand... But from an ajax call to display entities. Need to have CSS loaded.
 | |
| 
 | |
|       echo Html::css('css/jstree-glpi.css');
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($CFG_GLPI['notifications_ajax']) && $CFG_GLPI['notifications_ajax']) {
 | |
| 
 | |
|          Html::requireJs('notifications_ajax');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo Html::css('public/lib/leaflet.css');
 | |
| 
 | |
|       Html::requireJs('leaflet');
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo Html::css('public/lib/flatpickr.css');
 | |
| 
 | |
|       if ($theme != "darker") {
 | |
| 
 | |
|          echo Html::css('public/lib/flatpickr/themes/light.css');
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo Html::css('public/lib/flatpickr/themes/dark.css');
 | |
| 
 | |
|       }
 | |
| 
 | |
|       Html::requireJs('flatpickr');
 | |
| 
 | |
| 
 | |
| 
 | |
|       //on demand JS
 | |
| 
 | |
|       if ($sector != 'none' || $item != 'none' || $option != '') {
 | |
| 
 | |
|          $jslibs = [];
 | |
| 
 | |
|          if (isset($CFG_GLPI['javascript'][$sector])) {
 | |
| 
 | |
|             if (isset($CFG_GLPI['javascript'][$sector][$item])) {
 | |
| 
 | |
|                if (isset($CFG_GLPI['javascript'][$sector][$item][$option])) {
 | |
| 
 | |
|                   $jslibs = $CFG_GLPI['javascript'][$sector][$item][$option];
 | |
| 
 | |
|                } else {
 | |
| 
 | |
|                   $jslibs = $CFG_GLPI['javascript'][$sector][$item];
 | |
| 
 | |
|                }
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                $jslibs = $CFG_GLPI['javascript'][$sector];
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('planning', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('planning');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('fullcalendar', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/fullcalendar.css',
 | |
| 
 | |
|                            ['media' => '']);
 | |
| 
 | |
|             Html::requireJs('fullcalendar');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('gantt', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/jquery-gantt.css');
 | |
| 
 | |
|             Html::requireJs('gantt');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('kanban', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('kanban');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('rateit', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/jquery.rateit.css');
 | |
| 
 | |
|             Html::requireJs('rateit');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('dashboard', $jslibs)) {
 | |
| 
 | |
|             echo Html::scss('css/dashboard');
 | |
| 
 | |
|             Html::requireJs('dashboard');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('marketplace', $jslibs)) {
 | |
| 
 | |
|             echo Html::scss('css/marketplace');
 | |
| 
 | |
|             Html::requireJs('marketplace');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('rack', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('rack');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('gridstack', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/gridstack.css');
 | |
| 
 | |
|             Html::requireJs('gridstack');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('sortable', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('sortable');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('tinymce', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('tinymce');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('clipboard', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('clipboard');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('jstree', $jslibs)) {
 | |
| 
 | |
|             Html::requireJs('jstree');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('charts', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/chartist.css');
 | |
| 
 | |
|             echo Html::css('css/chartists-glpi.css');
 | |
| 
 | |
|             Html::requireJs('charts');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('codemirror', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/codemirror.css');
 | |
| 
 | |
|             Html::requireJs('codemirror');
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (in_array('photoswipe', $jslibs)) {
 | |
| 
 | |
|             echo Html::css('public/lib/photoswipe.css');
 | |
| 
 | |
|             Html::requireJs('photoswipe');
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
|          echo Html::css('public/lib/jquery.rateit.css');
 | |
| 
 | |
|          Html::requireJs('rateit');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       //file upload is required... almost everywhere.
 | |
| 
 | |
|       Html::requireJs('fileupload');
 | |
| 
 | |
| 
 | |
| 
 | |
|       // load fuzzy search everywhere
 | |
| 
 | |
|       Html::requireJs('fuzzy');
 | |
| 
 | |
| 
 | |
| 
 | |
|       // load log filters everywhere
 | |
| 
 | |
|       Html::requireJs('log_filters');
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo Html::css('css/jquery-glpi.css');
 | |
| 
 | |
|       if (CommonGLPI::isLayoutWithMain()
 | |
| 
 | |
|           && !CommonGLPI::isLayoutExcludedPage()) {
 | |
| 
 | |
|          echo Html::css('public/lib/scrollable-tabs.css');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       //  CSS link
 | |
| 
 | |
|       echo Html::scss('css/styles');
 | |
| 
 | |
|       if (isset($_SESSION['glpihighcontrast_css']) && $_SESSION['glpihighcontrast_css']) {
 | |
| 
 | |
|          echo Html::scss('css/highcontrast');
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo Html::scss('css/palettes/' . $theme);
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo Html::css('css/print.css', ['media' => 'print']);
 | |
| 
 | |
|       echo "<link rel='shortcut icon' type='images/x-icon' href='".
 | |
| 
 | |
|              $CFG_GLPI["root_doc"]."/pics/favicon.ico' >\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Add specific css for plugins
 | |
| 
 | |
|       if (isset($PLUGIN_HOOKS['add_css']) && count($PLUGIN_HOOKS['add_css'])) {
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($PLUGIN_HOOKS["add_css"] as $plugin => $files) {
 | |
| 
 | |
|             if (!Plugin::isPluginActive($plugin)) {
 | |
| 
 | |
|                continue;
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             $plugin_root_dir = Plugin::getPhpDir($plugin, true);
 | |
| 
 | |
|             $plugin_web_dir  = Plugin::getWebDir($plugin, false);
 | |
| 
 | |
|             $version         = Plugin::getInfo($plugin, 'version');
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (!is_array($files)) {
 | |
| 
 | |
|                $files = [$files];
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             foreach ($files as $file) {
 | |
| 
 | |
|                $filename = "$plugin_root_dir/$file";
 | |
| 
 | |
| 
 | |
| 
 | |
|                if (!file_exists($filename)) {
 | |
| 
 | |
|                   continue;
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                if ('scss' === substr(strrchr($filename, '.'), 1)) {
 | |
| 
 | |
|                   echo Html::scss("$plugin_web_dir/$file", ['version' => $version]);
 | |
| 
 | |
|                } else {
 | |
| 
 | |
|                   echo Html::css("$plugin_web_dir/$file", ['version' => $version]);
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Custom CSS for active entity
 | |
| 
 | |
|       if ($DB instanceof DBmysql && $DB->connected) {
 | |
| 
 | |
|          $entity = new Entity();
 | |
| 
 | |
|          if (isset($_SESSION['glpiactive_entity'])) {
 | |
| 
 | |
|             // Apply active entity styles
 | |
| 
 | |
|             $entity->getFromDB($_SESSION['glpiactive_entity']);
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             // Apply root entity styles
 | |
| 
 | |
|             $entity->getFromDB('0');
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo $entity->getCustomCssTag();
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // AJAX library
 | |
| 
 | |
|       echo Html::script('public/lib/base.js');
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Locales
 | |
| 
 | |
|       $locales_domains = ['glpi' => GLPI_VERSION]; // base domain
 | |
| 
 | |
|       $plugins = Plugin::getPlugins();
 | |
| 
 | |
|       foreach ($plugins as $plugin) {
 | |
| 
 | |
|          $locales_domains[$plugin] = Plugin::getInfo($plugin, 'version');
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (isset($_SESSION['glpilanguage'])) {
 | |
| 
 | |
|          echo Html::scriptBlock(<<<JAVASCRIPT
 | |
| 
 | |
|             $(function() {
 | |
| 
 | |
|                i18n.setLocale('{$_SESSION['glpilanguage']}');
 | |
| 
 | |
|             });
 | |
| 
 | |
| JAVASCRIPT
 | |
| 
 | |
|          );
 | |
| 
 | |
|          foreach ($locales_domains as $locale_domain => $locale_version) {
 | |
| 
 | |
|             $locales_url = $CFG_GLPI['root_doc'] . '/front/locale.php'
 | |
| 
 | |
|                . '?domain=' . $locale_domain
 | |
| 
 | |
|                . '&version=' . $locale_version
 | |
| 
 | |
|                . ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE ? '&debug' : '');
 | |
| 
 | |
|             $locale_js = <<<JAVASCRIPT
 | |
| 
 | |
|                $(function() {
 | |
| 
 | |
|                   $.ajax({
 | |
| 
 | |
|                      type: 'GET',
 | |
| 
 | |
|                      url: '{$locales_url}',
 | |
| 
 | |
|                      success: function(json) {
 | |
| 
 | |
|                         i18n.loadJSON(json, '{$locale_domain}');
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
|                });
 | |
| 
 | |
| JAVASCRIPT;
 | |
| 
 | |
|             echo Html::scriptBlock($locale_js);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // layout
 | |
| 
 | |
|       if (CommonGLPI::isLayoutWithMain()
 | |
| 
 | |
|           && !CommonGLPI::isLayoutExcludedPage()) {
 | |
| 
 | |
|          echo Html::script('public/lib/scrollable-tabs.js');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // End of Head
 | |
| 
 | |
|       echo "</head>\n";
 | |
| 
 | |
|       self::glpi_flush();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * @since 0.90
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getMenuInfos() {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $menu = [
 | |
| 
 | |
|          'assets' => [
 | |
| 
 | |
|             'title' => __('Assets'),
 | |
| 
 | |
|             'types' => array_merge([
 | |
| 
 | |
|                'Computer', 'Monitor', 'Software',
 | |
| 
 | |
|                'NetworkEquipment', 'Peripheral', 'Printer',
 | |
| 
 | |
|                'CartridgeItem', 'ConsumableItem', 'Phone',
 | |
| 
 | |
|                'Rack', 'Enclosure', 'PDU', 'PassiveDCEquipment'
 | |
| 
 | |
|             ], $CFG_GLPI['devices_in_menu']),
 | |
| 
 | |
|             'default' => '/front/dashboard_assets.php'
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'helpdesk' => [
 | |
| 
 | |
|             'title' => __('Assistance'),
 | |
| 
 | |
|             'types' => [
 | |
| 
 | |
|                'Ticket', 'Problem', 'Change',
 | |
| 
 | |
|                'Planning', 'Stat', 'TicketRecurrent'
 | |
| 
 | |
|             ],
 | |
| 
 | |
|             'default' => '/front/dashboard_helpdesk.php'
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'management' => [
 | |
| 
 | |
|             'title' => __('Management'),
 | |
| 
 | |
|             'types' => [
 | |
| 
 | |
|                'SoftwareLicense','Budget', 'Supplier', 'Contact', 'Contract',
 | |
| 
 | |
|                'Document', 'Line', 'Certificate', 'Datacenter', 'Cluster', 'Domain',
 | |
| 
 | |
|                'Appliance'
 | |
| 
 | |
|             ]
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'tools' => [
 | |
| 
 | |
|             'title' => __('Tools'),
 | |
| 
 | |
|             'types' => [
 | |
| 
 | |
|                'Project', 'Reminder', 'RSSFeed', 'KnowbaseItem',
 | |
| 
 | |
|                'ReservationItem', 'Report', 'MigrationCleaner',
 | |
| 
 | |
|                'SavedSearch', 'Impact'
 | |
| 
 | |
|             ]
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'plugins' => [
 | |
| 
 | |
|             'title' => _n('Plugin', 'Plugins', Session::getPluralNumber()),
 | |
| 
 | |
|             'types' => []
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'admin' => [
 | |
| 
 | |
|             'title' => __('Administration'),
 | |
| 
 | |
|             'types' => [
 | |
| 
 | |
|                'User', 'Group', 'Entity', 'Rule',
 | |
| 
 | |
|                'Profile', 'QueuedNotification', 'Glpi\\Event'
 | |
| 
 | |
|             ]
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'config' => [
 | |
| 
 | |
|             'title' => __('Setup'),
 | |
| 
 | |
|             'types' => [
 | |
| 
 | |
|                'CommonDropdown', 'CommonDevice', 'Notification',
 | |
| 
 | |
|                'SLM', 'Config', 'FieldUnicity', 'CronTask', 'Auth',
 | |
| 
 | |
|                'MailCollector', 'Link', 'Plugin'
 | |
| 
 | |
|             ]
 | |
| 
 | |
|          ],
 | |
| 
 | |
| 
 | |
| 
 | |
|          // special items
 | |
| 
 | |
|          'preference' => [
 | |
| 
 | |
|             'title' => __('My settings'),
 | |
| 
 | |
|             'default' => '/front/preference.php'
 | |
| 
 | |
|          ],
 | |
| 
 | |
|       ];
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $menu;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Generate menu array in $_SESSION['glpimenu'] and return the array
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since  9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param  boolean $force do we need to force regeneration of $_SESSION['glpimenu']
 | |
| 
 | |
|     * @return array          the menu array
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function generateMenuSession($force = false) {
 | |
| 
 | |
|       global $PLUGIN_HOOKS;
 | |
| 
 | |
|       $menu = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($force
 | |
| 
 | |
|           || !isset($_SESSION['glpimenu'])
 | |
| 
 | |
|           || !is_array($_SESSION['glpimenu'])
 | |
| 
 | |
|           || (count($_SESSION['glpimenu']) == 0)) {
 | |
| 
 | |
| 
 | |
| 
 | |
|          $menu = self::getMenuInfos();
 | |
| 
 | |
| 
 | |
| 
 | |
|          // Permit to plugins to add entry to others sector !
 | |
| 
 | |
|          if (isset($PLUGIN_HOOKS["menu_toadd"]) && count($PLUGIN_HOOKS["menu_toadd"])) {
 | |
| 
 | |
| 
 | |
| 
 | |
|             foreach ($PLUGIN_HOOKS["menu_toadd"] as $plugin => $items) {
 | |
| 
 | |
|                if (!Plugin::isPluginActive($plugin)) {
 | |
| 
 | |
|                   continue;
 | |
| 
 | |
|                }
 | |
| 
 | |
|                if (count($items)) {
 | |
| 
 | |
|                   foreach ($items as $key => $val) {
 | |
| 
 | |
|                      if (is_array($val)) {
 | |
| 
 | |
|                         foreach ($val as $k => $object) {
 | |
| 
 | |
|                            $menu[$key]['types'][] = $object;
 | |
| 
 | |
|                         }
 | |
| 
 | |
|                      } else {
 | |
| 
 | |
|                         if (isset($menu[$key])) {
 | |
| 
 | |
|                            $menu[$key]['types'][] = $val;
 | |
| 
 | |
|                         }
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             // Move Setup menu ('config') to the last position in $menu (always last menu),
 | |
| 
 | |
|             // in case some plugin inserted a new top level menu
 | |
| 
 | |
|             $categories = array_keys($menu);
 | |
| 
 | |
|             $menu += array_splice($menu, array_search('config', $categories, true), 1);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($menu as $category => $entries) {
 | |
| 
 | |
|             if (isset($entries['types']) && count($entries['types'])) {
 | |
| 
 | |
|                foreach ($entries['types'] as $type) {
 | |
| 
 | |
|                   if ($data = $type::getMenuContent()) {
 | |
| 
 | |
|                      // Multi menu entries management
 | |
| 
 | |
|                      if (isset($data['is_multi_entries']) && $data['is_multi_entries']) {
 | |
| 
 | |
|                         if (!isset($menu[$category]['content'])) {
 | |
| 
 | |
|                            $menu[$category]['content'] = [];
 | |
| 
 | |
|                         }
 | |
| 
 | |
|                         $menu[$category]['content'] += $data;
 | |
| 
 | |
|                      } else {
 | |
| 
 | |
|                         $menu[$category]['content'][strtolower($type)] = $data;
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      if (!isset($menu[$category]['title']) && isset($data['title'])) {
 | |
| 
 | |
|                         $menu[$category]['title'] = $data['title'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      if (!isset($menu[$category]['default']) && isset($data['default'])) {
 | |
| 
 | |
|                         $menu[$category]['default'] = $data['default'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             // Define default link :
 | |
| 
 | |
|             if (! isset($menu[$category]['default']) && isset($menu[$category]['content']) && count($menu[$category]['content'])) {
 | |
| 
 | |
|                foreach ($menu[$category]['content'] as $val) {
 | |
| 
 | |
|                   if (isset($val['page'])) {
 | |
| 
 | |
|                      $menu[$category]['default'] = $val['page'];
 | |
| 
 | |
|                      break;
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $allassets = [
 | |
| 
 | |
|             'Computer',
 | |
| 
 | |
|             'Monitor',
 | |
| 
 | |
|             'Peripheral',
 | |
| 
 | |
|             'NetworkEquipment',
 | |
| 
 | |
|             'Phone',
 | |
| 
 | |
|             'Printer'
 | |
| 
 | |
|          ];
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($allassets as $type) {
 | |
| 
 | |
|             if (isset($menu['assets']['content'][strtolower($type)])) {
 | |
| 
 | |
|                $menu['assets']['content']['allassets']['title']            = __('Global');
 | |
| 
 | |
|                $menu['assets']['content']['allassets']['shortcut']         = '';
 | |
| 
 | |
|                $menu['assets']['content']['allassets']['page']             = '/front/allassets.php';
 | |
| 
 | |
|                $menu['assets']['content']['allassets']['icon']             = 'fas fa-list';
 | |
| 
 | |
|                $menu['assets']['content']['allassets']['links']['search']  = '/front/allassets.php';
 | |
| 
 | |
|                break;
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $_SESSION['glpimenu'] = $menu;
 | |
| 
 | |
|          // echo 'menu load';
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $menu = $_SESSION['glpimenu'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $menu;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print a nice HTML head for every page
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $title   title of the page
 | |
| 
 | |
|     * @param string $url     not used anymore
 | |
| 
 | |
|     * @param string $sector  sector in which the page displayed is
 | |
| 
 | |
|     * @param string $item    item corresponding to the page displayed
 | |
| 
 | |
|     * @param string $option  option corresponding to the page displayed
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function header($title, $url = '', $sector = "none", $item = "none", $option = "") {
 | |
| 
 | |
|       global $CFG_GLPI, $HEADER_LOADED, $DB;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // If in modal : display popHeader
 | |
| 
 | |
|       if (isset($_REQUEST['_in_modal']) && $_REQUEST['_in_modal']) {
 | |
| 
 | |
|          return self::popHeader($title, $url, false, $sector, $item, $option);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Print a nice HTML-head for every page
 | |
| 
 | |
|       if ($HEADER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $HEADER_LOADED = true;
 | |
| 
 | |
|       // Force lower case for sector and item
 | |
| 
 | |
|       $sector = strtolower($sector);
 | |
| 
 | |
|       $item   = strtolower($item);
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::includeHeader($title, $sector, $item, $option);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $body_class = "layout_".$_SESSION['glpilayout'];
 | |
| 
 | |
|       if ((strpos($_SERVER['REQUEST_URI'], ".form.php") !== false)
 | |
| 
 | |
|           && isset($_GET['id']) && ($_GET['id'] > 0)) {
 | |
| 
 | |
|          if (!CommonGLPI::isLayoutExcludedPage()) {
 | |
| 
 | |
|             $body_class.= " form";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $body_class = "";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Body
 | |
| 
 | |
|       echo "<body class='$body_class'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       Html::displayImpersonateBanner();
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<div id='header'>";
 | |
| 
 | |
|       echo "<header role='banner' id='header_top'>";
 | |
| 
 | |
|       echo "<div id='c_logo'>";
 | |
| 
 | |
|       echo "<a href='" . $CFG_GLPI["root_doc"] . "/front/central.php'
 | |
| 
 | |
|                accesskey='1'
 | |
| 
 | |
|                title='" . __s('Home') . "'><span class='sr-only'>" . __s('Home') . "</span></a>";
 | |
| 
 | |
|       echo "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Preferences and logout link
 | |
| 
 | |
|       self::displayTopMenu(true);
 | |
| 
 | |
|       echo "</header>"; // header_top
 | |
| 
 | |
| 
 | |
| 
 | |
|       //Main menu
 | |
| 
 | |
|       self::displayMainMenu(
 | |
| 
 | |
|          true, [
 | |
| 
 | |
|             'sector' => $sector,
 | |
| 
 | |
|             'item'   => $item,
 | |
| 
 | |
|             'option' => $option
 | |
| 
 | |
|          ]
 | |
| 
 | |
|       );
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</div>\n"; // fin header
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Back to top button
 | |
| 
 | |
|       echo "<span class='fa-stack fa-lg' id='backtotop' style='display: none'>".
 | |
| 
 | |
|            "<i class='fa fa-circle fa-stack-2x primary-fg-inverse'></i>".
 | |
| 
 | |
|            "<a href='#' class='fa fa-arrow-up fa-stack-1x primary-fg' title='".
 | |
| 
 | |
|               __s('Back to top of the page')."'>".
 | |
| 
 | |
|            "<span class='sr-only'>Top of the page</span>".
 | |
| 
 | |
|            "</a></span>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<main role='main' id='page'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($DB->isSlave()
 | |
| 
 | |
|           && !$DB->first_connection) {
 | |
| 
 | |
|          echo "<div id='dbslave-float'>";
 | |
| 
 | |
|          echo "<a href='#see_debug'>".__('SQL replica: read only')."</a>";
 | |
| 
 | |
|          echo "</div>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // call static function callcron() every 5min
 | |
| 
 | |
|       CronTask::callCron();
 | |
| 
 | |
|       self::displayMessageAfterRedirect();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print footer for every page
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $keepDB boolean, closeDBConnections if false (false by default)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function footer($keepDB = false) {
 | |
| 
 | |
|       global $CFG_GLPI, $FOOTER_LOADED, $TIMER_DEBUG;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // If in modal : display popFooter
 | |
| 
 | |
|       if (isset($_REQUEST['_in_modal']) && $_REQUEST['_in_modal']) {
 | |
| 
 | |
|          return self::popFooter();
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print foot for every page
 | |
| 
 | |
|       if ($FOOTER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $FOOTER_LOADED = true;
 | |
| 
 | |
|       echo "</main>"; // end of "main role='main'"
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<footer role='contentinfo' id='footer'>";
 | |
| 
 | |
|       echo "<table role='presentation'><tr>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) { // mode debug
 | |
| 
 | |
|          echo "<td class='left'><span class='copyright'>";
 | |
| 
 | |
|          $timedebug = sprintf(_n('%s second', '%s seconds', $TIMER_DEBUG->getTime()),
 | |
| 
 | |
|                               $TIMER_DEBUG->getTime());
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (function_exists("memory_get_usage")) {
 | |
| 
 | |
|             $timedebug = sprintf(__('%1$s - %2$s'), $timedebug, Toolbox::getSize(memory_get_usage()));
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo $timedebug;
 | |
| 
 | |
|          echo "</span></td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $currentVersion = preg_replace('/^((\d+\.?)+).*$/', '$1', GLPI_VERSION);
 | |
| 
 | |
|       $foundedNewVersion = array_key_exists('founded_new_version', $CFG_GLPI)
 | |
| 
 | |
|          ? $CFG_GLPI['founded_new_version']
 | |
| 
 | |
|          : '';
 | |
| 
 | |
|       if (!empty($foundedNewVersion) && version_compare($currentVersion, $foundedNewVersion, '<')) {
 | |
| 
 | |
|          echo "<td class='copyright'>";
 | |
| 
 | |
|          $latest_version = "<a href='http://www.glpi-project.org' target='_blank' title=\""
 | |
| 
 | |
|              . __s('You will find it on the GLPI-PROJECT.org site.')."\"> "
 | |
| 
 | |
|              . $foundedNewVersion
 | |
| 
 | |
|              . "</a>";
 | |
| 
 | |
|          printf(__('A new version is available: %s.'), $latest_version);
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "</td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       //echo "<td class='right'>" . self::getCopyrightMessage() . "</td>";
 | |
| 
 | |
|       echo "</tr></table></footer>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($CFG_GLPI['maintenance_mode']) { // mode maintenance
 | |
| 
 | |
|          echo "<div id='maintenance-float'>";
 | |
| 
 | |
|          echo "<a href='#see_maintenance'>GLPI MAINTENANCE MODE</a>";
 | |
| 
 | |
|          echo "</div>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       self::displayDebugInfos();
 | |
| 
 | |
|       self::loadJavascript();
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</body></html>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!$keepDB) {
 | |
| 
 | |
|          closeDBConnections();
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display Ajax Footer for debug
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function ajaxFooter() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) { // mode debug
 | |
| 
 | |
|          $rand = mt_rand();
 | |
| 
 | |
|          echo "<div class='center' id='debugajax'>";
 | |
| 
 | |
|          echo "<a class='debug-float' href=\"javascript:showHideDiv('see_ajaxdebug$rand','','','');\">
 | |
| 
 | |
|                 AJAX DEBUG</a>";
 | |
| 
 | |
|          if (!isset($_GET['full_page_tab'])
 | |
| 
 | |
|              && strstr($_SERVER['REQUEST_URI'], '/ajax/common.tabs.php')) {
 | |
| 
 | |
|             echo "    ";
 | |
| 
 | |
|             echo "<a href='".$_SERVER['REQUEST_URI']."&full_page_tab=1' class='vsubmit'>Display only tab for debug</a>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "</div>";
 | |
| 
 | |
|          echo "<div id='see_ajaxdebug$rand' name='see_ajaxdebug$rand' style=\"display:none;\">";
 | |
| 
 | |
|          self::displayDebugInfos(false, true);
 | |
| 
 | |
|          echo "</div></div>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print a simple HTML head with links
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $title  title of the page
 | |
| 
 | |
|     * @param array  $links  links to display
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function simpleHeader($title, $links = []) {
 | |
| 
 | |
|       global $CFG_GLPI, $HEADER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print a nice HTML-head for help page
 | |
| 
 | |
|       if ($HEADER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $HEADER_LOADED = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::includeHeader($title);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Body
 | |
| 
 | |
|       echo "<body>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Main Headline
 | |
| 
 | |
|       echo "<div id='header'>";
 | |
| 
 | |
|       echo "<header role='banner' id='header_top'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<div id='c_logo'>";
 | |
| 
 | |
|       echo "<a href='".$CFG_GLPI["root_doc"]."/' accesskey='1' title=\"".__s('Home')."\">".
 | |
| 
 | |
|            "<span class='invisible'>Logo</span></a></div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Preferences + logout link
 | |
| 
 | |
|       echo "<div id='c_preference'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<ul>";
 | |
| 
 | |
|       echo "<li id='language_link'><a href='".$CFG_GLPI["root_doc"].
 | |
| 
 | |
|                   "/front/preference.php?forcetab=User\$1' title=\"".
 | |
| 
 | |
|                   addslashes(Dropdown::getLanguageName($_SESSION['glpilanguage']))."\">".
 | |
| 
 | |
|                   Dropdown::getLanguageName($_SESSION['glpilanguage'])."</a></li>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (Session::getLoginUserID()) {
 | |
| 
 | |
|          $logout_url = $CFG_GLPI['root_doc']
 | |
| 
 | |
|             . '/front/logout.php'
 | |
| 
 | |
|             . (isset($_SESSION['glpiextauth']) && $_SESSION['glpiextauth'] ? '?noAUTO=1' : '' );
 | |
| 
 | |
|          echo '<li id="deconnexion">';
 | |
| 
 | |
|          echo '<a href="' . $logout_url . '" title="' . __s('Logout') . '" class="fa fa-sign-out-alt">';
 | |
| 
 | |
|          echo '<span class="sr-only">' . __s('Logout') . '</span>';
 | |
| 
 | |
|          echo '</a>';
 | |
| 
 | |
|          echo '</li>';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</ul>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<div class='sep'></div>";
 | |
| 
 | |
|       echo "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</header>"; // end #header_top
 | |
| 
 | |
| 
 | |
| 
 | |
|       //-- Le menu principal --
 | |
| 
 | |
|       echo "<div id='c_menu'>";
 | |
| 
 | |
|       echo "<ul id='menu'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Build the navigation-elements
 | |
| 
 | |
|       if (count($links)) {
 | |
| 
 | |
|          $i = 1;
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($links as $name => $link) {
 | |
| 
 | |
|             echo "<li id='menu$i'>";
 | |
| 
 | |
|             echo "<a href='$link' title=\"".$name."\" class='itemP'>{$name}</a>";
 | |
| 
 | |
|             echo "</li>";
 | |
| 
 | |
|             $i++;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</ul></div>";
 | |
| 
 | |
|       // End navigation bar
 | |
| 
 | |
|       // End headline
 | |
| 
 | |
| 
 | |
| 
 | |
|       //  Le fil d ariane
 | |
| 
 | |
|       echo "<div id='c_ssmenu2'></div>";
 | |
| 
 | |
|       echo "</div>"; // fin header
 | |
| 
 | |
|       echo "<div id='page'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // call static function callcron() every 5min
 | |
| 
 | |
|       CronTask::callCron();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print a nice HTML head for help page
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $title  title of the page
 | |
| 
 | |
|     * @param string $url    not used anymore
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function helpHeader($title, $url = '') {
 | |
| 
 | |
|       global $CFG_GLPI, $HEADER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print a nice HTML-head for help page
 | |
| 
 | |
|       if ($HEADER_LOADED) {
 | |
| 
 | |
|          return;
 | |
|       }
 | |
| 
 | |
|       $HEADER_LOADED = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::includeHeader($title, 'self-service');
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Body
 | |
| 
 | |
|       $body_class = "layout_".$_SESSION['glpilayout'];
 | |
| 
 | |
|       if ((strpos($_SERVER['REQUEST_URI'], "form.php") !== false)
 | |
| 
 | |
|           && isset($_GET['id']) && ($_GET['id'] > 0)) {
 | |
| 
 | |
|          if (!CommonGLPI::isLayoutExcludedPage()) {
 | |
| 
 | |
|             $body_class.= " form";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $body_class = "";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "<body class='$body_class'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       Html::displayImpersonateBanner();
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Main Headline
 | |
| 
 | |
|       echo "<div id='header'>";
 | |
| 
 | |
|       echo "<header role='banner' id='header_top'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<div id='c_logo'>";
 | |
| 
 | |
|       echo "<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php' accesskey='1' title=\"".
 | |
| 
 | |
|              __s('Home')."\"><span class='invisible'>Logo</span></a>";
 | |
| 
 | |
|       echo "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       //Preferences and logout link
 | |
| 
 | |
|       self::displayTopMenu(false);
 | |
| 
 | |
|       echo "</header>"; // header_top
 | |
| 
 | |
| 
 | |
| 
 | |
|       //Main menu
 | |
| 
 | |
|       self::displayMainMenu(false);
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</div>"; // fin header
 | |
| 
 | |
|       echo "<main role='main' id='page'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // call static function callcron() every 5min
 | |
| 
 | |
|       CronTask::callCron();
 | |
| 
 | |
|       self::displayMessageAfterRedirect();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print footer for help page
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function helpFooter() {
 | |
| 
 | |
|       global $FOOTER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print foot for help page
 | |
| 
 | |
|       if ($FOOTER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $FOOTER_LOADED = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</main>"; // end of "main role='main'"
 | |
| 
 | |
| /*
 | |
| 
 | |
|       echo "<footer role='contentinfo' id='footer'>";
 | |
| 
 | |
|       echo "<table role='presentation' width='100%'><tr><td class='right'>" . self::getCopyrightMessage(false);
 | |
| 
 | |
|       echo "</td></tr></table></footer>";
 | |
| 
 | |
| */
 | |
| 
 | |
|       self::displayDebugInfos();
 | |
| 
 | |
|       echo "</body></html>";
 | |
| 
 | |
|       self::loadJavascript();
 | |
| 
 | |
|       closeDBConnections();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print a nice HTML head with no controls
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $title  title of the page
 | |
| 
 | |
|     * @param string $url    not used anymore
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function nullHeader($title, $url = '') {
 | |
| 
 | |
|       global $HEADER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($HEADER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $HEADER_LOADED = true;
 | |
| 
 | |
|       // Print a nice HTML-head with no controls
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Detect root_doc in case of error
 | |
| 
 | |
|       Config::detectRootDoc();
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Send UTF8 Headers
 | |
| 
 | |
|       header("Content-Type: text/html; charset=UTF-8");
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Send extra expires header if configured
 | |
| 
 | |
|       self::header_nocache();
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isCommandLine()) {
 | |
| 
 | |
|          return true;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::includeHeader($title);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Body with configured stuff
 | |
| 
 | |
|       echo "<body>";
 | |
| 
 | |
|       echo "<main role='main' id='page'>";
 | |
| 
 | |
|       echo "<br><br>";
 | |
| 
 | |
|       echo "<div id='bloc'>";
 | |
| 
 | |
|       echo "<div id='logo_bloc'></div>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print footer for null page
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function nullFooter() {
 | |
| 
 | |
|       global $FOOTER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print foot for null page
 | |
| 
 | |
|       if ($FOOTER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $FOOTER_LOADED = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!isCommandLine()) {
 | |
| 
 | |
|          echo "</div></main>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "<div id='footer-login'>" . self::getCopyrightMessage(false) . "</div>";
 | |
| 
 | |
|          self::loadJavascript();
 | |
| 
 | |
|          echo "</body></html>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       closeDBConnections();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print a nice HTML head for modal window (nothing to display)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $title    title of the page
 | |
| 
 | |
|     * @param string  $url      not used anymore
 | |
| 
 | |
|     * @param boolean $iframed  indicate if page loaded in iframe - css target
 | |
| 
 | |
|     * @param string  $sector    sector in which the page displayed is (default 'none')
 | |
| 
 | |
|     * @param string  $item      item corresponding to the page displayed (default 'none')
 | |
| 
 | |
|     * @param string  $option    option corresponding to the page displayed (default '')
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function popHeader(
 | |
| 
 | |
|       $title,
 | |
|       $url = '',
 | |
| 
 | |
|       $iframed = false,
 | |
| 
 | |
|       $sector = "none",
 | |
| 
 | |
|       $item = "none",
 | |
| 
 | |
|       $option = ""
 | |
| 
 | |
|    ) {
 | |
| 
 | |
|       global $HEADER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print a nice HTML-head for every page
 | |
| 
 | |
|       if ($HEADER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $HEADER_LOADED = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       self::includeHeader($title, $sector, $item, $option); // Body
 | |
| 
 | |
|       echo "<body class='".($iframed? "iframed": "")."'>";
 | |
| 
 | |
|       self::displayMessageAfterRedirect();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print footer for a modal window
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function popFooter() {
 | |
| 
 | |
|       global $FOOTER_LOADED;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($FOOTER_LOADED) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $FOOTER_LOADED = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print foot
 | |
| 
 | |
|       self::loadJavascript();
 | |
| 
 | |
|       echo "</body></html>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display responsive menu
 | |
| 
 | |
|     * @since 0.90.1
 | |
| 
 | |
|     * @param $menu array of menu items
 | |
| 
 | |
|     *    - key   : plugin system name
 | |
| 
 | |
|     *    - value : array of options
 | |
| 
 | |
|     *       * id      : html id attribute
 | |
| 
 | |
|     *       * default : defaul url
 | |
| 
 | |
|     *       * title   : displayed label
 | |
| 
 | |
|     *       * content : menu sub items, array with theses options :
 | |
| 
 | |
|     *          - page     : url
 | |
| 
 | |
|     *          - title    : displayed label
 | |
| 
 | |
|     *          - shortcut : keyboard shortcut letter
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function displayMenuAll($menu = []) {
 | |
| 
 | |
|       global $CFG_GLPI,$PLUGIN_HOOKS;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Display MENU ALL
 | |
| 
 | |
|       echo "<div id='show_all_menu' class='invisible'>";
 | |
| 
 | |
|       $items_per_columns = 15;
 | |
| 
 | |
|       $i                 = -1;
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach ($menu as $part => $data) {
 | |
| 
 | |
|          if (isset($data['content']) && count($data['content'])) {
 | |
| 
 | |
|             echo "<dl>";
 | |
| 
 | |
|             $link = "#";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (isset($data['default']) && !empty($data['default'])) {
 | |
| 
 | |
|                $link = $CFG_GLPI["root_doc"].$data['default'];
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             echo "<dt class='primary-bg primary-fg'>";
 | |
| 
 | |
|             echo "<a class='primary-fg' href='$link' title=\"".$data['title']."\" class='itemP'>".$data['title']."</a>";
 | |
| 
 | |
|             echo "</dt>";
 | |
| 
 | |
|             $i++;
 | |
| 
 | |
| 
 | |
| 
 | |
|             // list menu item
 | |
| 
 | |
|             foreach ($data['content'] as $key => $val) {
 | |
| 
 | |
| 
 | |
| 
 | |
|                if (isset($val['page'])
 | |
| 
 | |
|                   && isset($val['title'])) {
 | |
| 
 | |
|                   echo "<dd>";
 | |
| 
 | |
| 
 | |
| 
 | |
|                   if (isset($PLUGIN_HOOKS["helpdesk_menu_entry"][$key])
 | |
| 
 | |
|                         && is_string($PLUGIN_HOOKS["helpdesk_menu_entry"][$key])) {
 | |
| 
 | |
|                      echo "<a href='".Plugin::getWebDir($key).$val['page']."'";
 | |
| 
 | |
|                   } else {
 | |
| 
 | |
|                      echo "<a href='".$CFG_GLPI["root_doc"].$val['page']."'";
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                   if (isset($data['shortcut']) && !empty($data['shortcut'])) {
 | |
| 
 | |
|                      echo " accesskey='".$val['shortcut']."'";
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                   echo ">";
 | |
| 
 | |
| 
 | |
| 
 | |
|                   echo "<i class='fa-fw ".($val['icon'] ?? "")."'></i> ";
 | |
| 
 | |
|                   echo $val['title'];
 | |
| 
 | |
|                   echo "</a>";
 | |
| 
 | |
|                   echo "</dd>";
 | |
| 
 | |
|                   $i++;
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</dl>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 	  
 | |
| 
 | |
| 	  
 | |
| 
 | |
|       $setLang =  $_SESSION['glpilanguage'];
 | |
| 
 | |
|       $htmlUsers = getHtmlSubUsers($_SESSION["glpiID"]);
 | |
| 
 | |
| 
 | |
| 
 | |
|       //Divers
 | |
| 
 | |
|       echo"<dl>
 | |
| 
 | |
| 		   <dt class='primary-bg primary-fg'><a class='primary-fg' href='' title='Divers'>Divers</a></dt>";		
 | |
| 
 | |
| 		
 | |
| 
 | |
| 		echo"<dd>";		
 | |
| 
 | |
| 		// if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 		// 		  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=maintenance%20:%20work%20Ordre%20From' >";
 | |
| 
 | |
| 		// 	   }else{
 | |
| 
 | |
| 		// 		  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=maintenance%20:%20work%20Ordre%20From' >";   
 | |
| 
 | |
|       //          }
 | |
| 
 | |
|       echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=9'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  Maintenance : Work Order Form
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			echo"<dd>";		
 | |
| 
 | |
| 		 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=LCQ%20:%20Bon%20De%20Retour' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=LCQ%20:%20Bon%20De%20Retour' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  LCQ : Bon De Retour
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			echo"<dd>";		
 | |
| 
 | |
| 		if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Production%20:%20Bon%20De%20Retour' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Production%20:%20Bon%20De%20Retour' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  Production : Bon De Retour
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';
 | |
| 
 | |
|          
 | |
| 
 | |
| 			echo"<dd>";
 | |
| 
 | |
|          echo"<dd>";	
 | |
| 
 | |
|          echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=12'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|             Production : Bon De Commande
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';		
 | |
| 
 | |
| 		if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Production%20:%20Demande%20echantillonnage' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Production%20:%20Demande%20echantillonnage' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  Production : Demande D'echantillonnage
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';
 | |
| 
 | |
|          echo"<dd>";	
 | |
| 
 | |
|          echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=10'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|             AC : Bon De Livraison
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';
 | |
| 
 | |
|          echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=13'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|             MP : Bon De Livraison
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			</dd>';
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| if ($_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Admin"){
 | |
| 
 | |
|          echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/article.add.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Ajouter Article
 | |
| 
 | |
|            </a>
 | |
| 
 | |
|        </dd>';
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 	echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/stock.list.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Stock
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </dd>';
 | |
| 
 | |
|        
 | |
| 
 | |
|        
 | |
| 
 | |
|        
 | |
| 
 | |
| }
 | |
| 
 | |
| 	echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/articles.list.immo.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Articles Immobilisations
 | |
| 
 | |
|            </a>
 | |
| 
 | |
|        </dd>';
 | |
| 
 | |
| echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/inventaire.immo.php' >";
 | |
| 
 | |
|   echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Réalisation Inventaire Immobilisations
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </dd>';
 | |
| 
 | |
| 	  
 | |
| 
 | |
| 	  echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/articles.list.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Articles
 | |
| 
 | |
|            </a>
 | |
| 
 | |
|        </dd>';
 | |
| 
 | |
| 	  /* echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/inventaire.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Réalisation Inventaire
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </dd>';*/
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur MGX" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement" || $_SESSION['is_inventory_comm'] == 'true') {
 | |
| 
 | |
| 	echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/resultatinventaire.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Suivi Inventaire
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </dd>';
 | |
| 
 | |
| 	
 | |
| 
 | |
| }
 | |
| 
 | |
| echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/resultatinventaire.immo.php' >";
 | |
| 
 | |
|          echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|           Suivi Inventaire immobilisation
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </dd>';
 | |
| 
 | |
| 			
 | |
| 
 | |
| 	 echo"</dl>";
 | |
| 
 | |
| 	//fin Divers
 | |
| 
 | |
| 	  
 | |
| 
 | |
|       //MGX
 | |
| 
 | |
|       echo"<dl>
 | |
| 
 | |
| 			<dt class='primary-bg primary-fg'><a class='primary-fg' href='' title='MGX'>MGX</a></dt>";
 | |
| 
 | |
| 			
 | |
| 
 | |
|     echo"<dd>";
 | |
| 
 | |
| 	if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Transport%20:%20Demande' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Transport%20:%20Demande' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][23]." : ".$_SESSION['SophalLanguages'][$setLang][24]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
|     echo"<dd>";
 | |
| 
 | |
| 	 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Transport%20:%20Réclamation' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Transport%20:%20Réclamation' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][23]." : ".$_SESSION['SophalLanguages'][$setLang][25]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 	echo"<dd>";
 | |
| 
 | |
| 	  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Transport%20:%20Nouvelle%20Recrue' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Transport%20:%20Nouvelle%20Recrue' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][23]." : ".$_SESSION['SophalLanguages'][$setLang][26]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	   if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20Nettoyage' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20Nettoyage' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][27]." : ".$_SESSION['SophalLanguages'][$setLang][28]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	   if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Accidents%20De%20Travail' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Accidents%20De%20Travail' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][27]." : ".$_SESSION['SophalLanguages'][$setLang][29]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	    if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20De%20Desinsectisation' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20De%20Desinsectisation' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][27]." : ".$_SESSION['SophalLanguages'][$setLang][30]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	     if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20Evacuation' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20Evacuation' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][27]." : ".$_SESSION['SophalLanguages'][$setLang][31]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	     if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20Incineration' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20Incineration' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][27]." : ".$_SESSION['SophalLanguages'][$setLang][32]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
|     echo"<dd>";
 | |
| 
 | |
| 	      if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Constats' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Constats' >";   
 | |
| 
 | |
|                }				
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][27]." : ".$_SESSION['SophalLanguages'][$setLang][33]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	      if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Parc%20:%20Demande%20de%20Maintenance' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Parc%20:%20Demande%20de%20Maintenance' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 								
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][37]." : ".$_SESSION['SophalLanguages'][$setLang][38]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	        if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Travaux%20:%20Demande%20De%20Manoeuvres' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Travaux%20:%20Demande%20De%20Manoeuvres' >";   
 | |
| 
 | |
|                }								
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][37]." : ".$_SESSION['SophalLanguages'][$setLang][39]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	       if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Sécurité%20:%20Registre%20Des%20Mouvements' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Sécurité%20:%20Registre%20Des%20Mouvements' >";   
 | |
| 
 | |
|                }								
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][34]." : ".$_SESSION['SophalLanguages'][$setLang][35]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 		echo"<dd>";
 | |
| 
 | |
| 	        if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Sécurité%20:%20Constats' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Sécurité%20:%20Constats' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 												
 | |
| 
 | |
| 	echo"<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][34]." : ".$_SESSION['SophalLanguages'][$setLang][36]."</a>
 | |
| 
 | |
| 	    </dd>";
 | |
| 
 | |
| 	 echo"</dl>";
 | |
| 
 | |
| 	 
 | |
| 
 | |
| 	 //Ressources Humaines
 | |
| 
 | |
| 	  echo"<dl>
 | |
| 
 | |
| 			<dt class='primary-bg primary-fg'><a class='primary-fg' href='' title='DRH'>".$_SESSION['SophalLanguages'][$setLang][40]."</a></dt>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=0'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][42]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=1'>
 | |
| 
 | |
| 				<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][43]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=2'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-layer-group'></i> ".$_SESSION['SophalLanguages'][$setLang][44]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
|          <dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=11'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-layer-group'></i> ".$_SESSION['SophalLanguages'][$setLang][74]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=3'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-book'></i> ".$_SESSION['SophalLanguages'][$setLang][45]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=4'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-book'></i>".$_SESSION['SophalLanguages'][$setLang][46]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
|          <dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=14'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-book'></i>".$_SESSION['SophalLanguages'][$setLang][78]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=8'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-book'></i>".$_SESSION['SophalLanguages'][$setLang][72]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=6'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-book'></i>".$_SESSION['SophalLanguages'][$setLang][68]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=7'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-book'></i>".$_SESSION['SophalLanguages'][$setLang][69]."</a>
 | |
| 
 | |
| 			</dd>";
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG" || (count($htmlUsers) > 0)) {
 | |
| 
 | |
| 				echo '<dd>
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI['root_doc'].'/front/fiche.evaluation.list.php" >
 | |
| 
 | |
| 						<i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][47].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					</dd>';
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 
 | |
| 
 | |
| 				echo '<dd>
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI['root_doc'].'/front/fiche.resultat.evaluation.list.php" >
 | |
| 
 | |
| 						<i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][71].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					</dd>';
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG") {
 | |
| 
 | |
| 				echo'<dd>
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI['root_doc'].'/front/fiche.config.evaluation.list.php" >
 | |
| 
 | |
| 						<i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][70].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </dd>';
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			
 | |
| 
 | |
| 		echo"
 | |
| 
 | |
| 		    <dd><a href=''>
 | |
| 
 | |
| 			 <i class='fa-fw fas fa-user-check'></i> ".$_SESSION['SophalLanguages'][$setLang][48]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href=''>
 | |
| 
 | |
| 				<i class='fa-fw far fa-list-alt'></i> ".$_SESSION['SophalLanguages'][$setLang][49]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/drh.bulletinPaieListe.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][51]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/drh.MonDossierRH.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][52]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/drh.boiteIdeesListe.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][54]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd>";
 | |
| 
 | |
| 			if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=boite%20reclamations' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=boite%20reclamations' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 	echo"		<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][55]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/drh.meilleurEmploye.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][56]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href=''>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][57]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/drh.reglement.interieur.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][59]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/reminder.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][60]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href=''>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][61]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/publications.php'>
 | |
| 
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][62]."</a>
 | |
| 
 | |
| 			</dd>
 | |
| 			
 | |
| 			<dd><a href='".$CFG_GLPI['root_doc']."/front/drh.book.newsletter.php?edition=N2&readyes=0'>
 | |
| 				<i class='fa-fw fas fa-scroll'></i> ".$_SESSION['SophalLanguages'][$setLang][75]."</a>
 | |
| 			</dd>
 | |
| 
 | |
| 		  </dl>";
 | |
| 
 | |
| 		  
 | |
| 
 | |
| 	//Direction Generale	  
 | |
| 
 | |
| 	if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA"
 | |
| 
 | |
|      || $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur MGX"
 | |
| 
 | |
| 	 || $_SESSION['glpiactiveprofile']['name'] == "Directeur Commercial" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Marketing"
 | |
| 
 | |
| 	 || $_SESSION['glpiactiveprofile']['name'] == "Directeur Production" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement"
 | |
| 
 | |
| 	 || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){ 	  
 | |
| 
 | |
| 		  
 | |
| 
 | |
| 	echo"<dl>
 | |
| 
 | |
| 			<dt class='primary-bg primary-fg'><a class='primary-fg' href='' >".$_SESSION['SophalLanguages'][$setLang][0]."</a></dt>";
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Commercial"){
 | |
| 
 | |
| 			echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Commercial&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][2]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Marketing"){		
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Marketing&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][3]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Production"){
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Production&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][4]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement"){
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Approvisionnements&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][5]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH"){	 
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Ressources+Humaines&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][6]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG"){	 				 
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Système+Information&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][7]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG"){	 
 | |
| 
 | |
| 				echo"<dd><a href=''>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][8]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 			 $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Commercial"){
 | |
| 
 | |
| 			   echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Commercial&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][10]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
|             if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Marketing"){	
 | |
| 
 | |
| 				 echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Marketing&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][11]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}	
 | |
| 
 | |
|             if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Production"){
 | |
| 
 | |
| 				 echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Production&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][12]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}
 | |
| 
 | |
|             if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement"){
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Approvisionnement&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][13]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}	
 | |
| 
 | |
|             if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH"){
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Ressources+Humaines&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][14]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}	
 | |
| 
 | |
|             if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG"){
 | |
| 
 | |
| 				echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Système+Information&search=Rechercher&itemtype=PlanningExternalEvent&start=0'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][15]."</a>
 | |
| 
 | |
| 				</dd>"; 
 | |
| 
 | |
| 				}	
 | |
| 
 | |
|             if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG"){
 | |
| 
 | |
| 				echo"<dd><a href=''>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][16]."</a>
 | |
| 
 | |
| 				</dd>";
 | |
| 
 | |
| 				}		
 | |
| 
 | |
|             echo"<dd><a href='".$CFG_GLPI["root_doc"]."/front/problem.php'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][18]."</a>
 | |
| 
 | |
| 				</dd>
 | |
| 
 | |
| 				<dd><a href='".$CFG_GLPI["root_doc"]."/front/change.php'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][19]."</a>
 | |
| 
 | |
| 				</dd>
 | |
| 
 | |
| 				<dd><a href='".$CFG_GLPI["root_doc"]."/front/planning.php'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][20]."</a>
 | |
| 
 | |
| 				</dd>
 | |
| 
 | |
| 				<dd><a href='".$CFG_GLPI["root_doc"]."/front/stat.php'>
 | |
| 
 | |
| 					<i class='fa-fw fas fa-file-signature'></i> ".$_SESSION['SophalLanguages'][$setLang][21]."</a>
 | |
| 
 | |
| 				</dd>";				
 | |
| 
 | |
| 			
 | |
| 
 | |
| 	echo"</dl>";
 | |
| 
 | |
| 		
 | |
| 
 | |
| 	 }	
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // init menu in jquery dialog
 | |
| 
 | |
|       echo Html::scriptBlock("
 | |
| 
 | |
|          $(document).ready(
 | |
| 
 | |
|             function() {
 | |
| 
 | |
|                $('#show_all_menu').dialog({
 | |
| 
 | |
|                   height: 'auto',
 | |
| 
 | |
|                   width: 'auto',
 | |
| 
 | |
|                   modal: true,
 | |
| 
 | |
|                   autoOpen: false
 | |
| 
 | |
|                });
 | |
| 
 | |
|             }
 | |
| 
 | |
|          );
 | |
| 
 | |
|       ");
 | |
| 
 | |
| 
 | |
| 
 | |
|       /// Button to toggle responsive menu
 | |
| 
 | |
|       echo "<a href='#' onClick=\"".self::jsGetElementbyID('show_all_menu').".dialog('open'); return false;\"
 | |
| 
 | |
|             id='menu_all_button'><i class='fa fa-bars'></i>";
 | |
| 
 | |
|       echo "</a>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</div>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Flushes the system write buffers of PHP and whatever backend PHP is using (CGI, a web server, etc).
 | |
| 
 | |
|     * This attempts to push current output all the way to the browser with a few caveats.
 | |
| 
 | |
|     * @see https://www.sitepoint.com/php-streaming-output-buffering-explained/
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function glpi_flush() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (function_exists("ob_flush")
 | |
| 
 | |
|           && (ob_get_length() !== false)) {
 | |
| 
 | |
|          ob_flush();
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       flush();
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Set page not to use the cache
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function header_nocache() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
 | |
| 
 | |
|       header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date du passe
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * show arrow for massives actions : opening
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $formname
 | |
| 
 | |
|     * @param boolean $fixed     used tab_cadre_fixe in both tables
 | |
| 
 | |
|     * @param boolean $ontop     display on top of the list
 | |
| 
 | |
|     * @param boolean $onright   display on right of the list
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @deprecated 0.84
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function openArrowMassives($formname, $fixed = false, $ontop = false, $onright = false) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       Toolbox::deprecated('openArrowMassives() method is deprecated');
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($fixed) {
 | |
| 
 | |
|          echo "<table class='tab_glpi' width='950px'>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo "<table class='tab_glpi' width='80%'>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<tr>";
 | |
| 
 | |
|       if (!$onright) {
 | |
| 
 | |
|          echo "<td><img src='".$CFG_GLPI["root_doc"]."/pics/arrow-left".($ontop?'-top':'').".png'
 | |
| 
 | |
|                     alt=''></td>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo "<td class='left' width='80%'></td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "<td class='center' style='white-space:nowrap;'>";
 | |
| 
 | |
|       echo "<a onclick= \"if ( markCheckboxes('$formname') ) return false;\"
 | |
| 
 | |
|              href='#'>".__('Check all')."</a></td>";
 | |
| 
 | |
|       echo "<td>/</td>";
 | |
| 
 | |
|       echo "<td class='center' style='white-space:nowrap;'>";
 | |
| 
 | |
|       echo "<a onclick= \"if ( unMarkCheckboxes('$formname') ) return false;\"
 | |
| 
 | |
|              href='#'>".__('Uncheck all')."</a></td>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($onright) {
 | |
| 
 | |
|          echo "<td><img src='".$CFG_GLPI["root_doc"]."/pics/arrow-right".($ontop?'-top':'').".png'
 | |
| 
 | |
|                     alt=''>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo "<td class='left' width='80%'>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * show arrow for massives actions : closing
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $actions array of action : $name -> $label
 | |
| 
 | |
|     * @param $confirm array of confirmation string (optional)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @deprecated 0.84
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function closeArrowMassives($actions, $confirm = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       Toolbox::deprecated('closeArrowMassives() method is deprecated');
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (count($actions)) {
 | |
| 
 | |
|          foreach ($actions as $name => $label) {
 | |
| 
 | |
|             if (!empty($name)) {
 | |
| 
 | |
| 
 | |
| 
 | |
|                echo "<input type='submit' name='$name' ";
 | |
| 
 | |
|                if (is_array($confirm) && isset($confirm[$name])) {
 | |
| 
 | |
|                   echo self::addConfirmationOnAction($confirm[$name]);
 | |
| 
 | |
|                }
 | |
| 
 | |
|                echo "value=\"".addslashes($label)."\" class='submit'> ";
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</td></tr>";
 | |
| 
 | |
|       echo "</table>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get "check All as" checkbox
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $container_id  string html of the container of checkboxes link to this check all checkbox
 | |
| 
 | |
|     * @param $rand          string rand value to use (default is auto generated)(default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getCheckAllAsCheckbox($container_id, $rand = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($rand)) {
 | |
| 
 | |
|          $rand = mt_rand();
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out  = "<div class='form-group-checkbox'>
 | |
| 
 | |
|                   <input title='".__s('Check all as')."' type='checkbox' class='new_checkbox' ".
 | |
| 
 | |
|                    "name='_checkall_$rand' id='checkall_$rand' ".
 | |
| 
 | |
|                     "onclick= \"if ( checkAsCheckboxes('checkall_$rand', '$container_id'))
 | |
| 
 | |
|                                                    {return true;}\">
 | |
| 
 | |
|                   <label class='label-checkbox' for='checkall_$rand' title='".__s('Check all as')."'>
 | |
| 
 | |
|                      <span class='check'></span>
 | |
| 
 | |
|                      <span class='box'></span>
 | |
| 
 | |
|                   </label>
 | |
| 
 | |
|                </div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // permit to shift select checkboxes
 | |
| 
 | |
|       $out.= Html::scriptBlock("\$(function() {\$('#$container_id input[type=\"checkbox\"]').shiftSelectable();});");
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get the jquery criterion for massive checkbox update
 | |
| 
 | |
|     * We can filter checkboxes by a container or by a tag. We can also select checkboxes that have
 | |
| 
 | |
|     * a given tag and that are contained inside a container
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array $options  array of parameters:
 | |
| 
 | |
|     *    - tag_for_massive tag of the checkboxes to update
 | |
| 
 | |
|     *    - container_id    if of the container of the checkboxes
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string  the javascript code for jquery criterion or empty string if it is not a
 | |
| 
 | |
|     *         massive update checkbox
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getCriterionForMassiveCheckboxes(array $options) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $params                    = [];
 | |
| 
 | |
|       $params['tag_for_massive'] = '';
 | |
| 
 | |
|       $params['container_id']    = '';
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $params[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($params['tag_for_massive'])
 | |
| 
 | |
|           || !empty($params['container_id'])) {
 | |
| 
 | |
|          // Filtering on the container !
 | |
| 
 | |
|          if (!empty($params['container_id'])) {
 | |
| 
 | |
|             $criterion = '#' . $params['container_id'] . ' ';
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $criterion = '';
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          // We only want the checkbox input
 | |
| 
 | |
|          $criterion .= 'input[type="checkbox"]';
 | |
| 
 | |
| 
 | |
| 
 | |
|          // Only the given massive tag !
 | |
| 
 | |
|          if (!empty($params['tag_for_massive'])) {
 | |
| 
 | |
|             $criterion .= '[data-glpicore-cb-massive-tags~="' . $params['tag_for_massive'] . '"]';
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          // Only enabled checkbox
 | |
| 
 | |
|          $criterion .= ':enabled';
 | |
| 
 | |
| 
 | |
| 
 | |
|          return addslashes($criterion);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return '';
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get a checkbox.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array $options  array of parameters:
 | |
| 
 | |
|     *    - title         its title
 | |
| 
 | |
|     *    - name          its name
 | |
| 
 | |
|     *    - id            its id
 | |
| 
 | |
|     *    - value         the value to set when checked
 | |
| 
 | |
|     *    - readonly      can we edit it ?
 | |
| 
 | |
|     *    - massive_tags  the tag to set for massive checkbox update
 | |
| 
 | |
|     *    - checked       is it checked or not ?
 | |
| 
 | |
|     *    - zero_on_empty do we send 0 on submit when it is not checked ?
 | |
| 
 | |
|     *    - specific_tags HTML5 tags to add
 | |
| 
 | |
|     *    - criterion     the criterion for massive checkbox
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string  the HTML code for the checkbox
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getCheckbox(array $options) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $params                    = [];
 | |
| 
 | |
|       $params['title']           = '';
 | |
| 
 | |
|       $params['name']            = '';
 | |
| 
 | |
|       $params['rand']            = mt_rand();
 | |
| 
 | |
|       $params['id']              = "check_".$params['rand'];
 | |
| 
 | |
|       $params['value']           = 1;
 | |
| 
 | |
|       $params['readonly']        = false;
 | |
| 
 | |
|       $params['massive_tags']    = '';
 | |
| 
 | |
|       $params['checked']         = false;
 | |
| 
 | |
|       $params['zero_on_empty']   = true;
 | |
| 
 | |
|       $params['specific_tags']   = [];
 | |
| 
 | |
|       $params['criterion']       = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $params[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = "<span class='form-group-checkbox'>";
 | |
| 
 | |
|       $out.= "<input type='checkbox' class='new_checkbox' ";
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach (['id', 'name', 'title', 'value'] as $field) {
 | |
| 
 | |
|          if (!empty($params[$field])) {
 | |
| 
 | |
|             $out .= " $field='".$params[$field]."'";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $criterion = self::getCriterionForMassiveCheckboxes($params['criterion']);
 | |
| 
 | |
|       if (!empty($criterion)) {
 | |
| 
 | |
|          $out .= " onClick='massiveUpdateCheckbox(\"$criterion\", this)'";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['zero_on_empty']) {
 | |
| 
 | |
|          $out                               .= " data-glpicore-cb-zero-on-empty='1'";
 | |
| 
 | |
|          $CFG_GLPI['checkbox-zero-on-empty'] = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($params['massive_tags'])) {
 | |
| 
 | |
|          $params['specific_tags']['data-glpicore-cb-massive-tags'] = $params['massive_tags'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($params['specific_tags'])) {
 | |
| 
 | |
|          foreach ($params['specific_tags'] as $tag => $values) {
 | |
| 
 | |
|             if (is_array($values)) {
 | |
| 
 | |
|                $values = implode(' ', $values);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $out .= " $tag='$values'";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['readonly']) {
 | |
| 
 | |
|          $out .= " disabled='disabled'";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['checked']) {
 | |
| 
 | |
|          $out .= " checked";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= ">";
 | |
| 
 | |
|       $out .= "<label class='label-checkbox' title=\"".$params['title']."\" for='".$params['id']."'>";
 | |
| 
 | |
|       $out .= " <span class='check'></span>";
 | |
| 
 | |
|       $out .= " <span class='box'";
 | |
| 
 | |
|       if (isset($params['onclick'])) {
 | |
| 
 | |
|          $params['onclick'] = htmlspecialchars($params['onclick'], ENT_QUOTES);
 | |
| 
 | |
|          $out .= " onclick='{$params['onclick']}'";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= "></span>";
 | |
| 
 | |
|       $out .= " ";
 | |
| 
 | |
|       $out .= "</label>";
 | |
| 
 | |
|       $out .= "</span>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($criterion)) {
 | |
| 
 | |
|          $out .= Html::scriptBlock("\$(function() {\$('$criterion').shiftSelectable();});");
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * @brief display a checkbox that $_POST 0 or 1 depending on if it is checked or not.
 | |
| 
 | |
|     * @see Html::getCheckbox()
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $options   array
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showCheckbox(array $options = []) {
 | |
| 
 | |
|       echo self::getCheckbox($options);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get the massive action checkbox
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $itemtype  Massive action itemtype
 | |
| 
 | |
|     * @param integer $id        ID of the item
 | |
| 
 | |
|     * @param array   $options
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getMassiveActionCheckBox($itemtype, $id, array $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $options['checked']       = (isset($_SESSION['glpimassiveactionselected'][$itemtype][$id]));
 | |
| 
 | |
|       if (!isset($options['specific_tags']['data-glpicore-ma-tags'])) {
 | |
| 
 | |
|          $options['specific_tags']['data-glpicore-ma-tags'] = 'common';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $options['name']          = "item[$itemtype][".$id."]";
 | |
| 
 | |
|       $options['zero_on_empty'] = false;
 | |
| 
 | |
| 
 | |
| 
 | |
|       return self::getCheckbox($options);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Show the massive action checkbox
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $itemtype  Massive action itemtype
 | |
| 
 | |
|     * @param integer $id        ID of the item
 | |
| 
 | |
|     * @param array   $options
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showMassiveActionCheckBox($itemtype, $id, array $options = []) {
 | |
| 
 | |
|       echo Html::getMassiveActionCheckBox($itemtype, $id, $options);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display open form for massive action
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $name  given name/id to the form
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function openMassiveActionsForm($name = '') {
 | |
| 
 | |
|       echo Html::getOpenMassiveActionsForm($name);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get open form for massive action string
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $name  given name/id to the form
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getOpenMassiveActionsForm($name = '') {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($name)) {
 | |
| 
 | |
|          $name = 'massaction_'.mt_rand();
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return  "<form name='$name' id='$name' method='post'
 | |
| 
 | |
|                action='".$CFG_GLPI["root_doc"]."/front/massiveaction.php'>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display massive actions
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84 (before Search::displayMassiveActions)
 | |
| 
 | |
|     * @since 0.85 only 1 parameter (in 0.84 $itemtype required)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @todo replace 'hidden' by data-glpicore-ma-tags ?
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $options   array    of parameters
 | |
| 
 | |
|     * must contains :
 | |
| 
 | |
|     *    - container       : DOM ID of the container of the item checkboxes (since version 0.85)
 | |
| 
 | |
|     * may contains :
 | |
| 
 | |
|     *    - num_displayed   : integer number of displayed items. Permit to check suhosin limit.
 | |
| 
 | |
|     *                        (default -1 not to check)
 | |
| 
 | |
|     *    - ontop           : boolean true if displayed on top (default true)
 | |
| 
 | |
|     *    - fixed           : boolean true if used with fixed table display (default true)
 | |
| 
 | |
|     *    - forcecreate     : boolean force creation of modal window (default = false).
 | |
| 
 | |
|     *            Modal is automatically created when displayed the ontop item.
 | |
| 
 | |
|     *            If only a bottom one is displayed use it
 | |
| 
 | |
|     *    - check_itemtype   : string alternate itemtype to check right if different from main itemtype
 | |
| 
 | |
|     *                         (default empty)
 | |
| 
 | |
|     *    - check_items_id   : integer ID of the alternate item used to check right / optional
 | |
| 
 | |
|     *                         (default empty)
 | |
| 
 | |
|     *    - is_deleted       : boolean is massive actions for deleted items ?
 | |
| 
 | |
|     *    - extraparams      : string extra URL parameters to pass to massive actions (default empty)
 | |
| 
 | |
|     *                         if ([extraparams]['hidden'] is set : add hidden fields to post)
 | |
| 
 | |
|     *    - specific_actions : array of specific actions (do not use standard one)
 | |
| 
 | |
|     *    - add_actions      : array of actions to add (do not use standard one)
 | |
| 
 | |
|     *    - confirm          : string of confirm message before massive action
 | |
| 
 | |
|     *    - item             : CommonDBTM object that has to be passed to the actions
 | |
| 
 | |
|     *    - tag_to_send      : the tag of the elements to send to the ajax window (default: common)
 | |
| 
 | |
|     *    - display          : display or return the generated html (default true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return bool|string     the html if display parameter is false, or true
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showMassiveActions($options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       /// TODO : permit to pass several itemtypes to show possible actions of all types : need to clean visibility management after
 | |
| 
 | |
| 
 | |
| 
 | |
|       $p['ontop']             = true;
 | |
| 
 | |
|       $p['num_displayed']     = -1;
 | |
| 
 | |
|       $p['fixed']             = true;
 | |
| 
 | |
|       $p['forcecreate']       = false;
 | |
| 
 | |
|       $p['check_itemtype']    = '';
 | |
| 
 | |
|       $p['check_items_id']    = '';
 | |
| 
 | |
|       $p['is_deleted']        = false;
 | |
| 
 | |
|       $p['extraparams']       = [];
 | |
| 
 | |
|       $p['width']             = 800;
 | |
| 
 | |
|       $p['height']            = 400;
 | |
| 
 | |
|       $p['specific_actions']  = [];
 | |
| 
 | |
|       $p['add_actions']       = [];
 | |
| 
 | |
|       $p['confirm']           = '';
 | |
| 
 | |
|       $p['rand']              = '';
 | |
| 
 | |
|       $p['container']         = '';
 | |
| 
 | |
|       $p['display_arrow']     = true;
 | |
| 
 | |
|       $p['title']             = _n('Action', 'Actions', Session::getPluralNumber());
 | |
| 
 | |
|       $p['item']              = false;
 | |
| 
 | |
|       $p['tag_to_send']       = 'common';
 | |
| 
 | |
|       $p['display']           = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach ($options as $key => $val) {
 | |
| 
 | |
|          if (isset($p[$key])) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $url = $CFG_GLPI['root_doc']."/ajax/massiveaction.php";
 | |
| 
 | |
|       if ($p['container']) {
 | |
| 
 | |
|          $p['extraparams']['container'] = $p['container'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if ($p['is_deleted']) {
 | |
| 
 | |
|          $p['extraparams']['is_deleted'] = 1;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!empty($p['check_itemtype'])) {
 | |
| 
 | |
|          $p['extraparams']['check_itemtype'] = $p['check_itemtype'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!empty($p['check_items_id'])) {
 | |
| 
 | |
|          $p['extraparams']['check_items_id'] = $p['check_items_id'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (is_array($p['specific_actions']) && count($p['specific_actions'])) {
 | |
| 
 | |
|          $p['extraparams']['specific_actions'] = $p['specific_actions'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (is_array($p['add_actions']) && count($p['add_actions'])) {
 | |
| 
 | |
|          $p['extraparams']['add_actions'] = $p['add_actions'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if ($p['item'] instanceof CommonDBTM) {
 | |
| 
 | |
|          $p['extraparams']['item_itemtype'] = $p['item']->getType();
 | |
| 
 | |
|          $p['extraparams']['item_items_id'] = $p['item']->getID();
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Manage modal window
 | |
| 
 | |
|       if (isset($_REQUEST['_is_modal']) && $_REQUEST['_is_modal']) {
 | |
| 
 | |
|          $p['extraparams']['hidden']['_is_modal'] = 1;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['fixed']) {
 | |
| 
 | |
|          $width= '950px';
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $width= '95%';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $identifier = md5($url.serialize($p['extraparams']).$p['rand']);
 | |
| 
 | |
|       $max        = Toolbox::get_max_input_vars();
 | |
| 
 | |
|       $out = '';
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (($p['num_displayed'] >= 0)
 | |
| 
 | |
|           && ($max > 0)
 | |
| 
 | |
|           && ($max < ($p['num_displayed']+10))) {
 | |
| 
 | |
|          if (!$p['ontop']
 | |
| 
 | |
|              || (isset($p['forcecreate']) && $p['forcecreate'])) {
 | |
| 
 | |
|             $out .= "<table class='tab_cadre' width='$width'><tr class='tab_bg_1'>".
 | |
| 
 | |
|                     "<td><span class='b'>";
 | |
| 
 | |
|             $out .= __('Selection too large, massive action disabled.')."</span>";
 | |
| 
 | |
|             if ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) {
 | |
| 
 | |
|                $out .= "<br>".__('To increase the limit: change max_input_vars or suhosin.post.max_vars in php configuration.');
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $out .= "</td></tr></table>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          // Create Modal window on top
 | |
| 
 | |
|          if ($p['ontop']
 | |
| 
 | |
|              || (isset($p['forcecreate']) && $p['forcecreate'])) {
 | |
| 
 | |
|                 $out .= "<div id='massiveactioncontent$identifier'></div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (!empty($p['tag_to_send'])) {
 | |
| 
 | |
|                $js_modal_fields  = "            var items = $('";
 | |
| 
 | |
|                if (!empty($p['container'])) {
 | |
| 
 | |
|                   $js_modal_fields .= '[id='.$p['container'].'] ';
 | |
| 
 | |
|                }
 | |
| 
 | |
|                $js_modal_fields .= "[data-glpicore-ma-tags~=".$p['tag_to_send']."]')";
 | |
| 
 | |
|                $js_modal_fields .= ".each(function( index ) {\n";
 | |
| 
 | |
|                $js_modal_fields .= "              fields[$(this).attr('name')] = $(this).attr('value');\n";
 | |
| 
 | |
|                $js_modal_fields .= "              if (($(this).attr('type') == 'checkbox') && (!$(this).is(':checked'))) {\n";
 | |
| 
 | |
|                $js_modal_fields .= "                 fields[$(this).attr('name')] = 0;\n";
 | |
| 
 | |
|                $js_modal_fields .= "              }\n";
 | |
| 
 | |
|                $js_modal_fields .= "            });";
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                $js_modal_fields = "";
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             $out .= Ajax::createModalWindow('massiveaction_window'.$identifier,
 | |
| 
 | |
|                                             $url,
 | |
| 
 | |
|                                             ['title'           => $p['title'],
 | |
| 
 | |
|                                                   'container'       => 'massiveactioncontent'.$identifier,
 | |
| 
 | |
|                                                   'extraparams'     => $p['extraparams'],
 | |
| 
 | |
|                                                   'width'           => $p['width'],
 | |
| 
 | |
|                                                   'height'          => $p['height'],
 | |
| 
 | |
|                                                   'js_modal_fields' => $js_modal_fields,
 | |
| 
 | |
|                                                   'display'         => false]);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          $out .= "<table class='tab_glpi' width='$width'><tr>";
 | |
| 
 | |
|          
 | |
| 
 | |
|          //sophal cacher le bouton action en mass vue ticket selon le profile		 		 
 | |
| 
 | |
| 		 if( isset($options['container']) && $options['container'] == "massformTicket"){
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Utilisateur-standard" || $_SESSION['glpiactiveprofile']['name'] =='RESPONSABLE'){
 | |
| 
 | |
| 						$out .= "<table class='tab_glpi' style='display: none;' width='$width'><tr>";					
 | |
| 
 | |
| 			    }
 | |
| 
 | |
| 		 }
 | |
| 
 | |
| 		 //sophal
 | |
| 
 | |
| 		 
 | |
| 
 | |
|          if ($p['display_arrow']) {
 | |
| 
 | |
|             $out .= "<td width='30px'><img src='".$CFG_GLPI["root_doc"]."/pics/arrow-left".
 | |
| 
 | |
|                    ($p['ontop']?'-top':'').".png' alt=''></td>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          $out .= "<td width='100%' class='left'>";
 | |
| 
 | |
|          $out .= "<a class='vsubmit' ";
 | |
| 
 | |
|          if (is_array($p['confirm'] || strlen($p['confirm']))) {
 | |
| 
 | |
|             $out .= self::addConfirmationOnAction($p['confirm'], "massiveaction_window$identifier.dialog(\"open\");");
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $out .= "onclick='massiveaction_window$identifier.dialog(\"open\");'";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          $out .= " href='#modal_massaction_content$identifier' title=\"".htmlentities($p['title'], ENT_QUOTES, 'UTF-8')."\">";
 | |
| 
 | |
|          $out .= $p['title']."</a>";
 | |
| 
 | |
|          $out .= "</td>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          $out .= "</tr></table>";
 | |
| 
 | |
|          if (!$p['ontop']
 | |
| 
 | |
|              || (isset($p['forcecreate']) && $p['forcecreate'])) {
 | |
| 
 | |
|             // Clean selection
 | |
| 
 | |
|             $_SESSION['glpimassiveactionselected'] = [];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $out;
 | |
| 
 | |
|          return true;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $out;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display Date form with calendar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $name     name of the element
 | |
| 
 | |
|     * @param array  $options  array of possible options:
 | |
| 
 | |
|     *      - value        : default value to display (default '')
 | |
| 
 | |
|     *      - maybeempty   : may be empty ? (true by default)
 | |
| 
 | |
|     *      - canedit      :  could not modify element (true by default)
 | |
| 
 | |
|     *      - min          :  minimum allowed date (default '')
 | |
| 
 | |
|     *      - max          : maximum allowed date (default '')
 | |
| 
 | |
|     *      - showyear     : should we set/diplay the year? (true by default)
 | |
| 
 | |
|     *      - display      : boolean display of return string (default true)
 | |
| 
 | |
|     *      - calendar_btn : boolean display calendar icon (default true)
 | |
| 
 | |
|     *      - clear_btn    : boolean display clear icon (default true)
 | |
| 
 | |
|     *      - range        : boolean set the datepicket in range mode
 | |
| 
 | |
|     *      - rand         : specific rand value (default generated one)
 | |
| 
 | |
|     *      - yearrange    : set a year range to show in drop-down (default '')
 | |
| 
 | |
|     *      - required     : required field (will add required attribute)
 | |
| 
 | |
|     *      - placeholder  : text to display when input is empty
 | |
| 
 | |
|     *      - on_change    : function to execute when date selection changed
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return integer|string
 | |
| 
 | |
|     *    integer if option display=true (random part of elements id)
 | |
| 
 | |
|     *    string if option display=false (HTML code)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showDateField($name, $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $p = [
 | |
| 
 | |
|          'value'        => '',
 | |
| 
 | |
|          'defaultDate'  => '',
 | |
| 
 | |
|          'maybeempty'   => true,
 | |
| 
 | |
|          'canedit'      => true,
 | |
| 
 | |
|          'min'          => '',
 | |
| 
 | |
|          'max'          => '',
 | |
| 
 | |
|          'showyear'     => false,
 | |
| 
 | |
|          'display'      => true,
 | |
| 
 | |
|          'range'        => false,
 | |
| 
 | |
|          'rand'         => mt_rand(),
 | |
| 
 | |
|          'calendar_btn' => true,
 | |
| 
 | |
|          'clear_btn'    => true,
 | |
| 
 | |
|          'yearrange'    => '',
 | |
| 
 | |
|          'multiple'     => false,
 | |
| 
 | |
|          'size'         => 10,
 | |
| 
 | |
|          'required'     => false,
 | |
| 
 | |
|          'placeholder'  => '',
 | |
| 
 | |
|          'on_change'    => '',
 | |
| 
 | |
|       ];
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach ($options as $key => $val) {
 | |
| 
 | |
|          if (isset($p[$key])) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $required = $p['required'] == true
 | |
| 
 | |
|          ? " required='required'"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $disabled = !$p['canedit']
 | |
| 
 | |
|          ? " disabled='disabled'"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $calendar_btn = $p['calendar_btn']
 | |
| 
 | |
|          ? "<a class='input-button' data-toggle>
 | |
| 
 | |
|                <i class='far fa-calendar-alt fa-lg pointer'></i>
 | |
| 
 | |
|             </a>"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $clear_btn = $p['clear_btn'] && $p['maybeempty'] && $p['canedit']
 | |
| 
 | |
|          ? "<a data-clear  title='".__s('Clear')."'>
 | |
| 
 | |
|                <i class='fa fa-times-circle pointer'></i>
 | |
| 
 | |
|             </a>"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $mode = $p['range']
 | |
| 
 | |
|          ? "mode: 'range',"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output = <<<HTML
 | |
| 
 | |
|       <div class="no-wrap flatpickr" id="showdate{$p['rand']}">
 | |
| 
 | |
|          <input type="text" name="{$name}" size="{$p['size']}"
 | |
| 
 | |
|                 {$required} {$disabled} data-input placeholder="{$p['placeholder']}">
 | |
| 
 | |
|          $calendar_btn
 | |
| 
 | |
|          $clear_btn
 | |
| 
 | |
|       </div>
 | |
| 
 | |
| HTML;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $date_format = Toolbox::getDateFormat('js');
 | |
| 
 | |
| 
 | |
| 
 | |
|       $min_attr = !empty($p['min'])
 | |
| 
 | |
|          ? "minDate: '{$p['min']}',"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $max_attr = !empty($p['max'])
 | |
| 
 | |
|          ? "maxDate: '{$p['max']}',"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $multiple_attr = $p['multiple']
 | |
| 
 | |
|          ? "mode: 'multiple',"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $value = is_array($p['value'])
 | |
| 
 | |
|          ? json_encode($p['value'])
 | |
| 
 | |
|          : "'{$p['value']}'";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $js = <<<JS
 | |
| 
 | |
|       $(function() {
 | |
| 
 | |
|          $("#showdate{$p['rand']}").flatpickr({
 | |
| 
 | |
|             defaultDate: {$value},
 | |
| 
 | |
|             altInput: true, // Show the user a readable date (as per altFormat), but return something totally different to the server.
 | |
| 
 | |
|             altFormat: '{$date_format}',
 | |
| 
 | |
|             dateFormat: 'Y-m-d',
 | |
| 
 | |
|             wrap: true, // permits to have controls in addition to input (like clear or open date buttons
 | |
| 
 | |
|             weekNumbers: true,
 | |
| 
 | |
|             locale: "{$CFG_GLPI['languages'][$_SESSION['glpilanguage']][3]}",
 | |
| 
 | |
|             {$min_attr}
 | |
| 
 | |
|             {$max_attr}
 | |
| 
 | |
|             {$multiple_attr}
 | |
| 
 | |
|             {$mode}
 | |
| 
 | |
|             onChange: function(selectedDates, dateStr, instance) {
 | |
| 
 | |
|                {$p['on_change']}
 | |
| 
 | |
|             }
 | |
| 
 | |
|          });
 | |
| 
 | |
|       });
 | |
| 
 | |
| JS;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output .= Html::scriptBlock($js);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|          return $p['rand'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $output;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display Color field
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $name     name of the element
 | |
| 
 | |
|     * @param array  $options  array  of possible options:
 | |
| 
 | |
|     *   - value      : default value to display (default '')
 | |
| 
 | |
|     *   - display    : boolean display or get string (default true)
 | |
| 
 | |
|     *   - rand       : specific random value (default generated one)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return integer|string
 | |
| 
 | |
|     *    integer if option display=true (random part of elements id)
 | |
| 
 | |
|     *    string if option display=false (HTML code)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showColorField($name, $options = []) {
 | |
| 
 | |
|       $p['value']      = '';
 | |
| 
 | |
|       $p['rand']       = mt_rand();
 | |
| 
 | |
|       $p['display']    = true;
 | |
| 
 | |
|       foreach ($options as $key => $val) {
 | |
| 
 | |
|          if (isset($p[$key])) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $field_id = Html::cleanId("color_".$name.$p['rand']);
 | |
| 
 | |
|       $output   = "<input type='color' id='$field_id' name='$name' value='".$p['value']."'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|          return $p['rand'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $output;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display DateTime form with calendar
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $name     name of the element
 | |
| 
 | |
|     * @param array  $options  array  of possible options:
 | |
| 
 | |
|     *   - value      : default value to display (default '')
 | |
| 
 | |
|     *   - timestep   : step for time in minute (-1 use default config) (default -1)
 | |
| 
 | |
|     *   - maybeempty : may be empty ? (true by default)
 | |
| 
 | |
|     *   - canedit    : could not modify element (true by default)
 | |
| 
 | |
|     *   - mindate    : minimum allowed date (default '')
 | |
| 
 | |
|     *   - maxdate    : maximum allowed date (default '')
 | |
| 
 | |
|     *   - showyear   : should we set/diplay the year? (true by default)
 | |
| 
 | |
|     *   - display    : boolean display or get string (default true)
 | |
| 
 | |
|     *   - rand       : specific random value (default generated one)
 | |
| 
 | |
|     *   - required   : required field (will add required attribute)
 | |
| 
 | |
|     *   - on_change    : function to execute when date selection changed
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return integer|string
 | |
| 
 | |
|     *    integer if option display=true (random part of elements id)
 | |
| 
 | |
|     *    string if option display=false (HTML code)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showDateTimeField($name, $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $p = [
 | |
| 
 | |
|          'value'      => '',
 | |
| 
 | |
|          'maybeempty' => true,
 | |
| 
 | |
|          'canedit'    => true,
 | |
| 
 | |
|          'mindate'    => '',
 | |
| 
 | |
|          'maxdate'    => '',
 | |
| 
 | |
|          'mintime'    => '',
 | |
| 
 | |
|          'maxtime'    => '',
 | |
| 
 | |
|          'timestep'   => -1,
 | |
| 
 | |
|          'showyear'   => true,
 | |
| 
 | |
|          'display'    => true,
 | |
| 
 | |
|          'rand'       => mt_rand(),
 | |
| 
 | |
|          'required'   => false,
 | |
| 
 | |
|          'on_change'  => '',
 | |
| 
 | |
|       ];
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach ($options as $key => $val) {
 | |
| 
 | |
|          if (isset($p[$key])) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['timestep'] < 0) {
 | |
| 
 | |
|          $p['timestep'] = $CFG_GLPI['time_step'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $date_value = '';
 | |
| 
 | |
|       $hour_value = '';
 | |
| 
 | |
|       if (!empty($p['value'])) {
 | |
| 
 | |
|          list($date_value, $hour_value) = explode(' ', $p['value']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($p['mintime'])) {
 | |
| 
 | |
|          // Check time in interval
 | |
| 
 | |
|          if (!empty($hour_value) && ($hour_value < $p['mintime'])) {
 | |
| 
 | |
|             $hour_value = $p['mintime'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($p['maxtime'])) {
 | |
| 
 | |
|          // Check time in interval
 | |
| 
 | |
|          if (!empty($hour_value) && ($hour_value > $p['maxtime'])) {
 | |
| 
 | |
|             $hour_value = $p['maxtime'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // reconstruct value to be valid
 | |
| 
 | |
|       if (!empty($date_value)) {
 | |
| 
 | |
|          $p['value'] = $date_value.' '.$hour_value;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $required = $p['required'] == true
 | |
| 
 | |
|          ? " required='required'"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $disabled = !$p['canedit']
 | |
| 
 | |
|          ? " disabled='disabled'"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $clear    = $p['maybeempty'] && $p['canedit']
 | |
| 
 | |
|          ? "<a data-clear  title='".__s('Clear')."'>
 | |
| 
 | |
|                <i class='fa fa-times-circle pointer'></i>
 | |
| 
 | |
|             </a>"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output = <<<HTML
 | |
| 
 | |
|          <div class="no-wrap flatpickr" id="showdate{$p['rand']}">
 | |
| 
 | |
|             <input type="text" name="{$name}" value="{$p['value']}"
 | |
| 
 | |
|                    {$required} {$disabled} data-input>
 | |
| 
 | |
|             <a class="input-button" data-toggle>
 | |
| 
 | |
|                <i class="far fa-calendar-alt fa-lg pointer"></i>
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|             $clear
 | |
| 
 | |
|          </div>
 | |
| 
 | |
| HTML;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $date_format = Toolbox::getDateFormat('js')." H:i:S";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $min_attr = !empty($p['min'])
 | |
| 
 | |
|          ? "minDate: '{$p['min']}',"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $max_attr = !empty($p['max'])
 | |
| 
 | |
|          ? "maxDate: '{$p['max']}',"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $js = <<<JS
 | |
| 
 | |
|       $(function() {
 | |
| 
 | |
|          $("#showdate{$p['rand']}").flatpickr({
 | |
| 
 | |
|             altInput: true, // Show the user a readable date (as per altFormat), but return something totally different to the server.
 | |
| 
 | |
|             altFormat: "{$date_format}",
 | |
| 
 | |
|             dateFormat: 'Y-m-d H:i:S',
 | |
| 
 | |
|             wrap: true, // permits to have controls in addition to input (like clear or open date buttons)
 | |
| 
 | |
|             enableTime: true,
 | |
| 
 | |
|             enableSeconds: true,
 | |
| 
 | |
|             weekNumbers: true,
 | |
| 
 | |
|             locale: "{$CFG_GLPI['languages'][$_SESSION['glpilanguage']][3]}",
 | |
| 
 | |
|             minuteIncrement: "{$p['timestep']}",
 | |
| 
 | |
|             {$min_attr}
 | |
| 
 | |
|             {$max_attr}
 | |
| 
 | |
|             onChange: function(selectedDates, dateStr, instance) {
 | |
| 
 | |
|                {$p['on_change']}
 | |
| 
 | |
|             }
 | |
| 
 | |
|          });
 | |
| 
 | |
|       });
 | |
| 
 | |
| JS;
 | |
| 
 | |
|       $output .= Html::scriptBlock($js);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|          return $p['rand'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $output;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display TimeField form
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $name
 | |
| 
 | |
|     * @param array  $options
 | |
| 
 | |
|     *   - value      : default value to display (default '')
 | |
| 
 | |
|     *   - timestep   : step for time in minute (-1 use default config) (default -1)
 | |
| 
 | |
|     *   - maybeempty : may be empty ? (true by default)
 | |
| 
 | |
|     *   - canedit    : could not modify element (true by default)
 | |
| 
 | |
|     *   - mintime    : minimum allowed time (default '')
 | |
| 
 | |
|     *   - maxtime    : maximum allowed time (default '')
 | |
| 
 | |
|     *   - display    : boolean display or get string (default true)
 | |
| 
 | |
|     *   - rand       : specific random value (default generated one)
 | |
| 
 | |
|     *   - required   : required field (will add required attribute)
 | |
| 
 | |
|     *   - on_change  : function to execute when date selection changed
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     */
 | |
| 
 | |
|    public static function showTimeField($name, $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $p = [
 | |
| 
 | |
|          'value'      => '',
 | |
| 
 | |
|          'maybeempty' => true,
 | |
| 
 | |
|          'canedit'    => true,
 | |
| 
 | |
|          'mintime'    => '',
 | |
| 
 | |
|          'maxtime'    => '',
 | |
| 
 | |
|          'timestep'   => -1,
 | |
| 
 | |
|          'display'    => true,
 | |
| 
 | |
|          'rand'       => mt_rand(),
 | |
| 
 | |
|          'required'   => false,
 | |
| 
 | |
|          'on_change'  => '',
 | |
| 
 | |
|       ];
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach ($options as $key => $val) {
 | |
| 
 | |
|          if (isset($p[$key])) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['timestep'] < 0) {
 | |
| 
 | |
|          $p['timestep'] = $CFG_GLPI['time_step'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $hour_value = '';
 | |
| 
 | |
|       if (!empty($p['value'])) {
 | |
| 
 | |
|          $hour_value = $p['value'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($p['mintime'])) {
 | |
| 
 | |
|          // Check time in interval
 | |
| 
 | |
|          if (!empty($hour_value) && ($hour_value < $p['mintime'])) {
 | |
| 
 | |
|             $hour_value = $p['mintime'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!empty($p['maxtime'])) {
 | |
| 
 | |
|          // Check time in interval
 | |
| 
 | |
|          if (!empty($hour_value) && ($hour_value > $p['maxtime'])) {
 | |
| 
 | |
|             $hour_value = $p['maxtime'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // reconstruct value to be valid
 | |
| 
 | |
|       if (!empty($hour_value)) {
 | |
| 
 | |
|          $p['value'] = $hour_value;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $required = $p['required'] == true
 | |
| 
 | |
|          ? " required='required'"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $disabled = !$p['canedit']
 | |
| 
 | |
|          ? " disabled='disabled'"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
|       $clear    = $p['maybeempty'] && $p['canedit']
 | |
| 
 | |
|          ? "<a data-clear  title='".__s('Clear')."'>
 | |
| 
 | |
|                <i class='fa fa-times-circle pointer'></i>
 | |
| 
 | |
|             </a>"
 | |
| 
 | |
|          : "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output = <<<HTML
 | |
| 
 | |
|          <div class="no-wrap flatpickr" id="showtime{$p['rand']}">
 | |
| 
 | |
|             <input type="text" name="{$name}" value="{$p['value']}"
 | |
| 
 | |
|                    {$required} {$disabled} data-input>
 | |
| 
 | |
|             <a class="input-button" data-toggle>
 | |
| 
 | |
|                <i class="far fa-clock fa-lg pointer"></i>
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|             $clear
 | |
| 
 | |
|          </div>
 | |
| 
 | |
| HTML;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $js = <<<JS
 | |
| 
 | |
|       $(function() {
 | |
| 
 | |
|          $("#showtime{$p['rand']}").flatpickr({
 | |
| 
 | |
|             dateFormat: 'H:i:S',
 | |
| 
 | |
|             wrap: true, // permits to have controls in addition to input (like clear or open date buttons)
 | |
| 
 | |
|             enableTime: true,
 | |
| 
 | |
|             noCalendar: true, // only time picker
 | |
| 
 | |
|             enableSeconds: true,
 | |
| 
 | |
|             locale: "{$CFG_GLPI['languages'][$_SESSION['glpilanguage']][3]}",
 | |
| 
 | |
|             minuteIncrement: "{$p['timestep']}",
 | |
| 
 | |
|             onChange: function(selectedDates, dateStr, instance) {
 | |
| 
 | |
|                {$p['on_change']}
 | |
| 
 | |
|             }
 | |
| 
 | |
|          });
 | |
| 
 | |
|       });
 | |
| 
 | |
| JS;
 | |
| 
 | |
|       $output .= Html::scriptBlock($js);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|          return $p['rand'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $output;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Show generic date search
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $element  name of the html element
 | |
| 
 | |
|     * @param string $value    default value
 | |
| 
 | |
|     * @param $options   array of possible options:
 | |
| 
 | |
|     *      - with_time display with time selection ? (default false)
 | |
| 
 | |
|     *      - with_future display with future date selection ? (default false)
 | |
| 
 | |
|     *      - with_days display specific days selection TODAY, BEGINMONTH, LASTMONDAY... ? (default true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return integer|string
 | |
| 
 | |
|     *    integer if option display=true (random part of elements id)
 | |
| 
 | |
|     *    string if option display=false (HTML code)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showGenericDateTimeSearch($element, $value = '', $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $p['with_time']          = false;
 | |
| 
 | |
|       $p['with_future']        = false;
 | |
| 
 | |
|       $p['with_days']          = true;
 | |
| 
 | |
|       $p['with_specific_date'] = true;
 | |
| 
 | |
|       $p['display']            = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $rand   = mt_rand();
 | |
| 
 | |
|       $output = '';
 | |
| 
 | |
|       // Validate value
 | |
| 
 | |
|       if (($value != 'NOW')
 | |
| 
 | |
|           && ($value != 'TODAY')
 | |
| 
 | |
|           && !preg_match("/\d{4}-\d{2}-\d{2}.*/", $value)
 | |
| 
 | |
|           && !strstr($value, 'HOUR')
 | |
| 
 | |
|           && !strstr($value, 'MINUTE')
 | |
| 
 | |
|           && !strstr($value, 'DAY')
 | |
| 
 | |
|           && !strstr($value, 'WEEK')
 | |
| 
 | |
|           && !strstr($value, 'MONTH')
 | |
| 
 | |
|           && !strstr($value, 'YEAR')) {
 | |
| 
 | |
| 
 | |
| 
 | |
|          $value = "";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($value)) {
 | |
| 
 | |
|          $value = 'NOW';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $specific_value = date("Y-m-d H:i:s");
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (preg_match("/\d{4}-\d{2}-\d{2}.*/", $value)) {
 | |
| 
 | |
|          $specific_value = $value;
 | |
| 
 | |
|          $value          = 0;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $output    .= "<table width='100%'><tr><td width='50%'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $dates      = Html::getGenericDateTimeSearchItems($p);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output    .= Dropdown::showFromArray("_select_$element", $dates,
 | |
| 
 | |
|                                                   ['value'   => $value,
 | |
| 
 | |
|                                                         'display' => false,
 | |
| 
 | |
|                                                         'rand'    => $rand]);
 | |
| 
 | |
|       $field_id   = Html::cleanId("dropdown__select_$element$rand");
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output    .= "</td><td width='50%'>";
 | |
| 
 | |
|       $contentid  = Html::cleanId("displaygenericdate$element$rand");
 | |
| 
 | |
|       $output    .= "<span id='$contentid'></span>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $params     = ['value'         => '__VALUE__',
 | |
| 
 | |
|                           'name'          => $element,
 | |
| 
 | |
|                           'withtime'      => $p['with_time'],
 | |
| 
 | |
|                           'specificvalue' => $specific_value];
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output    .= Ajax::updateItemOnSelectEvent($field_id, $contentid,
 | |
| 
 | |
|                                                   $CFG_GLPI["root_doc"]."/ajax/genericdate.php",
 | |
| 
 | |
|                                                   $params, false);
 | |
| 
 | |
|       $params['value']  = $value;
 | |
| 
 | |
|       $output    .= Ajax::updateItem($contentid, $CFG_GLPI["root_doc"]."/ajax/genericdate.php",
 | |
| 
 | |
|                                            $params, '', false);
 | |
| 
 | |
|       $output    .= "</td></tr></table>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|          return $rand;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $output;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get items to display for showGenericDateTimeSearch
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.83
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array $options  array of possible options:
 | |
| 
 | |
|     *      - with_time display with time selection ? (default false)
 | |
| 
 | |
|     *      - with_future display with future date selection ? (default false)
 | |
| 
 | |
|     *      - with_days display specific days selection TODAY, BEGINMONTH, LASTMONDAY... ? (default true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return array of posible values
 | |
| 
 | |
|     * @see self::showGenericDateTimeSearch()
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getGenericDateTimeSearchItems($options) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $params['with_time']          = false;
 | |
| 
 | |
|       $params['with_future']        = false;
 | |
| 
 | |
|       $params['with_days']          = true;
 | |
| 
 | |
|       $params['with_specific_date'] = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $params[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $dates = [];
 | |
| 
 | |
|       if ($params['with_time']) {
 | |
| 
 | |
|          $dates['NOW'] = __('Now');
 | |
| 
 | |
|          if ($params['with_days']) {
 | |
| 
 | |
|             $dates['TODAY'] = __('Today');
 | |
| 
 | |
|          }
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $dates['NOW'] = __('Today');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['with_specific_date']) {
 | |
| 
 | |
|          $dates[0] = __('Specify a date');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['with_time']) {
 | |
| 
 | |
|          for ($i=1; $i<=24; $i++) {
 | |
| 
 | |
|             $dates['-'.$i.'HOUR'] = sprintf(_n('- %d hour', '- %d hours', $i), $i);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          for ($i=1; $i<=15; $i++) {
 | |
| 
 | |
|             $dates['-'.$i.'MINUTE'] = sprintf(_n('- %d minute', '- %d minutes', $i), $i);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       for ($i=1; $i<=7; $i++) {
 | |
| 
 | |
|          $dates['-'.$i.'DAY'] = sprintf(_n('- %d day', '- %d days', $i), $i);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['with_days']) {
 | |
| 
 | |
|          $dates['LASTSUNDAY']    = __('last Sunday');
 | |
| 
 | |
|          $dates['LASTMONDAY']    = __('last Monday');
 | |
| 
 | |
|          $dates['LASTTUESDAY']   = __('last Tuesday');
 | |
| 
 | |
|          $dates['LASTWEDNESDAY'] = __('last Wednesday');
 | |
| 
 | |
|          $dates['LASTTHURSDAY']  = __('last Thursday');
 | |
| 
 | |
|          $dates['LASTFRIDAY']    = __('last Friday');
 | |
| 
 | |
|          $dates['LASTSATURDAY']  = __('last Saturday');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       for ($i=1; $i<=10; $i++) {
 | |
| 
 | |
|          $dates['-'.$i.'WEEK'] = sprintf(_n('- %d week', '- %d weeks', $i), $i);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['with_days']) {
 | |
| 
 | |
|          $dates['BEGINMONTH']  = __('Beginning of the month');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       for ($i=1; $i<=12; $i++) {
 | |
| 
 | |
|          $dates['-'.$i.'MONTH'] = sprintf(_n('- %d month', '- %d months', $i), $i);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['with_days']) {
 | |
| 
 | |
|          $dates['BEGINYEAR']  = __('Beginning of the year');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       for ($i=1; $i<=10; $i++) {
 | |
| 
 | |
|          $dates['-'.$i.'YEAR'] = sprintf(_n('- %d year', '- %d years', $i), $i);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($params['with_future']) {
 | |
| 
 | |
|          if ($params['with_time']) {
 | |
| 
 | |
|             for ($i=1; $i<=24; $i++) {
 | |
| 
 | |
|                $dates[$i.'HOUR'] = sprintf(_n('+ %d hour', '+ %d hours', $i), $i);
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          for ($i=1; $i<=7; $i++) {
 | |
| 
 | |
|             $dates[$i.'DAY'] = sprintf(_n('+ %d day', '+ %d days', $i), $i);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          for ($i=1; $i<=10; $i++) {
 | |
| 
 | |
|             $dates[$i.'WEEK'] = sprintf(_n('+ %d week', '+ %d weeks', $i), $i);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          for ($i=1; $i<=12; $i++) {
 | |
| 
 | |
|             $dates[$i.'MONTH'] = sprintf(_n('+ %d month', '+ %d months', $i), $i);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          for ($i=1; $i<=10; $i++) {
 | |
| 
 | |
|             $dates[$i.'YEAR'] = sprintf(_n('+ %d year', '+ %d years', $i), $i);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $dates;
 | |
| 
 | |
| 
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|     /**
 | |
| 
 | |
|     * Compute date / datetime value resulting of showGenericDateTimeSearch
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.83
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string         $val           date / datetime value passed
 | |
| 
 | |
|     * @param boolean        $force_day     force computation in days
 | |
| 
 | |
|     * @param integer|string $specifictime  set specific timestamp
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string  computed date / datetime value
 | |
| 
 | |
|     * @see self::showGenericDateTimeSearch()
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function computeGenericDateTimeSearch($val, $force_day = false, $specifictime = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($specifictime)) {
 | |
| 
 | |
|          $specifictime = strtotime($_SESSION["glpi_currenttime"]);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $format_use = "Y-m-d H:i:s";
 | |
| 
 | |
|       if ($force_day) {
 | |
| 
 | |
|          $format_use = "Y-m-d";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Parsing relative date
 | |
| 
 | |
|       switch ($val) {
 | |
| 
 | |
|          case 'NOW' :
 | |
| 
 | |
|             return date($format_use, $specifictime);
 | |
| 
 | |
| 
 | |
| 
 | |
|          case 'TODAY' :
 | |
| 
 | |
|             return date("Y-m-d", $specifictime);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Search on begin of month / year
 | |
| 
 | |
|       if (strstr($val, 'BEGIN')) {
 | |
| 
 | |
|          $hour   = 0;
 | |
| 
 | |
|          $minute = 0;
 | |
| 
 | |
|          $second = 0;
 | |
| 
 | |
|          $month  = date("n", $specifictime);
 | |
| 
 | |
|          $day    = 1;
 | |
| 
 | |
|          $year   = date("Y", $specifictime);
 | |
| 
 | |
| 
 | |
| 
 | |
|          switch ($val) {
 | |
| 
 | |
|             case "BEGINYEAR":
 | |
| 
 | |
|                $month = 1;
 | |
| 
 | |
|                break;
 | |
| 
 | |
| 
 | |
| 
 | |
|             case "BEGINMONTH":
 | |
| 
 | |
|                break;
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          return date($format_use, mktime ($hour, $minute, $second, $month, $day, $year));
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Search on Last monday, sunday...
 | |
| 
 | |
|       if (strstr($val, 'LAST')) {
 | |
| 
 | |
|          $lastday = str_replace("LAST", "LAST ", $val);
 | |
| 
 | |
|          $hour   = 0;
 | |
| 
 | |
|          $minute = 0;
 | |
| 
 | |
|          $second = 0;
 | |
| 
 | |
|          $month  = date("n", strtotime($lastday));
 | |
| 
 | |
|          $day    = date("j", strtotime($lastday));
 | |
| 
 | |
|          $year   = date("Y", strtotime($lastday));
 | |
| 
 | |
| 
 | |
| 
 | |
|          return date($format_use, mktime ($hour, $minute, $second, $month, $day, $year));
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Search on +- x days, hours...
 | |
| 
 | |
|       if (preg_match("/^(-?)(\d+)(\w+)$/", $val, $matches)) {
 | |
| 
 | |
|          if (in_array($matches[3], ['YEAR', 'MONTH', 'WEEK', 'DAY', 'HOUR', 'MINUTE'])) {
 | |
| 
 | |
|             $nb = intval($matches[2]);
 | |
| 
 | |
|             if ($matches[1] == '-') {
 | |
| 
 | |
|                $nb = -$nb;
 | |
| 
 | |
|             }
 | |
| 
 | |
|             // Use it to have a clean delay computation (MONTH / YEAR have not always the same duration)
 | |
| 
 | |
|             $hour   = date("H", $specifictime);
 | |
| 
 | |
|             $minute = date("i", $specifictime);
 | |
| 
 | |
|             $second = 0;
 | |
| 
 | |
|             $month  = date("n", $specifictime);
 | |
| 
 | |
|             $day    = date("j", $specifictime);
 | |
| 
 | |
|             $year   = date("Y", $specifictime);
 | |
| 
 | |
| 
 | |
| 
 | |
|             switch ($matches[3]) {
 | |
| 
 | |
|                case "YEAR" :
 | |
| 
 | |
|                   $year += $nb;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                case "MONTH" :
 | |
| 
 | |
|                   $month += $nb;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                case "WEEK" :
 | |
| 
 | |
|                   $day += 7*$nb;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                case "DAY" :
 | |
| 
 | |
|                   $day += $nb;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                case "MINUTE" :
 | |
| 
 | |
|                   $format_use = "Y-m-d H:i:s";
 | |
| 
 | |
|                   $minute    += $nb;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                case "HOUR" :
 | |
| 
 | |
|                   $format_use = "Y-m-d H:i:s";
 | |
| 
 | |
|                   $hour      += $nb;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
|             }
 | |
| 
 | |
|             return date($format_use, mktime ($hour, $minute, $second, $month, $day, $year));
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $val;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display or return a list of dates in a vertical way
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array $options  array of possible options:
 | |
| 
 | |
|     *      - title, do we need to append an H2 title tag
 | |
| 
 | |
|     *      - dates, an array containing a collection of theses keys:
 | |
| 
 | |
|     *         * timestamp
 | |
| 
 | |
|     *         * class, supported: passed, checked, now
 | |
| 
 | |
|     *         * label
 | |
| 
 | |
|     *      - display, boolean to precise if we need to display (true) or return (false) the html
 | |
| 
 | |
|     *      - add_now, boolean to precise if we need to add to dates array, an entry for now time
 | |
| 
 | |
|     *        (with now class)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return array of posible values
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @see self::showGenericDateTimeSearch()
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showDatesTimelineGraph($options = []) {
 | |
| 
 | |
|       $default_options = [
 | |
| 
 | |
|          'title'   => '',
 | |
| 
 | |
|          'dates'   => [],
 | |
| 
 | |
|          'display' => true,
 | |
| 
 | |
|          'add_now' => true
 | |
| 
 | |
|       ];
 | |
| 
 | |
|       $options = array_merge($default_options, $options);
 | |
| 
 | |
| 
 | |
| 
 | |
|       //append now date if needed
 | |
| 
 | |
|       if ($options['add_now']) {
 | |
| 
 | |
|          $now = time();
 | |
| 
 | |
|          $options['dates'][$now."_now"] = [
 | |
| 
 | |
|             'timestamp' => $now,
 | |
| 
 | |
|             'label' => __('Now'),
 | |
| 
 | |
|             'class' => 'now'
 | |
| 
 | |
|          ];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       ksort($options['dates']);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = "";
 | |
| 
 | |
|       $out.= "<div class='dates_timelines'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // add title
 | |
| 
 | |
|       if (strlen($options['title'])) {
 | |
| 
 | |
|          $out.= "<h2 class='header'>".$options['title']."</h2>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // construct timeline
 | |
| 
 | |
|       $out.= "<ul>";
 | |
| 
 | |
|       foreach ($options['dates'] as $key => $data) {
 | |
| 
 | |
|          if ($data['timestamp'] != 0) {
 | |
| 
 | |
|             $out.= "<li class='".$data['class']."'> ";
 | |
| 
 | |
|             $out.= "<time>".Html::convDateTime(date("Y-m-d H:i:s", $data['timestamp']))."</time>";
 | |
| 
 | |
|             $out.= "<span class='dot'></span>";
 | |
| 
 | |
|             $out.= "<label>".$data['label']."</label>";
 | |
| 
 | |
|             $out.= "</li>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out.= "</ul>";
 | |
| 
 | |
|       $out.= "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($options['display']) {
 | |
| 
 | |
|          echo $out;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $out;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print the form used to select profile if several are available
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $target  target of the form
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showProfileSelecter($target) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (count($_SESSION["glpiprofiles"])>1) {
 | |
| 
 | |
|          echo '<li class="profile-selector"><form name="form" method="post" action="'.$target.'">';
 | |
| 
 | |
|          $values = [];
 | |
| 
 | |
|          foreach ($_SESSION["glpiprofiles"] as $key => $val) {
 | |
| 
 | |
|             $values[$key] = $val['name'];
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          Dropdown::showFromArray('newprofile', $values,
 | |
| 
 | |
|                                  ['value'     => $_SESSION["glpiactiveprofile"]["id"],
 | |
| 
 | |
|                                        'width'     => '150px',
 | |
| 
 | |
|                                        'on_change' => 'submit()']);
 | |
| 
 | |
|          Html::closeForm();
 | |
| 
 | |
|          echo '</li>';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (Session::isMultiEntitiesMode()) {
 | |
| 
 | |
|          echo "<li class='profile-selector'>";
 | |
| 
 | |
|          Ajax::createModalWindow('entity_window', $CFG_GLPI['root_doc']."/ajax/entitytree.php",
 | |
| 
 | |
|                                  ['title'       => __('Select the desired entity'),
 | |
| 
 | |
|                                        'extraparams' => ['target' => $target]]);
 | |
| 
 | |
|          echo "<a onclick='entity_window.dialog(\"open\");' href='#modal_entity_content' title=\"".
 | |
| 
 | |
|                 addslashes($_SESSION["glpiactive_entity_name"]).
 | |
| 
 | |
|                 "\" class='entity_select' id='global_entity_select'>".
 | |
| 
 | |
|                 $_SESSION["glpiactive_entity_shortname"]."</a>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "</li>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Show a tooltip on an item
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $content   string   data to put in the tooltip
 | |
| 
 | |
|     * @param $options   array    of possible options:
 | |
| 
 | |
|     *   - applyto : string / id of the item to apply tooltip (default empty).
 | |
| 
 | |
|     *                  If not set display an icon
 | |
| 
 | |
|     *   - title : string / title to display (default empty)
 | |
| 
 | |
|     *   - contentid : string / id for the content html container (default auto generated) (used for ajax)
 | |
| 
 | |
|     *   - link : string / link to put on displayed image if contentid is empty
 | |
| 
 | |
|     *   - linkid : string / html id to put to the link link (used for ajax)
 | |
| 
 | |
|     *   - linktarget : string / target for the link
 | |
| 
 | |
|     *   - popup : string / popup action : link not needed to use it
 | |
| 
 | |
|     *   - img : string / url of a specific img to use
 | |
| 
 | |
|     *   - display : boolean / display the item : false return the datas
 | |
| 
 | |
|     *   - autoclose : boolean / autoclose the item : default true (false permit to scroll)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void|string
 | |
| 
 | |
|     *    void if option display=true
 | |
| 
 | |
|     *    string if option display=false (HTML code)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showToolTip($content, $options = []) {
 | |
| 
 | |
|       $param['applyto']    = '';
 | |
| 
 | |
|       $param['title']      = '';
 | |
| 
 | |
|       $param['contentid']  = '';
 | |
| 
 | |
|       $param['link']       = '';
 | |
| 
 | |
|       $param['linkid']     = '';
 | |
| 
 | |
|       $param['linktarget'] = '';
 | |
| 
 | |
|       $param['awesome-class'] = 'fa-info';
 | |
| 
 | |
|       $param['popup']      = '';
 | |
| 
 | |
|       $param['ajax']       = '';
 | |
| 
 | |
|       $param['display']    = true;
 | |
| 
 | |
|       $param['autoclose']  = true;
 | |
| 
 | |
|       $param['onclick']    = false;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $param[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // No empty content to have a clean display
 | |
| 
 | |
|       if (empty($content)) {
 | |
| 
 | |
|          $content = " ";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $rand = mt_rand();
 | |
| 
 | |
|       $out  = '';
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Force link for popup
 | |
| 
 | |
|       if (!empty($param['popup'])) {
 | |
| 
 | |
|          $param['link'] = '#';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($param['applyto'])) {
 | |
| 
 | |
|          if (!empty($param['link'])) {
 | |
| 
 | |
|             $out .= "<a id='".(!empty($param['linkid'])?$param['linkid']:"tooltiplink$rand")."'";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (!empty($param['linktarget'])) {
 | |
| 
 | |
|                $out .= " target='".$param['linktarget']."' ";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $out .= " href='".$param['link']."'";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (!empty($param['popup'])) {
 | |
| 
 | |
|                $out .= " onClick=\"".Html::jsGetElementbyID('tooltippopup'.$rand).".dialog('open'); return false;\" ";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $out .= '>';
 | |
| 
 | |
|          }
 | |
| 
 | |
|          if (isset($param['img'])) {
 | |
| 
 | |
|             //for compatibility. Use fontawesome instead.
 | |
| 
 | |
|             $out .= "<img id='tooltip$rand' src='".$param['img']."' class='pointer'>";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $out .= "<span id='tooltip$rand' class='fas {$param['awesome-class']} pointer'></span>";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (!empty($param['link'])) {
 | |
| 
 | |
|             $out .= "</a>";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $param['applyto'] = "tooltip$rand";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($param['contentid'])) {
 | |
| 
 | |
|          $param['contentid'] = "content".$param['applyto'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= "<div id='".$param['contentid']."' class='invisible'>$content</div>";
 | |
| 
 | |
|       if (!empty($param['popup'])) {
 | |
| 
 | |
|          $out .= Ajax::createIframeModalWindow('tooltippopup'.$rand,
 | |
| 
 | |
|                                                $param['popup'],
 | |
| 
 | |
|                                                ['display' => false,
 | |
| 
 | |
|                                                      'width'   => 600,
 | |
| 
 | |
|                                                      'height'  => 300]);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $js = "$(function(){";
 | |
| 
 | |
|       $js .= Html::jsGetElementbyID($param['applyto']).".qtip({
 | |
| 
 | |
|          position: { viewport: $(window) },
 | |
| 
 | |
|          content: {text: ".Html::jsGetElementbyID($param['contentid']);
 | |
| 
 | |
|       if (!$param['autoclose']) {
 | |
| 
 | |
|          $js .=", title: {text: ' ',button: true}";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $js .= "}, style: { classes: 'qtip-shadow qtip-bootstrap'}";
 | |
| 
 | |
|       if ($param['onclick']) {
 | |
| 
 | |
|          $js .= ",show: 'click', hide: false,";
 | |
| 
 | |
|       } else if (!$param['autoclose']) {
 | |
| 
 | |
|          $js .= ",show: {
 | |
| 
 | |
|                         solo: true, // ...and hide all other tooltips...
 | |
| 
 | |
|                 }, hide: false,";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $js .= "});";
 | |
| 
 | |
|       $js .= "});";
 | |
| 
 | |
|       $out .= Html::scriptBlock($js);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($param['display']) {
 | |
| 
 | |
|          echo $out;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $out;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|     /**
 | |
| 
 | |
|     * Show div with auto completion
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param CommonDBTM $item    item object used for create dropdown
 | |
| 
 | |
|     * @param string     $field   field to search for autocompletion
 | |
| 
 | |
|     * @param array      $options array of possible options:
 | |
| 
 | |
|     *    - name    : string / name of the select (default is field parameter)
 | |
| 
 | |
|     *    - value   : integer / preselected value (default value of the item object)
 | |
| 
 | |
|     *    - size    : integer / size of the text field
 | |
| 
 | |
|     *    - entity  : integer / restrict to a defined entity (default entity of the object if define)
 | |
| 
 | |
|     *                set to -1 not to take into account
 | |
| 
 | |
|     *    - user    : integer / restrict to a defined user (default -1 : no restriction)
 | |
| 
 | |
|     *    - option  : string / options to add to text field
 | |
| 
 | |
|     *    - display : boolean / if false get string
 | |
| 
 | |
|     *    - type    : string / html5 field type (number, date, text, ...) defaults to 'text'
 | |
| 
 | |
|     *    - required: boolean / whether the field is required
 | |
| 
 | |
|     *    - rand    : integer / pre-exsting random value
 | |
| 
 | |
|     *    - attrs   : array of attributes to add (['name' => 'value']
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void|string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function autocompletionTextField(CommonDBTM $item, $field, $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $params['name']   = $field;
 | |
| 
 | |
|       $params['value']  = '';
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (array_key_exists($field, $item->fields)) {
 | |
| 
 | |
|          $params['value'] = $item->fields[$field];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $params['entity'] = -1;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (array_key_exists('entities_id', $item->fields)) {
 | |
| 
 | |
|          $params['entity'] = $item->fields['entities_id'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $params['user']   = -1;
 | |
| 
 | |
|       $params['option'] = '';
 | |
| 
 | |
|       $params['type']   = 'text';
 | |
| 
 | |
|       $params['required']  = false;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $params[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $rand = (isset($params['rand']) ? $params['rand'] : mt_rand());
 | |
| 
 | |
|       $name    = "field_".$params['name'].$rand;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Check if field is allowed
 | |
| 
 | |
|       $field_so = $item->getSearchOptionByField('field', $field, $item->getTable());
 | |
| 
 | |
|       $can_autocomplete = array_key_exists('autocomplete', $field_so) && $field_so['autocomplete'];
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output = '';
 | |
| 
 | |
|       if ($can_autocomplete && $CFG_GLPI["use_ajax_autocompletion"]) {
 | |
| 
 | |
|          $output .=  "<input ".$params['option']." id='text$name' type='{$params['type']}' name='".
 | |
| 
 | |
|                        $params['name']."' value=\"".self::cleanInputText($params['value'])."\"
 | |
| 
 | |
|                        class='autocompletion-text-field'";
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ($params['required'] == true) {
 | |
| 
 | |
|             $output .= " required='required'";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (isset($params['attrs'])) {
 | |
| 
 | |
|             foreach ($params['attrs'] as $attr => $value) {
 | |
| 
 | |
|                $output .= " $attr='$value'";
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $output .= ">";
 | |
| 
 | |
| 
 | |
| 
 | |
|          $parameters['itemtype'] = $item->getType();
 | |
| 
 | |
|          $parameters['field']    = $field;
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ($params['entity'] >= 0) {
 | |
| 
 | |
|             $parameters['entity_restrict']    = $params['entity'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|          if ($params['user'] >= 0) {
 | |
| 
 | |
|             $parameters['user_restrict']    = $params['user'];
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $js = "  $( '#text$name' ).autocomplete({
 | |
| 
 | |
|                         source: '".$CFG_GLPI["root_doc"]."/ajax/autocompletion.php?".Toolbox::append_params($parameters, '&')."',
 | |
| 
 | |
|                         minLength: 3,
 | |
| 
 | |
|                         });";
 | |
| 
 | |
| 
 | |
| 
 | |
|          $output .= Html::scriptBlock($js);
 | |
| 
 | |
| 
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $output .=  "<input ".$params['option']." type='text' id='text$name' name='".$params['name']."'
 | |
| 
 | |
|                 value=\"".self::cleanInputText($params['value'])."\">\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!isset($options['display']) || $options['display']) {
 | |
| 
 | |
|          echo $output;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $output;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Init the Editor System to a textarea
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $name      name of the html textarea to use
 | |
| 
 | |
|     * @param string  $rand      rand of the html textarea to use (if empty no image paste system)(default '')
 | |
| 
 | |
|     * @param boolean $display   display or get js script (true by default)
 | |
| 
 | |
|     * @param boolean $readonly  editor will be readonly or not
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void|string
 | |
| 
 | |
|     *    integer if param display=true
 | |
| 
 | |
|     *    string if param display=false (HTML code)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function initEditorSystem($name, $rand = '', $display = true, $readonly = false) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // load tinymce lib
 | |
| 
 | |
|       Html::requireJs('tinymce');
 | |
| 
 | |
| 
 | |
| 
 | |
|       $language = $_SESSION['glpilanguage'];
 | |
| 
 | |
|       if (!file_exists(GLPI_ROOT."/public/lib/tinymce-i18n/langs/$language.js")) {
 | |
| 
 | |
|          $language = $CFG_GLPI["languages"][$_SESSION['glpilanguage']][2];
 | |
| 
 | |
|          if (!file_exists(GLPI_ROOT."/public/lib/tinymce-i18n/langs/$language.js")) {
 | |
| 
 | |
|             $language = "en_GB";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $language_url = $CFG_GLPI['root_doc'] . '/public/lib/tinymce-i18n/langs/' . $language . '.js';
 | |
| 
 | |
| 
 | |
| 
 | |
|       $readonlyjs = "readonly: false";
 | |
| 
 | |
|       if ($readonly) {
 | |
| 
 | |
|          $readonlyjs = "readonly: true";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $darker_css = '';
 | |
| 
 | |
|       if ($_SESSION['glpipalette'] === 'darker') {
 | |
| 
 | |
|          $darker_css = $CFG_GLPI['root_doc']."/css/tiny_mce/dark_content.css";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // init tinymce
 | |
| 
 | |
|       $js = "$(function() {
 | |
| 
 | |
|          // init editor
 | |
| 
 | |
|          tinyMCE.init({
 | |
| 
 | |
|             language_url: '$language_url',
 | |
| 
 | |
|             invalid_elements: 'form,iframe,script,@[onclick|ondblclick|'
 | |
| 
 | |
|                + 'onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|'
 | |
| 
 | |
|                + 'onkeydown|onkeyup]',
 | |
| 
 | |
|             browser_spellcheck: true,
 | |
| 
 | |
|             mode: 'exact',
 | |
| 
 | |
|             elements: '$name',
 | |
| 
 | |
|             relative_urls: false,
 | |
| 
 | |
|             remove_script_host: false,
 | |
| 
 | |
|             content_css: '$darker_css',
 | |
| 
 | |
|             entity_encoding: 'raw',
 | |
| 
 | |
|             paste_data_images: $('.fileupload').length,
 | |
| 
 | |
|             menubar: false,
 | |
| 
 | |
|             statusbar: false,
 | |
| 
 | |
|             skin_url: '".$CFG_GLPI['root_doc']."/css/tiny_mce/skins/light',
 | |
| 
 | |
|             content_css: '".$CFG_GLPI['root_doc']."/css/tiny_mce_custom.css',
 | |
| 
 | |
|             cache_suffix: '?v=".GLPI_VERSION."',
 | |
| 
 | |
|             setup: function(editor) {
 | |
| 
 | |
|                if ($('#$name').attr('required') == 'required') {
 | |
| 
 | |
|                   $('#$name').closest('form').find('input[type=submit]').click(function() {
 | |
| 
 | |
|                      editor.save();
 | |
| 
 | |
|                      if ($('#$name').val() == '') {
 | |
| 
 | |
|                         alert('".__s('The description field is mandatory')."');
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
|                   editor.on('keyup', function (e) {
 | |
| 
 | |
|                      editor.save();
 | |
| 
 | |
|                      if ($('#$name').val() == '') {
 | |
| 
 | |
|                         $('.mce-edit-area').addClass('required');
 | |
| 
 | |
|                      } else {
 | |
| 
 | |
|                         $('.mce-edit-area').removeClass('required');
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
|                   editor.on('init', function (e) {
 | |
| 
 | |
|                      if ($('#$name').val() == '') {
 | |
| 
 | |
|                         $('.mce-edit-area').addClass('required');
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
|                }
 | |
| 
 | |
|                editor.on('SaveContent', function (contentEvent) {
 | |
| 
 | |
|                   contentEvent.content = contentEvent.content.replace(/\\r?\\n/g, '');
 | |
| 
 | |
|                });
 | |
| 
 | |
|                editor.on('Change', function (e) {
 | |
| 
 | |
|                   // Nothing fancy here. Since this is only used for tracking unsaved changes,
 | |
| 
 | |
|                   // we want to keep the logic in common.js with the other form input events.
 | |
| 
 | |
|                   onTinyMCEChange(e);
 | |
| 
 | |
|                });
 | |
| 
 | |
| 
 | |
| 
 | |
|                // ctrl + enter submit the parent form
 | |
| 
 | |
|                editor.addShortcut('ctrl+13', 'submit', function() {
 | |
| 
 | |
|                   editor.save();
 | |
| 
 | |
|                   submitparentForm($('#$name'));
 | |
| 
 | |
|                });
 | |
| 
 | |
|             },
 | |
| 
 | |
|             plugins: [
 | |
| 
 | |
|                'table directionality searchreplace',
 | |
| 
 | |
|                'tabfocus autoresize link image paste',
 | |
| 
 | |
|                'code fullscreen stickytoolbar',
 | |
| 
 | |
|                'textcolor colorpicker',
 | |
| 
 | |
|                // load glpi_upload_doc specific plugin if we need to upload files
 | |
| 
 | |
|                typeof tinymce.AddOnManager.PluginManager.lookup.glpi_upload_doc != 'undefined'
 | |
| 
 | |
|                   ? 'glpi_upload_doc'
 | |
| 
 | |
|                   : '',
 | |
| 
 | |
|                'lists'
 | |
| 
 | |
|             ],
 | |
| 
 | |
|             toolbar: 'styleselect | bold italic | forecolor backcolor | bullist numlist outdent indent | table link image | code fullscreen',
 | |
| 
 | |
|             $readonlyjs
 | |
| 
 | |
|          });
 | |
| 
 | |
| 
 | |
| 
 | |
|          // set sticky for split view
 | |
| 
 | |
|          $('.layout_vsplit .main_form, .layout_vsplit .ui-tabs-panel').scroll(function(event) {
 | |
| 
 | |
|             var editor = tinyMCE.get('$name');
 | |
| 
 | |
|             editor.settings.sticky_offset = $(event.target).offset().top;
 | |
| 
 | |
|             editor.setSticky();
 | |
| 
 | |
|          });
 | |
| 
 | |
|       });";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($display) {
 | |
| 
 | |
|          echo  Html::scriptBlock($js);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return  Html::scriptBlock($js);
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Convert rich text content to simple text content
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $content : content to convert in html
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return $content
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function setSimpleTextContent($content) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $content = Html::entity_decode_deep($content);
 | |
| 
 | |
|       $content = Toolbox::convertImageToTag($content);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // If is html content
 | |
| 
 | |
|       if ($content != strip_tags($content)) {
 | |
| 
 | |
|          $content = Toolbox::getHtmlToDisplay($content);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $content;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Convert simple text content to rich text content and init html editor
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $name     name of textarea
 | |
| 
 | |
|     * @param string  $content  content to convert in html
 | |
| 
 | |
|     * @param string  $rand     used for randomize tinymce dom id
 | |
| 
 | |
|     * @param boolean $readonly true will set editor in readonly mode
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return $content
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function setRichTextContent($name, $content, $rand, $readonly = false) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Init html editor (if name of textarea is provided)
 | |
| 
 | |
|       if (!empty($name)) {
 | |
| 
 | |
|          Html::initEditorSystem($name, $rand, true, $readonly);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Neutralize non valid HTML tags
 | |
| 
 | |
|       $content = Html::clean($content, false, 1);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // If content does not contain <br> or <p> html tag, use nl2br
 | |
| 
 | |
|       if (!preg_match("/<br\s?\/?>/", $content) && !preg_match("/<p>/", $content)) {
 | |
| 
 | |
|          $content = nl2br($content);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $content;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print Ajax pager for list in tab panel
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $title              displayed above
 | |
| 
 | |
|     * @param integer $start              from witch item we start
 | |
| 
 | |
|     * @param integer $numrows            total items
 | |
| 
 | |
|     * @param string  $additional_info    Additional information to display (default '')
 | |
| 
 | |
|     * @param boolean $display            display if true, return the pager if false
 | |
| 
 | |
|     * @param string  $additional_params  Additional parameters to pass to tab reload request (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void|string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function printAjaxPager($title, $start, $numrows, $additional_info = '', $display = true, $additional_params = '') {
 | |
| 
 | |
|       $list_limit = $_SESSION['glpilist_limit'];
 | |
| 
 | |
|       // Forward is the next step forward
 | |
| 
 | |
|       $forward = $start+$list_limit;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // This is the end, my friend
 | |
| 
 | |
|       $end = $numrows-$list_limit;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Human readable count starts here
 | |
| 
 | |
|       $current_start = $start+1;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // And the human is viewing from start to end
 | |
| 
 | |
|       $current_end = $current_start+$list_limit-1;
 | |
| 
 | |
|       if ($current_end > $numrows) {
 | |
| 
 | |
|          $current_end = $numrows;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Empty case
 | |
| 
 | |
|       if ($current_end == 0) {
 | |
| 
 | |
|          $current_start = 0;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Backward browsing
 | |
| 
 | |
|       if ($current_start-$list_limit <= 0) {
 | |
| 
 | |
|          $back = 0;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $back = $start-$list_limit;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($additional_params) && strpos($additional_params, '&') !== 0) {
 | |
| 
 | |
|          $additional_params = '&' . $additional_params;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = '';
 | |
| 
 | |
|       // Print it
 | |
| 
 | |
|       $out .= "<div><table class='tab_cadre_pager'>";
 | |
| 
 | |
|       if (!empty($title)) {
 | |
| 
 | |
|          $out .= "<tr><th colspan='6'>$title</th></tr>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= "<tr>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Back and fast backward button
 | |
| 
 | |
|       if (!$start == 0) {
 | |
| 
 | |
|          $out .= "<th class='left'><a href='javascript:reloadTab(\"start=0$additional_params\");'>
 | |
| 
 | |
|                      <i class='fa fa-step-backward' title=\"".__s('Start')."\"></i></a></th>";
 | |
| 
 | |
|          $out .= "<th class='left'><a href='javascript:reloadTab(\"start=$back$additional_params\");'>
 | |
| 
 | |
|                      <i class='fa fa-chevron-left' title=\"".__s('Previous')."\"></i></a></th>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= "<td width='50%' class='tab_bg_2'>";
 | |
| 
 | |
|       $out .= self::printPagerForm('', false, $additional_params);
 | |
| 
 | |
|       $out .= "</td>";
 | |
| 
 | |
|       if (!empty($additional_info)) {
 | |
| 
 | |
|          $out .= "<td class='tab_bg_2'>";
 | |
| 
 | |
|          $out .= $additional_info;
 | |
| 
 | |
|          $out .= "</td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Print the "where am I?"
 | |
| 
 | |
|       $out .= "<td width='50%' class='tab_bg_2 b'>";
 | |
| 
 | |
|       //TRANS: %1$d, %2$d, %3$d are page numbers
 | |
| 
 | |
|       $out .= sprintf(__('From %1$d to %2$d of %3$d'), $current_start, $current_end, $numrows);
 | |
| 
 | |
|       $out .= "</td>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Forward and fast forward button
 | |
| 
 | |
|       if ($forward < $numrows) {
 | |
| 
 | |
|          $out .= "<th class='right'><a href='javascript:reloadTab(\"start=$forward$additional_params\");'>
 | |
| 
 | |
|                      <i class='fa fa-chevron-right' title=\"".__s('Next')."\"></i></a></th>";
 | |
| 
 | |
|          $out .= "<th class='right'><a href='javascript:reloadTab(\"start=$end$additional_params\");'>
 | |
| 
 | |
|                      <i class='fa fa-step-forward' title=\"".__s('End')."\"></i></a></th>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // End pager
 | |
| 
 | |
|       $out .= "</tr></table></div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($display) {
 | |
| 
 | |
|          echo $out;
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Clean Printing of and array in a table
 | |
| 
 | |
|     * ONLY FOR DEBUG
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array   $tab       the array to display
 | |
| 
 | |
|     * @param integer $pad       Pad used
 | |
| 
 | |
|     * @param boolean $jsexpand  Expand using JS ?
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function printCleanArray($tab, $pad = 0, $jsexpand = false) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (count($tab)) {
 | |
| 
 | |
|          echo "<table class='tab_cadre'>";
 | |
| 
 | |
|          // For debug / no gettext
 | |
| 
 | |
|          echo "<tr><th>KEY</th><th>=></th><th>VALUE</th></tr>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($tab as $key => $val) {
 | |
| 
 | |
|             $key = Toolbox::clean_cross_side_scripting_deep($key);
 | |
| 
 | |
|             echo "<tr class='tab_bg_1'><td class='top right'>";
 | |
| 
 | |
|             echo $key;
 | |
| 
 | |
|             $is_array = is_array($val);
 | |
| 
 | |
|             $rand     = mt_rand();
 | |
| 
 | |
|             echo "</td><td class='top'>";
 | |
| 
 | |
|             if ($jsexpand && $is_array) {
 | |
| 
 | |
|                echo "<a class='pointer' href=\"javascript:showHideDiv('content$key$rand','','','')\">";
 | |
| 
 | |
|                echo "=></a>";
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                echo "=>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</td><td class='top tab_bg_1'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if ($is_array) {
 | |
| 
 | |
|                echo "<div id='content$key$rand' ".($jsexpand?"style=\"display:none;\"":'').">";
 | |
| 
 | |
|                self::printCleanArray($val, $pad+1);
 | |
| 
 | |
|                echo "</div>";
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                if (is_bool($val)) {
 | |
| 
 | |
|                   if ($val) {
 | |
| 
 | |
|                      echo 'true';
 | |
| 
 | |
|                   } else {
 | |
| 
 | |
|                      echo 'false';
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                } else {
 | |
| 
 | |
|                   if (is_object($val)) {
 | |
| 
 | |
|                      if (method_exists($val, '__toString')) {
 | |
| 
 | |
|                         echo (string) $val;
 | |
| 
 | |
|                      } else {
 | |
| 
 | |
|                         echo "(object) " . get_class($val);
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   } else {
 | |
| 
 | |
|                      echo htmlentities($val);
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</td></tr>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "</table>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo __('Empty array');
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Print pager for search option (first/previous/next/last)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param integer        $start                   from witch item we start
 | |
| 
 | |
|     * @param integer        $numrows                 total items
 | |
| 
 | |
|     * @param string         $target                  page would be open when click on the option (last,previous etc)
 | |
| 
 | |
|     * @param string         $parameters              parameters would be passed on the URL.
 | |
| 
 | |
|     * @param integer|string $item_type_output        item type display - if >0 display export PDF et Sylk form
 | |
| 
 | |
|     * @param integer|string $item_type_output_param  item type parameter for export
 | |
| 
 | |
|     * @param string         $additional_info         Additional information to display (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     *
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function printPager($start, $numrows, $target, $parameters, $item_type_output = 0,
 | |
| 
 | |
|                               $item_type_output_param = 0, $additional_info = '') {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $list_limit = $_SESSION['glpilist_limit'];
 | |
| 
 | |
|       // Forward is the next step forward
 | |
| 
 | |
|       $forward = $start+$list_limit;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // This is the end, my friend
 | |
| 
 | |
|       $end = $numrows-$list_limit;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Human readable count starts here
 | |
| 
 | |
| 
 | |
| 
 | |
|       $current_start = $start+1;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // And the human is viewing from start to end
 | |
| 
 | |
|       $current_end = $current_start+$list_limit-1;
 | |
| 
 | |
|       if ($current_end > $numrows) {
 | |
| 
 | |
|          $current_end = $numrows;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Empty case
 | |
| 
 | |
|       if ($current_end == 0) {
 | |
| 
 | |
|          $current_start = 0;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Backward browsing
 | |
| 
 | |
|       if ($current_start-$list_limit <= 0) {
 | |
| 
 | |
|          $back = 0;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $back = $start-$list_limit;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print it
 | |
| 
 | |
|       echo "<div><table class='tab_cadre_pager'>";
 | |
| 
 | |
|       echo "<tr>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (strpos($target, '?') == false) {
 | |
| 
 | |
|          $fulltarget = $target."?".$parameters;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $fulltarget = $target."&".$parameters;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Back and fast backward button
 | |
| 
 | |
|       if (!$start == 0) {
 | |
| 
 | |
|          echo "<th class='left'>";
 | |
| 
 | |
|          echo "<a href='$fulltarget&start=0'>";
 | |
| 
 | |
|          echo "
 | |
| 
 | |
|                <i class='fa fa-step-backward' title=\"".__s('Start')."\"></i>";
 | |
| 
 | |
|          echo "</a></th>";
 | |
| 
 | |
|          echo "<th class='left'>";
 | |
| 
 | |
|          echo "<a href='$fulltarget&start=$back'>";
 | |
| 
 | |
|          echo "<i class='fa fa-chevron-left' title=\"".__s('Previous')."\"></i>";
 | |
| 
 | |
|          echo "</a></th>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Print the "where am I?"
 | |
| 
 | |
|       echo "<td width='31%' class='tab_bg_2'>";
 | |
| 
 | |
|       self::printPagerForm("$fulltarget&start=$start");
 | |
| 
 | |
|       echo "</td>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($additional_info)) {
 | |
| 
 | |
|          echo "<td class='tab_bg_2'>";
 | |
| 
 | |
|          echo $additional_info;
 | |
| 
 | |
|          echo "</td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($item_type_output)
 | |
| 
 | |
|           && isset($_SESSION["glpiactiveprofile"])
 | |
| 
 | |
|           && (Session::getCurrentInterface() == "central")) {
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "<td class='tab_bg_2 responsive_hidden' width='30%'>";
 | |
| 
 | |
|          echo "<form method='GET' action='".$CFG_GLPI["root_doc"]."/front/report.dynamic.php'>";
 | |
| 
 | |
|          echo Html::hidden('item_type', ['value' => $item_type_output]);
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ($item_type_output_param != 0) {
 | |
| 
 | |
|             echo Html::hidden('item_type_param',
 | |
| 
 | |
|                               ['value' => Toolbox::prepareArrayForInput($item_type_output_param)]);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $parameters = trim($parameters, '&');
 | |
| 
 | |
|          if (strstr($parameters, 'start') === false) {
 | |
| 
 | |
|             $parameters .= "&start=$start";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $split = explode("&", $parameters);
 | |
| 
 | |
| 
 | |
| 
 | |
|          $count_split = count($split);
 | |
| 
 | |
|          for ($i=0; $i < $count_split; $i++) {
 | |
| 
 | |
|             $pos    = Toolbox::strpos($split[$i], '=');
 | |
| 
 | |
|             $length = Toolbox::strlen($split[$i]);
 | |
| 
 | |
|             echo Html::hidden(Toolbox::substr($split[$i], 0, $pos), ['value' => urldecode(Toolbox::substr($split[$i], $pos+1))]);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          Dropdown::showOutputFormat();
 | |
| 
 | |
|          Html::closeForm();
 | |
| 
 | |
|          echo "</td>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<td width='20%' class='tab_bg_2 b'>";
 | |
| 
 | |
|       //TRANS: %1$d, %2$d, %3$d are page numbers
 | |
| 
 | |
|       printf(__('From %1$d to %2$d of %3$d'), $current_start, $current_end, $numrows);
 | |
| 
 | |
|       echo "</td>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Forward and fast forward button
 | |
| 
 | |
|       if ($forward<$numrows) {
 | |
| 
 | |
|          echo "<th class='right'>";
 | |
| 
 | |
|          echo "<a href='$fulltarget&start=$forward'>
 | |
| 
 | |
|                <i class='fa fa-chevron-right' title=\"".__s('Next')."\">";
 | |
| 
 | |
|          echo "</a></th>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "<th class='right'>";
 | |
| 
 | |
|          echo "<a href='$fulltarget&start=$end'>";
 | |
| 
 | |
|          echo "<i class='fa fa-step-forward' title=\"".__s('End')."\"></i>";
 | |
| 
 | |
|          echo "</a></th>\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // End pager
 | |
| 
 | |
|       echo "</tr></table></div>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display the list_limit combo choice
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $action             page would be posted when change the value (URL + param) (default '')
 | |
| 
 | |
|     * @param boolean $display            display the pager form if true, return it if false
 | |
| 
 | |
|     * @param string  $additional_params  Additional parameters to pass to tab reload request (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * ajax Pager will be displayed if empty
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void|string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function printPagerForm($action = "", $display = true, $additional_params = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($additional_params) && strpos($additional_params, '&') !== 0) {
 | |
| 
 | |
|          $additional_params = '&' . $additional_params;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = '';
 | |
| 
 | |
|       if ($action) {
 | |
| 
 | |
|          $out .= "<form method='POST' action=\"$action\">";
 | |
| 
 | |
|          $out .= "<span class='responsive_hidden'>".__('Display (number of items)')."</span> ";
 | |
| 
 | |
|          $out .= Dropdown::showListLimit("submit()", false);
 | |
| 
 | |
| 
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $out .= "<form method='POST' action =''>\n";
 | |
| 
 | |
|          $out .= "<span class='responsive_hidden'>".__('Display (number of items)')."</span> ";
 | |
| 
 | |
|          $out .= Dropdown::showListLimit("reloadTab(\"glpilist_limit=\"+this.value+\"$additional_params\")", false);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= Html::closeForm(false);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($display) {
 | |
| 
 | |
|          echo $out;
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Create a title for list, as  "List (5 on 35)"
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $string String  text for title
 | |
| 
 | |
|     * @param $num    Integer number of item displayed
 | |
| 
 | |
|     * @param $tot    Integer number of item existing
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.83.1
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|     **/
 | |
| 
 | |
|    static function makeTitle ($string, $num, $tot) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (($num > 0) && ($num < $tot)) {
 | |
| 
 | |
|          // TRANS %1$d %2$d are numbers (displayed, total)
 | |
| 
 | |
|          $cpt = "<span class='primary-bg primary-fg count'>" .
 | |
| 
 | |
|             sprintf(__('%1$d on %2$d'), $num, $tot) . "</span>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          // $num is 0, so means configured to display nothing
 | |
| 
 | |
|          // or $num == $tot
 | |
| 
 | |
|          $cpt = "<span class='primary-bg primary-fg count'>$tot</span>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return sprintf(__('%1$s %2$s'), $string, $cpt);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * create a minimal form for simple action
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $action   String   URL to call on submit
 | |
| 
 | |
|     * @param $btname   String   button name (maybe if name <> value)
 | |
| 
 | |
|     * @param $btlabel  String   button label
 | |
| 
 | |
|     * @param $fields   Array    field name => field  value
 | |
| 
 | |
|     * @param $btimage  String   button image uri (optional)   (default '')
 | |
| 
 | |
|     *                           If image name starts with "fa-", il will be turned into
 | |
| 
 | |
|     *                           a font awesome element rather than an image.
 | |
| 
 | |
|     * @param $btoption String   optional button option        (default '')
 | |
| 
 | |
|     * @param $confirm  String   optional confirm message      (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.84
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function getSimpleForm($action, $btname, $btlabel, Array $fields = [], $btimage = '',
 | |
| 
 | |
|                                  $btoption = '', $confirm = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (GLPI_USE_CSRF_CHECK) {
 | |
| 
 | |
|          $fields['_glpi_csrf_token'] = Session::getNewCSRFToken();
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $fields['_glpi_simple_form'] = 1;
 | |
| 
 | |
|       $button                      = $btname;
 | |
| 
 | |
|       if (!is_array($btname)) {
 | |
| 
 | |
|          $button          = [];
 | |
| 
 | |
|          $button[$btname] = $btname;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $fields          = array_merge($button, $fields);
 | |
| 
 | |
|       $javascriptArray = [];
 | |
| 
 | |
|       foreach ($fields as $name => $value) {
 | |
| 
 | |
|          /// TODO : trouble :  urlencode not available for array / do not pass array fields...
 | |
| 
 | |
|          if (!is_array($value)) {
 | |
| 
 | |
|             // Javascript no gettext
 | |
| 
 | |
|             $javascriptArray[] = "'$name': '".urlencode($value)."'";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $link = "<a ";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($btoption)) {
 | |
| 
 | |
|          $link .= ' '.$btoption.' ';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Do not force class if already defined
 | |
| 
 | |
|       if (!strstr($btoption, 'class=')) {
 | |
| 
 | |
|          if (empty($btimage)) {
 | |
| 
 | |
|             $link .= " class='vsubmit' ";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $link .= " class='pointer' ";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $btlabel = htmlentities($btlabel, ENT_QUOTES, 'UTF-8');
 | |
| 
 | |
|       $action  = " submitGetLink('$action', {" .implode(', ', $javascriptArray) ."});";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($confirm) || strlen($confirm)) {
 | |
| 
 | |
|          $link .= self::addConfirmationOnAction($confirm, $action);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $link .= " onclick=\"$action\" ";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $link .= '>';
 | |
| 
 | |
|       if (empty($btimage)) {
 | |
| 
 | |
|          $link .= $btlabel;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          if (substr($btimage, 0, strlen('fa-')) === 'fa-') {
 | |
| 
 | |
|             $link .= "<span class='fa $btimage' title='$btlabel'><span class='sr-only'>$btlabel</span>";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $link .= "<img src='$btimage' title='$btlabel' alt='$btlabel' class='pointer'>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $link .="</a>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $link;
 | |
| 
 | |
| 
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * create a minimal form for simple action
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $action   String   URL to call on submit
 | |
| 
 | |
|     * @param $btname   String   button name
 | |
| 
 | |
|     * @param $btlabel  String   button label
 | |
| 
 | |
|     * @param $fields   Array    field name => field  value
 | |
| 
 | |
|     * @param $btimage  String   button image uri (optional) (default '')
 | |
| 
 | |
|     * @param $btoption String   optional button option (default '')
 | |
| 
 | |
|     * @param $confirm  String   optional confirm message (default '')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.83.3
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showSimpleForm($action, $btname, $btlabel, Array $fields = [], $btimage = '',
 | |
| 
 | |
|                                   $btoption = '', $confirm = '') {
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo self::getSimpleForm($action, $btname, $btlabel, $fields, $btimage, $btoption, $confirm);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Create a close form part including CSRF token
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $display boolean Display or return string (default true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.83.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function closeForm ($display = true) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = "\n";
 | |
| 
 | |
|       if (GLPI_USE_CSRF_CHECK) {
 | |
| 
 | |
|          $out .= Html::hidden('_glpi_csrf_token', ['value' => Session::getNewCSRFToken()])."\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($CFG_GLPI['checkbox-zero-on-empty']) && $CFG_GLPI['checkbox-zero-on-empty']) {
 | |
| 
 | |
|          $js = "   $('form').submit(function() {
 | |
| 
 | |
|          $('input[type=\"checkbox\"][data-glpicore-cb-zero-on-empty=\"1\"]:not(:checked)').each(function(index){
 | |
| 
 | |
|             // If the checkbox is not validated, we add a hidden field with '0' as value
 | |
| 
 | |
|             if ($(this).attr('name')) {
 | |
| 
 | |
|                $('<input>').attr({
 | |
| 
 | |
|                   type: 'hidden',
 | |
| 
 | |
|                   name: $(this).attr('name'),
 | |
| 
 | |
|                   value: '0'
 | |
| 
 | |
|                }).insertAfter($(this));
 | |
| 
 | |
|             }
 | |
| 
 | |
|          });
 | |
| 
 | |
|       });";
 | |
| 
 | |
|          $out .= Html::scriptBlock($js)."\n";
 | |
| 
 | |
|          unset($CFG_GLPI['checkbox-zero-on-empty']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= "</form>\n";
 | |
| 
 | |
|       if ($display) {
 | |
| 
 | |
|          echo $out;
 | |
| 
 | |
|          return true;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get javascript code for hide an item
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id string id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsHide($id) {
 | |
| 
 | |
|       return self::jsGetElementbyID($id).".hide();\n";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get javascript code for hide an item
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id string id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsShow($id) {
 | |
| 
 | |
|       return self::jsGetElementbyID($id).".show();\n";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get javascript code for enable an item
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id string id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     * @deprecated 9.5.0
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsEnable($id) {
 | |
| 
 | |
|       return self::jsGetElementbyID($id).".removeAttr('disabled');\n";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get javascript code for disable an item
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id string id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     * @deprecated 9.5.0
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsDisable($id) {
 | |
| 
 | |
|       return self::jsGetElementbyID($id).".attr('disabled', 'disabled');\n";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Clean ID used for HTML elements
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id string id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function cleanId($id) {
 | |
| 
 | |
|       return str_replace(['[',']'], '_', $id);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get javascript code to get item by id
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id string id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsGetElementbyID($id) {
 | |
| 
 | |
|       return "$('#$id')";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Set dropdown value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id      string   id of the dom element
 | |
| 
 | |
|     * @param $value   string   value to set
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsSetDropdownValue($id, $value) {
 | |
| 
 | |
|       return self::jsGetElementbyID($id).".trigger('setValue', '$value');";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get item value
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id      string   id of the dom element
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsGetDropdownValue($id) {
 | |
| 
 | |
|       return self::jsGetElementbyID($id).".val()";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Adapt dropdown to clean JS
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $id       string   id of the dom element
 | |
| 
 | |
|     * @param $params   array    of parameters
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsAdaptDropdown($id, $params = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $width = '';
 | |
| 
 | |
|       if (isset($params["width"]) && !empty($params["width"])) {
 | |
| 
 | |
|          $width = $params["width"];
 | |
| 
 | |
|          unset($params["width"]);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $placeholder = '';
 | |
| 
 | |
|       if (isset($params["placeholder"])) {
 | |
| 
 | |
|          $placeholder = "placeholder: ".json_encode($params["placeholder"]).",";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $js = "$(function() {
 | |
| 
 | |
|          $('#$id').select2({
 | |
| 
 | |
|             $placeholder
 | |
| 
 | |
|             width: '$width',
 | |
| 
 | |
|             dropdownAutoWidth: true,
 | |
| 
 | |
|             quietMillis: 100,
 | |
| 
 | |
|             minimumResultsForSearch: ".$CFG_GLPI['ajax_limit_count'].",
 | |
| 
 | |
|             matcher: function(params, data) {
 | |
| 
 | |
|                // store last search in the global var
 | |
| 
 | |
|                query = params;
 | |
| 
 | |
| 
 | |
| 
 | |
|                // If there are no search terms, return all of the data
 | |
| 
 | |
|                if ($.trim(params.term) === '') {
 | |
| 
 | |
|                   return data;
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                var searched_term = getTextWithoutDiacriticalMarks(params.term);
 | |
| 
 | |
|                var data_text = typeof(data.text) === 'string'
 | |
| 
 | |
|                   ? getTextWithoutDiacriticalMarks(data.text)
 | |
| 
 | |
|                   : '';
 | |
| 
 | |
|                var select2_fuzzy_opts = {
 | |
| 
 | |
|                   pre: '<span class=\"select2-rendered__match\">',
 | |
| 
 | |
|                   post: '</span>',
 | |
| 
 | |
|                };
 | |
| 
 | |
| 
 | |
| 
 | |
|                if (data_text.indexOf('>') !== -1 || data_text.indexOf('<') !== -1) {
 | |
| 
 | |
|                   // escape text, if it contains chevrons (can already be escaped prior to this point :/)
 | |
| 
 | |
|                   data_text = jQuery.fn.select2.defaults.defaults.escapeMarkup(data_text);
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                // Skip if there is no 'children' property
 | |
| 
 | |
|                if (typeof data.children === 'undefined') {
 | |
| 
 | |
|                   var match  = fuzzy.match(searched_term, data_text, select2_fuzzy_opts);
 | |
| 
 | |
|                   if (match == null) {
 | |
| 
 | |
|                      return false;
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                   data.rendered_text = match.rendered_text;
 | |
| 
 | |
|                   data.score = match.score;
 | |
| 
 | |
|                   return data;
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                // `data.children` contains the actual options that we are matching against
 | |
| 
 | |
|                // also check in `data.text` (optgroup title)
 | |
| 
 | |
|                var filteredChildren = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|                $.each(data.children, function (idx, child) {
 | |
| 
 | |
|                   var child_text = typeof(child.text) === 'string'
 | |
| 
 | |
|                      ? getTextWithoutDiacriticalMarks(child.text)
 | |
| 
 | |
|                      : '';
 | |
| 
 | |
| 
 | |
| 
 | |
|                   if (child_text.indexOf('>') !== -1 || child_text.indexOf('<') !== -1) {
 | |
| 
 | |
|                      // escape text, if it contains chevrons (can already be escaped prior to this point :/)
 | |
| 
 | |
|                      child_text = jQuery.fn.select2.defaults.defaults.escapeMarkup(child_text);
 | |
| 
 | |
|                   }
 | |
| 
 | |
| 
 | |
| 
 | |
|                   var match_child = fuzzy.match(searched_term, child_text, select2_fuzzy_opts);
 | |
| 
 | |
|                   var match_text  = fuzzy.match(searched_term, data_text, select2_fuzzy_opts);
 | |
| 
 | |
|                   if (match_child !== null || match_text !== null) {
 | |
| 
 | |
|                      if (match_text !== null) {
 | |
| 
 | |
|                         data.score         = match_text.score;
 | |
| 
 | |
|                         data.rendered_text = match_text.rendered;
 | |
| 
 | |
|                      }
 | |
| 
 | |
| 
 | |
| 
 | |
|                      if (match_child !== null) {
 | |
| 
 | |
|                         child.score         = match_child.score;
 | |
| 
 | |
|                         child.rendered_text = match_child.rendered;
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      filteredChildren.push(child);
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                });
 | |
| 
 | |
| 
 | |
| 
 | |
|                // If we matched any of the group's children, then set the matched children on the group
 | |
| 
 | |
|                // and return the group object
 | |
| 
 | |
|                if (filteredChildren.length) {
 | |
| 
 | |
|                   var modifiedData = $.extend({}, data, true);
 | |
| 
 | |
|                   modifiedData.children = filteredChildren;
 | |
| 
 | |
| 
 | |
| 
 | |
|                   // You can return modified objects from here
 | |
| 
 | |
|                   // This includes matching the `children` how you want in nested data sets
 | |
| 
 | |
|                   return modifiedData;
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                // Return `null` if the term should not be displayed
 | |
| 
 | |
|                return null;
 | |
| 
 | |
|             },
 | |
| 
 | |
|             templateResult: templateResult,
 | |
| 
 | |
|             templateSelection: templateSelection,
 | |
| 
 | |
|          })
 | |
| 
 | |
|          .bind('setValue', function(e, value) {
 | |
| 
 | |
|             $('#$id').val(value).trigger('change');
 | |
| 
 | |
|          })
 | |
| 
 | |
|          $('label[for=$id]').on('click', function(){ $('#$id').select2('open'); });
 | |
| 
 | |
|       });";
 | |
| 
 | |
|       return Html::scriptBlock($js);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Create Ajax dropdown to clean JS
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $name
 | |
| 
 | |
|     * @param $field_id   string   id of the dom element
 | |
| 
 | |
|     * @param $url        string   URL to get datas
 | |
| 
 | |
|     * @param $params     array    of parameters
 | |
| 
 | |
|     *            must contains :
 | |
| 
 | |
|     *                if single select
 | |
| 
 | |
|     *                   - 'value'       : default value selected
 | |
| 
 | |
|     *                   - 'valuename'   : default name of selected value
 | |
| 
 | |
|     *                if multiple select
 | |
| 
 | |
|     *                   - 'values'      : default values selected
 | |
| 
 | |
|     *                   - 'valuesnames' : default names of selected values
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsAjaxDropdown($name, $field_id, $url, $params = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!isset($params['value'])) {
 | |
| 
 | |
|          $value = 0;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $value = $params['value'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!isset($params['value'])) {
 | |
| 
 | |
|          $valuename = Dropdown::EMPTY_VALUE;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $valuename = $params['valuename'];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $on_change = '';
 | |
| 
 | |
|       if (isset($params["on_change"])) {
 | |
| 
 | |
|          $on_change = $params["on_change"];
 | |
| 
 | |
|          unset($params["on_change"]);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $width = '80%';
 | |
| 
 | |
|       if (isset($params["width"])) {
 | |
| 
 | |
|          $width = $params["width"];
 | |
| 
 | |
|          unset($params["width"]);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $placeholder = $params['placeholder'] ?? '';
 | |
| 
 | |
|       $allowclear =  "false";
 | |
| 
 | |
|       if (strlen($placeholder) > 0 && !$params['display_emptychoice']) {
 | |
| 
 | |
|          $allowclear = "true";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       unset($params['placeholder']);
 | |
| 
 | |
|       unset($params['value']);
 | |
| 
 | |
|       unset($params['valuename']);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $options = [
 | |
| 
 | |
|          'id'        => $field_id,
 | |
| 
 | |
|          'selected'  => $value
 | |
| 
 | |
|       ];
 | |
| 
 | |
|       if (!empty($params['specific_tags'])) {
 | |
| 
 | |
|          foreach ($params['specific_tags'] as $tag => $val) {
 | |
| 
 | |
|             if (is_array($val)) {
 | |
| 
 | |
|                $val = implode(' ', $val);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $options[$tag] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // manage multiple select (with multiple values)
 | |
| 
 | |
|       if (isset($params['values']) && count($params['values'])) {
 | |
| 
 | |
|          $values = array_combine($params['values'], $params['valuesnames']);
 | |
| 
 | |
|          $options['multiple'] = 'multiple';
 | |
| 
 | |
|          $options['selected'] = $params['values'];
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $values = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|          // simple select (multiple = no)
 | |
| 
 | |
|          if ((isset($params['display_emptychoice']) && $params['display_emptychoice'])
 | |
| 
 | |
|              || $value > 0) {
 | |
| 
 | |
|             $values = ["$value" => $valuename];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // display select tag
 | |
| 
 | |
|       $output = self::select($name, $values, $options);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $js = "
 | |
| 
 | |
|          var params_$field_id = {";
 | |
| 
 | |
|       foreach ($params as $key => $val) {
 | |
| 
 | |
|          // Specific boolean case
 | |
| 
 | |
|          if (is_bool($val)) {
 | |
| 
 | |
|             $js .= "$key: ".($val?1:0).",\n";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             $js .= "$key: ".json_encode($val).",\n";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $js.= "};
 | |
| 
 | |
| 
 | |
| 
 | |
|          $('#$field_id').select2({
 | |
| 
 | |
|             width: '$width',
 | |
| 
 | |
|             placeholder: '$placeholder',
 | |
| 
 | |
|             allowClear: $allowclear,
 | |
| 
 | |
|             minimumInputLength: 0,
 | |
| 
 | |
|             quietMillis: 100,
 | |
| 
 | |
|             dropdownAutoWidth: true,
 | |
| 
 | |
|             minimumResultsForSearch: ".$CFG_GLPI['ajax_limit_count'].",
 | |
| 
 | |
|             ajax: {
 | |
| 
 | |
|                url: '$url',
 | |
| 
 | |
|                dataType: 'json',
 | |
| 
 | |
|                type: 'POST',
 | |
| 
 | |
|                data: function (params) {
 | |
| 
 | |
|                   query = params;
 | |
| 
 | |
|                   return $.extend({}, params_$field_id, {
 | |
| 
 | |
|                      searchText: params.term,
 | |
| 
 | |
|                      page_limit: ".$CFG_GLPI['dropdown_max'].", // page size
 | |
| 
 | |
|                      page: params.page || 1, // page number
 | |
| 
 | |
|                   });
 | |
| 
 | |
|                },
 | |
| 
 | |
|                processResults: function (data, params) {
 | |
| 
 | |
|                   params.page = params.page || 1;
 | |
| 
 | |
|                   var more = (data.count >= ".$CFG_GLPI['dropdown_max'].");
 | |
| 
 | |
| 
 | |
| 
 | |
|                   return {
 | |
| 
 | |
|                      results: data.results,
 | |
| 
 | |
|                      pagination: {
 | |
| 
 | |
|                            more: more
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   };
 | |
| 
 | |
|                }
 | |
| 
 | |
|             },
 | |
| 
 | |
|             templateResult: templateResult,
 | |
| 
 | |
|             templateSelection: templateSelection
 | |
| 
 | |
|          })
 | |
| 
 | |
|          .bind('setValue', function(e, value) {
 | |
| 
 | |
|             $.ajax('$url', {
 | |
| 
 | |
|                data: $.extend({}, params_$field_id, {
 | |
| 
 | |
|                   _one_id: value,
 | |
| 
 | |
|                }),
 | |
| 
 | |
|                dataType: 'json',
 | |
| 
 | |
|                type: 'POST',
 | |
| 
 | |
|             }).done(function(data) {
 | |
| 
 | |
| 
 | |
| 
 | |
|                var iterate_options = function(options, value) {
 | |
| 
 | |
|                   var to_return = false;
 | |
| 
 | |
|                   $.each(options, function(index, option) {
 | |
| 
 | |
|                      if (option.hasOwnProperty('id')
 | |
| 
 | |
|                          && option.id == value) {
 | |
| 
 | |
|                         to_return = option;
 | |
| 
 | |
|                         return false; // act as break;
 | |
| 
 | |
|                      }
 | |
| 
 | |
| 
 | |
| 
 | |
|                      if (option.hasOwnProperty('children')) {
 | |
| 
 | |
|                         to_return = iterate_options(option.children, value);
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
| 
 | |
| 
 | |
|                   return to_return;
 | |
| 
 | |
|                };
 | |
| 
 | |
| 
 | |
| 
 | |
|                var option = iterate_options(data.results, value);
 | |
| 
 | |
|                if (option !== false) {
 | |
| 
 | |
|                   var newOption = new Option(option.text, option.id, true, true);
 | |
| 
 | |
|                    $('#$field_id').append(newOption).trigger('change');
 | |
| 
 | |
|                }
 | |
| 
 | |
|             });
 | |
| 
 | |
|          });
 | |
| 
 | |
|          ";
 | |
| 
 | |
|       if (!empty($on_change)) {
 | |
| 
 | |
|          $js .= " $('#$field_id').on('change', function(e) {".
 | |
| 
 | |
|                   stripslashes($on_change)."});";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $js .= " $('label[for=$field_id]').on('click', function(){ $('#$field_id').select2('open'); });";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $output .= Html::scriptBlock('$(function() {' . $js . '});');
 | |
| 
 | |
|       return $output;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a formatted IMG element.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * This method will set an empty alt attribute if no alt and no title is not supplied
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $path     Path to the image file
 | |
| 
 | |
|     * @param array  $options  array of HTML attributes
 | |
| 
 | |
|     *        - `url` If provided an image link will be generated and the link will point at
 | |
| 
 | |
|     *               `$options['url']`.
 | |
| 
 | |
|     * @return string completed img tag
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function image($path, $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!isset($options['title'])) {
 | |
| 
 | |
|          $options['title'] = '';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!isset($options['alt'])) {
 | |
| 
 | |
|          $options['alt'] = $options['title'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($options['title'])
 | |
| 
 | |
|           && !empty($options['alt'])) {
 | |
| 
 | |
|          $options['title'] = $options['alt'];
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $url = false;
 | |
| 
 | |
|       if (!empty($options['url'])) {
 | |
| 
 | |
|          $url = $options['url'];
 | |
| 
 | |
|          unset($options['url']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $class = "";
 | |
| 
 | |
|       if ($url) {
 | |
| 
 | |
|          $class = "class='pointer'";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $image = sprintf('<img src="%1$s" %2$s %3$s />', $path, Html::parseAttributes($options), $class);
 | |
| 
 | |
|       if ($url) {
 | |
| 
 | |
|          return Html::link($image, $url);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $image;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a PhotoSwipe image gallery
 | |
| 
 | |
|     *
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.5.0
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array $imgs  Array of image info
 | |
| 
 | |
|     *                      - src The public path of img
 | |
| 
 | |
|     *                      - w   The width of img
 | |
| 
 | |
|     *                      - h   The height of img
 | |
| 
 | |
|     * @param array $options
 | |
| 
 | |
|     * @return string completed gallery
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function imageGallery($imgs, $options = []) {
 | |
| 
 | |
|       $p = [
 | |
| 
 | |
|          'controls' => [
 | |
| 
 | |
|             'close'        => true,
 | |
| 
 | |
|             'share'        => true,
 | |
| 
 | |
|             'fullscreen'   => true,
 | |
| 
 | |
|             'zoom'         => true,
 | |
| 
 | |
|          ],
 | |
| 
 | |
|          'rand'   => mt_rand()
 | |
| 
 | |
|       ];
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = "<div id='psgallery{$p['rand']}' class='pswp' tabindex='-1'
 | |
| 
 | |
|          role='dialog' aria-hidden='true'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__bg'></div>";
 | |
| 
 | |
|       $out .= "<div class='pswp__scroll-wrap'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__container'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__item'></div>";
 | |
| 
 | |
|       $out .= "<div class='pswp__item'></div>";
 | |
| 
 | |
|       $out .= "<div class='pswp__item'></div>";
 | |
| 
 | |
|       $out .= "</div>";
 | |
| 
 | |
|       $out .= "<div class='pswp__ui pswp__ui--hidden'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__top-bar'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__counter'></div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($p['controls']['close']) && $p['controls']['close']) {
 | |
| 
 | |
|          $out .= "<button class='pswp__button pswp__button--close' title='".__('Close (Esc)')."'></button>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($p['controls']['share']) && $p['controls']['share']) {
 | |
| 
 | |
|          $out .= "<button class='pswp__button pswp__button--share' title='".__('Share')."'></button>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($p['controls']['fullscreen']) && $p['controls']['fullscreen']) {
 | |
| 
 | |
|          $out .= "<button class='pswp__button pswp__button--fs' title='".__('Toggle fullscreen')."'></button>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($p['controls']['zoom']) && $p['controls']['zoom']) {
 | |
| 
 | |
|          $out .= "<button class='pswp__button pswp__button--zoom' title='".__('Zoom in/out')."'></button>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= "<div class='pswp__preloader'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__preloader__icn'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__preloader__cut'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__preloader__donut'></div>";
 | |
| 
 | |
|       $out .= "</div></div></div></div>";
 | |
| 
 | |
|       $out .= "<div class='pswp__share-modal pswp__share-modal--hidden pswp__single-tap'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__share-tooltip'></div>";
 | |
| 
 | |
|       $out .= "</div>";
 | |
| 
 | |
|       $out .= "<button class='pswp__button pswp__button--arrow--left' title='".__('Previous (arrow left)')."'>";
 | |
| 
 | |
|       $out .= "</button>";
 | |
| 
 | |
|       $out .= "<button class='pswp__button pswp__button--arrow--right' title='".__('Next (arrow right)')."'>";
 | |
| 
 | |
|       $out .= "</button>";
 | |
| 
 | |
|       $out .= "<div class='pswp__caption'>";
 | |
| 
 | |
|       $out .= "<div class='pswp__caption__center'></div>";
 | |
| 
 | |
|       $out .= "</div></div></div></div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= "<div class='pswp-img{$p['rand']} timeline_img_preview' itemscope itemtype='http://schema.org/ImageGallery'>";
 | |
| 
 | |
|       foreach ($imgs as $img) {
 | |
| 
 | |
|          $out .= "<figure itemprop='associatedMedia' itemscope itemtype='http://schema.org/ImageObject'>";
 | |
| 
 | |
|          $out .= "<a href='{$img['src']}' itemprop='contentUrl' data-index='0'>";
 | |
| 
 | |
|          $out .= "<img src='{$img['src']}&context=timeline' itemprop='thumbnail'>";
 | |
| 
 | |
|          $out .= "</a>";
 | |
| 
 | |
|          $out .= "</figure>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Decode images urls
 | |
| 
 | |
|       $imgs = array_map(function($img) {
 | |
| 
 | |
|          $img['src'] = html_entity_decode($img['src']);
 | |
| 
 | |
|          return $img;
 | |
| 
 | |
|       }, $imgs);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $items_json = json_encode($imgs);
 | |
| 
 | |
|       $dltext = __('Download');
 | |
| 
 | |
|       $js = <<<JAVASCRIPT
 | |
| 
 | |
|       (function($) {
 | |
| 
 | |
|          var pswp = document.getElementById('psgallery{$p['rand']}');
 | |
| 
 | |
| 
 | |
| 
 | |
|          $('.pswp-img{$p['rand']}').on('click', 'figure', function(event) {
 | |
| 
 | |
|             event.preventDefault();
 | |
| 
 | |
| 
 | |
| 
 | |
|             var options = {
 | |
| 
 | |
|                 index: $(this).index(),
 | |
| 
 | |
|                 bgOpacity: 0.7,
 | |
| 
 | |
|                 showHideOpacity: true,
 | |
| 
 | |
|                 shareButtons: [
 | |
| 
 | |
|                   {id:'download', label:'{$dltext}', url:'{{raw_image_url}}', download:true}
 | |
| 
 | |
|                 ]
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             var lightBox = new PhotoSwipe(pswp, PhotoSwipeUI_Default, {$items_json}, options);
 | |
| 
 | |
|             $(pswp).closest('.glpi_tabs').css('z-index', 50); // be sure that tabs are displayed above form in vsplit
 | |
| 
 | |
|             lightBox.init();
 | |
| 
 | |
| 
 | |
| 
 | |
|             lightBox.listen(
 | |
| 
 | |
|                'destroy',
 | |
| 
 | |
|                function() {
 | |
| 
 | |
|                   $(this.container).closest('.glpi_tabs').css('z-index', ''); // restore z-index from CSS
 | |
| 
 | |
|                }
 | |
| 
 | |
|             );
 | |
| 
 | |
|         });
 | |
| 
 | |
|       })(jQuery);
 | |
| 
 | |
| 
 | |
| 
 | |
| JAVASCRIPT;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out .= Html::scriptBlock($js);
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Replace images by gallery component in rich text.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.5.0
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $richtext
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function replaceImagesByGallery($richtext) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $image_matches = [];
 | |
| 
 | |
|       preg_match_all(
 | |
| 
 | |
|          '/<a[^>]*>\s*<img[^>]*src=["\']([^"\']*document\.send\.php\?docid=([0-9]+)(?:&[^"\']+)?)["\'][^>]*>\s*<\/a>/',
 | |
| 
 | |
|          $richtext,
 | |
| 
 | |
|          $image_matches,
 | |
| 
 | |
|          PREG_SET_ORDER
 | |
| 
 | |
|       );
 | |
| 
 | |
|       foreach ($image_matches as $image_match) {
 | |
| 
 | |
|          $img_tag = $image_match[0];
 | |
| 
 | |
|          $docsrc  = $image_match[1];
 | |
| 
 | |
|          $docid   = $image_match[2];
 | |
| 
 | |
|          $document = new Document();
 | |
| 
 | |
|          if ($document->getFromDB($docid)) {
 | |
| 
 | |
|             $docpath = GLPI_DOC_DIR . '/' . $document->fields['filepath'];
 | |
| 
 | |
|             if (Document::isImage($docpath)) {
 | |
| 
 | |
|                $imgsize = getimagesize($docpath);
 | |
|                $gallery = Html::imageGallery([
 | |
| 
 | |
|                   [
 | |
| 
 | |
|                      'src' => $docsrc,
 | |
| 
 | |
|                      'w'   => $imgsize[0],
 | |
| 
 | |
|                      'h'   => $imgsize[1]
 | |
| 
 | |
|                   ]
 | |
| 
 | |
|                ]);
 | |
| 
 | |
|                $richtext = str_replace($img_tag, $gallery, $richtext);
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $richtext;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates an HTML link.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $text     The content to be wrapped by a tags.
 | |
| 
 | |
|     * @param string $url      URL parameter
 | |
| 
 | |
|     * @param array  $options  Array of HTML attributes:
 | |
| 
 | |
|     *     - `confirm` JavaScript confirmation message.
 | |
| 
 | |
|     *     - `confirmaction` optional action to do on confirmation
 | |
| 
 | |
|     * @return string an `a` element.
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function link($text, $url, $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($options['confirm'])) {
 | |
| 
 | |
|          if (!empty($options['confirm'])) {
 | |
| 
 | |
|             $confirmAction  = '';
 | |
| 
 | |
|             if (isset($options['confirmaction'])) {
 | |
| 
 | |
|                if (!empty($options['confirmaction'])) {
 | |
| 
 | |
|                   $confirmAction = $options['confirmaction'];
 | |
| 
 | |
|                }
 | |
| 
 | |
|                unset($options['confirmaction']);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $options['onclick'] = Html::getConfirmationOnActionScript($options['confirm'],
 | |
| 
 | |
|                                                                       $confirmAction);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          unset($options['confirm']);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // Do not escape title if it is an image or a i tag (fontawesome)
 | |
| 
 | |
|       if (!preg_match('/^<i(mg)?.*/', $text)) {
 | |
| 
 | |
|          $text = Html::cleanInputText($text);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return sprintf('<a href="%1$s" %2$s>%3$s</a>', Html::cleanInputText($url),
 | |
| 
 | |
|                      Html::parseAttributes($options), $text);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a hidden input field.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * If value of options is an array then recursively parse it
 | |
| 
 | |
|     * to generate as many hidden input as necessary
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $fieldName  Name of a field
 | |
| 
 | |
|     * @param array  $options    Array of HTML attributes.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string A generated hidden input
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function hidden($fieldName, $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ((isset($options['value'])) && (is_array($options['value']))) {
 | |
| 
 | |
|          $result = '';
 | |
| 
 | |
|          foreach ($options['value'] as $key => $value) {
 | |
| 
 | |
|             $options2          = $options;
 | |
| 
 | |
|             $options2['value'] = $value;
 | |
| 
 | |
|             $result           .= static::hidden($fieldName.'['.$key.']', $options2)."\n";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          return $result;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return sprintf('<input type="hidden" name="%1$s" %2$s />',
 | |
| 
 | |
|                      Html::cleanInputText($fieldName), Html::parseAttributes($options));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a text input field.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $fieldName  Name of a field
 | |
| 
 | |
|     * @param array  $options    Array of HTML attributes.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string A generated hidden input
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function input($fieldName, $options = []) {
 | |
| 
 | |
|       $type = 'text';
 | |
| 
 | |
|       if (isset($options['type'])) {
 | |
| 
 | |
|          $type = $options['type'];
 | |
| 
 | |
|          unset($options['type']);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return sprintf('<input type="%1$s" name="%2$s" %3$s />',
 | |
| 
 | |
|                      $type, Html::cleanInputText($fieldName), Html::parseAttributes($options));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a select tag
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.3
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $ame      Name of the field
 | |
| 
 | |
|     * @param array  $values   Array of the options
 | |
| 
 | |
|     * @param mixed  $selected Current selected option
 | |
| 
 | |
|     * @param array  $options  Array of HTML attributes
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function select($name, array $values = [], $options = []) {
 | |
| 
 | |
|       $selected = false;
 | |
| 
 | |
|       if (isset($options['selected'])) {
 | |
| 
 | |
|          $selected = $options['selected'];
 | |
| 
 | |
|          unset ($options['selected']);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $select = sprintf(
 | |
| 
 | |
|          '<select name="%1$s" %2$s>',
 | |
| 
 | |
|          self::cleanInputText($name),
 | |
| 
 | |
|          self::parseAttributes($options)
 | |
| 
 | |
|       );
 | |
| 
 | |
|       foreach ($values as $key => $value) {
 | |
| 
 | |
|          $select .= sprintf(
 | |
| 
 | |
|             '<option value="%1$s"%2$s>%3$s</option>',
 | |
| 
 | |
|             self::cleanInputText($key),
 | |
| 
 | |
|             ($selected != false && (
 | |
| 
 | |
|                $key == $selected
 | |
| 
 | |
|                || is_array($selected) && in_array($key, $selected))
 | |
| 
 | |
|             ) ? ' selected="selected"' : '',
 | |
| 
 | |
|             $value
 | |
| 
 | |
|          );
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $select .= '</select>';
 | |
| 
 | |
|       return $select;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a submit button element. This method will generate input elements that
 | |
| 
 | |
|     * can be used to submit, and reset forms by using $options. Image submits can be created by supplying an
 | |
| 
 | |
|     * image option
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $caption  caption of the input
 | |
| 
 | |
|     * @param array  $options  Array of options.
 | |
| 
 | |
|     *     - image : will use a submit image input
 | |
| 
 | |
|     *     - `confirm` JavaScript confirmation message.
 | |
| 
 | |
|     *     - `confirmaction` optional action to do on confirmation
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string A HTML submit button
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function submit($caption, $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $image = false;
 | |
| 
 | |
|       if (isset($options['image'])) {
 | |
| 
 | |
|          if (preg_match('/\.(jpg|jpe|jpeg|gif|png|ico)$/', $options['image'])) {
 | |
| 
 | |
|             $image = $options['image'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|          unset($options['image']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Set default class to submit
 | |
| 
 | |
|       if (!isset($options['class'])) {
 | |
| 
 | |
|          $options['class'] = 'vsubmit';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (isset($options['confirm'])) {
 | |
| 
 | |
|          if (!empty($options['confirm'])) {
 | |
| 
 | |
|             $confirmAction  = '';
 | |
| 
 | |
|             if (isset($options['confirmaction'])) {
 | |
| 
 | |
|                if (!empty($options['confirmaction'])) {
 | |
| 
 | |
|                   $confirmAction = $options['confirmaction'];
 | |
| 
 | |
|                }
 | |
| 
 | |
|                unset($options['confirmaction']);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $options['onclick'] = Html::getConfirmationOnActionScript($options['confirm'],
 | |
| 
 | |
|                                                                       $confirmAction);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          unset($options['confirm']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($image) {
 | |
| 
 | |
|          $options['title'] = $caption;
 | |
| 
 | |
|          $options['alt']   = $caption;
 | |
| 
 | |
|          return sprintf('<input type="image" src="%s" %s />',
 | |
| 
 | |
|                Html::cleanInputText($image), Html::parseAttributes($options));
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $button = "<button type='submit' value='%s' %s>
 | |
| 
 | |
|                $caption
 | |
| 
 | |
|             </button> ";
 | |
| 
 | |
| 
 | |
| 
 | |
|       return sprintf($button, Html::cleanInputText($caption), Html::parseAttributes($options));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates an accessible, stylable progress bar control.
 | |
| 
 | |
|     * @since 9.5.0
 | |
| 
 | |
|     * @param int $max    The maximum value of the progress bar.
 | |
| 
 | |
|     * @param int $value    The current value of the progress bar.
 | |
| 
 | |
|     * @param array $params  Array of options:
 | |
| 
 | |
|     *                         - rand: Random int for the progress id. Default is a new random int.
 | |
| 
 | |
|     *                         - tooltip: Text to show in the tooltip. Default is nothing.
 | |
| 
 | |
|     *                         - append_percent_tt: If true, the percent will be appended to the tooltip.
 | |
| 
 | |
|     *                               In this case, it will also be automatically updated. Default is true.
 | |
| 
 | |
|     *                         - text: Text to show in the progress bar. Default is nothing.
 | |
| 
 | |
|     *                         - append_percent_text: If true, the percent will be appended to the text.
 | |
| 
 | |
|     *                               In this case, it will also be automatically updated. Default is false.
 | |
| 
 | |
|     * @return string     The progress bar HTML
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function progress($max, $value, $params = []) {
 | |
| 
 | |
|       $p = [
 | |
| 
 | |
|          'rand'            => mt_rand(),
 | |
| 
 | |
|          'tooltip'         => '',
 | |
| 
 | |
|          'append_percent'  => true
 | |
| 
 | |
|       ];
 | |
| 
 | |
|       $p = array_replace($p, $params);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $tooltip = trim($p['tooltip'] . ($p['append_percent'] ? " {$value}%" : ''));
 | |
| 
 | |
|       // Hide element except when using a screen reader. This uses FontAwesome's sr-only class.
 | |
| 
 | |
|       $html = "<progress id='progress{$p['rand']}' class='sr-only' max='$max' value='$value'
 | |
| 
 | |
|             onchange='updateProgress(\"{$p['rand']}\")' title='{$tooltip}'></progress>";
 | |
| 
 | |
|       // Custom progress control. Should be hidden for screen readers.
 | |
| 
 | |
|       $html .= "<div aria-hidden='true' data-progressid='{$p['rand']}'
 | |
| 
 | |
|          data-append-percent='{$p['append_percent']}' class='progress' title='{$tooltip}'>";
 | |
| 
 | |
|       $calcWidth = ($value / $max) * 100;
 | |
| 
 | |
|       $html .= "<span aria-hidden='true' class='progress-fg' style='width: $calcWidth%'></span>";
 | |
| 
 | |
|       $html .= "</div>";
 | |
| 
 | |
|       return $html;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Returns a space-delimited string with items of the $options array.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $options Array of options.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string Composed attributes.
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function parseAttributes($options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!is_string($options)) {
 | |
| 
 | |
|          $attributes = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|          foreach ($options as $key => $value) {
 | |
| 
 | |
|             $attributes[] = Html::formatAttribute($key, $value);
 | |
| 
 | |
|          }
 | |
| 
 | |
|          $out = implode(' ', $attributes);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $out = $options;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Formats an individual attribute, and returns the string value of the composed attribute.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $key    The name of the attribute to create
 | |
| 
 | |
|     * @param string $value  The value of the attribute to create.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string The composed attribute.
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function formatAttribute($key, $value) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($value)) {
 | |
| 
 | |
|          $value = implode(' ', $value);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return sprintf('%1$s="%2$s"', $key, Html::cleanInputText($value));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Wrap $script in a script tag.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $script  The script to wrap
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function scriptBlock($script) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $script = "\n" . '//<![CDATA[' . "\n\n" . $script . "\n\n" . '//]]>' . "\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       return sprintf('<script type="text/javascript">%s</script>', $script);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Returns one or many script tags depending on the number of scripts given.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     * @since 9.2 Path is now relative to GLPI_ROOT. Add $minify parameter.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $url     File to include (relative to GLPI_ROOT)
 | |
| 
 | |
|     * @param array   $options Array of HTML attributes
 | |
| 
 | |
|     * @param boolean $minify  Try to load minified file (defaults to true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return String of script tags
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function script($url, $options = [], $minify = true) {
 | |
| 
 | |
|       $version = GLPI_VERSION;
 | |
| 
 | |
|       if (isset($options['version'])) {
 | |
| 
 | |
|          $version = $options['version'];
 | |
| 
 | |
|          unset($options['version']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($minify === true) {
 | |
| 
 | |
|          $url = self::getMiniFile($url);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $url = self::getPrefixedUrl($url);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($version) {
 | |
| 
 | |
|          $url .= '?v=' . $version;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return sprintf('<script type="text/javascript" src="%1$s"></script>', $url);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a link element for CSS stylesheets.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     * @since 9.2 Path is now relative to GLPI_ROOT. Add $minify parameter.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $url     File to include (relative to GLPI_ROOT)
 | |
| 
 | |
|     * @param array   $options Array of HTML attributes
 | |
| 
 | |
|     * @param boolean $minify  Try to load minified file (defaults to true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string CSS link tag
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function css($url, $options = [], $minify = true) {
 | |
| 
 | |
|       if ($minify === true) {
 | |
| 
 | |
|          $url = self::getMiniFile($url);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $url = self::getPrefixedUrl($url);
 | |
| 
 | |
| 
 | |
| 
 | |
|       return self::csslink($url, $options);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a link element for SCSS stylesheets.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.4
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string  $url     File to include (relative to GLPI_ROOT)
 | |
| 
 | |
|     * @param array   $options Array of HTML attributes
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string CSS link tag
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function scss($url, $options = []) {
 | |
| 
 | |
|       $prod_file = self::getScssCompilePath($url);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (file_exists($prod_file) && $_SESSION['glpi_use_mode'] != Session::DEBUG_MODE) {
 | |
| 
 | |
|          $url = self::getPrefixedUrl(str_replace(GLPI_ROOT, '', $prod_file));
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $file = $url;
 | |
| 
 | |
|          $url = self::getPrefixedUrl('/front/css.php');
 | |
| 
 | |
|          $url .= '?file=' . $file;
 | |
| 
 | |
|          if ($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) {
 | |
| 
 | |
|             $url .= '&debug';
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return self::csslink($url, $options);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates a link element for (S)CSS stylesheets.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.4
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $url      File to include (raltive to GLPI_ROOT)
 | |
| 
 | |
|     * @param array  $options  Array of HTML attributes
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string CSS link tag
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static private function csslink($url, $options) {
 | |
| 
 | |
|       if (!isset($options['media']) || $options['media'] == '') {
 | |
| 
 | |
|          $options['media'] = 'all';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $version = GLPI_VERSION;
 | |
| 
 | |
|       if (isset($options['version'])) {
 | |
| 
 | |
|          $version = $options['version'];
 | |
| 
 | |
|          unset($options['version']);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $url .= ((strpos($url, '?') !== false) ? '&' : '?') . 'v=' . $version;
 | |
| 
 | |
| 
 | |
| 
 | |
|       return sprintf('<link rel="stylesheet" type="text/css" href="%s" %s>', $url,
 | |
| 
 | |
|                      Html::parseAttributes($options));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display a div who reveive a list of uploaded file
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since  version 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param  array $options theses following keys:
 | |
| 
 | |
|     *                          - editor_id the dom id of the tinymce editor
 | |
| 
 | |
|     * @return string The Html
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function fileForRichText($options = []) {
 | |
|       $p['editor_id']     = '';
 | |
| 
 | |
|       $p['name']          = 'filename';
 | |
| 
 | |
|       $p['filecontainer'] = 'fileupload_info';
 | |
| 
 | |
|       $p['display']       = true;
 | |
| 
 | |
|       $rand               = mt_rand();
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $display = "";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // display file controls
 | |
| 
 | |
|       $display .= __('Attach file by drag & drop or copy & paste in editor or ').
 | |
| 
 | |
|                   "<a href='' id='upload_link$rand'>".__('selecting them')."</a>".
 | |
| 
 | |
|                   "<input id='upload_rich_text$rand' class='upload_rich_text' type='file' />";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $display .= Html::scriptBlock("
 | |
| 
 | |
|          var fileindex = 0;
 | |
| 
 | |
|          $(function() {
 | |
| 
 | |
|             $('#upload_link$rand').on('click', function(e){
 | |
| 
 | |
|                e.preventDefault();
 | |
| 
 | |
|                $('#upload_rich_text$rand:hidden').trigger('click');
 | |
| 
 | |
|             });
 | |
| 
 | |
| 
 | |
| 
 | |
|             $('#upload_rich_text$rand:hidden').change(function (event) {
 | |
| 
 | |
|                uploadFile($('#upload_rich_text$rand:hidden')[0].files[0],
 | |
| 
 | |
|                             tinyMCE.get('{$p['editor_id']}'),
 | |
| 
 | |
|                             '{$p['name']}');
 | |
| 
 | |
|             });
 | |
| 
 | |
|          });
 | |
| 
 | |
|       ");
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $display;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $display;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Creates an input file field. Send file names in _$name field as array.
 | |
| 
 | |
|     * Files are uploaded in files/_tmp/ directory
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $options       array of options
 | |
| 
 | |
|     *    - name                string   field name (default filename)
 | |
| 
 | |
|     *    - onlyimages          boolean  restrict to image files (default false)
 | |
| 
 | |
|     *    - filecontainer       string   DOM ID of the container showing file uploaded:
 | |
| 
 | |
|     *                                   use selector to display
 | |
| 
 | |
|     *    - showfilesize        boolean  show file size with file name
 | |
| 
 | |
|     *    - showtitle           boolean  show the title above file list
 | |
| 
 | |
|     *                                   (with max upload size indication)
 | |
| 
 | |
|     *    - enable_richtext     boolean  switch to richtext fileupload
 | |
| 
 | |
|     *    - pasteZone           string   DOM ID of the paste zone
 | |
| 
 | |
|     *    - dropZone            string   DOM ID of the drop zone
 | |
| 
 | |
|     *    - rand                string   already computed rand value
 | |
| 
 | |
|     *    - display             boolean  display or return the generated html (default true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void|string   the html if display parameter is false
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function file($options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $randupload             = mt_rand();
 | |
| 
 | |
| 
 | |
| 
 | |
|       $p['name']              = 'filename';
 | |
| 
 | |
|       $p['onlyimages']        = false;
 | |
| 
 | |
|       $p['filecontainer']     = 'fileupload_info';
 | |
| 
 | |
|       $p['showfilesize']      = true;
 | |
| 
 | |
|       $p['showtitle']         = true;
 | |
| 
 | |
|       $p['enable_richtext']   = false;
 | |
| 
 | |
|       $p['pasteZone']         = false;
 | |
| 
 | |
|       $p['dropZone']          = 'dropdoc'.$randupload;
 | |
| 
 | |
|       $p['rand']              = $randupload;
 | |
| 
 | |
|       $p['values']            = [];
 | |
| 
 | |
|       $p['display']           = true;
 | |
| 
 | |
|       $p['multiple']          = false;
 | |
| 
 | |
|       $p['uploads']           = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $p[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $display = "";
 | |
| 
 | |
|       $display .= "<div class='fileupload draghoverable'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['showtitle']) {
 | |
| 
 | |
|          $display .= "<b>";
 | |
| 
 | |
|          $display .= sprintf(__('%1$s (%2$s)'), __('File(s)'), Document::getMaxUploadSize());
 | |
| 
 | |
|          $display .= DocumentType::showAvailableTypesLink(['display' => false]);
 | |
| 
 | |
|          $display .= "</b>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $display .= self::uploadedFiles([
 | |
| 
 | |
|          'filecontainer' => $p['filecontainer'],
 | |
| 
 | |
|          'name'          => $p['name'],
 | |
| 
 | |
|          'display'       => false,
 | |
| 
 | |
|          'uploads'       => $p['uploads'],
 | |
| 
 | |
|       ]);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($p['editor_id'])
 | |
| 
 | |
|           && $p['enable_richtext']) {
 | |
| 
 | |
|          $options_rt = $options;
 | |
| 
 | |
|          $options_rt['display'] = false;
 | |
| 
 | |
|          $display .= self::fileForRichText($options_rt);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
| 
 | |
| 
 | |
|          // manage file upload without tinymce editor
 | |
| 
 | |
|          $display .= "<div id='{$p['dropZone']}'>";
 | |
| 
 | |
|          $display .= "<span class='b'>".__('Drag and drop your file here, or').'</span><br>';
 | |
| 
 | |
|          $display .= "<input id='fileupload{$p['rand']}' type='file' name='".$p['name']."[]'
 | |
| 
 | |
|                          data-url='".$CFG_GLPI["root_doc"]."/ajax/fileupload.php'
 | |
| 
 | |
|                          data-form-data='{\"name\": \"".$p['name']."\",
 | |
| 
 | |
|                                           \"showfilesize\": \"".$p['showfilesize']."\"}'".($p['multiple']?" multiple='multiple'":"").">";
 | |
| 
 | |
|          $display .= "<div id='progress{$p['rand']}' style='display:none'>".
 | |
| 
 | |
|                  "<div class='uploadbar' style='width: 0%;'></div></div>";
 | |
| 
 | |
|          $display .= "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          $display .= Html::scriptBlock("
 | |
| 
 | |
|          $(function() {
 | |
| 
 | |
|             var fileindex{$p['rand']} = 0;
 | |
| 
 | |
|             $('#fileupload{$p['rand']}').fileupload({
 | |
| 
 | |
|                dataType: 'json',
 | |
| 
 | |
|                pasteZone: ".($p['pasteZone'] !== false
 | |
| 
 | |
|                               ? "$('#{$p['pasteZone']}')"
 | |
| 
 | |
|                               : "false").",
 | |
| 
 | |
|                dropZone:  ".($p['dropZone'] !== false
 | |
| 
 | |
|                               ? "$('#{$p['dropZone']}')"
 | |
| 
 | |
|                               : "false").",
 | |
| 
 | |
|                acceptFileTypes: ".($p['onlyimages']
 | |
| 
 | |
|                                     ? "'/(\.|\/)(gif|jpe?g|png)$/i'"
 | |
| 
 | |
|                                     : "undefined").",
 | |
| 
 | |
|                progressall: function(event, data) {
 | |
| 
 | |
|                   var progress = parseInt(data.loaded / data.total * 100, 10);
 | |
| 
 | |
|                   $('#progress{$p['rand']}')
 | |
| 
 | |
|                      .show()
 | |
| 
 | |
|                   .filter('.uploadbar')
 | |
| 
 | |
|                      .css({
 | |
| 
 | |
|                         width: progress + '%'
 | |
| 
 | |
|                      })
 | |
| 
 | |
|                      .text(progress + '%')
 | |
| 
 | |
|                      .show();
 | |
| 
 | |
|                },
 | |
| 
 | |
|                done: function (event, data) {
 | |
| 
 | |
|                   var filedata = data;
 | |
| 
 | |
|                   // Load image tag, and display image uploaded
 | |
| 
 | |
|                   $.ajax({
 | |
| 
 | |
|                      type: 'POST',
 | |
| 
 | |
|                      url: '".$CFG_GLPI['root_doc']."/ajax/getFileTag.php',
 | |
| 
 | |
|                      data: {
 | |
| 
 | |
|                         data: data.result.{$p['name']}
 | |
| 
 | |
|                      },
 | |
| 
 | |
|                      dataType: 'JSON',
 | |
| 
 | |
|                      success: function(tag) {
 | |
| 
 | |
|                         $.each(filedata.result.{$p['name']}, function(index, file) {
 | |
| 
 | |
|                            if (file.error === undefined) {
 | |
| 
 | |
|                               //create a virtual editor to manage filelist, see displayUploadedFile()
 | |
| 
 | |
|                               var editor = {
 | |
| 
 | |
|                                  targetElm: $('#fileupload{$p['rand']}')
 | |
| 
 | |
|                               };
 | |
| 
 | |
|                               displayUploadedFile(file, tag[index], editor, '{$p['name']}');
 | |
| 
 | |
| 
 | |
| 
 | |
|                               $('#progress{$p['rand']} .uploadbar')
 | |
| 
 | |
|                                  .text('".addslashes(__('Upload successful'))."')
 | |
| 
 | |
|                                  .css('width', '100%')
 | |
| 
 | |
|                                  .delay(2000)
 | |
| 
 | |
|                                  .fadeOut('slow');
 | |
| 
 | |
|                            } else {
 | |
| 
 | |
|                               $('#progress{$p['rand']} .uploadbar')
 | |
| 
 | |
|                                  .text(file.error)
 | |
| 
 | |
|                                  .css('width', '100%');
 | |
| 
 | |
|                            }
 | |
| 
 | |
|                         });
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   });
 | |
| 
 | |
|                }
 | |
| 
 | |
|             });
 | |
| 
 | |
|          });");
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $display .= "</div>"; // .fileupload
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $display;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $display;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display an html textarea  with extended options
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param  array  $options with these keys:
 | |
| 
 | |
|     *  - name (string):              corresponding html attribute
 | |
| 
 | |
|     *  - filecontainer (string):     dom id for the upload filelist
 | |
| 
 | |
|     *  - rand (string):              random param to avoid overriding between textareas
 | |
| 
 | |
|     *  - editor_id (string):         id attribute for the textarea
 | |
| 
 | |
|     *  - value (string):             value attribute for the textarea
 | |
| 
 | |
|     *  - enable_richtext (bool):     enable tinymce for this textarea
 | |
| 
 | |
|     *  - enable_fileupload (bool):   enable the inline fileupload system
 | |
| 
 | |
|     *  - display (bool):             display or return the generated html
 | |
| 
 | |
|     *  - cols (int):                 textarea cols attribute (witdh)
 | |
| 
 | |
|     *  - rows (int):                 textarea rows attribute (height)
 | |
| 
 | |
|     *  - required (bool):            textarea is mandatory
 | |
| 
 | |
|     *  - uploads (array):            uploads to recover from a prevous submit
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return mixed          the html if display paremeter is false or true
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function textarea($options = []) {
 | |
| 
 | |
|       //default options
 | |
| 
 | |
|       $p['name']              = 'text';
 | |
| 
 | |
|       $p['filecontainer']     = 'fileupload_info';
 | |
| 
 | |
|       $p['rand']              = mt_rand();
 | |
| 
 | |
|       $p['editor_id']         = 'text'.$p['rand'];
 | |
| 
 | |
|       $p['value']             = '';
 | |
| 
 | |
|       $p['enable_richtext']   = false;
 | |
| 
 | |
|       $p['enable_fileupload'] = false;
 | |
| 
 | |
|       $p['display']           = true;
 | |
| 
 | |
|       $p['cols']              = 100;
 | |
| 
 | |
|       $p['rows']              = 15;
 | |
| 
 | |
|       $p['multiple']          = true;
 | |
| 
 | |
|       $p['required']          = false;
 | |
| 
 | |
|       $p['uploads']           = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|       //merge default options with options parameter
 | |
| 
 | |
|       $p = array_merge($p, $options);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $required = $p['required'] ? 'required="required"' : '';
 | |
| 
 | |
|       $display = '';
 | |
| 
 | |
|       $display .= "<textarea name='".$p['name']."' id='".$p['editor_id']."'
 | |
| 
 | |
|                              rows='".$p['rows']."' cols='".$p['cols']."' $required>".
 | |
| 
 | |
|                   $p['value']."</textarea>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['enable_richtext']) {
 | |
| 
 | |
|          $display .= Html::initEditorSystem($p['editor_id'], $p['rand'], false);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $display .= Html::scriptBlock("
 | |
| 
 | |
|                         $(document).ready(function() {
 | |
| 
 | |
|                            $('".$p['editor_id']."').autogrow();
 | |
| 
 | |
|                         });
 | |
| 
 | |
|                      ");
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!$p['enable_fileupload'] && $p['enable_richtext']) {
 | |
| 
 | |
|          $display .= self::uploadedFiles([
 | |
| 
 | |
|             'filecontainer' => $p['filecontainer'],
 | |
| 
 | |
|             'name'          => $p['name'],
 | |
| 
 | |
|             'display'       => false,
 | |
| 
 | |
|             'uploads'       => $p['uploads'],
 | |
| 
 | |
|             'editor_id'     => $p['editor_id'],
 | |
| 
 | |
|          ]);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['enable_fileupload']) {
 | |
| 
 | |
|          $p_rt = $p;
 | |
| 
 | |
|          unset($p_rt['name']);
 | |
| 
 | |
|          $p_rt['display'] = false;
 | |
| 
 | |
|          $display .= Html::file($p_rt);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $display;
 | |
| 
 | |
|          return true;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $display;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display uploaded files area
 | |
| 
 | |
|     * @see displayUploadedFile() in fileupload.js
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $options       array of options
 | |
| 
 | |
|     *    - name                string   field name (default filename)
 | |
| 
 | |
|     *    - filecontainer       string   DOM ID of the container showing file uploaded:
 | |
| 
 | |
|     *    - editor_id           string   id attribute for the textarea
 | |
| 
 | |
|     *    - display             bool     display or return the generated html
 | |
| 
 | |
|     *    - uploads             array    uploads to display (done in a previous form submit)
 | |
| 
 | |
|     * @return void|string   the html if display parameter is false
 | |
| 
 | |
|     */
 | |
| 
 | |
|    private static function uploadedFiles($options = []) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       //default options
 | |
| 
 | |
|       $p['filecontainer']     = 'fileupload_info';
 | |
| 
 | |
|       $p['name']              = 'filename';
 | |
| 
 | |
|       $p['editor_id']         = '';
 | |
| 
 | |
|       $p['display']           = true;
 | |
| 
 | |
|       $p['uploads']           = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|       //merge default options with options parameter
 | |
| 
 | |
|       $p = array_merge($p, $options);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // div who will receive and display file list
 | |
| 
 | |
|       $display = "<div id='".$p['filecontainer']."' class='fileupload_info'>";
 | |
| 
 | |
|       if (isset($p['uploads']['_' . $p['name']])) {
 | |
| 
 | |
|          foreach ($p['uploads']['_' . $p['name']] as $uploadId => $upload) {
 | |
| 
 | |
|             $prefix  = substr($upload, 0, 23);
 | |
| 
 | |
|             $displayName = substr($upload, 23);
 | |
| 
 | |
| 
 | |
| 
 | |
|             // get the extension icon
 | |
| 
 | |
|             $extension = pathinfo(GLPI_TMP_DIR . '/' . $upload, PATHINFO_EXTENSION);
 | |
| 
 | |
|             $extensionIcon = '/pics/icones/' . $extension . '-dist.png';
 | |
| 
 | |
|             if (!is_readable(GLPI_ROOT . $extensionIcon)) {
 | |
| 
 | |
|                $extensionIcon = '/pics/icones/defaut-dist.png';
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $extensionIcon = $CFG_GLPI['root_doc'] . $extensionIcon;
 | |
| 
 | |
| 
 | |
| 
 | |
|             // Rebuild the minimal data to show the already uploaded files
 | |
| 
 | |
|             $upload = [
 | |
| 
 | |
|                'name'    => $upload,
 | |
| 
 | |
|                'id'      => 'doc' . $p['name'] . mt_rand(),
 | |
| 
 | |
|                'display' => $displayName,
 | |
| 
 | |
|                'size'    => filesize(GLPI_TMP_DIR . '/' . $upload),
 | |
| 
 | |
|                'prefix'  => $prefix,
 | |
| 
 | |
|             ];
 | |
| 
 | |
|             $tag = $p['uploads']['_tag_' . $p['name']][$uploadId];
 | |
| 
 | |
|             $tag = [
 | |
| 
 | |
|                'name' => $tag,
 | |
| 
 | |
|                'tag'  => "#$tag#",
 | |
| 
 | |
|             ];
 | |
| 
 | |
| 
 | |
| 
 | |
|             // Show the name and size of the upload
 | |
| 
 | |
|             $display .= "<p id='" . $upload['id'] . "'> ";
 | |
| 
 | |
|             $display .= "<img src='$extensionIcon' title='$extension'> ";
 | |
| 
 | |
|             $display .= "<b>" . $upload['display'] . "</b> (" . Toolbox::getSize($upload['size']) . ")";
 | |
| 
 | |
| 
 | |
| 
 | |
|             $name = '_' . $p['name'] . '[' . $uploadId . ']';
 | |
| 
 | |
|             $display .= Html::hidden($name, ['value' => $upload['name']]);
 | |
| 
 | |
| 
 | |
| 
 | |
|             $name = '_prefix_' . $p['name'] . '[' . $uploadId . ']';
 | |
| 
 | |
|             $display .= Html::hidden($name, ['value' => $upload['prefix']]);
 | |
| 
 | |
| 
 | |
| 
 | |
|             $name = '_tag_' . $p['name'] . '[' . $uploadId . ']';
 | |
| 
 | |
|             $display .= Html::hidden($name, ['value' => $tag['name']]);
 | |
| 
 | |
| 
 | |
| 
 | |
|             // show button to delete the upload
 | |
| 
 | |
|             $getEditor = 'null';
 | |
| 
 | |
|             if ($p['editor_id'] != '') {
 | |
| 
 | |
|                $getEditor = "tinymce.get('" . $p['editor_id'] . "')";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $textTag = $tag['tag'];
 | |
| 
 | |
|             $domItems = "{0:'" . $upload['id'] . "', 1:'" . $upload['id'] . "'+'2'}";
 | |
| 
 | |
|             $deleteUpload = "deleteImagePasted($domItems, '$textTag', $getEditor)";
 | |
| 
 | |
|             $display .= '<span class="fa fa-times-circle pointer" onclick="' . $deleteUpload . '"></span>';
 | |
| 
 | |
| 
 | |
| 
 | |
|             $display .= "</p>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $display .= "</div>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($p['display']) {
 | |
| 
 | |
|          echo $display;
 | |
| 
 | |
|          return true;
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          return $display;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function generateImageName() {
 | |
| 
 | |
|       return 'pastedImage'.str_replace('-', '', Html::convDateTime(date('Y-m-d', time())));
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display choice matrix
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 0.85
 | |
| 
 | |
|     * @param $columns   array   of column field name => column label
 | |
| 
 | |
|     * @param $rows      array    of field name => array(
 | |
| 
 | |
|     *      'label' the label of the row
 | |
| 
 | |
|     *      'columns' an array of specific information regaring current row
 | |
| 
 | |
|     *                and given column indexed by column field_name
 | |
| 
 | |
|     *                 * a string if only have to display a string
 | |
| 
 | |
|     *                 * an array('value' => ???, 'readonly' => ???) that is used to Dropdown::showYesNo()
 | |
| 
 | |
|     * @param $options   array   possible:
 | |
| 
 | |
|     *       'title'         of the matrix
 | |
| 
 | |
|     *       'first_cell'    the content of the upper-left cell
 | |
| 
 | |
|     *       'row_check_all' set to true to display a checkbox to check all elements of the row
 | |
| 
 | |
|     *       'col_check_all' set to true to display a checkbox to check all elements of the col
 | |
| 
 | |
|     *       'rand'          random number to use for ids
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return integer random value used to generate the ids
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function showCheckboxMatrix(array $columns, array $rows, array $options = []) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       $param['title']                = '';
 | |
| 
 | |
|       $param['first_cell']           = ' ';
 | |
| 
 | |
|       $param['row_check_all']        = false;
 | |
| 
 | |
|       $param['col_check_all']        = false;
 | |
| 
 | |
|       $param['rotate_column_titles'] = false;
 | |
| 
 | |
|       $param['rand']                 = mt_rand();
 | |
| 
 | |
|       $param['table_class']          = 'tab_cadre_fixehov';
 | |
| 
 | |
|       $param['cell_class_method']    = null;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (is_array($options) && count($options)) {
 | |
| 
 | |
|          foreach ($options as $key => $val) {
 | |
| 
 | |
|             $param[$key] = $val;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $cb_options = ['title' => __s('Check/uncheck all')];
 | |
| 
 | |
| 
 | |
| 
 | |
|       $number_columns = (count($columns) + 1);
 | |
| 
 | |
|       if ($param['row_check_all']) {
 | |
| 
 | |
|          $number_columns += 1;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $width = round(100/$number_columns);
 | |
| 
 | |
|       echo "\n<table class='".$param['table_class']."'>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!empty($param['title'])) {
 | |
| 
 | |
|          echo "\t<tr>\n";
 | |
| 
 | |
|          echo "\t\t<th colspan='$number_columns'>".$param['title']."</th>\n";
 | |
| 
 | |
|          echo "\t</tr>\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "\t<tr class='tab_bg_1'>\n";
 | |
| 
 | |
|       echo "\t\t<td>".$param['first_cell']."</td>\n";
 | |
| 
 | |
|       foreach ($columns as $col_name => $column) {
 | |
| 
 | |
|          $nb_cb_per_col[$col_name] = ['total'   => 0,
 | |
| 
 | |
|                                            'checked' => 0];
 | |
| 
 | |
|          $col_id                   = Html::cleanId('col_label_'.$col_name.'_'.$param['rand']);
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "\t\t<td class='center b";
 | |
| 
 | |
|          if ($param['rotate_column_titles']) {
 | |
| 
 | |
|             echo " rotate";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "' id='$col_id' width='$width%'>";
 | |
| 
 | |
|          if (!is_array($column)) {
 | |
| 
 | |
|             $columns[$col_name] = $column = ['label' => $column];
 | |
| 
 | |
|          }
 | |
| 
 | |
|          if (isset($column['short'])
 | |
| 
 | |
|              && isset($column['long'])) {
 | |
| 
 | |
|             echo $column['short'];
 | |
| 
 | |
|             self::showToolTip($column['long'], ['applyto' => $col_id]);
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             echo $column['label'];
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "</td>\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if ($param['row_check_all']) {
 | |
| 
 | |
|          $col_id = Html::cleanId('col_of_table_'.$param['rand']);
 | |
| 
 | |
|          echo "\t\t<td class='center";
 | |
| 
 | |
|          if ($param['rotate_column_titles']) {
 | |
| 
 | |
|             echo " rotate";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "' id='$col_id'>".__('Select/unselect all')."</td>\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "\t</tr>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       foreach ($rows as $row_name => $row) {
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ((!is_string($row)) && (!is_array($row))) {
 | |
| 
 | |
|             continue;
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "\t<tr class='tab_bg_1'>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (is_string($row)) {
 | |
| 
 | |
|             echo "\t\t<th colspan='$number_columns'>$row</th>\n";
 | |
| 
 | |
|          } else {
 | |
| 
 | |
| 
 | |
| 
 | |
|             $row_id = Html::cleanId('row_label_'.$row_name.'_'.$param['rand']);
 | |
| 
 | |
|             if (isset($row['class'])) {
 | |
| 
 | |
|                $class = $row['class'];
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                $class = '';
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "\t\t<td class='b $class' id='$row_id'>";
 | |
| 
 | |
|             if (!empty($row['label'])) {
 | |
| 
 | |
|                echo $row['label'];
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                echo " ";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</td>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|             $nb_cb_per_row = ['total'   => 0,
 | |
| 
 | |
|                                    'checked' => 0];
 | |
| 
 | |
| 
 | |
| 
 | |
|             foreach ($columns as $col_name => $column) {
 | |
| 
 | |
|                $class = '';
 | |
| 
 | |
|                if ((!empty($row['class'])) && (!empty($column['class']))) {
 | |
| 
 | |
|                   if (is_callable($param['cell_class_method'])) {
 | |
| 
 | |
|                      $class = $param['cell_class_method']($row['class'], $column['class']);
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                } else if (!empty($row['class'])) {
 | |
| 
 | |
|                   $class = $row['class'];
 | |
| 
 | |
|                } else if (!empty($column['class'])) {
 | |
| 
 | |
|                   $class = $column['class'];
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                echo "\t\t<td class='center $class'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|                // Warning: isset return false if the value is NULL ...
 | |
| 
 | |
|                if (array_key_exists($col_name, $row['columns'])) {
 | |
| 
 | |
|                   $content = $row['columns'][$col_name];
 | |
| 
 | |
|                   if (is_array($content)
 | |
| 
 | |
|                       && array_key_exists('checked', $content)) {
 | |
| 
 | |
|                      if (!array_key_exists('readonly', $content)) {
 | |
| 
 | |
|                         $content['readonly'] = false;
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      $content['massive_tags'] = [];
 | |
| 
 | |
|                      if ($param['row_check_all']) {
 | |
| 
 | |
|                         $content['massive_tags'][] = 'row_'.$row_name.'_'.$param['rand'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      if ($param['col_check_all']) {
 | |
| 
 | |
|                         $content['massive_tags'][] = 'col_'.$col_name.'_'.$param['rand'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      if ($param['row_check_all'] && $param['col_check_all']) {
 | |
| 
 | |
|                         $content['massive_tags'][] = 'table_'.$param['rand'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      $content['name'] = $row_name."[$col_name]";
 | |
| 
 | |
|                      $content['id']   = Html::cleanId('cb_'.$row_name.'_'.$col_name.'_'.
 | |
| 
 | |
|                                                       $param['rand']);
 | |
| 
 | |
|                      Html::showCheckbox($content);
 | |
| 
 | |
|                      $nb_cb_per_col[$col_name]['total'] ++;
 | |
| 
 | |
|                      $nb_cb_per_row['total'] ++;
 | |
| 
 | |
|                      if ($content['checked']) {
 | |
| 
 | |
|                         $nb_cb_per_col[$col_name]['checked'] ++;
 | |
| 
 | |
|                         $nb_cb_per_row['checked'] ++;
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   } else if (is_string($content)) {
 | |
| 
 | |
|                      echo $content;
 | |
| 
 | |
|                   } else {
 | |
| 
 | |
|                      echo " ";
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                } else {
 | |
| 
 | |
|                   echo " ";
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                echo "</td>\n";
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
|          if (($param['row_check_all'])
 | |
| 
 | |
|              && (!is_string($row))
 | |
| 
 | |
|              && ($nb_cb_per_row['total'] > 1)) {
 | |
| 
 | |
|             $cb_options['criterion']    = ['tag_for_massive' => 'row_'.$row_name.'_'.
 | |
| 
 | |
|                                                 $param['rand']];
 | |
| 
 | |
|             $cb_options['massive_tags'] = 'table_'.$param['rand'];
 | |
| 
 | |
|             $cb_options['id']           = Html::cleanId('cb_checkall_row_'.$row_name.'_'.
 | |
| 
 | |
|                                                         $param['rand']);
 | |
| 
 | |
|             $cb_options['checked']      = ($nb_cb_per_row['checked']
 | |
| 
 | |
|                                              > ($nb_cb_per_row['total'] / 2));
 | |
| 
 | |
|             echo "\t\t<td class='center'>".Html::getCheckbox($cb_options)."</td>\n";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          echo "\t</tr>\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($param['col_check_all']) {
 | |
| 
 | |
|          echo "\t<tr class='tab_bg_1'>\n";
 | |
| 
 | |
|          echo "\t\t<td>".__('Select/unselect all')."</td>\n";
 | |
| 
 | |
|          foreach ($columns as $col_name => $column) {
 | |
| 
 | |
|             echo "\t\t<td class='center'>";
 | |
| 
 | |
|             if ($nb_cb_per_col[$col_name]['total'] > 1) {
 | |
| 
 | |
|                $cb_options['criterion']    = ['tag_for_massive' => 'col_'.$col_name.'_'.
 | |
| 
 | |
|                                                    $param['rand']];
 | |
| 
 | |
|                $cb_options['massive_tags'] = 'table_'.$param['rand'];
 | |
| 
 | |
|                $cb_options['id']           = Html::cleanId('cb_checkall_col_'.$col_name.'_'.
 | |
| 
 | |
|                                                            $param['rand']);
 | |
| 
 | |
|                $cb_options['checked']      = ($nb_cb_per_col[$col_name]['checked']
 | |
| 
 | |
|                                                 > ($nb_cb_per_col[$col_name]['total'] / 2));
 | |
| 
 | |
|                echo Html::getCheckbox($cb_options);
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                echo " ";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</td>\n";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ($param['row_check_all']) {
 | |
| 
 | |
|             $cb_options['criterion']    = ['tag_for_massive' => 'table_'.$param['rand']];
 | |
| 
 | |
|             $cb_options['massive_tags'] = '';
 | |
| 
 | |
|             $cb_options['id']           = Html::cleanId('cb_checkall_table_'.$param['rand']);
 | |
| 
 | |
|             echo "\t\t<td class='center'>".Html::getCheckbox($cb_options)."</td>\n";
 | |
| 
 | |
|          }
 | |
| 
 | |
|          echo "\t</tr>\n";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</table>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $param['rand'];
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * This function provides a mecanism to send html form by ajax
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $selector selector of a HTML form
 | |
| 
 | |
|     * @param string $success  jacascript code of the success callback
 | |
| 
 | |
|     * @param string $error    jacascript code of the error callback
 | |
| 
 | |
|     * @param string $complete jacascript code of the complete callback
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @see https://api.jquery.com/jQuery.ajax/
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.1
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function ajaxForm($selector, $success = "console.log(html);", $error = "console.error(html)", $complete = '') {
 | |
| 
 | |
|       echo Html::scriptBlock("
 | |
| 
 | |
|       $(function() {
 | |
| 
 | |
|          var lastClicked = null;
 | |
| 
 | |
|          $('input[type=submit], button[type=submit]').click(function(e) {
 | |
| 
 | |
|             e = e || event;
 | |
| 
 | |
|             lastClicked = e.target || e.srcElement;
 | |
| 
 | |
|          });
 | |
| 
 | |
| 
 | |
| 
 | |
|          $('$selector').on('submit', function(e) {
 | |
| 
 | |
|             e.preventDefault();
 | |
| 
 | |
|             var form = $(this);
 | |
| 
 | |
|             var formData = form.closest('form').serializeArray();
 | |
| 
 | |
|             //push submit button
 | |
| 
 | |
|             formData.push({
 | |
| 
 | |
|                name: $(lastClicked).attr('name'),
 | |
| 
 | |
|                value: $(lastClicked).val()
 | |
| 
 | |
|             });
 | |
| 
 | |
| 
 | |
| 
 | |
|             $.ajax({
 | |
| 
 | |
|                url: form.attr('action'),
 | |
| 
 | |
|                type: form.attr('method'),
 | |
| 
 | |
|                data: formData,
 | |
| 
 | |
|                success: function(html) {
 | |
| 
 | |
|                   $success
 | |
| 
 | |
|                },
 | |
| 
 | |
|                error: function(html) {
 | |
| 
 | |
|                   $error
 | |
| 
 | |
|                },
 | |
| 
 | |
|                complete: function(html) {
 | |
| 
 | |
|                   $complete
 | |
| 
 | |
|                }
 | |
| 
 | |
|             });
 | |
| 
 | |
|          });
 | |
| 
 | |
|       });
 | |
| 
 | |
|       ");
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * In this function, we redefine 'window.alert' javascript function
 | |
| 
 | |
|     * by a jquery-ui dialog equivalent (but prettier).
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.1
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function redefineAlert() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo self::scriptBlock("
 | |
| 
 | |
|       window.old_alert = window.alert;
 | |
| 
 | |
|       window.alert = function(message, caption) {
 | |
| 
 | |
|          // Don't apply methods on undefined objects... ;-) #3866
 | |
| 
 | |
|          if(typeof message == 'string') {
 | |
| 
 | |
|             message = message.replace('\\n', '<br>');
 | |
| 
 | |
|          }
 | |
| 
 | |
|          caption = caption || '"._sn('Information', 'Information', 1)."';
 | |
| 
 | |
|          $('<div></div>').html(message).dialog({
 | |
| 
 | |
|             title: caption,
 | |
| 
 | |
|             buttons: {
 | |
| 
 | |
|                ".__s('OK').": function() {
 | |
| 
 | |
|                   $(this).dialog('close');
 | |
| 
 | |
|                }
 | |
| 
 | |
|             },
 | |
| 
 | |
|             dialogClass: 'glpi_modal',
 | |
| 
 | |
|             open: function(event, ui) {
 | |
| 
 | |
|                $(this).parent().prev('.ui-widget-overlay').addClass('glpi_modal');
 | |
| 
 | |
|                $(this).next('div').find('button').focus();
 | |
| 
 | |
|             },
 | |
| 
 | |
|             close: function(){
 | |
| 
 | |
|                $(this).remove();
 | |
| 
 | |
|             },
 | |
| 
 | |
|             draggable: true,
 | |
| 
 | |
|             modal: true,
 | |
| 
 | |
|             resizable: false,
 | |
| 
 | |
|             width: 'auto'
 | |
| 
 | |
|          });
 | |
| 
 | |
|       };");
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Summary of confirmCallback
 | |
| 
 | |
|     * Is a replacement for Javascript native confirm function
 | |
| 
 | |
|     * Beware that native confirm is synchronous by nature (will block
 | |
| 
 | |
|     * browser waiting an answer from user, but that this is emulating the confirm behaviour
 | |
| 
 | |
|     * by using callbacks functions when user presses 'Yes' or 'No' buttons.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.1
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $msg            string      message to be shown
 | |
| 
 | |
|     * @param $title          string      title for dialog box
 | |
| 
 | |
|     * @param $yesCallback    string      function that will be called when 'Yes' is pressed
 | |
| 
 | |
|     *                                    (default null)
 | |
| 
 | |
|     * @param $noCallback     string      function that will be called when 'No' is pressed
 | |
| 
 | |
|     *                                    (default null)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsConfirmCallback($msg, $title, $yesCallback = null, $noCallback = null) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       return "
 | |
| 
 | |
|          // the Dialog and its properties.
 | |
| 
 | |
|          $('<div></div>').dialog({
 | |
| 
 | |
|             open: function(event, ui) { $('.ui-dialog-titlebar-close').hide(); },
 | |
| 
 | |
|             close: function(event, ui) { $(this).remove(); },
 | |
| 
 | |
|             resizable: false,
 | |
| 
 | |
|             modal: true,
 | |
| 
 | |
|             title: '".Toolbox::addslashes_deep($title)."',
 | |
| 
 | |
|             buttons: {
 | |
| 
 | |
|                '" . __s('Yes') . "': function () {
 | |
| 
 | |
|                      $(this).dialog('close');
 | |
| 
 | |
|                      ".($yesCallback!==null?'('.$yesCallback.')()':'')."
 | |
| 
 | |
|                   },
 | |
| 
 | |
|                '" . __s('No') . "': function () {
 | |
| 
 | |
|                      $(this).dialog('close');
 | |
| 
 | |
|                      ".($noCallback!==null?'('.$noCallback.')()':'')."
 | |
| 
 | |
|                   }
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }).text('".Toolbox::addslashes_deep($msg)."');
 | |
| 
 | |
|       ";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * In this function, we redefine 'window.confirm' javascript function
 | |
| 
 | |
|     * by a jquery-ui dialog equivalent (but prettier).
 | |
| 
 | |
|     * This dialog is normally asynchronous and can't return a boolean like naive window.confirm.
 | |
| 
 | |
|     * We manage this behavior with a global variable 'confirmed' who watchs the acceptation of dialog.
 | |
| 
 | |
|     * In this case, we trigger a new click on element to return the value (and without display dialog)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.1
 | |
| 
 | |
|    */
 | |
| 
 | |
|    static function redefineConfirm() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo self::scriptBlock("
 | |
| 
 | |
|       var confirmed = false;
 | |
| 
 | |
|       var lastClickedElement;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // store last clicked element on dom
 | |
| 
 | |
|       $(document).click(function(event) {
 | |
| 
 | |
|           lastClickedElement = $(event.target);
 | |
| 
 | |
|       });
 | |
| 
 | |
| 
 | |
| 
 | |
|       // asynchronous confirm dialog with jquery ui
 | |
| 
 | |
|       var newConfirm = function(message, caption) {
 | |
| 
 | |
|          message = message.replace('\\n', '<br>');
 | |
| 
 | |
|          caption = caption || '';
 | |
| 
 | |
| 
 | |
| 
 | |
|          $('<div></div>').html(message).dialog({
 | |
| 
 | |
|             title: caption,
 | |
| 
 | |
|             dialogClass: 'fixed glpi_modal',
 | |
| 
 | |
|             buttons: {
 | |
| 
 | |
|                '".addslashes(_x('button', 'Confirm'))."': function () {
 | |
| 
 | |
|                   $(this).dialog('close');
 | |
| 
 | |
|                   confirmed = true;
 | |
| 
 | |
| 
 | |
| 
 | |
|                   //trigger click on the same element (to return true value)
 | |
| 
 | |
|                   lastClickedElement.click();
 | |
| 
 | |
| 
 | |
| 
 | |
|                   // re-init confirmed (to permit usage of 'confirm' function again in the page)
 | |
| 
 | |
|                   // maybe timeout is not essential ...
 | |
| 
 | |
|                   setTimeout(function(){  confirmed = false; }, 100);
 | |
| 
 | |
|                },
 | |
| 
 | |
|                '".addslashes(_x('button', 'Cancel'))."': function () {
 | |
| 
 | |
|                   $(this).dialog('close');
 | |
| 
 | |
|                   confirmed = false;
 | |
| 
 | |
|                }
 | |
| 
 | |
|             },
 | |
| 
 | |
|             open: function(event, ui) {
 | |
| 
 | |
|                $(this).parent().prev('.ui-widget-overlay').addClass('glpi_modal');
 | |
| 
 | |
|             },
 | |
| 
 | |
|             close: function () {
 | |
| 
 | |
|                 $(this).remove();
 | |
| 
 | |
|             },
 | |
| 
 | |
|             draggable: true,
 | |
| 
 | |
|             modal: true,
 | |
| 
 | |
|             resizable: false,
 | |
| 
 | |
|             width: 'auto'
 | |
| 
 | |
|          });
 | |
| 
 | |
|       };
 | |
| 
 | |
| 
 | |
| 
 | |
|       window.nativeConfirm = window.confirm;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // redefine native 'confirm' function
 | |
| 
 | |
|       window.confirm = function (message, caption) {
 | |
| 
 | |
|          // if watched var isn't true, we can display dialog
 | |
| 
 | |
|          if(!confirmed) {
 | |
| 
 | |
|             // call asynchronous dialog
 | |
| 
 | |
|             newConfirm(message, caption);
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          // return early
 | |
| 
 | |
|          return confirmed;
 | |
| 
 | |
|       };");
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Summary of jsAlertCallback
 | |
| 
 | |
|     * Is a replacement for Javascript native alert function
 | |
| 
 | |
|     * Beware that native alert is synchronous by nature (will block
 | |
| 
 | |
|     * browser waiting an answer from user, but that this is emulating the alert behaviour
 | |
| 
 | |
|     * by using a callback function when user presses 'Ok' button.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.1
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param $msg          string   message to be shown
 | |
| 
 | |
|     * @param $title        string   title for dialog box
 | |
| 
 | |
|     * @param $okCallback   string   function that will be called when 'Ok' is pressed
 | |
| 
 | |
|     *                               (default null)
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    static function jsAlertCallback($msg, $title, $okCallback = null) {
 | |
| 
 | |
|       return "
 | |
| 
 | |
|          // Dialog and its properties.
 | |
| 
 | |
|          $('<div></div>').dialog({
 | |
| 
 | |
|             open: function(event, ui) { $('.ui-dialog-titlebar-close').hide(); },
 | |
| 
 | |
|             close: function(event, ui) { $(this).remove(); },
 | |
| 
 | |
|             resizable: false,
 | |
| 
 | |
|             modal: true,
 | |
| 
 | |
|             title: '".Toolbox::addslashes_deep( $title )."',
 | |
| 
 | |
|             buttons: {
 | |
| 
 | |
|                '".__s('OK')."': function () {
 | |
| 
 | |
|                      $(this).dialog('close');
 | |
| 
 | |
|                      ".($okCallback!==null?'('.$okCallback.')()':'')."
 | |
| 
 | |
|                   }
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }).text('".Toolbox::addslashes_deep($msg)."');
 | |
| 
 | |
|          ";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get image html tag for image document.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param int    $document_id  identifier of the document
 | |
| 
 | |
|     * @param int    $width        witdh of the final image
 | |
| 
 | |
|     * @param int    $height       height of the final image
 | |
| 
 | |
|     * @param bool   $addLink      boolean, do we need to add an anchor link
 | |
| 
 | |
|     * @param string $more_link    append to the link (ex &test=true)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.4.3
 | |
| 
 | |
|    **/
 | |
| 
 | |
|    public static function getImageHtmlTagForDocument($document_id, $width, $height, $addLink = true, $more_link = "") {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $document = new Document();
 | |
| 
 | |
|       if (!$document->getFromDB($document_id)) {
 | |
| 
 | |
|          return '';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $base_path = $CFG_GLPI['root_doc'];
 | |
| 
 | |
|       if (isCommandLine()) {
 | |
| 
 | |
|          $base_path = parse_url($CFG_GLPI['url_base'], PHP_URL_PATH);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Add only image files : try to detect mime type
 | |
| 
 | |
|       $ok   = false;
 | |
| 
 | |
|       $mime = '';
 | |
| 
 | |
|       if (isset($document->fields['filepath'])) {
 | |
| 
 | |
|          $fullpath = GLPI_DOC_DIR."/".$document->fields['filepath'];
 | |
| 
 | |
|          $mime = Toolbox::getMime($fullpath);
 | |
| 
 | |
|          $ok   = Toolbox::getMime($fullpath, 'image');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!($ok || empty($mime))) {
 | |
| 
 | |
|          return '';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $out = '';
 | |
| 
 | |
|       if ($addLink) {
 | |
| 
 | |
|          $out .= '<a '
 | |
| 
 | |
|                  . 'href="' . $base_path . '/front/document.send.php?docid=' . $document_id . $more_link . '" '
 | |
| 
 | |
|                  . 'target="_blank" '
 | |
| 
 | |
|                  . '>';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= '<img ';
 | |
| 
 | |
|       if (isset($document->fields['tag'])) {
 | |
| 
 | |
|          $out .= 'alt="' . $document->fields['tag'] . '" ';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $out .= 'width="' . $width . '" '
 | |
| 
 | |
|               . 'src="' . $base_path . '/front/document.send.php?docid=' . $document_id . $more_link . '" '
 | |
| 
 | |
|               . '/>';
 | |
| 
 | |
|       if ($addLink) {
 | |
| 
 | |
|          $out .= '</a>';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $out;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get copyright message in HTML (used in footers)
 | |
| 
 | |
|     * @since 9.1
 | |
| 
 | |
|     * @param boolean $withVersion include GLPI version ?
 | |
| 
 | |
|     * @return string HTML copyright
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function getCopyrightMessage($withVersion = true) {
 | |
| 
 | |
|       $message = "<a href=\"http://glpi-project.org/\" title=\"Powered by Teclib and contributors\" class=\"copyright\">";
 | |
| 
 | |
|       $message .= "GLPI ";
 | |
| 
 | |
|       // if required, add GLPI version (eg not for login page)
 | |
| 
 | |
|       if ($withVersion) {
 | |
| 
 | |
|           $message .= GLPI_VERSION . " ";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $message .= "Copyright (C) 2015-" . GLPI_YEAR . " Teclib' and contributors".
 | |
| 
 | |
|          "</a>";
 | |
| 
 | |
|       return $message;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * A a required javascript lib
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string|array $name Either a know name, or an array defining lib
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static public function requireJs($name) {
 | |
| 
 | |
|       global $CFG_GLPI, $PLUGIN_HOOKS;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($_SESSION['glpi_js_toload'][$name])) {
 | |
| 
 | |
|          //already in stack
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
|       switch ($name) {
 | |
| 
 | |
|          case 'clipboard':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/clipboard.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'tinymce':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/tinymce.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'planning':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/planning.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'flatpickr':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/flatpickr.js';
 | |
| 
 | |
|             if (isset($_SESSION['glpilanguage'])) {
 | |
| 
 | |
|                $filename = "public/lib/flatpickr/l10n/".
 | |
| 
 | |
|                   strtolower($CFG_GLPI["languages"][$_SESSION['glpilanguage']][3]).".js";
 | |
| 
 | |
|                if (file_exists(GLPI_ROOT . '/' . $filename)) {
 | |
| 
 | |
|                   $_SESSION['glpi_js_toload'][$name][] = $filename;
 | |
| 
 | |
|                   break;
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'fullcalendar':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/fullcalendar.js';
 | |
| 
 | |
|             if (isset($_SESSION['glpilanguage'])) {
 | |
| 
 | |
|                foreach ([2, 3] as $loc) {
 | |
| 
 | |
|                   $filename = "public/lib/fullcalendar/locales/".
 | |
| 
 | |
|                      strtolower($CFG_GLPI["languages"][$_SESSION['glpilanguage']][$loc]).".js";
 | |
| 
 | |
|                   if (file_exists(GLPI_ROOT . '/' . $filename)) {
 | |
| 
 | |
|                      $_SESSION['glpi_js_toload'][$name][] = $filename;
 | |
| 
 | |
|                      break;
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'jstree':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/jstree.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'gantt':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/jquery-gantt.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'kanban':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/kanban.js';
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'lib/jqueryplugins/jquery.ui.touch-punch.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'rateit':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/jquery.rateit.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'fileupload':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/file-type.js';
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/jquery-file-upload.js';
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/fileupload.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'charts':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload']['charts'][] = 'public/lib/chartist.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'notifications_ajax';
 | |
| 
 | |
|             $_SESSION['glpi_js_toload']['notifications_ajax'][] = 'js/notifications_ajax.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'fuzzy':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/fuzzy.js';
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/fuzzysearch.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'dashboard':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/dashboard.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'marketplace':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/marketplace.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'gridstack':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/gridstack.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'sortable':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/sortable.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'rack':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/rack.js';
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'lib/jqueryplugins/jquery.ui.touch-punch.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'leaflet':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/leaflet.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'log_filters':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'js/log_filters.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'codemirror':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/codemirror.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          case 'photoswipe':
 | |
| 
 | |
|             $_SESSION['glpi_js_toload'][$name][] = 'public/lib/photoswipe.js';
 | |
| 
 | |
|             break;
 | |
| 
 | |
|          default:
 | |
| 
 | |
|             $found = false;
 | |
| 
 | |
|             if (isset($PLUGIN_HOOKS['javascript']) && isset($PLUGIN_HOOKS['javascript'][$name])) {
 | |
| 
 | |
|                $found = true;
 | |
| 
 | |
|                $jslibs = $PLUGIN_HOOKS['javascript'][$name];
 | |
| 
 | |
|                if (!is_array($jslibs)) {
 | |
| 
 | |
|                   $jslibs = [$jslibs];
 | |
| 
 | |
|                }
 | |
| 
 | |
|                foreach ($jslibs as $jslib) {
 | |
| 
 | |
|                   $_SESSION['glpi_js_toload'][$name][] = $jslib;
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             if (!$found) {
 | |
| 
 | |
|                Toolbox::logError("JS lib $name is not known!");
 | |
| 
 | |
|             }
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Load javascripts
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static private function loadJavascript() {
 | |
| 
 | |
|       global $CFG_GLPI, $PLUGIN_HOOKS;
 | |
| 
 | |
| 
 | |
| 
 | |
|       //load on demand scripts
 | |
| 
 | |
|       if (isset($_SESSION['glpi_js_toload'])) {
 | |
| 
 | |
|          foreach ($_SESSION['glpi_js_toload'] as $key => $script) {
 | |
| 
 | |
|             if (is_array($script)) {
 | |
| 
 | |
|                foreach ($script as $s) {
 | |
| 
 | |
|                   echo Html::script($s);
 | |
| 
 | |
|                }
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                echo Html::script($script);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             unset($_SESSION['glpi_js_toload'][$key]);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       //locales for js libraries
 | |
| 
 | |
|       if (isset($_SESSION['glpilanguage'])) {
 | |
| 
 | |
|          // select2
 | |
| 
 | |
|          $filename = "public/lib/select2/js/i18n/".
 | |
| 
 | |
|                      $CFG_GLPI["languages"][$_SESSION['glpilanguage']][2].".js";
 | |
| 
 | |
|          if (file_exists(GLPI_ROOT.'/'.$filename)) {
 | |
| 
 | |
|             echo Html::script($filename);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // transfer core variables to javascript side
 | |
| 
 | |
|       echo self::getCoreVariablesForJavascript(true);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Some Javascript-Functions which we may need later
 | |
| 
 | |
|       echo Html::script('js/common.js');
 | |
| 
 | |
|       self::redefineAlert();
 | |
| 
 | |
|       self::redefineConfirm();
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (isset($CFG_GLPI['notifications_ajax']) && $CFG_GLPI['notifications_ajax'] && !Session::isImpersonateActive()) {
 | |
| 
 | |
|          $options = [
 | |
| 
 | |
|             'interval'  => ($CFG_GLPI['notifications_ajax_check_interval'] ? $CFG_GLPI['notifications_ajax_check_interval'] : 5) * 1000,
 | |
| 
 | |
|             'sound'     => $CFG_GLPI['notifications_ajax_sound'] ? $CFG_GLPI['notifications_ajax_sound'] : false,
 | |
| 
 | |
|             'icon'      => ($CFG_GLPI["notifications_ajax_icon_url"] ? $CFG_GLPI['root_doc'] . $CFG_GLPI['notifications_ajax_icon_url'] : false),
 | |
| 
 | |
|             'user_id'   => Session::getLoginUserID()
 | |
| 
 | |
|          ];
 | |
| 
 | |
|          $js = "$(function() {
 | |
| 
 | |
|             notifications_ajax = new GLPINotificationsAjax(". json_encode($options) . ");
 | |
| 
 | |
|             notifications_ajax.start();
 | |
| 
 | |
|          });";
 | |
| 
 | |
|          echo Html::scriptBlock($js);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // add Ajax display message after redirect
 | |
| 
 | |
|       Html::displayAjaxMessageAfterRedirect();
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Add specific javascript for plugins
 | |
| 
 | |
|       if (isset($PLUGIN_HOOKS['add_javascript']) && count($PLUGIN_HOOKS['add_javascript'])) {
 | |
| 
 | |
|          foreach ($PLUGIN_HOOKS["add_javascript"] as $plugin => $files) {
 | |
| 
 | |
|             $plugin_root_dir = Plugin::getPhpDir($plugin, true);
 | |
| 
 | |
|             $plugin_web_dir  = Plugin::getWebDir($plugin, false);
 | |
| 
 | |
|             if (!Plugin::isPluginActive($plugin)) {
 | |
| 
 | |
|                continue;
 | |
| 
 | |
|             }
 | |
| 
 | |
|             $version = Plugin::getInfo($plugin, 'version');
 | |
| 
 | |
|             if (!is_array($files)) {
 | |
| 
 | |
|                $files = [$files];
 | |
| 
 | |
|             }
 | |
| 
 | |
|             foreach ($files as $file) {
 | |
| 
 | |
|                if (file_exists($plugin_root_dir."/$file")) {
 | |
| 
 | |
|                   echo Html::script("$plugin_web_dir/$file", ['version' => $version]);
 | |
| 
 | |
|                } else {
 | |
| 
 | |
|                   Toolbox::logWarning("$file file not found from plugin $plugin!");
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (file_exists(GLPI_ROOT."/js/analytics.js")) {
 | |
| 
 | |
|          echo Html::script("js/analytics.js");
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * transfer some var of php to javascript
 | |
| 
 | |
|     * (warning, don't expose all keys of $CFG_GLPI, some shouldn't be available client side)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param bool $full if false, don't expose all variables from CFG_GLPI (only url_base & root_doc)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.5
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function getCoreVariablesForJavascript(bool $full = false) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $cfg_glpi = "var CFG_GLPI  = {
 | |
| 
 | |
|          'url_base': '".(isset($CFG_GLPI['url_base']) ? $CFG_GLPI["url_base"] : '')."',
 | |
| 
 | |
|          'root_doc': '".$CFG_GLPI["root_doc"]."',
 | |
| 
 | |
|       };";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($full) {
 | |
| 
 | |
|          $debug = (isset($_SESSION['glpi_use_mode'])
 | |
| 
 | |
|                    && $_SESSION['glpi_use_mode'] == Session::DEBUG_MODE ? true : false);
 | |
| 
 | |
|          $cfg_glpi = "var CFG_GLPI  = ".json_encode(Config::getSafeConfig(true), $debug ? JSON_PRETTY_PRINT : 0).";";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $plugins_path = [];
 | |
| 
 | |
|       foreach (Plugin::getPlugins() as $key) {
 | |
| 
 | |
|          $plugins_path[$key] = Plugin::getWebDir($key, false);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       $plugins_path = 'var GLPI_PLUGINS_PATH = '.json_encode($plugins_path).';';
 | |
| 
 | |
| 
 | |
| 
 | |
|       return self::scriptBlock("
 | |
| 
 | |
|          $cfg_glpi
 | |
| 
 | |
|          $plugins_path
 | |
| 
 | |
|       ");
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get a stylesheet or javascript path, minified if any
 | |
| 
 | |
|     * Return minified path if minified file exists and not in
 | |
| 
 | |
|     * debug mode, else standard path
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $file_path File path part
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static private function getMiniFile($file_path) {
 | |
| 
 | |
|       $debug = (isset($_SESSION['glpi_use_mode'])
 | |
| 
 | |
|          && $_SESSION['glpi_use_mode'] == Session::DEBUG_MODE ? true : false);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $file_minpath = str_replace(['.css', '.js'], ['.min.css', '.min.js'], $file_path);
 | |
| 
 | |
|       if (file_exists(GLPI_ROOT . '/' . $file_minpath)) {
 | |
| 
 | |
|          if (!$debug || !file_exists(GLPI_ROOT . '/' . $file_path)) {
 | |
| 
 | |
|             return $file_minpath;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $file_path;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Return prefixed URL
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $url Original URL (not prefixed)
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static public final function getPrefixedUrl($url) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
|       $prefix = $CFG_GLPI['root_doc'];
 | |
| 
 | |
|       if (substr($url, 0, 1) != '/') {
 | |
| 
 | |
|          $prefix .= '/';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       return $prefix . $url;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Add the HTML code to refresh the current page at a define interval of time
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param int|false   $timer    The time (in minute) to refresh the page
 | |
| 
 | |
|     * @param string|null $callback A javascript callback function to execute on timer
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static public function manageRefreshPage($timer = false, $callback = null) {
 | |
| 
 | |
|       if (!$timer) {
 | |
| 
 | |
|          $timer = $_SESSION['glpirefresh_views'] ?? 0;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($callback === null) {
 | |
| 
 | |
|          $callback = 'window.location.reload()';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $text = "";
 | |
| 
 | |
|       if ($timer > 0) {
 | |
| 
 | |
|          // set timer to millisecond from minutes
 | |
| 
 | |
|          $timer = $timer * MINUTE_TIMESTAMP * 1000;
 | |
| 
 | |
| 
 | |
| 
 | |
|          // call callback function to $timer interval
 | |
| 
 | |
|          $text = self::scriptBlock("window.setInterval(function() {
 | |
| 
 | |
|                $callback
 | |
| 
 | |
|             }, $timer);");
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $text;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Manage events from js/fuzzysearch.js
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since 9.2
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $action action to switch (should be actually 'getHtml' or 'getList')
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function fuzzySearch($action = '') {
 | |
| 
 | |
|       switch ($action) {
 | |
| 
 | |
|          case 'getHtml':
 | |
| 
 | |
|             return "<div id='fuzzysearch'>
 | |
| 
 | |
|                     <input type='text' placeholder='".__("Start typing to find a menu")."'>
 | |
| 
 | |
|                     <ul class='results'></ul>
 | |
| 
 | |
|                     <i class='fa fa-2x fa-times'></i>
 | |
| 
 | |
|                     </div>
 | |
| 
 | |
|                     <div class='ui-widget-overlay ui-front fuzzymodal' style='z-index: 100;'>
 | |
| 
 | |
|                     </div>";
 | |
| 
 | |
|             break;
 | |
| 
 | |
| 
 | |
| 
 | |
|          default;
 | |
| 
 | |
|             $fuzzy_entries = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|             // retrieve menu
 | |
| 
 | |
|             foreach ($_SESSION['glpimenu'] as $firstlvl) {
 | |
| 
 | |
|                if (isset($firstlvl['content'])) {
 | |
| 
 | |
|                   foreach ($firstlvl['content'] as $menu) {
 | |
| 
 | |
|                      if (isset($menu['title']) && strlen($menu['title']) > 0) {
 | |
| 
 | |
|                         $fuzzy_entries[] = [
 | |
| 
 | |
|                            'url'   => $menu['page'],
 | |
| 
 | |
|                            'title' => $firstlvl['title']." > ".$menu['title']
 | |
| 
 | |
|                         ];
 | |
| 
 | |
| 
 | |
| 
 | |
|                         if (isset($menu['options'])) {
 | |
| 
 | |
|                            foreach ($menu['options'] as $submenu) {
 | |
| 
 | |
|                               if (isset($submenu['title']) && strlen($submenu['title']) > 0) {
 | |
| 
 | |
|                                  $fuzzy_entries[] = [
 | |
| 
 | |
|                                     'url'   => $submenu['page'],
 | |
| 
 | |
|                                     'title' => $firstlvl['title']." > ".
 | |
| 
 | |
|                                                $menu['title']." > ".
 | |
| 
 | |
|                                                $submenu['title']
 | |
| 
 | |
|                                  ];
 | |
| 
 | |
|                               }
 | |
| 
 | |
|                            }
 | |
| 
 | |
|                         }
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
| 
 | |
| 
 | |
|                if (isset($firstlvl['default'])) {
 | |
| 
 | |
|                   if (strlen($menu['title']) > 0) {
 | |
| 
 | |
|                      $fuzzy_entries[] = [
 | |
| 
 | |
|                         'url'   => $firstlvl['default'],
 | |
| 
 | |
|                         'title' => $firstlvl['title']
 | |
| 
 | |
|                      ];
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             // return the entries to ajax call
 | |
| 
 | |
|             return json_encode($fuzzy_entries);
 | |
| 
 | |
|             break;
 | |
| 
 | |
|       }
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display GLPI top menu
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param boolean $full True for full interface, false otherwise
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     */
 | |
|    private static function displayTopMenu($full) {
 | |
| 
 | |
|       global $CFG_GLPI;
 | |
| 
 | |
| 
 | |
| 
 | |
|       /// Prefs / Logout link
 | |
| 
 | |
|       echo "<div id='c_preference' >";
 | |
| 
 | |
|       echo "<ul>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<li id='deconnexion'>";
 | |
| 
 | |
|       echo "<a href='".$CFG_GLPI["root_doc"]."/front/logout.php";
 | |
| 
 | |
|             /// logout witout noAuto login for extauth
 | |
| 
 | |
|       if (isset($_SESSION['glpiextauth']) && $_SESSION['glpiextauth']) {
 | |
| 
 | |
|          echo "?noAUTO=1";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "' title=\"".__s('Logout')."\" class='fa fa-sign-out-alt'>";
 | |
| 
 | |
|       // check user id : header used for display messages when session logout
 | |
| 
 | |
|       echo "<span class='sr-only'>" . __s('Logout') . "></span>";
 | |
| 
 | |
|       echo "</a>";
 | |
| 
 | |
|       echo "</li>\n";
 | |
| 
 | |
| 
 | |
| 
 | |
|       $username = '';
 | |
| 
 | |
|       $title = __s('My settings');
 | |
| 
 | |
|       if (Session::getLoginUserID()) {
 | |
| 
 | |
|          $username = formatUserName(0, $_SESSION["glpiname"], $_SESSION["glpirealname"],
 | |
| 
 | |
|                                     $_SESSION["glpifirstname"], 0, 20);
 | |
| 
 | |
|          $title = sprintf(
 | |
| 
 | |
|             __s('%1$s - %2$s'),
 | |
| 
 | |
|             __s('My settings'),
 | |
| 
 | |
|             $username
 | |
| 
 | |
|          );
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "<li id='preferences_link'><a href='".$CFG_GLPI["root_doc"]."/front/preference.php' title=\"".
 | |
| 
 | |
|                  $title."\" class='fa fa-cog'>";
 | |
| 
 | |
|       echo "<span class='sr-only'>" . __s('My settings') . "</span>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // check user id : header used for display messages when session logout
 | |
| 
 | |
|       if (Session::getLoginUserID()) {
 | |
| 
 | |
|          echo "<span id='myname'>{$username}</span>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</a></li>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (Config::canUpdate()) {
 | |
| 
 | |
|          $is_debug_active = $_SESSION['glpi_use_mode'] == Session::DEBUG_MODE;
 | |
| 
 | |
|          $class = 'debug' . ($is_debug_active ? 'on' : 'off');
 | |
| 
 | |
|          $title = sprintf(
 | |
| 
 | |
|             __s('%1$s - %2$s'),
 | |
| 
 | |
|             __s('Change mode'),
 | |
| 
 | |
|             $is_debug_active ? __s('Debug mode enabled') : __s('Debug mode disabled')
 | |
| 
 | |
|          );
 | |
| 
 | |
|          echo "<li id='debug_mode'>";
 | |
| 
 | |
|          echo "<a href='{$CFG_GLPI['root_doc']}/ajax/switchdebug.php' class='fa fa-bug $class'
 | |
| 
 | |
|                 title='$title'>";
 | |
| 
 | |
|          echo "<span class='sr-only'>" . __s('Change mode') . "</span>";
 | |
| 
 | |
|          echo "</a>";
 | |
| 
 | |
|          echo "</li>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       /// Bookmark load
 | |
| 
 | |
|       echo "<li id='bookmark_link'>";
 | |
| 
 | |
|       Ajax::createSlidePanel(
 | |
| 
 | |
|          'showSavedSearches',
 | |
| 
 | |
|          [
 | |
| 
 | |
|             'title'     => __('Saved searches'),
 | |
| 
 | |
|             'url'       => $CFG_GLPI['root_doc'] . '/ajax/savedsearch.php?action=show',
 | |
| 
 | |
|             'icon'      => '/pics/menu_config.png',
 | |
| 
 | |
|             'icon_url'  => SavedSearch::getSearchURL(),
 | |
| 
 | |
|             'icon_txt'  => __('Manage saved searches')
 | |
| 
 | |
|          ]
 | |
| 
 | |
|       );
 | |
| 
 | |
|       echo "<a href='#' id='showSavedSearchesLink' class='fa fa-star' title=\"".
 | |
| 
 | |
|              __s('Load a saved search'). "\">";
 | |
| 
 | |
|       echo "<span class='sr-only'>" . __('Saved searches')  . "</span>";
 | |
| 
 | |
|       echo "</a></li>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (Session::getCurrentInterface() == 'central') {
 | |
| 
 | |
|          $url_help_link = (empty($CFG_GLPI["central_doc_url"])
 | |
| 
 | |
|             ? "http://glpi-project.org/help-central"
 | |
| 
 | |
|             : $CFG_GLPI["central_doc_url"]);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $url_help_link = (empty($CFG_GLPI["helpdesk_doc_url"])
 | |
| 
 | |
|             ? "http://glpi-project.org/help-central"
 | |
| 
 | |
|             : $CFG_GLPI["helpdesk_doc_url"]);
 | |
| 
 | |
|       }
 | |
| 
 | |
|       /*
 | |
| 
 | |
|       echo "<li id='help_link'>".
 | |
| 
 | |
|            "<a href='".$url_help_link."' target='_blank' title=\"".
 | |
| 
 | |
|                             __s('Help')."\" class='fa fa-question'>".
 | |
| 
 | |
|            "<span class='sr-only'>" . __('Help') . "</span>";
 | |
| 
 | |
|       echo "</a></li>";
 | |
| 
 | |
|       */
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!GLPI_DEMO_MODE) {
 | |
| 
 | |
|          echo "<li id='language_link'><a href='".$CFG_GLPI["root_doc"].
 | |
| 
 | |
|                     "/front/preference.php?forcetab=User\$1' title=\"".
 | |
| 
 | |
|                     addslashes(Dropdown::getLanguageName($_SESSION['glpilanguage']))."\">".
 | |
| 
 | |
|                     Dropdown::getLanguageName($_SESSION['glpilanguage'])."</a></li>";
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          echo "<li id='language_link'><span>" .
 | |
| 
 | |
|             Dropdown::getLanguageName($_SESSION['glpilanguage']) . "</span></li>";
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<li id='c_recherche'>\n";
 | |
| 
 | |
|       if ($full === true) {
 | |
| 
 | |
|          /// Search engine
 | |
| 
 | |
|          if ($CFG_GLPI['allow_search_global']) {
 | |
| 
 | |
|             echo "<form role='search' method='get' action='".$CFG_GLPI["root_doc"]."/front/search.php'>\n";
 | |
| 
 | |
|             echo "<span id='champRecherche'>";
 | |
| 
 | |
|             echo "<input size='15' type='search' name='globalsearch' placeholder='". __s('Search')."' aria-labelledby='globalsearchglass'>";
 | |
| 
 | |
|             echo "<button type='submit' name='globalsearchglass' id='globalsearchglass'>";
 | |
| 
 | |
|             echo "<i class='fa fa-search'></i><span class='sr-only'>". __s('Search')."</span>";
 | |
| 
 | |
|             echo "</button>";
 | |
| 
 | |
|             echo "</span>";
 | |
| 
 | |
|             Html::closeForm();
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</li>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</ul>";
 | |
| 
 | |
|       echo "</div>\n";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display GLPI main menu
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param boolean $full    True for full interface, false otherwise
 | |
| 
 | |
|     * @param array   $options Option
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     */
 | |
| 
 | |
|    private static function displayMainMenu($full, $options = []) {
 | |
| 
 | |
|       global $CFG_GLPI, $PLUGIN_HOOKS;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $sector = '';
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Generate array for menu and check right
 | |
| 
 | |
|       if ($full === true) {
 | |
| 
 | |
|          $menu    = self::generateMenuSession($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE);
 | |
| 
 | |
|          $sector  = $options['sector'];
 | |
| 
 | |
|          $item    = $options['item'];
 | |
| 
 | |
|          $option  = $options['option'];
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $menu = [];
 | |
| 
 | |
| 
 | |
| 
 | |
|          //  Create ticket
 | |
| 
 | |
|          if (Session::haveRight("ticket", CREATE)) {
 | |
| 
 | |
|             $menu['create_ticket'] = [
 | |
| 
 | |
|                'default'   => '/front/helpdesk.public.php?create_ticket=1',
 | |
| 
 | |
|                'title'     => __s('Create a ticket'),
 | |
| 
 | |
|                'content'   => [true]
 | |
| 
 | |
|             ];
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          //  Tickets
 | |
| 
 | |
|          if (Session::haveRight("ticket", CREATE)
 | |
| 
 | |
|             || Session::haveRight("ticket", Ticket::READMY)
 | |
| 
 | |
|             || Session::haveRight("followup", ITILFollowup::SEEPUBLIC)
 | |
| 
 | |
|          ) {
 | |
| 
 | |
|             $menu['tickets'] = [
 | |
| 
 | |
|                'default'   => '/front/ticket.php',
 | |
| 
 | |
|                'title'     => _n('Ticket', 'Tickets', Session::getPluralNumber()),
 | |
| 
 | |
|                'content'   => [true]
 | |
| 
 | |
|             ];
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          // Reservation
 | |
| 
 | |
|          if (Session::haveRight("reservation", ReservationItem::RESERVEANITEM)) {
 | |
| 
 | |
|             $menu['reservation'] = [
 | |
| 
 | |
|                'default'   => '/front/reservationitem.php',
 | |
| 
 | |
|                'title'     => _n('Reservation', 'Reservations', Session::getPluralNumber()),
 | |
| 
 | |
|                'content'   => [true]
 | |
| 
 | |
|             ];
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          // FAQ
 | |
| 
 | |
|          if (Session::haveRight('knowbase', KnowbaseItem::READFAQ)) {
 | |
| 
 | |
|             $menu['faq'] = [
 | |
| 
 | |
|                'default'   => '/front/helpdesk.faq.php',
 | |
| 
 | |
|                'title'     => __s('FAQ'),
 | |
| 
 | |
|                'content'   => [true]
 | |
| 
 | |
|             ];
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $menu = Plugin::doHookFunction("redefine_menus", $menu);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $already_used_shortcut = ['1'];
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "<div id='c_menu'>";
 | |
| 
 | |
|       echo "<ul id='menu'";
 | |
| 
 | |
|       if ($full === true) {
 | |
| 
 | |
|          echo " class='fullmenu'";
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo ">";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($full === false) {
 | |
| 
 | |
|          // Display Home menu
 | |
| 
 | |
|          echo "<li id='menu1'>";
 | |
| 
 | |
|          echo "<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php' title=\"".
 | |
| 
 | |
|                __s('Home')."\" class='itemP'>".__('Home')."</a>";
 | |
| 
 | |
|          echo "</li>";
 | |
| 
 | |
|       }
 | |
| 
 | |
|  
 | |
| 
 | |
|  
 | |
| 
 | |
| 	$setLang =  $_SESSION['glpilanguage'];
 | |
| 
 | |
|     $htmlUsers = getHtmlSubUsers($_SESSION["glpiID"]);
 | |
| 
 | |
| 
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA"
 | |
| 
 | |
|      || $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur MGX"
 | |
| 
 | |
| 	 || $_SESSION['glpiactiveprofile']['name'] == "Directeur Commercial" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Marketing"
 | |
| 
 | |
| 	 || $_SESSION['glpiactiveprofile']['name'] == "Directeur Production" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement"
 | |
| 
 | |
| 	 || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){ 
 | |
| 
 | |
| 	 
 | |
| 
 | |
| echo'<li id="menu88" data-id="88" class="" onmouseover="mouseIN2()" onmouseout="mouseOUT2()">
 | |
| 
 | |
| 	   <a href="#" class="itemP">'.$_SESSION['SophalLanguages'][$setLang][0].'</a> 
 | |
| 
 | |
| 	   <ul class="ssmenu" id="DG">
 | |
| 
 | |
| 		  <li  id="Grouper_Menu100"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][1].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
| 		  <div id="menu_groupe100" class="closed">';
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Commercial" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 			echo'<li class="">
 | |
| 
 | |
| 					<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Commercial&search=Rechercher&itemtype=PlanningExternalEvent&start=0" >
 | |
| 
 | |
| 					<i class="fa-fw fas fa-calculator"></i>
 | |
| 
 | |
| 					'.$_SESSION['SophalLanguages'][$setLang][2].'
 | |
| 
 | |
| 					</a>
 | |
| 
 | |
| 				 </li>';
 | |
| 
 | |
| 			 }
 | |
| 
 | |
| 			 if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Marketing" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){		
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Marketing&search=Rechercher&itemtype=PlanningExternalEvent&start=0" >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-calculator"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][3].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Production" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Production&search=Rechercher&itemtype=PlanningExternalEvent&start=0" >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-dolly"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][4].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				 echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Approvisionnements&search=Rechercher&itemtype=PlanningExternalEvent&start=0" >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-user-tie"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][5].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH"){	 
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Ressources+Humaines&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-file-signature"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][6].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){	 				 
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Annuelle+Plan+Directeur+Système+Information&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][7].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li> ';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){	 
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href=""   >
 | |
| 
 | |
| 						<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][8].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 					 
 | |
| 
 | |
| 	echo' </div>
 | |
| 
 | |
| 		  <li  id="Grouper_Menu200"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][9].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
| 		  <div id="menu_groupe200" class="closed">';
 | |
| 
 | |
| 		  if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 			 $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Commercial" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 			   echo' <li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Commercial&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][10].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 			if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Marketing"){	
 | |
| 
 | |
| 				echo' <li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Marketing&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-columns"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][11].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>  ';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Production" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						 <a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Production&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-sticky-note"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][12].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Approvisionnement&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-question"></i>
 | |
| 
 | |
| 					   '.$_SESSION['SophalLanguages'][$setLang][13].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Ressources+Humaines&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-calendar-check"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][14].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="'.$CFG_GLPI["root_doc"].'/front/planningexternalevent.php?as_map=0&criteria%5B0%5D%5Blink%5D=AND&criteria%5B0%5D%5Bfield%5D=1&criteria%5B0%5D%5Bsearchtype%5D=contains&criteria%5B0%5D%5Bvalue%5D=Revue+Mensuelle+Suivi+Système+Information&search=Rechercher&itemtype=PlanningExternalEvent&start=0"  >
 | |
| 
 | |
| 						<i class="fa-fw fas fa-file-medical-alt"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][15].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';  
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 				$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] =="Assistant"){
 | |
| 
 | |
| 				echo'<li class="">
 | |
| 
 | |
| 						<a href="#"  >
 | |
| 
 | |
| 						<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 						'.$_SESSION['SophalLanguages'][$setLang][16].'
 | |
| 
 | |
| 						</a>
 | |
| 
 | |
| 					 </li>';
 | |
| 
 | |
| 				}
 | |
| 
 | |
| 				
 | |
| 
 | |
| 	echo' </div>
 | |
| 
 | |
| 		  <li  id="Grouper_Menu300"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][17].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
| 		  <div id="menu_groupe300" class="closed">
 | |
| 
 | |
| 		   <li class="">
 | |
| 
 | |
| 							<a href="'.$CFG_GLPI["root_doc"].'/front/problem.php" >
 | |
| 
 | |
| 							   <i class="fa-fw fas fa-exclamation-triangle"></i>
 | |
| 
 | |
| 							   '.$_SESSION['SophalLanguages'][$setLang][18].'
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li><li class="">
 | |
| 
 | |
| 							<a href="'.$CFG_GLPI["root_doc"].'/front/change.php" >
 | |
| 
 | |
| 							   <i class="fa-fw fas fa-clipboard-check"></i>
 | |
| 
 | |
| 							   '.$_SESSION['SophalLanguages'][$setLang][19].'
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li><li class="">
 | |
| 
 | |
| 							<a href="'.$CFG_GLPI["root_doc"].'/front/planning.php"  accesskey="p">
 | |
| 
 | |
| 							   <i class="fa-fw far fa-calendar-alt"></i>
 | |
| 
 | |
| 							   '.$_SESSION['SophalLanguages'][$setLang][20].'
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li><li class="">
 | |
| 
 | |
| 							<a href="'.$CFG_GLPI["root_doc"].'/front/stat.php"  accesskey="a">
 | |
| 
 | |
| 							   <i class="fa-fw fas fa-chart-bar"></i>
 | |
| 
 | |
| 							   '.$_SESSION['SophalLanguages'][$setLang][21].'
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li>  
 | |
| 
 | |
| 		  </div>';
 | |
| 
 | |
| 		  
 | |
| 
 | |
| 		  
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA"
 | |
| 
 | |
|      || $_SESSION['glpiactiveprofile']['name'] == "DG" ){
 | |
| 
 | |
| 
 | |
| 
 | |
| 	echo'<li  id="Grouper_Menu1300"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][66].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
| 		  <div id="menu_groupe1300" class="closed">
 | |
| 
 | |
| 		                 <li class="">
 | |
| 
 | |
| 							<a href="'.$CFG_GLPI["root_doc"].'/front/rapportImpression.php" >
 | |
| 
 | |
| 							   <i class="fa-fw fas fa-exclamation-triangle"></i>
 | |
| 
 | |
| 							   '.$_SESSION['SophalLanguages'][$setLang][67].'
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li>
 | |
| 
 | |
|                    <li class="">
 | |
| 
 | |
| 							<a href="'.$CFG_GLPI["root_doc"].'/front/access.logs.php" >
 | |
| 
 | |
| 							   <i class="fa-fw fas fa-exclamation-triangle"></i>
 | |
| 
 | |
| 							   '.$_SESSION['SophalLanguages'][$setLang][73].'
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li>
 | |
| 
 | |
| 		  </div>';
 | |
| 
 | |
| 	 }	  
 | |
| 
 | |
| 	 
 | |
| 
 | |
| 		echo'</ul>';
 | |
| 
 | |
|     
 | |
| 
 | |
|  }
 | |
| 
 | |
|     
 | |
| 
 | |
|     
 | |
| 
 | |
|       echo "<li id='menu11' data-id='11' class='' onmouseover='mouseIN1()' onmouseout='mouseOUT1()'>
 | |
| 
 | |
| 		   <a href='' class='itemP'  >".$_SESSION['SophalLanguages'][$setLang][22]."</a>
 | |
| 
 | |
| 		   <ul class='ssmenu' id='MGXmenu' style='display: none;'>	
 | |
| 
 | |
| 		   <li  id='Grouper_Menu900'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>".$_SESSION['SophalLanguages'][$setLang][23]."<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li>
 | |
| 
 | |
|             <div id='menu_groupe900' class='closed'>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 			   if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Transport%20:%20Demande' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Transport%20:%20Demande' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa fa-bus'></i>
 | |
| 
 | |
| 				  ".$_SESSION['SophalLanguages'][$setLang][24]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>	
 | |
| 
 | |
| 			   <li class=''>";
 | |
| 
 | |
| 				 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Transport%20:%20Réclamation' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Transport%20:%20Réclamation' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa fa-bus'></i>
 | |
| 
 | |
| 				  ".$_SESSION['SophalLanguages'][$setLang][25]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>	
 | |
| 
 | |
| 			   <li class=''>";
 | |
| 
 | |
| 			    if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Transport%20:%20Nouvelle%20Recrue' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Transport%20:%20Nouvelle%20Recrue' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa fa-bus'></i>
 | |
| 
 | |
| 				  ".$_SESSION['SophalLanguages'][$setLang][26]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			 </div>	 
 | |
| 
 | |
| 			 <li  id='Grouper_Menu1000'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>".$_SESSION['SophalLanguages'][$setLang][27]."<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li>
 | |
| 
 | |
|             <div id='menu_groupe1000' class='closed'>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20Nettoyage' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20Nettoyage' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][28]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Accidents%20De%20Travail' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Accidents%20De%20Travail' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				".$_SESSION['SophalLanguages'][$setLang][29]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20De%20Desinsectisation' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20De%20Desinsectisation' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][30]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 			  
 | |
| 
 | |
| 				  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20Evacuation' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20Evacuation' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				".$_SESSION['SophalLanguages'][$setLang][31]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Demande%20Incineration' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Demande%20Incineration' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][32]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=HSE%20:%20Constats' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=HSE%20:%20Constats' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo" <i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][33]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  </div>
 | |
| 
 | |
| 			  
 | |
| 
 | |
| 			  
 | |
| 
 | |
| 			  
 | |
| 
 | |
| 			  <li  id='Grouper_Menu1100'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>".$_SESSION['SophalLanguages'][$setLang][34]."<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li>
 | |
| 
 | |
|             <div id='menu_groupe1100' class='closed'>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Sécurité%20:%20Registre%20Des%20Mouvements' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Sécurité%20:%20Registre%20Des%20Mouvements' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-fingerprint'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][35]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Sécurité%20:%20Constats' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Sécurité%20:%20Constats' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-fingerprint'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][36]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>
 | |
| 
 | |
| 			  </div>
 | |
| 
 | |
| 			  
 | |
| 
 | |
| 			   <li  id='Grouper_Menu1200'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>".$_SESSION['SophalLanguages'][$setLang][37]."<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li>
 | |
| 
 | |
|             <div id='menu_groupe1200' class='closed'>
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				 if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Parc%20:%20Demande%20de%20Maintenance' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Parc%20:%20Demande%20de%20Maintenance' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][38]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>	
 | |
| 
 | |
| 			  <li class=''>";
 | |
| 
 | |
| 				  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Travaux%20:%20Demande%20De%20Manoeuvres' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Travaux%20:%20Demande%20De%20Manoeuvres' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				echo"<i class='fa-fw fas fa-edit'></i>
 | |
| 
 | |
| 				 ".$_SESSION['SophalLanguages'][$setLang][39]."
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
| 			  </li>	
 | |
| 
 | |
| 			  </div>
 | |
| 
 | |
| 			</ul>
 | |
| 
 | |
| 			
 | |
| 
 | |
|         </li>"; 
 | |
| 
 | |
|       
 | |
| 
 | |
|       
 | |
| 
 | |
|       echo'<li id="menu99" data-id="99" class=""  onmouseover="mouseIN4()" onmouseout="mouseOUT4()">
 | |
| 
 | |
|    <a href="#" class="itemP">'.$_SESSION['SophalLanguages'][$setLang][40].'</a> 
 | |
| 
 | |
|    <ul class="ssmenu" id="rh">
 | |
| 
 | |
|       <li  id="Grouper_Menu400"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][41].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|       <div id="menu_groupe400" class="closed">
 | |
| 
 | |
|           <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=0" >
 | |
| 
 | |
|          <i class="fa-fw fas fa-file-signature"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][42].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
| 	   <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=1" >
 | |
| 
 | |
|          <i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][43].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
| 	   <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=2" >
 | |
| 
 | |
|          <i class="fa-fw fas fa-edit"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][44].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=11" >
 | |
| 
 | |
|          <i class="fa-fw fas fa-edit"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][74].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
| 	  <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=3" >
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][45].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
| 	  <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=4" >
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][46].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=14" >
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][78].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=8" >
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][72].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=6" >
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][68].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=7" >
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][69].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>';
 | |
| 
 | |
|       
 | |
| 
 | |
|       if( $_SESSION['glpiactiveprofile']['name'] != "Self-Service" && $_SESSION['glpiactiveprofile']['name'] != "Utilisateur-standard" ){
 | |
| 
 | |
| 	 
 | |
| 
 | |
|          echo'
 | |
| 
 | |
|     	 <li class="">
 | |
| 
 | |
|              <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.php?modele=5" >
 | |
| 
 | |
|              <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|              '.$_SESSION['SophalLanguages'][$setLang][65].'
 | |
| 
 | |
|              </a>
 | |
| 
 | |
|           </li>';
 | |
| 
 | |
|     	  
 | |
| 
 | |
|     	}
 | |
| 
 | |
| 	
 | |
| 
 | |
| echo' </div>
 | |
| 
 | |
|       <li  id="Grouper_Menu500"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][47].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|       <div id="menu_groupe500" class="closed">';
 | |
| 
 | |
| 
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Charge Des Formations") {
 | |
| 
 | |
| 	echo '<li class="">
 | |
| 
 | |
|             <a href="'.$CFG_GLPI['root_doc'].'/front/drh.score.employees.php" >
 | |
| 
 | |
|             <i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
|             Scores Employés
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|         </li>';
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG" || (count($htmlUsers) > 0)) {
 | |
| 
 | |
| 	echo '<li class="">
 | |
| 
 | |
|             <a href="'.$CFG_GLPI['root_doc'].'/front/fiche.evaluation.list.php" >
 | |
| 
 | |
|             <i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
|             '.$_SESSION['SophalLanguages'][$setLang][47].'
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|         </li>';
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 	echo '<li class="">
 | |
| 
 | |
|             <a href="'.$CFG_GLPI['root_doc'].'/front/fiche.resultat.evaluation.list.php" >
 | |
| 
 | |
|             <i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
|             '.$_SESSION['SophalLanguages'][$setLang][71].'
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|         </li>';
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Directeur RH" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG") {
 | |
| 
 | |
| 	echo'<li class="">
 | |
| 
 | |
|             <a href="'.$CFG_GLPI['root_doc'].'/front/fiche.config.evaluation.list.php" >
 | |
| 
 | |
|             <i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
|             '.$_SESSION['SophalLanguages'][$setLang][70].'
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|          </li>';
 | |
| 
 | |
| }
 | |
| 
 | |
|          echo'<li class="">
 | |
| 
 | |
|             <a href="#" >
 | |
| 
 | |
|             <i class="fa-fw far fa-sticky-note"></i>
 | |
| 
 | |
|             '.$_SESSION['SophalLanguages'][$setLang][48].'
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
| 		 <li class="">
 | |
| 
 | |
|             <a href="#" >
 | |
| 
 | |
|             <i class="fa-fw fas fa-columns"></i>
 | |
| 
 | |
|             '.$_SESSION['SophalLanguages'][$setLang][49].'
 | |
| 
 | |
|             </a>
 | |
| 
 | |
|          </li>                 
 | |
| 
 | |
|       </div>
 | |
| 
 | |
|      
 | |
| 
 | |
| 	  <li  id="Grouper_Menu700"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][50].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|       <div id="menu_groupe700" class="closed">        
 | |
| 
 | |
|        <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.bulletinPaieListe.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][51].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.MonDossierRH.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|           '.$_SESSION['SophalLanguages'][$setLang][52].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       </div>
 | |
| 
 | |
| 	  <li  id="Grouper_Menu800"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][53].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|       <div id="menu_groupe800" class="closed">        
 | |
| 
 | |
|        <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.boiteIdeesListe.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][54].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|        <li class="">';
 | |
| 
 | |
|           if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=boite%20reclamations' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=boite%20reclamations' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| echo'    <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][55].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.meilleurEmploye.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|         '.$_SESSION['SophalLanguages'][$setLang][56].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
| 	   <li class="">
 | |
| 
 | |
|          <a href="">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|         '.$_SESSION['SophalLanguages'][$setLang][57].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       </div>
 | |
| 
 | |
|       
 | |
| 
 | |
|        <li  id="Grouper_Menu600"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][58].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|       <div id="menu_groupe600" class="closed">';
 | |
| 
 | |
|       if ($_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Admin" ||str_contains($_SESSION['glpiactiveprofile']['name'], "RH")){
 | |
| 
 | |
|          echo' <li class="">
 | |
| 
 | |
|              <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.hs.export.php?content=HS">
 | |
| 
 | |
|                 <i class="far fa-save"></i>
 | |
| 
 | |
|                    Export Heures supplémentaires
 | |
| 
 | |
|              </a>
 | |
| 
 | |
|           </li>';//id -> 36
 | |
| 
 | |
|           echo' <li class="">
 | |
| 
 | |
|           <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.hs.export.php?content=AA">
 | |
| 
 | |
|              <i class="far fa-save"></i>
 | |
| 
 | |
|                 Export Autorisations D\'absences
 | |
| 
 | |
|           </a>
 | |
| 
 | |
|           </li>';//id -> 15
 | |
| 
 | |
|           echo' <li class="">
 | |
| 
 | |
|                <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.hs.export.php?content=AE">
 | |
| 
 | |
|                   <i class="far fa-save"></i>
 | |
| 
 | |
|                      Export Autorisations D\'entrees
 | |
| 
 | |
|                </a>
 | |
| 
 | |
|           </li>';//id -> 16
 | |
| 
 | |
|           echo' <li class="">
 | |
| 
 | |
|                 <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.hs.export.php?content=AS">
 | |
| 
 | |
|                    <i class="far fa-save"></i>
 | |
| 
 | |
|                       Export Autorisations De Sorties
 | |
| 
 | |
|                 </a>
 | |
| 
 | |
|           </li>';//id -> 12
 | |
| 
 | |
|           echo' <li class="">
 | |
| 
 | |
|                 <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.hs.export.php?content=CR">
 | |
| 
 | |
|                    <i class="far fa-save"></i>
 | |
| 
 | |
|                       Export Conges De Recuperations
 | |
| 
 | |
|                 </a>
 | |
| 
 | |
|           </li>';//id -> 38
 | |
| 
 | |
| 	  echo' <li class="">
 | |
| 
 | |
|              <a href="'.$CFG_GLPI['root_doc'].'/front/drh.demandes.hs.export.php?content=RE">
 | |
| 
 | |
|                 <i class="far fa-save"></i>
 | |
| 
 | |
|                    Export Reclamations de paie
 | |
| 
 | |
|              </a>
 | |
| 
 | |
|           </li>';
 | |
| 
 | |
|        }
 | |
| 
 | |
|       echo'
 | |
| 
 | |
|         <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.reglement.interieur.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][59].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|        <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/reminder.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][60].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
| 	  <li class="">
 | |
| 
 | |
|          <a href="">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][61].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/publications.php">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][62].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|      <li class="">
 | |
| 
 | |
|          <a href="'.$CFG_GLPI['root_doc'].'/front/drh.book.newsletter.php?edition=N2&readyes=0">
 | |
| 
 | |
|          <i class="fa-fw far fa-list-alt"></i>
 | |
| 
 | |
|          '.$_SESSION['SophalLanguages'][$setLang][75].'
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>
 | |
| 
 | |
|       </div>';
 | |
| 
 | |
| 
 | |
| 
 | |
|       if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiID'] == 66 || $_SESSION['glpiID'] == 58) {
 | |
| 
 | |
|          echo'
 | |
| 
 | |
|          <li  id="Grouper_Menu1800"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">'.$_SESSION['SophalLanguages'][$setLang][76].'<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|             <div id="menu_groupe1800" class="closed">        
 | |
| 
 | |
|                <li class="">
 | |
| 
 | |
|                   <a href="'.$CFG_GLPI['root_doc'].'/front/payroll.period.list.php">
 | |
| 
 | |
|                   <i class="fa-fw fas fa-cog"></i>
 | |
| 
 | |
|                   '.$_SESSION['SophalLanguages'][$setLang][77].'
 | |
| 
 | |
|                   </a>
 | |
| 
 | |
|                </li>
 | |
| 
 | |
|             </div>
 | |
| 
 | |
|          </li>';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|      echo'</ul>
 | |
| 
 | |
|      </li>';
 | |
| 
 | |
|      
 | |
| 
 | |
|      //divers
 | |
| 
 | |
|       echo'<li id="menu9900" data-id="9900" class=""  onmouseover="mouseIN5()" onmouseout="mouseOUT5()">
 | |
| 
 | |
|       <a href="#" class="itemP">Divers</a> 
 | |
| 
 | |
|       <ul class="ssmenu" id="divers">
 | |
| 
 | |
|         
 | |
| 
 | |
|           <li class="">';
 | |
| 
 | |
|             //  if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				//   echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=maintenance%20:%20work%20Ordre%20From' >";
 | |
| 
 | |
| 			   // }else{
 | |
| 
 | |
| 				//   echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=maintenance%20:%20work%20Ordre%20From' >";   
 | |
| 
 | |
|             //    }
 | |
| 
 | |
|             echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=9'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  Maintenance : Work Order Form
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
| 		 <li class="">';
 | |
| 
 | |
|              if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=LCQ%20:%20Bon%20De%20Retour' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=LCQ%20:%20Bon%20De%20Retour' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  LCQ : Bon De Retour
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
| 		 <li class="">';
 | |
| 
 | |
|        echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=12'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
|             Production : Bon De Commande
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li> <li class="">';
 | |
| 
 | |
|              if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Production%20:%20Bon%20De%20Retour' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Production%20:%20Bon%20De%20Retour' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  Production : Bon De Retour
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
| 		 <li class="">';
 | |
| 
 | |
|              if (Session::getCurrentInterface() == "helpdesk") {
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1&modele=Production%20:%20Demande%20echantillonnage' >";
 | |
| 
 | |
| 			   }else{
 | |
| 
 | |
| 				  echo"<a href='".$CFG_GLPI["root_doc"]."/front/ticket.form.php?modele=Production%20:%20Demande%20echantillonnage' >";   
 | |
| 
 | |
|                }
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  Production : Demande D'echantillonnage
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
|          <li class="">';
 | |
| 
 | |
|             echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=10'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  AC : Bon De Livraison
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
|          <li class="">';
 | |
| 
 | |
|             echo"<a href='".$CFG_GLPI["root_doc"]."/front/drh.demandes.php?modele=13'>";
 | |
| 
 | |
| 				echo'<i class="fa-fw far fa-file"></i>
 | |
| 
 | |
| 				  MP : Bon De Livraison
 | |
| 
 | |
| 				 </a>
 | |
| 
 | |
|          </li>
 | |
| 
 | |
|       <li  id="Grouper_Menu1600"><a class="sophalmenu" style="background-color: #1B2F62; color : #ffffff;">Inventaire<i class="fa fa-chevron-down" style="color:#FFFFFF; float: right;"></i></a></li>
 | |
| 
 | |
|       <div id="menu_groupe1600" class="closed">
 | |
| 
 | |
| 
 | |
| 
 | |
|       
 | |
| 
 | |
| 
 | |
| 
 | |
|      
 | |
| 
 | |
| 	  
 | |
| 
 | |
| 	  ';
 | |
| 
 | |
| 	  
 | |
| 
 | |
|      if ($_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || 
 | |
| 
 | |
| 	  $_SESSION['glpiactiveprofile']['name'] == "Admin" || $_SESSION['glpiID'] == 1411){
 | |
| 
 | |
|          echo'	 	  
 | |
| 
 | |
| 		  <li class="">
 | |
| 
 | |
| 			<a href="'.$CFG_GLPI["root_doc"].'/front/article.add.php" ><i class="fa-fw far fa-file"></i>Ajouter Article</a>
 | |
| 
 | |
| 		  </li>
 | |
| 
 | |
| 		  <li class="">
 | |
| 
 | |
| 			<a href="'.$CFG_GLPI["root_doc"].'/front/barcode.pdf.php" ><i class="fa-fw far fa-file"></i>Imprimer les Codes a Bar</a>
 | |
| 
 | |
| 		  </li>
 | |
| 
 | |
| 
 | |
| 
 | |
| 		<li class="">
 | |
| 
 | |
| 			<a href="'.$CFG_GLPI["root_doc"].'/front/articles.list.immo.php" ><i class="fa-fw far fa-file"></i>Articles Immobilisations</a>
 | |
| 
 | |
| 		  </li>
 | |
| 
 | |
| 
 | |
| 
 | |
| 		<li class="">
 | |
| 
 | |
| 			<a href="'.$CFG_GLPI["root_doc"].'/front/stock.list.php" ><i class="fa-fw far fa-file"></i>Stock</a>
 | |
| 
 | |
| 		  </li>';
 | |
| 
 | |
| 	  }
 | |
| 
 | |
| 	  echo '<li class="">
 | |
| 
 | |
| 			<a href="'.$CFG_GLPI["root_doc"].'/front/inventaire.immo.php" ><i class="fa-fw far fa-file"></i>Réalisation Inventaire immobilisation</a>
 | |
| 
 | |
| 		  </li>';
 | |
| 
 | |
| 
 | |
| 
 | |
| if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" || $_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Directeur MGX"  || $_SESSION['glpiactiveprofile']['name'] == "Directeur Approvisionnement" || $_SESSION['is_inventory_comm'] == 'true' || $_SESSION['glpiID'] == 1411) {
 | |
| 
 | |
| 	echo'<li class="">
 | |
| 
 | |
| 		<a href="'.$CFG_GLPI["root_doc"].'/front/resultatinventaire.php" ><i class="fa-fw far fa-file"></i>Suivi Inventaire</a>
 | |
| 
 | |
|       </li>';
 | |
| 
 | |
| 	echo'<li class="">
 | |
| 
 | |
| 		<a href="'.$CFG_GLPI["root_doc"].'/front/resultatinventaire.immo.php" ><i class="fa-fw far fa-file"></i>Suivi Inventaire immobilisation</a>
 | |
| 
 | |
|       </li>';
 | |
| 
 | |
| }
 | |
| 
 | |
| 	echo'</div>
 | |
| 
 | |
| 
 | |
| 
 | |
|         </ul>
 | |
| 
 | |
|         </li>';
 | |
| 
 | |
|       //divers
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| for($dd = 1 ; $dd <= 18 ; $dd++){
 | |
| 
 | |
| echo '<script>
 | |
| 
 | |
| 		        $(document).ready(function(){
 | |
| 
 | |
| 				
 | |
| 
 | |
| 				  $("#Grouper_Menu'.$dd.'00").click(function(){ 
 | |
| 
 | |
| 				var menu_groupe = document.getElementById("menu_groupe'.$dd.'00");
 | |
| 
 | |
| 					  if (menu_groupe.classList.contains("opened")) {
 | |
| 
 | |
| 												menu_groupe.classList.remove("opened");
 | |
| 
 | |
| 												menu_groupe.classList.add("closed");
 | |
| 
 | |
| 								}else {
 | |
| 
 | |
| 									menu_groupe.classList.remove("closed");
 | |
| 
 | |
| 												menu_groupe.classList.add("opened");
 | |
| 
 | |
| 								}
 | |
| 
 | |
| 				  });				
 | |
| 
 | |
| 				});
 | |
| 
 | |
| 	 </script>
 | |
| 
 | |
| 		
 | |
| 
 | |
| 	<style type="text/css">
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			#menu_groupe'.$dd.'00.closed {
 | |
| 
 | |
| 			max-height: 0;			
 | |
| 
 | |
| 				visibility: hidden;
 | |
| 
 | |
| 			}		
 | |
| 
 | |
| 			#menu_groupe'.$dd.'00.opened {			
 | |
| 
 | |
| 				visibility: visible;
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			
 | |
| 
 | |
| 	</style>';
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| echo '<script>
 | |
| 
 | |
| function mouseIN() {
 | |
| 
 | |
| document.getElementById("DRHmenu").style.display = "block";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseOUT() {
 | |
| 
 | |
| document.getElementById("DRHmenu").style.display = "none";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseIN1() {
 | |
| 
 | |
| document.getElementById("MGXmenu").style.display = "block";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseOUT1() {
 | |
| 
 | |
| document.getElementById("MGXmenu").style.display = "none";
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| function mouseIN2() {
 | |
| 
 | |
| 		document.getElementById("DG").style.display = "block";
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 		function mouseOUT2() {
 | |
| 
 | |
| 		document.getElementById("DG").style.display = "none";
 | |
| 
 | |
| 		}
 | |
| 
 | |
| function mouseIN3() {
 | |
| 
 | |
| document.getElementById("PARAMETRAGE").style.display = "block";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseOUT3() {
 | |
| 
 | |
| document.getElementById("PARAMETRAGE").style.display = "none";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseIN4() {
 | |
| 
 | |
| document.getElementById("rh").style.display = "block";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseOUT4() {
 | |
| 
 | |
| document.getElementById("rh").style.display = "none";
 | |
| 
 | |
| }
 | |
| 
 | |
| function mouseIN5() {
 | |
| 
 | |
|    document.getElementById("divers").style.display = "block";
 | |
| 
 | |
|    }
 | |
| 
 | |
|    function mouseOUT5() {
 | |
| 
 | |
|    document.getElementById("divers").style.display = "none";
 | |
| 
 | |
|    }
 | |
| 
 | |
| </script>';
 | |
| 
 | |
|       
 | |
| 
 | |
|       
 | |
| 
 | |
|       
 | |
| 
 | |
|       
 | |
| 
 | |
|      
 | |
| 
 | |
|      // Get object-variables and build the navigation-elements
 | |
| 
 | |
|       $i = 1;
 | |
| 
 | |
| 	  $Grouper_Menu = array(); 
 | |
| 
 | |
| 	  $tableauDeBordLink = 0;
 | |
| 
 | |
| 	 
 | |
| 
 | |
|       foreach ($menu as $part => $data) { 
 | |
| 
 | |
| 	   if ($part == 'assets' or $part == "management" or $part == "tools" or $part == "admin" or $part == "config") {		
 | |
| 
 | |
| 		if (isset($data['content']) && count($data['content'])) { 
 | |
| 
 | |
|          array_push($Grouper_Menu,"<li  id='Grouper_Menu$i'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>{$data['title']}<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li><div id='menu_groupe$i' class='closed'>");
 | |
| 
 | |
| 		 
 | |
| 
 | |
| 		 echo'<script>
 | |
| 
 | |
| 		        $(document).ready(function(){
 | |
| 
 | |
| 				  $("#Grouper_Menu'.$i.'").click(function(){
 | |
| 
 | |
| 					  var menu_groupe = document.getElementById("menu_groupe'.$i.'");
 | |
| 
 | |
| 					  if (menu_groupe.classList.contains("opened")) {
 | |
| 
 | |
| 												menu_groupe.classList.remove("opened");
 | |
| 
 | |
| 												menu_groupe.classList.add("closed");
 | |
| 
 | |
| 								}else {
 | |
| 
 | |
| 									menu_groupe.classList.remove("closed");
 | |
| 
 | |
| 												menu_groupe.classList.add("opened");
 | |
| 
 | |
| 								}
 | |
| 
 | |
| 				  });
 | |
| 
 | |
| 				});
 | |
| 
 | |
| 			 </script>
 | |
| 
 | |
| 		
 | |
| 
 | |
| 			<style type="text/css">
 | |
| 
 | |
| 			
 | |
| 
 | |
| 			#menu_groupe'.$i.'.closed {
 | |
| 
 | |
| 			max-height: 0;			
 | |
| 
 | |
| 				visibility: hidden;
 | |
| 
 | |
| 			}		
 | |
| 
 | |
| 			#menu_groupe'.$i.'.opened {			
 | |
| 
 | |
| 				visibility: visible;
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			</style>';
 | |
| 
 | |
| 			
 | |
| 
 | |
| 		 if (!isset($data['content'][0]) || $data['content'][0] !== true) {
 | |
| 
 | |
|                if($part == 'tools') {
 | |
| 
 | |
|                    if($_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Technician") {
 | |
| 
 | |
| 						$decharge="<li class=''>
 | |
| 
 | |
| 									<a href='".$CFG_GLPI["root_doc"]."/front/decharge.list.php' >
 | |
| 
 | |
| 									   <i class='fa-fw far fa-file'></i>
 | |
| 
 | |
| 									   Décharge/Contre Décharge 
 | |
| 
 | |
| 									</a>
 | |
| 
 | |
| 								 </li>";
 | |
| 
 | |
| 						array_push($Grouper_Menu,$decharge);
 | |
| 
 | |
|                    }
 | |
| 
 | |
| 				}
 | |
| 
 | |
|                // list menu item
 | |
| 
 | |
|                foreach ($data['content'] as $key => $val) {
 | |
| 
 | |
|                   $menu_class       = "";
 | |
| 
 | |
|                   $tmp_active_item  = explode("/", $item);
 | |
|                   $active_item      = array_pop($tmp_active_item);
 | |
| 
 | |
|                   if (isset($menu[$sector]['content'])
 | |
| 
 | |
|                      && isset($menu[$sector]['content'][$active_item])
 | |
| 
 | |
|                      && isset($val['title'])
 | |
| 
 | |
|                      && ($menu[$sector]['content'][$active_item]['title'] == $val['title'])) {
 | |
| 
 | |
|                      $menu_class = "active";
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                   if (isset($val['page'])
 | |
| 
 | |
|                      && isset($val['title'])) {
 | |
| 
 | |
|                      $shortcut_attr = "";
 | |
| 
 | |
|                      $title = $val['title'];
 | |
| 
 | |
| 
 | |
| 
 | |
|                      if (isset($val['shortcut']) && !empty($val['shortcut'])) {
 | |
| 
 | |
|                         if (!isset($already_used_shortcut[$val['shortcut']])) {
 | |
| 
 | |
|                            $shortcut_attr = " accesskey='".$val['shortcut']."'";
 | |
| 
 | |
|                            $already_used_shortcut[$val['shortcut']] = $val['shortcut'];
 | |
| 
 | |
|                         }
 | |
| 
 | |
|                         $title = Toolbox::shortcut($val['title'], $val['shortcut']);
 | |
| 
 | |
|                      }
 | |
| 
 | |
| 
 | |
| 
 | |
|                      $icon_cls = "";
 | |
| 
 | |
|                      if (isset($val['icon'])) {
 | |
| 
 | |
|                         $icon_cls = $val['icon'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
| 					 
 | |
| 
 | |
| 					 if($data['title'] == "Parc" && $tableauDeBordLink == 0){
 | |
| 
 | |
| 					    $tableauDeBordLink = 1;						 
 | |
| 
 | |
| 						 $liLink = "<li class=''>
 | |
| 
 | |
| 							<a href='".$CFG_GLPI["root_doc"]."/front/dashboard_assets.php' >
 | |
| 
 | |
| 							   <i class='fa-fw $icon_cls'></i>
 | |
| 
 | |
| 							   Tableau De Bord
 | |
| 
 | |
| 							</a>
 | |
| 
 | |
| 						 </li>";
 | |
| 
 | |
| 						 array_push($Grouper_Menu,$liLink);
 | |
| 
 | |
| 					 }
 | |
| 
 | |
| 					 
 | |
| 
 | |
| 					 
 | |
| 
 | |
|                      $icon = "<i class='fa-fw $icon_cls'></i>";
 | |
| 
 | |
| 
 | |
| 
 | |
|                      $li = "<li class='$menu_class'>
 | |
| 
 | |
|                         <a href='".$CFG_GLPI["root_doc"].$val['page']."' $shortcut_attr>
 | |
| 
 | |
|                            $icon
 | |
| 
 | |
|                            $title
 | |
| 
 | |
|                         </a>
 | |
| 
 | |
|                      </li>";
 | |
| 
 | |
| 					 array_push($Grouper_Menu,$li);
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }               
 | |
| 
 | |
|             }
 | |
| 
 | |
|            
 | |
| 
 | |
| 		 $i++;
 | |
| 
 | |
| 		 array_push($Grouper_Menu ,"</div>"); 
 | |
| 
 | |
| 		 
 | |
| 
 | |
| 		 }
 | |
| 
 | |
| 		}else{
 | |
| 
 | |
|          
 | |
| 
 | |
| 		    if ($data['title'] == "Assistance") $data['title'] = $_SESSION['SophalLanguages'][$setLang][63];
 | |
| 
 | |
| 		    
 | |
| 
 | |
|          if (isset($data['content']) && count($data['content'])) {
 | |
| 
 | |
|             $menu_class = "";
 | |
| 
 | |
|             if (isset($menu[$sector]) && $menu[$sector]['title'] == $data['title']) {
 | |
| 
 | |
|                $menu_class = "active";
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             echo "<li id='menu$i' data-id='$i' class='$menu_class'>";
 | |
| 
 | |
|             $link = "#";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (isset($data['default']) && !empty($data['default'])) {
 | |
| 
 | |
|                $link = $CFG_GLPI["root_doc"].$data['default'];
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             echo "<a href='$link' class='itemP'>{$data['title']}</a>";
 | |
| 
 | |
|             if (!isset($data['content'][0]) || $data['content'][0] !== true) {
 | |
| 
 | |
|                echo "<ul class='ssmenu'>";
 | |
| 
 | |
|                
 | |
| 
 | |
|                // list menu item
 | |
| 
 | |
|                foreach ($data['content'] as $key => $val) {
 | |
| 
 | |
|                   $menu_class       = "";
 | |
| 
 | |
|                   $tmp_active_item  = explode("/", $item);
 | |
| 
 | |
|                   $active_item      = array_pop($tmp_active_item);
 | |
| 
 | |
|                   if (isset($menu[$sector]['content'])
 | |
| 
 | |
|                      && isset($menu[$sector]['content'][$active_item])
 | |
| 
 | |
|                      && isset($val['title'])
 | |
| 
 | |
|                      && ($menu[$sector]['content'][$active_item]['title'] == $val['title'])) {
 | |
| 
 | |
|                      $menu_class = "active";
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                   if (isset($val['page'])
 | |
| 
 | |
|                      && isset($val['title'])) {
 | |
| 
 | |
|                      $shortcut_attr = "";
 | |
| 
 | |
|                      $title = $val['title'];
 | |
| 
 | |
| 
 | |
| 
 | |
|                      if (isset($val['shortcut']) && !empty($val['shortcut'])) {
 | |
| 
 | |
|                         if (!isset($already_used_shortcut[$val['shortcut']])) {
 | |
| 
 | |
|                            $shortcut_attr = " accesskey='".$val['shortcut']."'";
 | |
| 
 | |
|                            $already_used_shortcut[$val['shortcut']] = $val['shortcut'];
 | |
| 
 | |
|                         }
 | |
| 
 | |
|                         $title = Toolbox::shortcut($val['title'], $val['shortcut']);
 | |
| 
 | |
|                      }
 | |
| 
 | |
| 
 | |
| 
 | |
|                      $icon_cls = "";
 | |
| 
 | |
|                      if (isset($val['icon'])) {
 | |
| 
 | |
|                         $icon_cls = $val['icon'];
 | |
| 
 | |
|                      }
 | |
| 
 | |
|                      $icon = "<i class='fa-fw $icon_cls'></i>";
 | |
| 
 | |
|                     
 | |
| 
 | |
|                      echo "<li class='$menu_class'>
 | |
| 
 | |
|                         <a href='".$CFG_GLPI["root_doc"].$val['page']."' $shortcut_attr>
 | |
| 
 | |
|                            $icon
 | |
| 
 | |
|                            $title
 | |
| 
 | |
|                         </a>
 | |
| 
 | |
|                      </li>";
 | |
| 
 | |
|                   }  
 | |
| 
 | |
|                }
 | |
| 
 | |
| //Divers DSI
 | |
| echo"<li  id='Grouper_Menu1400'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>Divers<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li>
 | |
|       <div id='menu_groupe1400' class='closed'>
 | |
|         <li class=''>
 | |
|          <a href='/dsi/plugins/consumables/front/wizard.php'>
 | |
|          <i class='fa-fw far fa-list-alt'></i>
 | |
|          Demande de consommables
 | |
|          </a>
 | |
|       </li>";
 | |
|       if ($_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "Admin") {
 | |
|          echo "
 | |
|              <li>
 | |
|                  <a href='".$CFG_GLPI["root_doc"]."/front/change.responsable.php'>
 | |
|                      <i class='fa-fw far fa-list-alt'></i>
 | |
|                      Modifier Responsable
 | |
|                  </a>
 | |
|              </li>
 | |
|              <li>
 | |
|                  <a href='".$CFG_GLPI["root_doc"]."/front/picklist.list.php'>
 | |
|                      <i class='fa-fw far fa-list-alt'></i>
 | |
|                      Fonction et Structure
 | |
|                  </a>
 | |
|              </li>";
 | |
|      }
 | |
|      echo "</div>";
 | |
| 
 | |
| //Demande d'acces
 | |
| 
 | |
| if($_SESSION['glpiactiveprofile']['name'] <> "Utilisateur-standard"){
 | |
| 
 | |
|    echo"<li  id='Grouper_Menu1700'><a class='sophalmenu' style='background-color: #1B2F62; color : #ffffff;'>Gestion des Acces<i class='fa fa-chevron-down' style='color:#FFFFFF; float: right;'></i></a></li>
 | |
| 
 | |
|       <div id='menu_groupe1700' class='closed'>
 | |
| 
 | |
|          <li class=''>
 | |
| 
 | |
|          <a href='".$CFG_GLPI["root_doc"]."/front/dsi.demandes.acces.php?modele=0'>
 | |
| 
 | |
|          <i class='fa-fw far fa-list-alt'></i>
 | |
| 
 | |
|             Demande accés
 | |
| 
 | |
|          </a>
 | |
| 
 | |
|       </li>";
 | |
| 
 | |
|    }
 | |
| 
 | |
|                echo "</ul>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</li>";
 | |
| 
 | |
|             $i++;
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
|   }
 | |
| 
 | |
|   
 | |
| 
 | |
|   if(sizeof($Grouper_Menu) != 0 ){
 | |
| 
 | |
| 			 $a22 = "<li id='menu66' data-id='66' class='$menu_class' onmouseover='mouseIN3()' onmouseout='mouseOUT3()'>";
 | |
| 
 | |
| 			 if( $_SESSION['glpiactiveprofile']['name'] == "Super-Admin" || $_SESSION['glpiactiveprofile']['name'] == "DGA" ||
 | |
| 
 | |
| 			$_SESSION['glpiactiveprofile']['name'] == "DG" || $_SESSION['glpiactiveprofile']['name'] == "Technician"){
 | |
| 
 | |
| 			 $a33 =  "<a href='#' class='itemP'>".$_SESSION['SophalLanguages'][$setLang][64]."</a>";
 | |
| 
 | |
| 			}else{
 | |
| 
 | |
| 			 $a33 =  "<a href='#' class='itemP'>Divers</a>";
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			 $a44 = "<ul class='ssmenu' id='PARAMETRAGE'>";
 | |
| 
 | |
| 			 array_unshift($Grouper_Menu ,$a22,$a33,$a44);
 | |
| 
 | |
| 			 array_push($Grouper_Menu ,  "</ul>","</li>");
 | |
| 
 | |
| 			 array_push($Grouper_Menu ,"</div>"); 
 | |
| 
 | |
| 			 echo implode(" ",$Grouper_Menu);
 | |
| 
 | |
| 		 }
 | |
| 
 | |
| 		 
 | |
| 
 | |
| 		 echo'<script>
 | |
| 
 | |
| 				var setback=$("#header_top").css("background-color");
 | |
| 
 | |
| 				$(".sophalmenu").css("background-color", setback);
 | |
| 
 | |
| 			  </script>';
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($full === false) {
 | |
| 
 | |
|          // Plugins
 | |
| 
 | |
|          $menu['plugins'] = [
 | |
| 
 | |
|             'default'   => "#",
 | |
| 
 | |
|             'title'     => _sn('Plugin', 'Plugins', Session::getPluralNumber()),
 | |
| 
 | |
|             'content'   => []
 | |
| 
 | |
|          ];
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (isset($PLUGIN_HOOKS["helpdesk_menu_entry"])
 | |
| 
 | |
|             && count($PLUGIN_HOOKS["helpdesk_menu_entry"])) {
 | |
| 
 | |
| 
 | |
| 
 | |
|             foreach ($PLUGIN_HOOKS["helpdesk_menu_entry"] as $plugin => $active) {
 | |
| 
 | |
|                if (!Plugin::isPluginActive($plugin)) {
 | |
| 
 | |
|                   continue;
 | |
| 
 | |
|                }
 | |
| 
 | |
|                if ($active) {
 | |
| 
 | |
|                   $infos = Plugin::getInfo($plugin);
 | |
| 
 | |
|                   $link = "";
 | |
| 
 | |
|                   if (is_string($PLUGIN_HOOKS["helpdesk_menu_entry"][$plugin])) {
 | |
| 
 | |
|                      $link = $PLUGIN_HOOKS["helpdesk_menu_entry"][$plugin];
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                   $infos['page'] = $link;
 | |
| 
 | |
|                   $infos['title'] = $infos['name'];
 | |
| 
 | |
|                   $menu['plugins']['content'][$plugin] = $infos;
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          // Display plugins
 | |
| 
 | |
|          if (isset($menu['plugins']['content']) && count($menu['plugins']['content']) > 0) {
 | |
| 
 | |
|             asort($menu['plugins']['content']);
 | |
| 
 | |
|             echo "<li id='menu5' onmouseover=\"javascript:menuAff('menu5','menu');\">";
 | |
| 
 | |
|             echo "<a href='#' title=\"".
 | |
| 
 | |
|                   _sn('Plugin', 'Plugins', Session::getPluralNumber())."\" class='itemP'>".
 | |
| 
 | |
|                   __('Plugins')."</a>"; // default none
 | |
| 
 | |
|             echo "<ul class='ssmenu'>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             // list menu item
 | |
| 
 | |
|             foreach ($menu['plugins']['content'] as $key => $val) {
 | |
| 
 | |
|                echo "<li><a href='".Plugin::getWebDir($key).$val['page']."'>".
 | |
| 
 | |
|                         $val["title"]."</a></li>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</ul></li>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo "</ul>"; // #menu
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Display MENU ALL
 | |
| 
 | |
|       self::displayMenuAll($menu);
 | |
| 
 | |
| 
 | |
| 
 | |
|       // End navigation bar
 | |
| 
 | |
|       // End headline
 | |
| 
 | |
| 
 | |
| 
 | |
|       //  Le fil d ariane
 | |
| 
 | |
|       echo "<div id='c_ssmenu2' >";
 | |
| 
 | |
|       echo "<ul>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Display item
 | |
| 
 | |
|       $mainurl = ($full === true) ? 'central' : 'helpdesk.public';
 | |
| 
 | |
|       echo "<li class='breadcrumb_item'>".
 | |
| 
 | |
|            "<a href='".$CFG_GLPI["root_doc"]."/front/$mainurl.php' title=\"". __s('Home')."\">".
 | |
| 
 | |
|              __('Home')."</a></li>";
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($full === true) {
 | |
| 
 | |
|          if (isset($menu[$sector])) {
 | |
| 
 | |
|             $link = "/front/central.php";
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (isset($menu[$sector]['default'])) {
 | |
| 
 | |
|                $link = $menu[$sector]['default'];
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "<li class='breadcrumb_item'>".
 | |
| 
 | |
|                "<a href='".$CFG_GLPI["root_doc"].$link."' title=\"".$menu[$sector]['title']."\">".
 | |
| 
 | |
|                      $menu[$sector]['title']."</a></li>";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (isset($menu[$sector]['content'][$item])) {
 | |
| 
 | |
|             // Title
 | |
| 
 | |
|             $with_option = false;
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (!empty($option)
 | |
| 
 | |
|                && isset($menu[$sector]['content'][$item]['options'][$option]['title'])
 | |
| 
 | |
|                && isset($menu[$sector]['content'][$item]['options'][$option]['page'])) {
 | |
| 
 | |
| 
 | |
| 
 | |
|                $with_option = true;
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             if (isset($menu[$sector]['content'][$item]['page'])) {
 | |
| 
 | |
|                echo "<li class='breadcrumb_item'>".
 | |
| 
 | |
|                   "<a href='".$CFG_GLPI["root_doc"].$menu[$sector]['content'][$item]['page']."' ".
 | |
| 
 | |
|                         ($with_option?"":"class='here'")." title=\"".
 | |
| 
 | |
|                         $menu[$sector]['content'][$item]['title']."\" >".
 | |
| 
 | |
|                         "<i class='".($menu[$sector]['content'][$item]['icon'] ?? "")."'></i> ".
 | |
| 
 | |
|                         $menu[$sector]['content'][$item]['title'].
 | |
| 
 | |
|                   "</a>".
 | |
| 
 | |
|                   "</li>";
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             if ($with_option) {
 | |
| 
 | |
|                echo "<li class='breadcrumb_item'>".
 | |
| 
 | |
|                   "<a href='".$CFG_GLPI["root_doc"].
 | |
| 
 | |
|                         $menu[$sector]['content'][$item]['options'][$option]['page'].
 | |
| 
 | |
|                         "' class='here' title=\"".
 | |
| 
 | |
|                         $menu[$sector]['content'][$item]['options'][$option]['title']."\" >";
 | |
| 
 | |
| 
 | |
| 
 | |
|                echo "<i class='".($menu[$sector]['content'][$item]['options'][$option]['icon'] ?? "")."'></i> ";
 | |
| 
 | |
|                echo self::resume_name($menu[$sector]['content'][$item]['options'][$option]['title'],
 | |
| 
 | |
|                                     17);
 | |
| 
 | |
|                echo "</a></li>";
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             $links = [];
 | |
| 
 | |
|             // Item with Option case
 | |
| 
 | |
|             if (!empty($option)
 | |
| 
 | |
|                && isset($menu[$sector]['content'][$item]['options'][$option]['links'])
 | |
| 
 | |
|                && is_array($menu[$sector]['content'][$item]['options'][$option]['links'])) {
 | |
| 
 | |
|                $links = $menu[$sector]['content'][$item]['options'][$option]['links'];
 | |
| 
 | |
| 
 | |
| 
 | |
|             } else if (isset($menu[$sector]['content'][$item]['links'])
 | |
| 
 | |
|                      && is_array($menu[$sector]['content'][$item]['links'])) {
 | |
| 
 | |
|                // Without option case : only item links
 | |
| 
 | |
| 
 | |
| 
 | |
|                $links = $menu[$sector]['content'][$item]['links'];
 | |
| 
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             // Add item
 | |
| 
 | |
|             echo "<li class='icons_block'>";
 | |
| 
 | |
|             echo "<span>";
 | |
| 
 | |
|             if (isset($links['add'])) {
 | |
| 
 | |
|                echo "<a href='{$CFG_GLPI['root_doc']}{$links['add']}' class='pointer'
 | |
| 
 | |
|                                  title='" . __s('Add') ."'><i class='fa fa-plus'></i>
 | |
| 
 | |
|                                  <span class='sr-only'>" . __('Add') . "</span></a>";
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                echo "<a href='#' class='pointer disabled' title='".__s('Add is disabled')."'>".
 | |
| 
 | |
|                   "<i class='fa fa-plus'></i>".
 | |
| 
 | |
|                   "<span class='sr-only'>" . __('Add is disabled') . "</span></a>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</span>";
 | |
| 
 | |
| 
 | |
| 
 | |
|             // Search Item
 | |
| 
 | |
|             echo "<span>";
 | |
| 
 | |
|             if (isset($links['search'])) {
 | |
| 
 | |
|                echo "<a href='{$CFG_GLPI['root_doc']}{$links['search']}' class='pointer'
 | |
| 
 | |
|                                  title='" . __s('Search') ."'><i class='fa fa-search'></i>
 | |
| 
 | |
|                                  <span class='sr-only'>" . __s('Search') . "</span></a>";
 | |
| 
 | |
|             } else {
 | |
| 
 | |
|                echo "<a href='#' class='pointer disabled' title='" . __s('Search is disabled')."'>".
 | |
| 
 | |
|                   "<i class='fa fa-search'></i>".
 | |
| 
 | |
|                   "<span class='sr-only'>" . __('Search is disabled') . "</span></a>";
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</span>";
 | |
| 
 | |
|             // Links
 | |
| 
 | |
|             if (count($links) > 0) {
 | |
| 
 | |
|                foreach ($links as $key => $val) {
 | |
| 
 | |
| 
 | |
| 
 | |
|                   switch ($key) {
 | |
| 
 | |
|                      case "add" :
 | |
| 
 | |
|                      case "search" :
 | |
| 
 | |
|                         break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                      case "template" :
 | |
| 
 | |
|                         echo "<span>";
 | |
| 
 | |
|                         echo Html::link('<i class="pointer fa fa-layer-group"></i>',
 | |
| 
 | |
|                                         $CFG_GLPI["root_doc"].$val, [
 | |
| 
 | |
|                                           'title' => __('Manage templates...')
 | |
| 
 | |
|                                         ]);
 | |
| 
 | |
|                         echo "</span>";
 | |
| 
 | |
|                         break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                      case "showall" :
 | |
| 
 | |
|                         echo "<span>";
 | |
| 
 | |
|                         echo Html::image($CFG_GLPI["root_doc"] . "/pics/menu_showall.png",
 | |
| 
 | |
|                                        ['alt' => __('Show all'),
 | |
| 
 | |
|                                              'url' => $CFG_GLPI["root_doc"].$val]);
 | |
| 
 | |
|                         echo "</span>";
 | |
| 
 | |
|                         break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                      case "summary" :
 | |
| 
 | |
|                         echo "<span>";
 | |
| 
 | |
|                         echo Html::link('<i class="pointer fas fa-stream"></i>',
 | |
| 
 | |
|                                         $CFG_GLPI["root_doc"].$val, [
 | |
| 
 | |
|                                           'title' => __('Summary')
 | |
| 
 | |
|                                         ]);
 | |
| 
 | |
|                         echo "</span>";
 | |
| 
 | |
|                         break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                      case "summary_kanban" :
 | |
| 
 | |
|                         echo "<span>";
 | |
| 
 | |
|                         echo Html::link('<i class="pointer fas fa-columns"></i>',
 | |
| 
 | |
|                            $CFG_GLPI["root_doc"].$val, [
 | |
| 
 | |
|                               'title' => __('Global Kanban')
 | |
| 
 | |
|                            ]);
 | |
| 
 | |
|                         echo "</span>";
 | |
| 
 | |
|                         break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                      case "config" :
 | |
| 
 | |
|                         echo "<span>";
 | |
| 
 | |
|                         echo Html::image($CFG_GLPI["root_doc"] . "/pics/menu_config.png",
 | |
| 
 | |
|                                        ['alt' => __('Setup'),
 | |
| 
 | |
|                                              'url' => $CFG_GLPI["root_doc"].$val]);
 | |
| 
 | |
|                         echo "</span>";
 | |
| 
 | |
|                         break;
 | |
| 
 | |
| 
 | |
| 
 | |
|                      default :
 | |
| 
 | |
|                         echo "<span>".Html::link($key, $CFG_GLPI["root_doc"].$val, ['class' => 'pointer'])."</span>";
 | |
| 
 | |
|                         break;
 | |
| 
 | |
|                   }
 | |
| 
 | |
|                }
 | |
| 
 | |
|             }
 | |
| 
 | |
|             echo "</li>";
 | |
| 
 | |
| 
 | |
| 
 | |
|          } else {
 | |
| 
 | |
|             echo "<li> </li>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          if (Session::haveRightsOr('ticketvalidation', TicketValidation::getValidateRights())) {
 | |
| 
 | |
|             $opt                              = [];
 | |
| 
 | |
|             $opt['reset']                     = 'reset';
 | |
| 
 | |
|             $opt['criteria'][0]['field']      = 55; // validation status
 | |
| 
 | |
|             $opt['criteria'][0]['searchtype'] = 'equals';
 | |
| 
 | |
|             $opt['criteria'][0]['value']      = TicketValidation::WAITING;
 | |
| 
 | |
|             $opt['criteria'][0]['link']       = 'AND';
 | |
| 
 | |
| 
 | |
| 
 | |
|             $opt['criteria'][1]['field']      = 59; // validation aprobator
 | |
| 
 | |
|             $opt['criteria'][1]['searchtype'] = 'equals';
 | |
| 
 | |
|             $opt['criteria'][1]['value']      = Session::getLoginUserID();
 | |
| 
 | |
|             $opt['criteria'][1]['link']       = 'AND';
 | |
| 
 | |
| 
 | |
| 
 | |
|             $url_validate = $CFG_GLPI["root_doc"]."/front/ticket.php?".
 | |
| 
 | |
|                            Toolbox::append_params($opt, '&');
 | |
| 
 | |
|             $pic_validate = "<a href='$url_validate'>".
 | |
| 
 | |
|                            "<img title=\"".__s('Ticket waiting for your approval')."\" alt=\"".
 | |
| 
 | |
|                               __s('Ticket waiting for your approval')."\" src='".
 | |
| 
 | |
|                               $CFG_GLPI["root_doc"]."/pics/menu_showall.png' class='pointer'></a>";
 | |
| 
 | |
|             echo "<li class='icons_block'>$pic_validate</li>\n";
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          if (Session::haveRight('ticket', CREATE)
 | |
| 
 | |
|             && strpos($_SERVER['PHP_SELF'], "ticket")) {
 | |
| 
 | |
|             echo "<li class='icons_block'><a class='pointer' href='".$CFG_GLPI["root_doc"]."/front/helpdesk.public.php?create_ticket=1'title=\"".__s('Add')."\">";
 | |
| 
 | |
|             echo "<i class='fa fa-plus'></i><span class='sr-only'>".__s('Add')."</span></a></li>";
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Add common items
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Profile selector
 | |
| 
 | |
|       // check user id : header used for display messages when session logout
 | |
| 
 | |
|       if (Session::getLoginUserID()) {
 | |
| 
 | |
|          self::showProfileSelecter($CFG_GLPI["root_doc"]."/front/$mainurl.php");
 | |
| 
 | |
|       }
 | |
| 
 | |
|       echo "</ul>";
 | |
| 
 | |
|       echo "</div>";
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Invert the input color (usefull for label bg on top of a background)
 | |
| 
 | |
|     * inpiration: https://github.com/onury/invert-color
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @since  9.3
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param  string  $hexcolor the color, you can pass hex color (prefixed or not by #)
 | |
| 
 | |
|     *                           You can also pass a short css color (ex #FFF)
 | |
| 
 | |
|     * @param  boolean $bw       default true, should we invert the color or return black/white function of the input color
 | |
| 
 | |
|     * @param  boolean $sb       default true, should we soft the black/white to a dark/light grey
 | |
| 
 | |
|     * @return string            the inverted color prefixed by #
 | |
| 
 | |
|     */
 | |
| 
 | |
|    static function getInvertedColor($hexcolor = "", $bw = true, $sbw = true) {
 | |
| 
 | |
|       if (strpos($hexcolor, '#') !== false) {
 | |
| 
 | |
|          $hexcolor = trim($hexcolor, '#');
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // convert 3-digit hex to 6-digits.
 | |
| 
 | |
|       if (strlen($hexcolor) == 3) {
 | |
| 
 | |
|          $hexcolor = $hexcolor[0] + $hexcolor[0]
 | |
| 
 | |
|                    + $hexcolor[1] + $hexcolor[1]
 | |
| 
 | |
|                    + $hexcolor[2] + $hexcolor[2];
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (strlen($hexcolor) != 6) {
 | |
| 
 | |
|          throw new Exception('Invalid HEX color.');
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $r = hexdec(substr($hexcolor, 0, 2));
 | |
| 
 | |
|       $g = hexdec(substr($hexcolor, 2, 2));
 | |
| 
 | |
|       $b = hexdec(substr($hexcolor, 4, 2));
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($bw) {
 | |
| 
 | |
|          return ($r * 0.299 + $g * 0.587 + $b * 0.114) > 100
 | |
| 
 | |
|             ? ($sbw
 | |
| 
 | |
|                ? '#303030'
 | |
| 
 | |
|                : '#000000')
 | |
| 
 | |
|             : ($sbw
 | |
| 
 | |
|                ? '#DFDFDF'
 | |
| 
 | |
|                : '#FFFFFF');
 | |
| 
 | |
|       }
 | |
| 
 | |
|       // invert color components
 | |
| 
 | |
|       $r = 255 - $r;
 | |
| 
 | |
|       $g = 255 - $g;
 | |
| 
 | |
|       $b = 255 - $b;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // pad each with zeros and return
 | |
| 
 | |
|       return "#"
 | |
| 
 | |
|          + str_pad($r, 2, '0', STR_PAD_LEFT)
 | |
| 
 | |
|          + str_pad($g, 2, '0', STR_PAD_LEFT)
 | |
| 
 | |
|          + str_pad($b, 2, '0', STR_PAD_LEFT);
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Compile SCSS styleshet
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param array $args Arguments. May contain:
 | |
| 
 | |
|     *                      - v: version to append (will default to GLPI_VERSION)
 | |
| 
 | |
|     *                      - debug: if present, will not use Crunched formatter
 | |
| 
 | |
|     *                      - file: filerepresentation  to load
 | |
| 
 | |
|     *                      - reload: force reload and recache
 | |
| 
 | |
|     *                      - nocache: do not use nor update cache
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    public static function compileScss($args) {
 | |
| 
 | |
|       global $CFG_GLPI, $GLPI_CACHE;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $ckey = 'css_';
 | |
| 
 | |
|       $ckey .= isset($args['v']) ? $args['v'] : GLPI_SCHEMA_VERSION;
 | |
| 
 | |
| 
 | |
| 
 | |
|       $scss = new Compiler();
 | |
| 
 | |
|       $scss->setFormatter('ScssPhp\ScssPhp\Formatter\Crunched');
 | |
| 
 | |
|       if (isset($args['debug'])) {
 | |
| 
 | |
|          $ckey .= '_sourcemap';
 | |
| 
 | |
|          $scss->setSourceMap(Compiler::SOURCE_MAP_INLINE);
 | |
| 
 | |
|          $scss->setSourceMapOptions(
 | |
| 
 | |
|             [
 | |
| 
 | |
|                'sourceMapBasepath' => GLPI_ROOT . '/',
 | |
| 
 | |
|                'sourceRoot'        => $CFG_GLPI['root_doc'] . '/',
 | |
| 
 | |
|             ]
 | |
| 
 | |
|          );
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $file = isset($args['file']) ? $args['file'] : 'css/styles';
 | |
| 
 | |
| 
 | |
| 
 | |
|       $ckey .= '_' . $file;
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!Toolbox::endsWith($file, '.scss')) {
 | |
| 
 | |
|          // Prevent include of file if ext is not .scss
 | |
| 
 | |
|          $file .= '.scss';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Requested file path
 | |
| 
 | |
|       $path = GLPI_ROOT . '/' . $file;
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Alternate file path (prefixed by a "_", i.e. "_highcontrast.scss").
 | |
| 
 | |
|       $pathargs = explode('/', $file);
 | |
| 
 | |
|       $pathargs[] = '_' . array_pop($pathargs);
 | |
| 
 | |
|       $pathalt = GLPI_ROOT . '/' . implode('/', $pathargs);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!file_exists($path) && !file_exists($pathalt)) {
 | |
| 
 | |
|          Toolbox::logWarning('Requested file ' . $path . ' does not exists.');
 | |
| 
 | |
|          return '';
 | |
| 
 | |
|       }
 | |
| 
 | |
|       if (!file_exists($path)) {
 | |
| 
 | |
|          $path = $pathalt;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       // Prevent import of a file from ouside GLPI dir
 | |
| 
 | |
|       $path = realpath($path);
 | |
| 
 | |
|       if (!Toolbox::startsWith($path, realpath(GLPI_ROOT))) {
 | |
| 
 | |
|          Toolbox::logWarning('Requested file ' . $path . ' is outside GLPI file tree.');
 | |
| 
 | |
|          return '';
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $import = '@import "' . $file . '";';
 | |
| 
 | |
|       $fckey = 'css_raw_file_' . $file;
 | |
| 
 | |
|       $file_hash = self::getScssFileHash($path);
 | |
| 
 | |
| 
 | |
| 
 | |
|       //check if files has changed
 | |
| 
 | |
|       if ($GLPI_CACHE->has($fckey)) {
 | |
| 
 | |
|          $cached_file_hash = $GLPI_CACHE->get($fckey);
 | |
| 
 | |
| 
 | |
| 
 | |
|          if ($file_hash != $cached_file_hash) {
 | |
| 
 | |
|             //file has changed
 | |
| 
 | |
|             Toolbox::logDebug("$file has changed, reloading");
 | |
| 
 | |
|             $args['reload'] = true;
 | |
| 
 | |
|             $GLPI_CACHE->set($fckey, $file_hash);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          Toolbox::logDebug("$file is new, loading");
 | |
| 
 | |
|          $GLPI_CACHE->set($fckey, $file_hash);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $scss->addImportPath(GLPI_ROOT);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if ($GLPI_CACHE->has($ckey) && !isset($args['reload']) && !isset($args['nocache'])) {
 | |
| 
 | |
|          $css = $GLPI_CACHE->get($ckey);
 | |
| 
 | |
|       } else {
 | |
| 
 | |
|          $css = $scss->compile($import);
 | |
| 
 | |
|          if (!isset($args['nocache'])) {
 | |
| 
 | |
|             $GLPI_CACHE->set($ckey, $css);
 | |
| 
 | |
|          }
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $css;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Returns SCSS file hash.
 | |
| 
 | |
|     * This function evaluates recursivly imports to compute a hash that represent the whole
 | |
| 
 | |
|     * contents of the final SCSS.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @param string $filepath
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return null|string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    public static function getScssFileHash(string $filepath) {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!is_file($filepath) || !is_readable($filepath)) {
 | |
| 
 | |
|          return null;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $contents = file_get_contents($filepath);
 | |
| 
 | |
|       $hash = md5($contents);
 | |
| 
 | |
| 
 | |
| 
 | |
|       $matches = [];
 | |
| 
 | |
|       preg_match_all('/@import\s+[\'"]([^\'"]*)[\'"];/', $contents, $matches);
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (empty($matches)) {
 | |
| 
 | |
|          return $hash;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       $basedir = dirname($filepath);
 | |
| 
 | |
|       foreach ($matches[1] as $import_url) {
 | |
| 
 | |
|          $has_extension = preg_match('/\.s?css$/', $import_url);
 | |
| 
 | |
|          $imported_filepath = $basedir . '/' . $import_url;
 | |
| 
 | |
|          if (!$has_extension && is_file($imported_filepath . '.scss')) {
 | |
| 
 | |
|             $imported_filepath = $imported_filepath . '.scss';
 | |
| 
 | |
|          }
 | |
| 
 | |
| 
 | |
| 
 | |
|          $hash .= self::getScssFileHash($imported_filepath);
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       return $hash;
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get scss compilation path for given file.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return array
 | |
| 
 | |
|     */
 | |
| 
 | |
|    public static function getScssCompilePath($file) {
 | |
| 
 | |
|       return implode(
 | |
| 
 | |
|          DIRECTORY_SEPARATOR,
 | |
| 
 | |
|          [
 | |
| 
 | |
|             self::getScssCompileDir(),
 | |
| 
 | |
|             str_replace('/', '_', $file) . '.min.css',
 | |
| 
 | |
|          ]
 | |
| 
 | |
|       );
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Get scss compilation directory.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return string
 | |
| 
 | |
|     */
 | |
| 
 | |
|    public static function getScssCompileDir() {
 | |
| 
 | |
|       return GLPI_ROOT . '/css_compiled';
 | |
| 
 | |
|    }
 | |
| 
 | |
| 
 | |
| 
 | |
|    /**
 | |
| 
 | |
|     * Display impersonate banner if feature is currently used.
 | |
| 
 | |
|     *
 | |
| 
 | |
|     * @return void
 | |
| 
 | |
|     */
 | |
| 
 | |
|    public static function displayImpersonateBanner() {
 | |
| 
 | |
| 
 | |
| 
 | |
|       if (!Session::isImpersonateActive()) {
 | |
| 
 | |
|          return;
 | |
| 
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
|       echo '<div class="banner-impersonate">';
 | |
| 
 | |
|       echo '<form name="form" method="post" action="' . User::getFormURL() . '">';
 | |
| 
 | |
|       echo sprintf(__('You are impersonating %s.'), $_SESSION['glpiname']);
 | |
| 
 | |
|       echo Html::hidden('_glpi_csrf_token', ['value' => Session::getNewCSRFToken()]);
 | |
| 
 | |
|       echo '<button type="submit" name="impersonate" class="btn-linkstyled" value="0">';
 | |
| 
 | |
|       echo __s('Stop impersonating');
 | |
| 
 | |
|       echo '</button>';
 | |
| 
 | |
|       echo '</form>';
 | |
| 
 | |
|       echo '</div>';
 | |
| 
 | |
|    }
 | |
| 
 | |
| }
 | |
| 
 |