diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/FileController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/FileController.php index 848f8cc5..8a515970 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/FileController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/FileController.php @@ -26,6 +26,7 @@ class FileController extends Controller $clear=$request->get("clear"); $view=$request->get("view"); $sort=$request->get("sort"); + $order=$request->get("order"); $defaultview=$request->get("defaultview"); // Récupérer les préférences utilisateur @@ -68,7 +69,7 @@ class FileController extends Controller $preference["widgetviewdirectory"][$directory]=$view; } - // Prérence trie + // Préférence trie if(!array_key_exists("widgetsortdirectory",$preference)) { $toupdate=true; $preference["widgetsortdirectory"]=[]; @@ -82,6 +83,21 @@ class FileController extends Controller $preference["widgetsortdirectory"][$directory]=$sort; } + // Préférence order + if(!array_key_exists("widgetorderdirectory",$preference)) { + $toupdate=true; + $preference["widgetorderdirectory"]=[]; + } + if((!array_key_exists($directory,$preference["widgetorderdirectory"]))) { + $toupdate=true; + $preference["widgetorderdirectory"][$directory]="SORT_ASC"; + } + if($sort&&$preference["widgetorderdirectory"][$directory]!=$order) { + $toupdate=true; + $preference["widgetorderdirectory"][$directory]=$order; + } + + // Mise à jour des préferences if($toupdate) { $em = $this->getDoctrine()->getManager(); @@ -109,23 +125,27 @@ class FileController extends Controller if($fs->exists($fulldirectory)) { $finder = new Finder(); - $finder->depth('== 0')->sortByName()->in($fulldirectory)->exclude('thumb')->exclude('thumbmini'); + $finder->depth('== 0')->sortByName()->in($fulldirectory)->exclude('thumb')->exclude('thumbmini')->exclude('__trash'); foreach ($finder as $file) { if(is_dir($file)) { $tmp=[]; $tmp["name"]=$file->getRelativePathname(); + $tmp["namesort"]=strtolower($tmp["name"]); $tmp["date"]=date ("d/m/Y H:i", filemtime($file)); + $tmp["datesort"] = date ("YmdHi", filemtime($file)); array_push($dirs,$tmp); } else { $tmp=[]; $tmp["name"]=$file->getRelativePathname(); + $tmp["namesort"]=strtolower($tmp["name"]); $tmp["extension"]=strtolower($file->getExtension()); $fileinfo = new file($file->getPathname()); $tmp["minetype"]=$fileinfo->getMimeType(); $tmp["minefamily"]=explode("/",$tmp["minetype"])[0]; $tmp["date"] = date ("d/m/Y H:i", filemtime($file)); + $tmp["datesort"] = date ("YmdHi", filemtime($file)); $tmp["thumb"]=""; if($tmp["extension"]=="pdf") { @@ -148,12 +168,22 @@ class FileController extends Controller } } - // Trie du tableu - $sort = array_column($files, $preference["widgetsortdirectory"][$directory]); - array_multisort($sort, SORT_ASC, $files); + // Flag poubelle + $fgtrash=false; + if(stripos($subdirectory,"_trash")==1) $fgtrash=true; - $sort = array_column($dirs, $preference["widgetsortdirectory"][$directory]); - array_multisort($sort, SORT_ASC, $dirs); + // Trie du tableu + $sort = array_column($files, $preference["widgetsortdirectory"][$directory]."sort"); + if($preference["widgetorderdirectory"][$directory]=="SORT_ASC") + array_multisort($sort, SORT_ASC, $files); + else + array_multisort($sort, SORT_DESC, $files); + + $sort = array_column($dirs, $preference["widgetsortdirectory"][$directory]."sort"); + if($preference["widgetorderdirectory"][$directory]=="SORT_ASC") + array_multisort($sort, SORT_ASC, $dirs); + else + array_multisort($sort, SORT_DESC, $dirs); return $this->render('CadolesCoreBundle:File:list.html.twig',[ 'useheader' => false, @@ -171,14 +201,19 @@ class FileController extends Controller 'canadd' => $canupdate, 'view' => $preference["widgetviewdirectory"][$directory], 'sort' => $preference["widgetsortdirectory"][$directory], + 'order' => $preference["widgetorderdirectory"][$directory], + 'fgtrash' => $fgtrash, ]); } public function uploadAction($id,$type,Request $request,$access="config") { - $subdirectory=$request->get("subdirectory"); - $forcereload=(is_null($request->get("forcereload"))?true:$request->get("forcereload")); + $canupdate =$this->getPermission($access,$id); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + $subdirectory=urldecode($request->get("subdirectory")); + $forcereload=(is_null($request->get("forcereload"))?true:$request->get("forcereload")); + return $this->render('CadolesCoreBundle:File:upload.html.twig',[ 'useheader' => false, 'usemenu' => false, @@ -193,8 +228,10 @@ class FileController extends Controller public function subdirectoryAction($id,$type,Request $request,$access="config") { - $subdirectory=$request->get("subdirectory"); + $canupdate =$this->getPermission($access,$id); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + $subdirectory=$request->get("subdirectory"); $defaultData = []; $form = $this->createFormBuilder() ->add('subdirectory', TextType::class,["label"=>"Répertoire"]) @@ -206,7 +243,7 @@ class FileController extends Controller if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); - if($data["subdirectory"]=="thumb"||$data["subdirectory"]=="thumbmini") { + if($data["subdirectory"]=="thumb"||$data["subdirectory"]=="thumbmini"||$data["subdirectory"]=="__trash") { $form->addError(new FormError('Nom de répertoire réservé, merci de choisir un autre nom de répertoire')); $this->get('session')->getFlashBag()->clear(); $request->getSession()->getFlashBag()->add("error", 'Nom de répertoire réservé, merci de choisir un autre nom de répertoire'); @@ -234,6 +271,223 @@ class FileController extends Controller ]); } + public function renameAction($id,$oldname, Request $request,$access="config") + { + $canupdate =$this->getPermission($access,$id); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + + $subdirectory=$request->get("subdirectory"); + + $form = $this->createFormBuilder() + ->add('subdirectory', TextType::class,["label"=>"Renommer"]) + ->add('submit', SubmitType::class,["label"=>"Valider"]) + ->getForm(); + + $form->handleRequest($request); + $toclose=false; + + if ($form->isSubmitted() && $form->isValid()) { + $data = $form->getData(); + if($data["subdirectory"]=="thumb"||$data["subdirectory"]=="thumbmini"||$data["subdirectory"]=="__trash") { + $form->addError(new FormError('Nom réservé, merci de choisir un autre nom')); + $this->get('session')->getFlashBag()->clear(); + $request->getSession()->getFlashBag()->add("error", 'Nom réservé, merci de choisir un autre nom'); + } + else { + $fs = new Filesystem(); + $fulldirectory=$this->get('kernel')->getRootDir()."/../uploads/file/".$id; + if($subdirectory) $fulldirectory.="/".$subdirectory; + + $urlsource= $fulldirectory."/".$oldname; + $urldestination = $fulldirectory."/".$data["subdirectory"]; + if($urlsource!=$urldestination) { + if($fs->exists($urldestination)) { + $form->addError(new FormError('Ce nom existe déjà')); + $this->get('session')->getFlashBag()->clear(); + $request->getSession()->getFlashBag()->add("error", 'Ce nom existe déjà'); + } + elseif($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else { + $fs->rename($urlsource,$urldestination,true); + $fs->touch($urldestination); + + $urlsource= $fulldirectory."/thumb/".$oldname; + $urldestination = $fulldirectory."/thumb/".$data["subdirectory"]; + if($fs->exists($urlsource)) + $fs->rename($urlsource,$urldestination,true); + + $urlsource= $fulldirectory."/thumbmini/".$oldname; + $urldestination = $fulldirectory."/thumbmini/".$data["subdirectory"]; + if($fs->exists($urlsource)) + $fs->rename($urlsource,$urldestination,true); + } + + $toclose=true; + } + } + + + } + } else $form->get('subdirectory')->setData($oldname); + + return $this->render('CadolesCoreBundle:File:subdirectory.html.twig',[ + 'useheader' => false, + 'usemenu' => false, + 'usesidebar' => false, + 'access' => $access, + 'id' => $id, + 'subdirectory' => $subdirectory, + 'form' => $form->createView(), + 'toclose' => $toclose, + ]); + } + + public function trashAction(Request $request,$access="config") + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(array('message' => 'Interdit'), 400); + } + + $output=array(); + $directory=$request->request->get('directory'); + + // Récupération du répertoire source et le nom du fichier + $racine=$this->get('kernel')->getRootDir()."/../uploads/file"; + $directory=$request->request->get('directory'); + $dirsource =$request->request->get('subdirectory'); + $namesource =$request->request->get('filename'); + + $canupdate =$this->getPermission($access,$directory); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + + $fs = new Filesystem(); + + // Déplacer le fichier + $urlsource=$racine."/".$directory."/".$dirsource."/".$namesource; + $urldestination=$racine."/".$directory."/__trash/".$dirsource."/".$namesource; + $fs->mkdir($racine."/".$directory."/__trash/".$dirsource); + if($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else $fs->rename($urlsource,$urldestination,true); + + } + + // Déplacer le thumb + $fs->mkdir($racine."/".$directory."/__trash/".$dirsource."/thumb"); + $urlsource=$racine."/".$directory."/".$dirsource."/thumb/".$namesource; + $urldestination=$racine."/".$directory."/__trash/".$dirsource."/thumb/".$namesource; + if($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else $fs->rename($urlsource,$urldestination,true); + } + + // Déplacer le thumbmini + $fs->mkdir($racine."/".$directory."/__trash/".$dirsource."/thumbmini"); + $urlsource=$racine."/".$directory."/".$dirsource."/thumbmini/".$namesource; + $urldestination=$racine."/".$directory."/__trash/".$dirsource."/thumbmini/".$namesource; + if($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else $fs->rename($urlsource,$urldestination,true); + } + + $response = new Response(json_encode($output)); + $response->headers->set('Content-Type', 'application/json'); + return $response; + } + + public function restaureAction(Request $request,$access="config") + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(array('message' => 'Interdit'), 400); + } + + $output=array(); + $directory=$request->request->get('directory'); + + // Récupération du répertoire source et le nom du fichier + $racine=$this->get('kernel')->getRootDir()."/../uploads/file"; + $directory=$request->request->get('directory'); + $dirsource =$request->request->get('subdirectory'); + $namesource =$request->request->get('filename'); + + $canupdate =$this->getPermission($access,$directory); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + + $fs = new Filesystem(); + + // Déplacer le fichier + $dirdestination=str_replace("__trash/","",$dirsource); + $urlsource=$racine."/".$directory."/".$dirsource."/".$namesource; + $urldestination=str_replace("__trash/","/",$urlsource); + $fs->mkdir($racine."/".$directory."/".$dirdestination); + if($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else $fs->rename($urlsource,$urldestination,true); + } + + // Déplacer le thumb + $urlsource=$racine."/".$directory."/".$dirsource."/thumb/".$namesource; + $urldestination=str_replace("__trash/","/",$urlsource); + $fs->mkdir($racine."/".$directory."/".$dirdestination."/thumb"); + if($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else $fs->rename($urlsource,$urldestination,true); + } + + // Déplacer le thumbmini + $urlsource=$racine."/".$directory."/".$dirsource."/thumbmini/".$namesource; + $urldestination=str_replace("__trash/","/",$urlsource); + $fs->mkdir($racine."/".$directory."/".$dirdestination."/thumbmini"); + if($fs->exists($urlsource)) { + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else $fs->rename($urlsource,$urldestination,true); + } + + $response = new Response(json_encode($output)); + $response->headers->set('Content-Type', 'application/json'); + return $response; + } + + public function purgetrashAction($directory,Request $request,$access="config") + { + $output=array(); + + $canupdate =$this->getPermission($access,$directory); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + + $fs = new Filesystem(); + $url=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory."/__trash"; + if($fs->exists($url)) { + $fs->remove($url); + } + + return $this->redirectToRoute('cadoles_core_'.$access.'_file_list',['directory'=>$directory]); + } + public function deleteAction(Request $request,$access="config") { // S'assurer que c'est un appel ajax @@ -247,7 +501,9 @@ class FileController extends Controller $filename=$request->request->get('filename'); if($subdirectory) $directory.="/".$subdirectory; - $this->getPermission($access,$directory); + $canupdate =$this->getPermission($access,$directory); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + $fs = new Filesystem(); $url=$this->get('kernel')->getRootDir()."/../uploads/file/".$directory."/".$filename; if($fs->exists($url)) { @@ -267,7 +523,7 @@ class FileController extends Controller } $output=array(); - $directory=$request->request->get('directory');+ + $directory=$request->request->get('directory'); // Récupération du répertoire source et le nom du fichier $racine=$this->get('kernel')->getRootDir()."/../uploads/file"; @@ -276,16 +532,22 @@ class FileController extends Controller $dirdestination =$request->request->get('dirdestination'); $namedestination =$request->request->get('namedestination'); - $destid=$request->request->get('destid'); - $this->getPermission($access,$directory); + $canupdate =$this->getPermission($access,$directory); + if(!$canupdate) throw $this->createNotFoundException('Permission denied'); + $fs = new Filesystem(); // Déplacer le fichier $urlsource=$racine."/".$dirsource."/".$namesource; $urldestination=$racine."/".$dirdestination."/".$namedestination; if($fs->exists($urlsource)) { - $fs->rename($urlsource,$urldestination); + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else + $fs->rename($urlsource,$urldestination, true); } // Déplacer le thumb @@ -293,7 +555,12 @@ class FileController extends Controller $urlsource=$racine."/".$dirsource."/thumb/".$namesource; $urldestination=$racine."/".$dirdestination."/thumb/".$namedestination; if($fs->exists($urlsource)) { - $fs->rename($urlsource,$urldestination); + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else + $fs->rename($urlsource,$urldestination, true); } // Déplacer le thumbmini @@ -301,7 +568,12 @@ class FileController extends Controller $urlsource=$racine."/".$dirsource."/thumbmini/".$namesource; $urldestination=$racine."/".$dirdestination."/thumbmini/".$namedestination; if($fs->exists($urlsource)) { - $fs->rename($urlsource,$urldestination); + if(is_dir($urlsource)) { + $fs->mirror($urlsource,$urldestination); + $fs->remove($urlsource); + } + else + $fs->rename($urlsource,$urldestination, true); } $response = new Response(json_encode($output)); @@ -309,6 +581,7 @@ class FileController extends Controller return $response; } + public function viewAction($directory,$filename,Request $request,$access="config") { $this->getPermission($access,$directory); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/GroupController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/GroupController.php index 2497836f..183384a7 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/GroupController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/GroupController.php @@ -139,16 +139,16 @@ class GroupController extends Controller case 6 : $qb->orderBy('table.owner',$order[0]["dir"]); break; - case 7 : + case 8 : $qb->orderBy('table.fgcancreatepage',$order[0]["dir"]); break; - case 8 : + case 9 : $qb->orderBy('table.fgcancreatecalendar',$order[0]["dir"]); break; - case 9 : + case 10 : $qb->orderBy('table.fgcancreateblog',$order[0]["dir"]); break; - case 10 : + case 11 : $qb->orderBy('table.fgcancreateproject',$order[0]["dir"]); break; } @@ -175,7 +175,7 @@ class GroupController extends Controller if(!$data->getFgall()) $action .="$data->getId()))."'>"; if($data->getFgcanshare()) - $action.="$data->getId()))."'>"; + $action.="$data->getId()))."'>"; } else { $fgproprio=($user==$data->getOwner()); @@ -194,11 +194,16 @@ class GroupController extends Controller $action .="$data->getId()))."'>"; } else { - $action.="$data->getId()))."'>"; + // On ne peut se désinscrire que si le groupe est ouvert et qu'il n'est pas lié à un groupe ldap ou sso + $fgcanleave=true; + if($data->getFgtemplate() or $data->getFgall()) $fgcanleave=false; + elseif(!$data->getFgcanshare() && !$data->getFgopen()) $fgcanleave=false; + elseif($data->getFgcanshare() && !$this->get('session')->get('permunsubscribe') && !$data->getFgopen()) $fgcanleave=false; + if($fgcanleave) $action.="$data->getId()))."'>"; } if($data->getFgcanshare()) - $action.="$data->getId()))."'>"; + $action.="$data->getId()))."'>"; } @@ -217,6 +222,12 @@ class GroupController extends Controller $userinfo.="
".$data->getOwner()->getUsername(); } + $visitecpt=""; + $visitelast=null; + foreach($data->getUsers() as $usergroup) { + $visitecpt+=$usergroup->getVisitecpt(); + $visitelast=($usergroup->getVisitedate()>$visitelast?$usergroup->getVisitedate():$visitelast); + } array_push($output["data"],array( @@ -227,6 +238,7 @@ class GroupController extends Controller $filtre, ($data->getFgcanshare()?"oui":"non"), $userinfo, + ($visitelast?$visitelast->format("d/m/Y H:i")."
":"")."nb = ".$visitecpt, ($data->getFgcancreatepage()?"oui":"non"), ($data->getFgcancreatecalendar()?"oui":"non"), ($data->getFgcancreateblog()?"oui":"non"), @@ -561,7 +573,7 @@ class GroupController extends Controller // Notification mail auprès de la personne inscrite if($group->getFgcanshare()) { $idpage =$group->getPages()->first()->getId(); - $url = $this->generateUrl('cadoles_core_home', ["id"=>$idpage], UrlGeneratorInterface::ABSOLUTE_URL); + $url = $this->generateUrl('cadoles_core_redirect', ["route"=>"cadoles_core_home","id"=>$idpage], UrlGeneratorInterface::ABSOLUTE_URL); $texthtml="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel()."
Suivez le lien suivant pour y accéder = $url"; $text="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel()."
Suivez le lien suivant pour y accéder = $url"; @@ -1010,6 +1022,61 @@ class GroupController extends Controller ]); } + public function groupexportAction(Request $request, $access="config") + { + $em = $this->getDoctrine()->getManager(); + $dir = $this->get('kernel')->getRootDir() . '/../uploads/export/'; + $file = "exportgroup.csv"; + + $fs = new Filesystem(); + $fs->mkdir($dir); + + $csvh = fopen($dir.$file, 'w'); + $d = ';'; // this is the default but i like to be explicit + $e = '"'; // this is the default but i like to be explicit + + // Entête de colonne + $data=["id","Label","Ouvert","Groupe de Travail","Propriétaire","Date Visite","Cpt Visite","Création Page","Création Calendriers","Création Blogs","Création Projets"]; + fputcsv($csvh, $data, $d, $e); + + // Liste des utilisateurs en fonction du role de l'utilisateur en cours + $groups=$em->getRepository("CadolesCoreBundle:Group")->findAll(); + + foreach($groups as $group) { + $data = [ + "id"=>$group->getId(), + "label"=>$group->getLabel(), + "fgopen"=>($group->getFgopen()?"oui":"non"), + "fgcanshare"=>($group->getFgcanshare()?"oui":"non"), + "owner"=>($group->getOwner()?$group->getOwner()->getUsername():""), + "visitedate"=>"", + "visitecpt"=>"", + "fgcancreatepage"=>($group->getFgcancreatepage()?"oui":"non"), + "fgcancreatecalendar"=>($group->getFgcancreatecalendar()?"oui":"non"), + "fgcancreateblog"=>($group->getFgcancreateblog()?"oui":"non"), + "fgcancreateproject"=>($group->getFgcancreateproject()?"oui":"non"), + ]; + + $visitecpt=""; + $visitelast=null; + foreach($group->getUsers() as $usergroup) { + $visitecpt+=$usergroup->getVisitecpt(); + $visitelast=($usergroup->getVisitedate()>$visitelast?$usergroup->getVisitedate():$visitelast); + } + + $data["visitedate"]=($visitelast?$visitelast->format("d/m/Y H:i"):""); + $data["visitecpt"]=$visitecpt; + + fputcsv($csvh, $data, $d, $e); + } + fclose($csvh); + + $response = new BinaryFileResponse($dir.$file); + $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); + + return $response; + } + public function usergroupexportAction($id,Request $request, $access="config") { // Récupération de l'enregistrement courant @@ -1131,6 +1198,46 @@ class GroupController extends Controller ]); } + public function invitationAction($id,Request $request, $access="config") + { + // Récupération de l'enregistrement courant + $em = $this->getDoctrine()->getManager(); + $group=$this->getData($id); + $this->canManager($group,$access); + + $invitations=$group->getInvitations(); + if(!is_array($invitations)) $invitations=[]; + + foreach($invitations as $key => $mail) { + $user=$em->getRepository("CadolesCoreBundle:User")->findOneBy(["email"=>$mail]); + // Si l'utilisateur est inscript plus la peine de le suivre + if($user) { + $listinvitations[$key]=["email"=>$mail,"statut"=>"","relance"=>false]; + $usergroup=$em->getRepository("CadolesCoreBundle:UserGroup")->findOneBy(["user"=>$user,"group"=>$group]); + if($usergroup) + $listinvitations[$key]["statut"]="Inscrit dans le groupe"; + else + $listinvitations[$key]["statut"]="Inscrit sur ".$this->get('session')->get('appname')." mais pas dans le groupe"; + } + else { + $listinvitations[$key]=["email"=>$mail,"statut"=>"Non inscrit sur ".$this->get('session')->get('appname'),"relance"=>true]; + $user=$em->getRepository("CadolesCoreBundle:Registration")->findOneBy(["email"=>$mail]); + if($user) { + $listinvitations[$key]["statut"]=$user->getStatut()->getLabel(); + $listinvitations[$key]["relance"]=false; + } + } + } + + return $this->render('CadolesCoreBundle:Group:invitations.html.twig',[ + 'useheader' => false, + 'usemenu' => false, + 'usesidebar' => false, + 'id' => $id, + 'invitations' => $listinvitations, + ]); + } + protected function canManager($group,$access) { if($access!="config") { $em = $this->getDoctrine()->getManager(); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/MailController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/MailController.php index d472bb2e..6e9e06a9 100755 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/MailController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/MailController.php @@ -23,6 +23,10 @@ class MailController extends Controller throw $this->createNotFoundException('Unable to find '.$this->labeldata); } + // On récupère la liste des email invités + $invitations=$group->getInvitations(); + if(!is_array($invitations)) $invitations=[]; + // Création du formulaire $form = $this->createForm(MailType::class); @@ -34,7 +38,7 @@ class MailController extends Controller // Sujet $url = $this->generateUrl('cadoles_core_registration',[], UrlGeneratorInterface::ABSOLUTE_URL)."?group=".$group->getId(); - $message = "Bonjour,

En tant que responsable du projet '".$group->getLabel()."', je vous ai invité à rejoindre cette communauté de travail

"; + $message = "Bonjour,

En tant que responsable du groupe '".$group->getLabel()."', je vous ai invité à rejoindre cette communauté de travail

"; $message.= "Merci de bien vouloir tout d’abord vous inscrire sur ".$this->get('session')->get('appname')." en suivant le lien suivant
"; $message.= "$url

"; $message.= "Une fois le processus d'inscription complété, vous serez automatiquement rattaché à notre groupe de travail

"; @@ -64,8 +68,15 @@ class MailController extends Controller if($usergroup) array_push($usersin,$user); else array_push($usersnotin,$user); } + else { + // On enregistre l'invitation si elle n'existe pas déjà + if(!in_array($mail,$invitations)) { + array_push($invitations,$mail); + } + } } - + + $text=$form->get("message")->getData(); $subject=$form->get("subject")->getData(); $template="template"; @@ -78,6 +89,17 @@ class MailController extends Controller $fromName = $this->getUser()->getFirstname()." ".$this->getUser()->getLastname(); $message = $this->container->get('cadoles.core.service.mail'); $message->sendEmail($template, $mail_params, $to, $from, $fromName); + + // Sauvegarde des invitation + $group->setInvitations($invitations); + $em->persist($group); + $em->flush(); + } + else { + $email=$request->get("email"); + if($email) { + $form->get('destinataire')->setData($email); + } } if($closed && (!empty($usersin)||!empty($usersnotin))) { diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RegistrationController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RegistrationController.php index 61e910db..78abe42e 100755 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RegistrationController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RegistrationController.php @@ -509,6 +509,7 @@ class RegistrationController extends Controller $user->setPasswordDirect($data[0]->getPassword()); $user->setVisible($data[0]->getVisible()); $user->setMotivation($data[0]->getMotivation()); + $user->setNote($data[0]->getNote()); $user->setNiveau01($data[0]->getNiveau01()); $user->setSiren($data[0]->getNiveau01()->getSiren()); @@ -700,9 +701,8 @@ class RegistrationController extends Controller public function resetpwd02Action($key,Request $request) { - $moderegistration = $this->getParameter('moderegistration'); $masteridentity = $this->getParameter('masteridentity'); - if($moderegistration=="none"||$masteridentity!="SQL") + if($masteridentity!="SQL") throw $this->createNotFoundException('Permission denied'); $now=new \DateTime(); @@ -872,7 +872,7 @@ class RegistrationController extends Controller $niveau01=strtolower($data->getNiveau01()->getLabel()); if(stripos($niveau01,"autre")===0) { if(!$data->getNiveau01other()) { - $form->addError(new FormError("Merci d'indiquer votre ".$this->getParameter("labelniveau01"))); + $form->addError(new FormError("Merci de compléter le champ 'Autre ".$this->getParameter("labelniveau01")."'")); } } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php index bcd7119e..ede07371 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php @@ -429,11 +429,15 @@ class UserController extends Controller // Notification mail auprès de la personne inscrite if($group->getFgcanshare()) { - $text="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel(); + $idpage =$group->getPages()->first()->getId(); + $url = $this->generateUrl('cadoles_core_redirect', ["route"=>"cadoles_core_home","id"=>$idpage], UrlGeneratorInterface::ABSOLUTE_URL); + $texthtml="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel()."
Suivez le lien suivant pour y accéder = $url"; + $text="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel()."
Suivez le lien suivant pour y accéder = $url"; + $template="template"; $mail_params=array( "subject" => $this->get('session')->get('appname')." : Inscription au groupe de travail : ".$group->getLabel()."\n\n".$group->getDescription(), - "body_html"=>nl2br($text), + "body_html"=>$texthtml, "body_text"=>$text ); $to = $data->getEmail(); @@ -575,11 +579,15 @@ class UserController extends Controller // Notification mail auprès de la personne inscrite if($group->getFgcanshare()) { - $text="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel(); + $idpage =$group->getPages()->first()->getId(); + $url = $this->generateUrl('cadoles_core_redirect', ["route"=>"cadoles_core_home","id"=>$idpage], UrlGeneratorInterface::ABSOLUTE_URL); + $texthtml="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel()."
Suivez le lien suivant pour y accéder = $url"; + $text="Vous venez d'être inscrit dans le groupe de travail : ".$group->getLabel()."
Suivez le lien suivant pour y accéder = $url"; + $template="template"; $mail_params=array( "subject" => $this->get('session')->get('appname')." : Inscription au groupe de travail : ".$group->getLabel()."\n\n".$group->getDescription(), - "body_html"=>nl2br($text), + "body_html"=>$texthtml, "body_text"=>$text ); $to = $data->getEmail(); @@ -910,7 +918,7 @@ class UserController extends Controller public function exportuserAction(Request $request) { $em = $this->getDoctrine()->getManager(); $dir = $this->get('kernel')->getRootDir() . '/../uploads/export/'; - $file = "export.csv"; + $file = "exportuser.csv"; $fs = new Filesystem(); $fs->mkdir($dir); @@ -920,7 +928,7 @@ class UserController extends Controller $e = '"'; // this is the default but i like to be explicit // Entête de colonne - $data=["id","Login","Nom","Prénom","Email","Téléphone",$this->getParameter("labelniveau01"),$this->getParameter("labelniveau02"),"Métier","Fonction","Nom Usage","Autres Prénom","Sexe","Adresse","Date Naissance","Pays Naissance","Ville Naissance"]; + $data=["id","Login","Nom","Prénom","Email","Téléphone",$this->getParameter("labelniveau01"),$this->getParameter("labelniveau02"),"Métier","Fonction","Nom Usage","Autres Prénom","Sexe","Adresse","Date Naissance","Pays Naissance","Ville Naissance","Date Visite","Cpt Visite","Groupes"]; fputcsv($csvh, $data, $d, $e); // Liste des utilisateurs en fonction du role de l'utilisateur en cours @@ -942,6 +950,17 @@ class UserController extends Controller } foreach($users as $user) { + $groups=""; + $fgfirst=true; + foreach($user->getGroups() as $key => $usergroup) { + if(!$fgfirst) $groups.=" - "; + $groups.=$usergroup->getGroup()->getLabel(); + if($fgfirst) $fgfirst=false; + } + + $visite = ($user->getVisitedate()?$user->getVisitedate()->format("d/m/Y H:i"):""); + $cptvisite = ($user->getVisitedate()?$user->getVisitecpt():""); + $data = [ "id"=>$user->getId(), "username"=>$user->getUsername(), @@ -960,6 +979,9 @@ class UserController extends Controller "birthdate"=>($user->getBirthdate()?$user->getBirthdate()->format("d/m/Y"):""), "birthcountry"=>($user->getBirthcountry()?$user->getBirthcountry()->getLabel():""), "birthplace"=>($user->getBirthplace()?$user->getBirthplace()->getLabel():""), + "visite"=>$visite, + "cptvisite"=>$cptvisite, + "groups"=>$groups, ]; @@ -1461,7 +1483,7 @@ class UserController extends Controller $niveau01=strtolower($data->getNiveau01()->getLabel()); if(stripos($niveau01,"autre")===0) { if(!$data->getNiveau01other()) { - $form->addError(new FormError("Merci d'indiquer votre ".$this->getParameter("labelniveau01"))); + $form->addError(new FormError("Merci de compléter le champ 'Autre ".$this->getParameter("labelniveau01")."'")); } } } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/WhitelistController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/WhitelistController.php index 01d4e715..a49466f9 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/WhitelistController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/WhitelistController.php @@ -207,6 +207,25 @@ class WhitelistController extends Controller ]); } + public function ajaxiswhitelistAction(Request $request) + { + // S'assurer que c'est un appel ajax + if (!$request->isXmlHttpRequest()) { + return new JsonResponse(array('message' => 'Interdit'), 400); + } + $email=$request->request->get('email'); + $email=explode("@",$email); + $domaine=end($email); + + // Rechercher le mail dans la liste blanche + $em = $this->getDoctrine()->getManager(); + $whitelist=$em->getRepository($this->labelentity)->findOneBy(["label"=>$domaine]); + if($whitelist) + return new Response("OK", 200); + else + return new Response("KO", 200); + } + protected function getDatas() { $em = $this->getDoctrine()->getManager(); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Group.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Group.php index b241701c..2a8e02fc 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Group.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Group.php @@ -103,6 +103,11 @@ class Group */ private $idonlyoffice; + /** + * @ORM\Column(name="invitations", type="array", nullable=true) + */ + private $invitations; + /** * @ORM\ManyToOne(targetEntity="Cadoles\PortalBundle\Entity\Icon", inversedBy="groups") * @ORM\JoinColumn(nullable=true, onDelete="SET NULL") @@ -1085,4 +1090,28 @@ class Group { return $this->email; } + + /** + * Set invitations + * + * @param array $invitations + * + * @return Group + */ + public function setInvitations($invitations) + { + $this->invitations = $invitations; + + return $this; + } + + /** + * Get invitations + * + * @return array + */ + public function getInvitations() + { + return $this->invitations; + } } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Registration.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Registration.php index 9f2640d2..8f2cf950 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Registration.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/Registration.php @@ -143,6 +143,11 @@ class Registration implements UserInterface, \Serializable */ private $motivation; + /** + * @ORM\Column(name="note", type="text", nullable=true) + */ + private $note; + /** * @ORM\Column(type="integer", length=60, nullable=true) */ @@ -840,4 +845,28 @@ class Registration implements UserInterface, \Serializable { return $this->passwordad; } + + /** + * Set note + * + * @param string $note + * + * @return Registration + */ + public function setNote($note) + { + $this->note = $note; + + return $this; + } + + /** + * Get note + * + * @return string + */ + public function getNote() + { + return $this->note; + } } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/User.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/User.php index c2b826be..5cea9d96 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/User.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Entity/User.php @@ -195,7 +195,12 @@ class User implements UserInterface, \Serializable * @ORM\Column(name="motivation", type="text", nullable=true) */ private $motivation; - + + /** + * @ORM\Column(name="note", type="text", nullable=true) + */ + private $note; + /** * @ORM\Column(name="preference", type="array", nullable=true) */ @@ -2059,4 +2064,28 @@ class User implements UserInterface, \Serializable { return $this->passwordad; } + + /** + * Set note + * + * @param string $note + * + * @return User + */ + public function setNote($note) + { + $this->note = $note; + + return $this; + } + + /** + * Get note + * + * @return string + */ + public function getNote() + { + return $this->note; + } } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/RegistrationType.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/RegistrationType.php index 1528adc2..ad8aead0 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/RegistrationType.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/RegistrationType.php @@ -45,6 +45,15 @@ class RegistrationType extends AbstractType "attr" => array("class" => "btn btn-success") ) ); + + $builder->add('note', + TextareaType::class, array( + "label" => "Notes Administrateur", + "required" => false, + "disabled" => ($options["mode"]=="delete"?true:false), + "attr" => array("class" => "form-control", "style" => "margin-bottom:15px; height: 130px") + ) + ); } # Obligatoire @@ -87,7 +96,7 @@ class RegistrationType extends AbstractType $builder->add('niveau01other', TextType::class, array( - "label" =>"Autre ".$session->get('labelniveau01'), + "label" =>"Autre ".$session->get('labelniveau01'). " *", "disabled" => ($options["mode"]=="delete"?true:false), "required" => false, "attr" => array("class" => "form-control", "style" => "margin-bottom:15px") diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/UserType.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/UserType.php index 0f64d4aa..5a6d8950 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/UserType.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Form/UserType.php @@ -85,7 +85,16 @@ class UserType extends AbstractType "required" => false, "attr" => array("class" => "form-control", "style" => "margin-bottom:15px;$readonly","onfocus" => $onfocus, "onchange" => $onchange), ] - ); + ); + + $builder->add('note', + TextareaType::class, array( + "label" => "Notes Administrateur", + "required" => false, + "disabled" => ($options["mode"]=="delete"?true:false), + "attr" => array("class" => "form-control", "style" => "margin-bottom:15px; height: 130px") + ) + ); } $perm=$options["perm"]; diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/config/routing.yml b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/config/routing.yml index 0511a6ba..2bc28289 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/config/routing.yml +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/config/routing.yml @@ -74,6 +74,22 @@ cadoles_core_config_file_subdirectory: path: /config/file/subdirectory/{id}/{type} defaults: { _controller: CadolesCoreBundle:File:subdirectory, access: config } +cadoles_core_config_file_rename: + path: /config/file/rename/{id}/{oldname} + defaults: { _controller: CadolesCoreBundle:File:rename, access: config } + +cadoles_core_config_file_trash: + path: /config/file/trash/ + defaults: { _controller: CadolesCoreBundle:File:trash, access: config } + +cadoles_core_config_file_restaure: + path: /config/file/restaure/ + defaults: { _controller: CadolesCoreBundle:File:restaure, access: config } + +cadoles_core_config_file_purgetrash: + path: /config/file/purgetrash/{directory} + defaults: { _controller: CadolesCoreBundle:File:purgetrash, access: config } + cadoles_core_config_file_delete: path: /config/file/delete/ defaults: { _controller: CadolesCoreBundle:File:delete, access: config } @@ -107,6 +123,22 @@ cadoles_core_user_file_subdirectory: path: /user/file/subdirectory/{id}/{type} defaults: { _controller: CadolesCoreBundle:File:subdirectory, access: user } +cadoles_core_user_file_rename: + path: /user/file/rename/{id}/{oldname} + defaults: { _controller: CadolesCoreBundle:File:rename, access: user } + +cadoles_core_user_file_trash: + path: /user/file/trash/ + defaults: { _controller: CadolesCoreBundle:File:trash, access: user } + +cadoles_core_user_file_restaure: + path: /user/file/restaure/ + defaults: { _controller: CadolesCoreBundle:File:restaure, access: user } + +cadoles_core_user_file_purgetrash: + path: /user/file/purgetrash/{directory} + defaults: { _controller: CadolesCoreBundle:File:purgetrash, access: user } + cadoles_core_user_file_delete: path: /user/file/delete defaults: { _controller: CadolesCoreBundle:File:delete, access: user } @@ -128,6 +160,7 @@ cadoles_core_user_file_show: defaults: { _controller: CadolesCoreBundle:File:show, access: user } + #== Ajax ================================================================================================================= cadoles_core_ajax_country_list: path: /ajax/country/list @@ -161,6 +194,10 @@ cadoles_core_ajax_item_list: path: /ajax/item/list defaults: { _controller: CadolesCoreBundle:Ajax:itemlist } +cadoles_core_ajax_iswhitelist: + path: /ajax/iswhitelist + defaults: { _controller: CadolesCoreBundle:Whitelist:ajaxiswhitelist } + #== Home Config ========================================================================================================== cadoles_core_config: path: /config/home @@ -461,10 +498,18 @@ cadoles_core_config_group_ajax_switchmanager: path: /config/group/ajax/switchmanager defaults: { _controller: CadolesCoreBundle:Group:switchmanager, access: config } +cadoles_core_config_group_export: + path: /config/group/export + defaults: { _controller: CadolesCoreBundle:Group:groupexport } + cadoles_core_config_group_usergroup_export: path: /config/group/users/export/{id} defaults: { _controller: CadolesCoreBundle:Group:usergroupexport, access: config } +cadoles_core_config_group_invitation: + path: /config/group/invitation/{id} + defaults: { _controller: CadolesCoreBundle:Group:invitation, access: config } + #-- Access user cadoles_core_user_group: path: /user/group @@ -522,6 +567,10 @@ cadoles_core_user_group_usergroup_export: path: /user/group/users/export/{id} defaults: { _controller: CadolesCoreBundle:Group:usergroupexport, access: user } +cadoles_core_user_group_invitation: + path: /user/group/invitation/{id} + defaults: { _controller: CadolesCoreBundle:Group:invitation, access: user } + #== Whitelist ============================================================================================================ cadoles_core_config_whitelist: diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/jquery-ui.multidatespicker.css b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/jquery-ui.multidatespicker.css new file mode 100644 index 00000000..0315bf42 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/jquery-ui.multidatespicker.css @@ -0,0 +1,12 @@ +/* jQuery UI Datepicker moving pixels fix */ +table.ui-datepicker-calendar {border-collapse: separate;} +.ui-datepicker-calendar td {border: 1px solid transparent;} + +/* jQuery UI Datepicker hide datepicker helper */ +#ui-datepicker-div {display:none;} + +/* jQuery UI Datepicker emphasis on selected dates */ +.ui-datepicker .ui-datepicker-calendar .ui-state-highlight a { + background: #743620 none; + color: white; +} \ No newline at end of file diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/style.css b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/style.css index 29c54e2a..3d446a49 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/style.css +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/css/style.css @@ -381,6 +381,15 @@ a.item-update { z-index: 1000; } + +a.item-restaure { + display: none; + position: absolute; + right: 25px; + top: 2px; + z-index: 1000; +} + a.item-delete { display: none; position: absolute; diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/js/jquery-ui.multidatespicker.js b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/js/jquery-ui.multidatespicker.js new file mode 100644 index 00000000..85546af0 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/js/jquery-ui.multidatespicker.js @@ -0,0 +1,498 @@ +/* + * MultiDatesPicker v1.6.4 + * http://multidatespickr.sourceforge.net/ + * + * Copyright 2014, Luca Lauretta + * Dual licensed under the MIT or GPL version 2 licenses. + */ +(function( $ ){ + $.extend($.ui, { multiDatesPicker: { version: "1.6.4" } }); + + $.fn.multiDatesPicker = function(method) { + var mdp_arguments = arguments; + var ret = this; + var today_date = new Date(); + var day_zero = new Date(0); + var mdp_events = {}; + + function removeDate(date, type) { + if(!type) type = 'picked'; + date = dateConvert.call(this, date); + for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++) + if(!methods.compareDates(this.multiDatesPicker.dates[type][i], date)) + return this.multiDatesPicker.dates[type].splice(i, 1).pop(); + } + function removeIndex(index, type) { + if(!type) type = 'picked'; + return this.multiDatesPicker.dates[type].splice(index, 1).pop(); + } + function addDate(date, type, no_sort) { + if(!type) type = 'picked'; + date = dateConvert.call(this, date); + + // @todo: use jQuery UI datepicker method instead + date.setHours(0); + date.setMinutes(0); + date.setSeconds(0); + date.setMilliseconds(0); + + if (methods.gotDate.call(this, date, type) === false) { + this.multiDatesPicker.dates[type].push(date); + if(!no_sort) this.multiDatesPicker.dates[type].sort(methods.compareDates); + } + } + function sortDates(type) { + if(!type) type = 'picked'; + this.multiDatesPicker.dates[type].sort(methods.compareDates); + } + function dateConvert(date, desired_type, date_format) { + if(!desired_type) desired_type = 'object';/* + if(!date_format && (typeof date == 'string')) { + date_format = $(this).datepicker('option', 'dateFormat'); + if(!date_format) date_format = $.datepicker._defaults.dateFormat; + } + */ + return methods.dateConvert.call(this, date, desired_type, date_format); + } + + var methods = { + init : function( options ) { + var $this = $(this); + this.multiDatesPicker.changed = false; + + var mdp_events = { + beforeShow: function(input, inst) { + this.multiDatesPicker.changed = false; + if(this.multiDatesPicker.originalBeforeShow) + this.multiDatesPicker.originalBeforeShow.call(this, input, inst); + }, + onSelect : function(dateText, inst) { + var $this = $(this); + this.multiDatesPicker.changed = true; + + if (dateText) { + $this.multiDatesPicker('toggleDate', dateText); + this.multiDatesPicker.changed = true; + // @todo: this will be optimized when I'll move methods to the singleton. + } + + if (this.multiDatesPicker.mode == 'normal' && this.multiDatesPicker.pickableRange) { + if(this.multiDatesPicker.dates.picked.length > 0) { + var min_date = this.multiDatesPicker.dates.picked[0], + max_date = new Date(min_date.getTime()); + + methods.sumDays(max_date, this.multiDatesPicker.pickableRange-1); + + // counts the number of disabled dates in the range + if(this.multiDatesPicker.adjustRangeToDisabled) { + var c_disabled, + disabled = this.multiDatesPicker.dates.disabled.slice(0); + do { + c_disabled = 0; + for(var i = 0; i < disabled.length; i++) { + if(disabled[i].getTime() <= max_date.getTime()) { + if((min_date.getTime() <= disabled[i].getTime()) && (disabled[i].getTime() <= max_date.getTime()) ) { + c_disabled++; + } + disabled.splice(i, 1); + i--; + } + } + max_date.setDate(max_date.getDate() + c_disabled); + } while(c_disabled != 0); + } + + if(this.multiDatesPicker.maxDate && (max_date > this.multiDatesPicker.maxDate)) + max_date = this.multiDatesPicker.maxDate; + + $this + .datepicker("option", "minDate", min_date) + .datepicker("option", "maxDate", max_date); + } else { + $this + .datepicker("option", "minDate", this.multiDatesPicker.minDate) + .datepicker("option", "maxDate", this.multiDatesPicker.maxDate); + } + } + + if(this.multiDatesPicker.originalOnSelect && dateText) + this.multiDatesPicker.originalOnSelect.call(this, dateText, inst); + + }, + beforeShowDay : function(date) { + var $this = $(this), + gotThisDate = $this.multiDatesPicker('gotDate', date) !== false, + isDisabledCalendar = $this.datepicker('option', 'disabled'), + isDisabledDate = $this.multiDatesPicker('gotDate', date, 'disabled') !== false, + areAllSelected = this.multiDatesPicker.maxPicks <= this.multiDatesPicker.dates.picked.length; + + var bsdReturn = [true, '', null]; + if(this.multiDatesPicker.originalBeforeShowDay) + bsdReturn = this.multiDatesPicker.originalBeforeShowDay.call(this, date); + + bsdReturn[1] = gotThisDate ? 'ui-state-highlight '+bsdReturn[1] : bsdReturn[1]; + bsdReturn[0] = bsdReturn[0] && !(isDisabledCalendar || isDisabledDate || (areAllSelected && !bsdReturn[1])); + return bsdReturn; + } + }; + + // value have to be extracted before datepicker is initiated + if($this.val()) var inputDates = $this.val() + + if(options) { + // value have to be extracted before datepicker is initiated + //if(options.altField) var inputDates = $(options.altField).val(); + if(options.separator) this.multiDatesPicker.separator = options.separator; + if(!this.multiDatesPicker.separator) this.multiDatesPicker.separator = ', '; + + this.multiDatesPicker.originalBeforeShow = options.beforeShow; + this.multiDatesPicker.originalOnSelect = options.onSelect; + this.multiDatesPicker.originalBeforeShowDay = options.beforeShowDay; + this.multiDatesPicker.originalOnClose = options.onClose; + + // datepicker init + $this.datepicker(options); + + this.multiDatesPicker.minDate = $.datepicker._determineDate(this, options.minDate, null); + this.multiDatesPicker.maxDate = $.datepicker._determineDate(this, options.maxDate, null); + if(options.addDates) methods.addDates.call(this, options.addDates); + + if(options.addDisabledDates) + methods.addDates.call(this, options.addDisabledDates, 'disabled'); + + methods.setMode.call(this, options); + } else { + $this.datepicker(); + } + $this.datepicker('option', mdp_events); + + // adds any dates found in the input or alt field + if(inputDates) $this.multiDatesPicker('value', inputDates); + + // generates the new string of added dates + var inputs_values = $this.multiDatesPicker('value'); + + // fills the input field back with all the dates in the calendar + $this.val(inputs_values); + + // Fixes the altField filled with defaultDate by default + var altFieldOption = $this.datepicker('option', 'altField'); + if (altFieldOption) $(altFieldOption).val(inputs_values); + + // Updates the calendar view + $this.datepicker('refresh'); + }, + compareDates : function(date1, date2) { + date1 = dateConvert.call(this, date1); + date2 = dateConvert.call(this, date2); + // return > 0 means date1 is later than date2 + // return == 0 means date1 is the same day as date2 + // return < 0 means date1 is earlier than date2 + var diff = date1.getFullYear() - date2.getFullYear(); + if(!diff) { + diff = date1.getMonth() - date2.getMonth(); + if(!diff) + diff = date1.getDate() - date2.getDate(); + } + return diff; + }, + sumDays : function( date, n_days ) { + var origDateType = typeof date; + obj_date = dateConvert.call(this, date); + obj_date.setDate(obj_date.getDate() + n_days); + return dateConvert.call(this, obj_date, origDateType); + }, + dateConvert : function( date, desired_format, dateFormat ) { + var from_format = typeof date; + var $this = $(this); + + if(from_format == desired_format) { + if(from_format == 'object') { + try { + date.getTime(); + } catch (e) { + $.error('Received date is in a non supported format!'); + return false; + } + } + return date; + } + + if(typeof date == 'undefined') date = new Date(0); + + if(desired_format != 'string' && desired_format != 'object' && desired_format != 'number') + $.error('Date format "'+ desired_format +'" not supported!'); + + if(!dateFormat) { + // thanks to bibendus83 -> http://sourceforge.net/tracker/index.php?func=detail&aid=3213174&group_id=358205&atid=1495382 + var dp_dateFormat = $this.datepicker('option', 'dateFormat'); + if (dp_dateFormat) { + dateFormat = dp_dateFormat; + } else { + dateFormat = $.datepicker._defaults.dateFormat; + } + } + + // converts to object as a neutral format + switch(from_format) { + case 'object': break; + case 'string': date = $.datepicker.parseDate(dateFormat, date); break; + case 'number': date = new Date(date); break; + default: $.error('Conversion from "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker'); + } + // then converts to the desired format + switch(desired_format) { + case 'object': return date; + case 'string': return $.datepicker.formatDate(dateFormat, date); + case 'number': return date.getTime(); + default: $.error('Conversion to "'+ desired_format +'" format not allowed on jQuery.multiDatesPicker'); + } + return false; + }, + gotDate : function( date, type ) { + if(!type) type = 'picked'; + for(var i = 0; i < this.multiDatesPicker.dates[type].length; i++) { + if(methods.compareDates.call(this, this.multiDatesPicker.dates[type][i], date) === 0) { + return i; + } + } + return false; + }, + value : function( value ) { + if(value && typeof value == 'string') { + methods.addDates.call(this, value.split(this.multiDatesPicker.separator)); + } else { + var dates = methods.getDates.call(this, 'string'); + return dates.length + ? dates.join(this.multiDatesPicker.separator) + : ""; + } + }, + getDates : function( format, type ) { + if(!format) format = 'string'; + if(!type) type = 'picked'; + switch (format) { + case 'object': + return this.multiDatesPicker.dates[type]; + case 'string': + case 'number': + var o_dates = new Array(); + for(var i in this.multiDatesPicker.dates[type]) + o_dates.push( + dateConvert.call( + this, + this.multiDatesPicker.dates[type][i], + format + ) + ); + return o_dates; + + default: $.error('Format "'+format+'" not supported!'); + } + }, + addDates : function( dates, type ) { + if(dates.length > 0) { + if(!type) type = 'picked'; + switch(typeof dates) { + case 'object': + case 'array': + if(dates.length) { + for(var i = 0; i < dates.length; i++) + addDate.call(this, dates[i], type, true); + sortDates.call(this, type); + break; + } // else does the same as 'string' + case 'string': + case 'number': + addDate.call(this, dates, type); + break; + default: + $.error('Date format "'+ typeof dates +'" not allowed on jQuery.multiDatesPicker'); + } + //$(this).datepicker('refresh'); + } else { + $.error('Empty array of dates received.'); + } + }, + removeDates : function( dates, type ) { + if(!type) type = 'picked'; + var removed = []; + if (Object.prototype.toString.call(dates) === '[object Array]') { + for(var i in dates.sort(function(a,b){return b-a})) { + removed.push(removeDate.call(this, dates[i], type)); + } + } else { + removed.push(removeDate.call(this, dates, type)); + } + return removed; + }, + removeIndexes : function( indexes, type ) { + if(!type) type = 'picked'; + var removed = []; + if (Object.prototype.toString.call(indexes) === '[object Array]') { + for(var i in indexes.sort(function(a,b){return b-a})) { + removed.push(removeIndex.call(this, indexes[i], type)); + } + } else { + removed.push(removeIndex.call(this, indexes, type)); + } + return removed; + }, + resetDates : function ( type ) { + if(!type) type = 'picked'; + this.multiDatesPicker.dates[type] = []; + }, + toggleDate : function( date, type ) { + if(!type) type = 'picked'; + + switch(this.multiDatesPicker.mode) { + case 'daysRange': + this.multiDatesPicker.dates[type] = []; // deletes all picked/disabled dates + var end = this.multiDatesPicker.autoselectRange[1]; + var begin = this.multiDatesPicker.autoselectRange[0]; + if(end < begin) { // switch + end = this.multiDatesPicker.autoselectRange[0]; + begin = this.multiDatesPicker.autoselectRange[1]; + } + for(var i = begin; i < end; i++) + methods.addDates.call(this, methods.sumDays.call(this,date, i), type); + break; + default: + if(methods.gotDate.call(this, date) === false) // adds dates + methods.addDates.call(this, date, type); + else // removes dates + methods.removeDates.call(this, date, type); + break; + } + }, + setMode : function( options ) { + var $this = $(this); + if(options.mode) this.multiDatesPicker.mode = options.mode; + + switch(this.multiDatesPicker.mode) { + case 'normal': + for(option in options) + switch(option) { + case 'maxPicks': + case 'minPicks': + case 'pickableRange': + case 'adjustRangeToDisabled': + this.multiDatesPicker[option] = options[option]; + break; + //default: $.error('Option ' + option + ' ignored for mode "'.options.mode.'".'); + } + break; + case 'daysRange': + case 'weeksRange': + var mandatory = 1; + for(option in options) + switch(option) { + case 'autoselectRange': + mandatory--; + case 'pickableRange': + case 'adjustRangeToDisabled': + this.multiDatesPicker[option] = options[option]; + break; + //default: $.error('Option ' + option + ' does not exist for setMode on jQuery.multiDatesPicker'); + } + if(mandatory > 0) $.error('Some mandatory options not specified!'); + break; + } + + /* + if(options.pickableRange) { + $this.datepicker("option", "maxDate", options.pickableRange); + $this.datepicker("option", "minDate", this.multiDatesPicker.minDate); + } + */ + + if(mdp_events.onSelect) + mdp_events.onSelect(); + }, + destroy: function(){ + this.multiDatesPicker = null; + $(this).datepicker('destroy'); + } + }; + + this.each(function() { + var $this = $(this); + if (!this.multiDatesPicker) { + this.multiDatesPicker = { + dates: { + picked: [], + disabled: [] + }, + mode: 'normal', + adjustRangeToDisabled: true + }; + } + + if(methods[method]) { + var exec_result = methods[method].apply(this, Array.prototype.slice.call(mdp_arguments, 1)); + switch(method) { + case 'removeDates': + case 'removeIndexes': + case 'resetDates': + case 'toggleDate': + case 'addDates': + var altField = $this.datepicker('option', 'altField'); + // @todo: should use altFormat for altField + var dates_string = methods.value.call(this); + if (altField !== undefined && altField != "") { + $(altField).val(dates_string); + } + $this.val(dates_string); + + $.datepicker._refreshDatepicker(this); + } + switch(method) { + case 'removeDates': + case 'getDates': + case 'gotDate': + case 'sumDays': + case 'compareDates': + case 'dateConvert': + case 'value': + ret = exec_result; + } + return exec_result; + } else if( typeof method === 'object' || ! method ) { + return methods.init.apply(this, mdp_arguments); + } else { + $.error('Method ' + method + ' does not exist on jQuery.multiDatesPicker'); + } + return false; + }); + + return ret; + }; + + var PROP_NAME = 'multiDatesPicker'; + var dpuuid = new Date().getTime(); + var instActive; + + $.multiDatesPicker = {version: false}; + //$.multiDatesPicker = new MultiDatesPicker(); // singleton instance + $.multiDatesPicker.initialized = false; + $.multiDatesPicker.uuid = new Date().getTime(); + $.multiDatesPicker.version = $.ui.multiDatesPicker.version; + + // allows MDP not to hide everytime a date is picked + $.multiDatesPicker._hideDatepicker = $.datepicker._hideDatepicker; + $.datepicker._hideDatepicker = function(){ + var target = this._curInst.input[0]; + var mdp = target.multiDatesPicker; + if(!mdp || (this._curInst.inline === false && !mdp.changed)) { + return $.multiDatesPicker._hideDatepicker.apply(this, arguments); + } else { + mdp.changed = false; + $.datepicker._refreshDatepicker(target); + return; + } + }; + + // Workaround for #4055 + // Add another global to avoid noConflict issues with inline event handlers + window['DP_jQuery_' + dpuuid] = $; +})( jQuery ); \ No newline at end of file diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Config/list.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Config/list.html.twig index 7a8e0202..be686877 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Config/list.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Config/list.html.twig @@ -17,6 +17,7 @@ Action Ordre Clé + Description Valeur @@ -38,6 +39,7 @@ {{ config.order }} {{ config.id }} + {{ config.help|raw }} {% if config.type == "boolean" %} {% if config.value == "0" %} diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Crop/crop02.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Crop/crop02.html.twig index 434062b0..baa550f0 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Crop/crop02.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Crop/crop02.html.twig @@ -49,5 +49,24 @@ $(window).load(function () { $('#largeimg').imgAreaSelect({ aspectRatio: '1:1', onSelectChange: preview }); + + + var selection = new Object(); + if($('#largeimg').height()<$('#largeimg').width()) { + selection.width = $('#largeimg').height(); + selection.height = $('#largeimg').height(); + } + else { + selection.width = $('#largeimg').width(); + selection.height = $('#largeimg').width(); + } + + selection.x1=0; + selection.x2=0; + selection.y1=0; + selection.y2=0; + + preview($('#largeimg'),selection); + }); {% endblock %} diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/list.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/list.html.twig index 419bba1e..09e09619 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/list.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/list.html.twig @@ -33,6 +33,10 @@ text-transform: initial !important; } + a.item-update { + right: 25px; + } + {% endblock %} @@ -41,7 +45,7 @@
+ + {% if canupdate %} +
+ + {% if fgtrash %} + Purger la poubelle + {% endif %} +
+ {% endif %}
@@ -103,12 +142,14 @@ {% set datadir = datadir~'/'~sub %} {% set sub = sub~"/"~parent %} {% endif %} - -
  • {{parent|raw}}
  • + + {% set tmpdirname = parent|replace({'__trash': 'Poubelle'}) %} +
  • {{tmpdirname|raw}}
  • {% endfor %} {% if not subdirectory is empty %} - + {% set tmpdirname = dirname|replace({'__trash': 'Poubelle'}) %} + {% endif %} @@ -124,9 +165,23 @@
    {% if canadd %} + {% if fgtrash %} + + + + - - + + + {% else %} + + + + + + + + {% endif %} {% endif %} {% if subdirectory is empty %} @@ -153,9 +208,23 @@
    {% if canadd %} + {% if fgtrash %} + + + + - - + + + {% else %} + + + + + + + + {% endif %} {% endif %} {% if file.minefamily=="text" or file.minefamily=="image" or file.minetype == "application/pdf" %} @@ -205,8 +274,12 @@ else { color = "#{{ color["main"]}}"; } + $(".item-update").css("color",color); + $(".item-update > i").css("color",color); $(".item-delete").css("color",color); $(".item-delete > i").css("color",color); + $(".item-restaure").css("color",color); + $(".item-restaure > i").css("color",color); $(".grid-item-title > h2").css("color",color); $('#mymodal').on('shown.bs.modal', function() { @@ -293,9 +366,47 @@ } } + // Trasher un fichier + function trashFile(directory,subdirectory,filename) { + var r = confirm("Confirmez-vous la mise à la poubelle de ce fichier ? Vous pourrez le récupèrer si besoin."); + if (r == true) { + $.ajax({ + method: "POST", + url: "{{ path('cadoles_core_'~access~'_file_trash') }}", + data: { + directory:directory, + subdirectory:subdirectory, + filename:filename + }, + success: function() { + location.reload(); + } + }); + } + } + + // Restaurer un fichier + function restaureFile(directory,subdirectory,filename) { + var r = confirm("Confirmez-vous la restauration de ce fichier ?"); + if (r == true) { + $.ajax({ + method: "POST", + url: "{{ path('cadoles_core_'~access~'_file_restaure') }}", + data: { + directory:directory, + subdirectory:subdirectory, + filename:filename + }, + success: function() { + location.reload(); + } + }); + } + } + // Supprimer un fichier function delFile(directory,subdirectory,filename) { - var r = confirm("Confirmez-vous la suppression de ce fichier ?"); + var r = confirm("Confirmez-vous la suppression définitive de ce fichier ?"); if (r == true) { $.ajax({ method: "POST", diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/upload.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/upload.html.twig index 3878b1d6..3a8c052f 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/upload.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/File/upload.html.twig @@ -23,7 +23,7 @@ init: function() { this.on("sending", function(file, xhr, formData) { formData.append("directory", "{{ id }}"); - formData.append("subdirectory", "{{ subdirectory }}"); + formData.append("subdirectory", "{{ subdirectory|raw }}"); }); var totalFiles = 0; diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/invitations.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/invitations.html.twig new file mode 100644 index 00000000..63aecc73 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/invitations.html.twig @@ -0,0 +1,52 @@ +{% extends '@CadolesCore/base.html.twig' %} + +{% block pagewrapper %} + Fermer + +

    + + + + + + + + + + + {% for invitation in invitations %} + + + + + + {% endfor %} + +
    ActionEmailStatut
    + {% if invitation.relance %} + + {% endif %} + {{invitation.email}}{{invitation.statut}}
    + +{% endblock %} + +{% block localjavascript %} + $(document).ready(function() { + }); + + function showMail(email) { + window.parent.$("#mymodal").hide(); + + $("#mymodal").find(".modal-title").html("INVITATION"); + var url="{{ path('cadoles_core_mail_invitationgroup',{id:id,email:'xxx'}) }}"; + url=url.replace('xxx',email); + window.parent.$("#mymodal").find("#framemodal").attr("src",url); + window.parent.$("#mymodal").modal().show(); + } + + function closeModal() { + url=window.parent.location; + window.parent.location=url; + } + +{% endblock %} \ No newline at end of file diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig index 73c862af..addb14bd 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/list.html.twig @@ -9,17 +9,21 @@ {%endif%} +

    {% set permgroup = app.session.get('permgroup') %} {% if is_granted('ROLE_ADMIN') or (is_granted('ROLE_MODO') and (permgroup=="ROLE_MODO" or permgroup=="ROLE_ANIM" or permgroup=="ROLE_USER")) or (is_granted('ROLE_ANIM') and (permgroup=="ROLE_ANIM" or permgroup=="ROLE_USER")) or (is_granted('ROLE_USER') and permgroup=="ROLE_USER") %} -

    + {% if access=="config" %} Ajouter {% else %} Créer un Groupe de Travail {% endif %} -

    + {% endif %} - + {%if access=="config" %} + Exporter CSV + {% endif %} +

    @@ -39,6 +43,7 @@ {% if portal_activate %} Groupe de Travail Propriétaire + Visite {% if access=="config" %} Création Pages Création Calendriers diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/users.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/users.html.twig index a76e132d..3cc5e48b 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/users.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Group/users.html.twig @@ -11,6 +11,7 @@ {% if moderegistration!="none" and masteridentity=="SQL"%} Inviter des personnes non listées ci-dessous + Suivi des Invitations {%endif%} Exporter CSV

    @@ -168,4 +169,11 @@ $("#mymodal").find("#framemodal").attr("src",url); $("#mymodal").modal().show(); } + + function showInvitations() { + $("#mymodal").find(".modal-title").html("SUVI DES INVITATIONS"); + var url="{{ path('cadoles_core_'~access~'_group_invitation',{id:group.id}) }}"; + $("#mymodal").find("#framemodal").attr("src",url); + $("#mymodal").modal().show(); + } {% endblock %} diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Include/footer.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Include/footer.html.twig index 92586780..5c13dbcb 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Include/footer.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Include/footer.html.twig @@ -217,6 +217,7 @@ $( ".grid-item-content").hover(function() { $(this).children(".item-heart").show(); $(this).children(".item-delete").show(); + $(this).children(".item-restaure").show(); $(this).children(".item-update").show(); $(this).children(".item-preview").show(); }); @@ -224,6 +225,7 @@ $( ".grid-item-content" ).mouseleave(function() { $(this).children(".item-heart").hide(); $(this).children(".item-delete").hide(); + $(this).children(".item-restaure").hide(); $(this).children(".item-update").hide(); $(this).children(".item-preview").hide(); }); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Registration/edit.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Registration/edit.html.twig index bb0a32a2..0e79038c 100755 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Registration/edit.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/Registration/edit.html.twig @@ -21,7 +21,11 @@ {% endif %} {% if mode!="submit" %} - {% if mode=="send" %} {{ form_widget(form.save) }} {%endif%} + {% if mode=="send" %} + {{ form_widget(form.save) }} + Envoyer un mail + {%endif%} + Annuler {% endif %} @@ -56,6 +60,19 @@ {% endif %}
    + {% if mode=="send" %} +
    +
    +
    + Notes Administrateur +
    +
    + {{ form_widget(form.note) }} +
    +
    +
    + {%endif%} +
    @@ -90,7 +107,14 @@
    {% if form.firstname is defined %} {{ form_row(form.firstname) }} {% endif %} {{ form_row(form.lastname) }} - {% if form.email is defined %} {{ form_row(form.email) }} {% endif %} + {% if form.email is defined %} + {{ form_row(form.email) }} + + {% endif %} {% if form.visible is defined %} {{ form_row(form.visible) }} {% endif %}
    @@ -196,6 +220,29 @@ }); }); + $(document.body).on("focusout","#registration_email",function(){ + $.ajax({ + method: "POST", + url: "{{ path('cadoles_core_ajax_iswhitelist') }}", + data: { + email:$("#registration_email").val(), + }, + success: function(data) { + if(data=="KO") { + $("#registration_motivation").attr("required","required"); + $(".alert-email").show(); + $("label[for='registration_motivation']").text("Motivation *"); + } + else { + $("#registration_motivation").removeAttr("required"); + $(".alert-email").hide(); + $("label[for='registration_motivation']").text("Motivation"); + } + } + }); + + }); + function hideshow() { if($("#registration_birthcountry").val()==269) $("#blockcity").show(); @@ -207,10 +254,12 @@ niveau01=$("#registration_niveau01 option:selected").text().toLowerCase(); if(niveau01.startsWith("autre")) { $("#niveau01other").show(); + $("#registration_niveau01other").attr("required","required"); } else { $("#registration_niveau01other").val(""); $("#niveau01other").hide(); + $("#registration_niveau01other").removeAttr("required"); } } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/User/edit.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/User/edit.html.twig index c81036aa..8522fdf1 100755 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/User/edit.html.twig +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/views/User/edit.html.twig @@ -63,6 +63,19 @@ Modifier
    + {% if access=="config" %} +
    +
    +
    + Notes Administrateur +
    +
    + {{ form_widget(form.note) }} +
    +
    +
    + {%endif%} +
    @@ -169,12 +182,21 @@ {% for group in user.groups %} - {% if access=="config" and not group.group.fgall and group.group.ldapfilter=="" and group.group.attributes =="" %} - - {% elseif (group.group.fgopen or group.group.fgcanshare) and group.group.owner!=app.user and not group.group.fgall and group.group.ldapfilter=="" and group.group.attributes =="" %} - + {% set canleave = true %} + {% if group.group.fgtemplate or group.group.fgall or group.group.owner==user %} + {% set canleave = false %} + {% elseif access!="config" %} + {% if not group.group.fgcanshare and not group.group.fgopen %} + {% set canleave = false %} + {% elseif group.group.fgcanshare and not app.session.get('permunsubscribe') and not group.group.fgopen %} + {% set canleave = false %} + {% endif %} + {% endif %} + + {% if canleave %} + {% else %} - + {% endif %} diff --git a/src/ninegate-1.0/src/Cadoles/CronBundle/Command/CronCommand.php b/src/ninegate-1.0/src/Cadoles/CronBundle/Command/CronCommand.php index d9dccff0..086df48e 100644 --- a/src/ninegate-1.0/src/Cadoles/CronBundle/Command/CronCommand.php +++ b/src/ninegate-1.0/src/Cadoles/CronBundle/Command/CronCommand.php @@ -145,7 +145,7 @@ class CronCommand extends ContainerAwareCommand if($cron->getRepeatcall()>0) $cron->setRepeatexec($cron->getRepeatexec()+1); // Envoyer un mail à l'ensemble des administrateurs - $this->sendMailerror(); + $this->sendMailerror($cron); } } @@ -161,7 +161,7 @@ class CronCommand extends ContainerAwareCommand } } - private function sendMailerror() { + private function sendMailerror($cron) { $appname=""; $config = $this->em->getRepository("CadolesCoreBundle:Config")->findOneBy(["id"=>"appname"]); if($config) $appname = $config->getValue(); @@ -184,8 +184,8 @@ class CronCommand extends ContainerAwareCommand $mail_params=array( "subject" => $appname." : ERREUR SUR EXECUTION JOB", - "body_html"=> "ATTENTION UN JOB EST EN ERREUR. MERCI DE VERIFIER LES LOGS.", - "body_text"=> "ATTENTION UN JOB EST EN ERREUR. MERCI DE VERIFIER LES LOGS." + "body_html"=> "ATTENTION UN JOB EST EN ERREUR. MERCI DE VERIFIER LES LOGS.
    Command = ".$cron->getCommand()."
    Description = ".$cron->getDescription(), + "body_text"=> "ATTENTION UN JOB EST EN ERREUR. MERCI DE VERIFIER LES LOGS.\nCommand = ".$cron->getCommand()."\nDescription = ".$cron->getDescription() ); $message = $this->container->get('cadoles.core.service.mail'); diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/CalendareventController.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/CalendareventController.php index a4eceffd..76bbde7f 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/CalendareventController.php +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/CalendareventController.php @@ -73,11 +73,37 @@ class CalendareventController extends Controller array_push($events,$tmp); array_push($eventids,$tmp["id"]); } + + // On recherche les taches associées aux groupes du calendrier + if($this->getUser()) { + $groups=$calendar->getGroups(); + foreach($groups as $group) { + $projects=$group->getProjects(); + foreach($projects as $project) { + $projecttasks = $this->getDoctrine()->getRepository("CadolesPortalBundle:Projecttask")->getProjectTasksByDate($project,$this->getUser(),$start,$end); + foreach($projecttasks as $projecttask) { + $tmp=[]; + $tmp['id'] = "TASK".strval($projecttask->getId()); + $tmp['title'] = "TACHE = ".$projecttask->getName(); + $tmp['description'] = $projecttask->getDescription(); + $tmp['start'] = $projecttask->getEnd()->format("Y-m-d\TH:i:s"); + $tmp['end'] = $projecttask->getEnd()->format("Y-m-d\TH:i:s"); + $tmp['color'] = "#".$this->get('session')->get('color')["main"]; + $tmp['allDay'] = true; + $tmp['calendar'] = $project->getId(); + $tmp['name'] = $project->getName()." - Tache"; + $tmp['editable'] = false; + + array_push($events,$tmp); + array_push($eventids,$tmp["id"]); + } + } + } + } } // On récupére les évenement partagé de l'utilisateur if($this->getUser()) { - $calendarevents = $this->getDoctrine()->getRepository("CadolesPortalBundle:Calendarevent")->getCalendareventGroupsShareByDate($this->getUser(),$start,$end); foreach($calendarevents as $calendarevent) { diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php index a1849471..f9aa80d7 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php @@ -100,12 +100,10 @@ class CalendareventRepository extends EntityRepository // On récupère soit les calendriers du group en cours soit l'ensemble des calendriers de l'utilisateur if($usage=="group") { $calendars=$em->getRepository("CadolesPortalBundle:Calendar")->getCalendarsGroup($user,$group); - if($calendars) $firstcalendar=$calendars[0]->getId(); } else { $em->getRepository("CadolesPortalBundle:Calendar")->getCalendarsUser($user,$calendarssuser,$calendarsadmin,$calendarsshared); $calendars=array_merge($calendarssuser,$calendarsadmin->toArray(),$calendarsshared); - $firstcalendar="all"; } // Début & fin @@ -176,6 +174,41 @@ class CalendareventRepository extends EntityRepository } } } + + // On récupère les taches associé à l'utilisateur + if($user) { + if($usage=="group") { + $projects=$em->getRepository("CadolesPortalBundle:Project")->getProjectsGroup($user,$group); + if($projects) $firstproject=$projects[0]->getId(); + } + else { + $em->getRepository("CadolesPortalBundle:Project")->getProjectsUser($user,$projectssuser,$projectsadmin,$projectsshared); + $projects=array_merge($projectssuser,$projectsadmin->toArray(),$projectsshared); + $firstcalendar="all"; + } + + foreach($projects as $project) { + $projecttasks = $em->getRepository("CadolesPortalBundle:Projecttask")->getProjectTasksByDate($project,$user,$start,$end); + + foreach($projecttasks as $projecttask) { + $tmp=[]; + $tmp['id'] = "TASK".strval($projecttask->getId()); + $tmp['title'] = $projecttask->getName(); + $tmp['description'] = $projecttask->getDescription(); + $tmp['start'] = $projecttask->getEnd(); + $tmp['end'] = $projecttask->getEnd(); + $tmp['color'] = "#".$sessioncolor; + $tmp['allDay'] = true; + $tmp['calendar'] = $project->getId(); + $tmp['name'] = $project->getName()." - Tache"; + $tmp['editable'] = false; + + array_push($events,$tmp); + array_push($eventids,$tmp["id"]); + + } + } + } return $events; } } diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php index e843c8b2..b515d2b8 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/ProjecttaskRepository.php @@ -25,4 +25,21 @@ class ProjecttaskRepository extends EntityRepository ->setFirstResult($start)->setMaxResults($length) ->getQuery()->getResult(); } + + public function getProjectTasksByDate($project,$user,$start,$end) + { + $projecttasks=$this->createQueryBuilder('projecttask') + ->where('projecttask.project=:project') + ->andWhere('projecttask.owner=:user OR projecttask.user=:user') + ->andWhere('projecttask.end>=:start') + ->andWhere('projecttask.end<=:end') + ->setParameter('project',$project) + ->setParameter('user',$user) + ->setParameter('start',$start) + ->setParameter('end',$end) + ->OrderBy('projecttask.end', 'ASC') + ->getQuery()->getResult(); + + return $projecttasks; + } } diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Calendar/view.html.twig b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Calendar/view.html.twig index ed04b61e..5a260fe0 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Calendar/view.html.twig +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Calendar/view.html.twig @@ -144,6 +144,8 @@     + +   @@ -217,11 +219,46 @@
    + + + + {% endblock %} {% block localexternalscript %} + + {% endblock %} {% block localjavascript %} @@ -357,17 +394,29 @@ // Modification Evenement eventClick: function(event, jsEvent, view) { if(event.editable) { + end=event.end.clone(); + $("#mymodal-event-mod #event_id").val(event.id); $("#mymodal-event-mod #event_title").val(event.title); CKEDITOR.instances["event_description-mod"].setData(event.description) $("#mymodal-event-mod #event_start_timem").val(event.start.format("DD/MM/YYYY HH:mm")); $("#mymodal-event-mod #event_end_timem").val(event.end.format("DD/MM/YYYY HH:mm")); $("#mymodal-event-mod #event_startm").val(event.start.format("DD/MM/YYYY")); - $("#mymodal-event-mod #event_endm").val(event.end.subtract("1","s").format("DD/MM/YYYY")); + $("#mymodal-event-mod #event_endm").val(end.subtract("1","s").format("DD/MM/YYYY")); + $("#mymodal-event-mod #event_allday").bootstrapSwitch('state', event.allDay); $("#mymodal-event-mod #event_calendar option[value='"+event.calendar+"']").prop('selected', true); - + $("#mymodal-event-clone #event_id").val(event.id); + $("#mymodal-event-clone #event_title").val(event.title); + $("#mymodal-event-clone #event_description").val(event.description); + $("#mymodal-event-clone #event_start_timem").val(event.start.format("HH:mm")); + $("#mymodal-event-clone #event_end_timem").val(event.end.format("HH:mm")); + $("#mymodal-event-clone #event_startm").val(event.start.format("DD/MM/YYYY")); + $("#mymodal-event-clone #event_endm").val(event.end.format("DD/MM/YYYY")); + $("#mymodal-event-clone #event_allday").val(event.allDay); + $("#mymodal-event-clone #event_calendar").val(event.calendar); + refreshPJ(); switchallDay("UPDATE"); @@ -526,7 +575,6 @@ }, false // make the event "stick" ); - console.log(event); $("#mymodal-event-add").modal("hide"); @@ -625,6 +673,92 @@ $(location).attr('href',url); } + function showcloneEvent() { + $("#mymodal-event-mod").modal("hide"); + $("#mymodal-event-clone").modal("show"); + + + $('#mymodal-event-clone #event_dates').multiDatesPicker({ + firstDay: 1, + altField: "#datepicker", + closeText: 'Fermer', + prevText: 'Précédent', + nextText: 'Suivant', + currentText: 'Aujourd\'hui', + monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'], + monthNamesShort: ['Janv.', 'Févr.', 'Mars', 'Avril', 'Mai', 'Juin', 'Juil.', 'Août', 'Sept.', 'Oct.', 'Nov.', 'Déc.'], + dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], + dayNamesShort: ['Dim.', 'Lun.', 'Mar.', 'Mer.', 'Jeu.', 'Ven.', 'Sam.'], + dayNamesMin: ['D', 'L', 'M', 'M', 'J', 'V', 'S'], + weekHeader: 'Sem.', + dateFormat: 'yy-mm-dd', + + }); + $('#mymodal-event-clone #event_dates').multiDatesPicker('resetDates') + } + + function cloneEvent() { + var dates = $('#mymodal-event-clone #event_dates').multiDatesPicker('value'); + dates=dates.replaceAll(' ',''); + tbdates=dates.split(','); + + var dstart=moment($("#mymodal-event-clone #event_startm").val(),"DD/MM/YYYY"); + var tstart=$("#mymodal-event-clone #event_start_timem").val(); + var dend=moment($("#mymodal-event-clone #event_endm").val(),"DD/MM/YYYY"); + var tend=$("#mymodal-event-clone #event_end_timem").val(); + + var nbdays=dend.diff(dstart, 'days'); + + if($("#mymodal-event-clone #event_allday").val()=="true") + allDay=true; + else + allDay=false; + + tbdates.forEach(function(date){ + var mdatestart=moment(date +' '+tstart,"YYYY-MM-DD HH:mm"); + var mdateend=moment(date +' '+tend,"YYYY-MM-DD HH:mm"); + mdateend.add(nbdays,'days'); + start=mdatestart.format("YYYY-MM-DD HH:mm"); + end=mdateend.format("YYYY-MM-DD HH:mm"); + + $.ajax({ + method: "POST", + url: "{{ path('cadoles_portal_'~access~'_calendarevent_submit') }}", + data: { + "title":$("#mymodal-event-clone #event_title").val(), + "description":$("#mymodal-event-clone #event_description").val(), + "start": start, + "end": end, + "allday": $("#mymodal-event-clone #event_allday").val(), + "idcalendar": $("#mymodal-event-clone #event_calendar").val() + }, + success: function(data) { + start=mdatestart.format("YYYY-MM-DD HH:mm"); + end=mdateend.format("YYYY-MM-DD HH:mm"); + + // Ajout de l'event dans fullcalendar + event = $('#calendar').fullCalendar('renderEvent', + { + id: data.id, + title: $("#mymodal-event-clone #event_title").val(), + description:$("#mymodal-event-clone #event_description").val(), + start: mdatestart, + end: mdateend, + editable: true, + color: data.color, + allDay: allDay, + calendar: $("#mymodal-event-clone #event_calendar").val(), + files: [] + }, + false // make the event "stick" + ); + + $("#mymodal-event-clone").modal("hide"); + } + }); + }); + } + function deleteEvent() { $.ajax({ diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Pagewidget/viewcalendar.html.twig b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Pagewidget/viewcalendar.html.twig index 2eaffe92..8b3036d9 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Pagewidget/viewcalendar.html.twig +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Resources/views/Pagewidget/viewcalendar.html.twig @@ -82,6 +82,7 @@ {% endif %}
    + {{ event.name }} = {% if not event.allDay %} {{ event.start | date("H:i") }} - {%endif%} diff --git a/src/ninegate-1.0/src/Cadoles/WebsocketBundle/Resources/views/Chat/client.html.twig b/src/ninegate-1.0/src/Cadoles/WebsocketBundle/Resources/views/Chat/client.html.twig index 9537d684..92cf89b1 100644 --- a/src/ninegate-1.0/src/Cadoles/WebsocketBundle/Resources/views/Chat/client.html.twig +++ b/src/ninegate-1.0/src/Cadoles/WebsocketBundle/Resources/views/Chat/client.html.twig @@ -192,9 +192,21 @@
    - -
    - + + + +
    + + +
    @@ -482,24 +494,50 @@ sendbtn(); }); + function formatState (opt) { + if (!opt.id) { + return opt.text.toUpperCase(); + } + + var optimage = $(opt.element).attr('data-image'); + console.log(optimage) + if(!optimage){ + return opt.text.toUpperCase(); + } else { + var $opt = $( + ' ' + opt.text + '' + ); + return $opt; + } + }; + + $("#checkalldestinataires").click(function(){ + if($("#checkalldestinataires").is(':checked') ){ + $("#destinataires > option").prop("selected","selected"); + $("#destinataires").trigger("change"); + }else{ + $("#destinataires > option").removeAttr("selected"); + $("#destinataires").trigger("change"); + } + }); + function sendbtn() { var data = CKEDITOR.instances["chat_message"].getData(); if($("#sendbymail").bootstrapSwitch('state')) { CKEDITOR.instances["chat_messagemail"].setData(data); $("#mailsuject").val("{{app.session.get('appname')}} = Notification {{ group.label }}"); - $("#mailto").val(""); - $("#listtoavatar").html(""); - - {% for user in group.users %} - {%if(user.user!=app.user)%} - $("#mailto").val($("#mailto").val()+";{{user.user.email}}"); - $("#listtoavatar").append($("")); - {%endif%} - {% endfor %} $("#sendbtnmail").show(); $("#sendbtnmailreply").hide(); $('#mymodal-sendmail').modal('show'); + $("#checkalldestinataires").prop( "checked", false ); + $("#destinataires > option").removeAttr("selected"); + $("#destinataires").trigger("change"); + $('#destinataires').select2({ + templateResult: formatState, + templateSelection: formatState, + sorter: data => data.sort((a, b) => a.text.localeCompare(b.text)), + }); } else { if(data) { @@ -538,12 +576,15 @@ function sendbtnmail() { var data = CKEDITOR.instances["chat_messagemail"].getData(); var subject=$("#mailsuject").val(); - var mailto=$("#mailto").val(); + var destinataires=$("#destinataires").val(); + + if(data&&subject&&!(jQuery.isEmptyObject(destinataires))) { - if(data&&subject&&mailto) { try { // Flager que l'envoit c'est fait tosendmail=false; + mailto=destinataires.join(';'); + mailto=";"+mailto; $("#sendbtnmail").html("Envoyer"); $("#sendbtnmail").removeClass("btn-danger"); $("#sendbtnmail").css('cursor','auto'); @@ -581,13 +622,15 @@ function sendbtnmailreply() { var data = CKEDITOR.instances["chat_messagemail"].getData(); var subject=$("#mailsuject").val(); - var mailto=$("#mailto").val(); + var destinataires=$("#destinataires").val(); - if(data&&subject&&mailto) { + if(data&&subject&&!(jQuery.isEmptyObject(destinataires))) { try { // Flager que l'envoit c'est fait tosendmail=false; + mailto=destinataires.join(';'); + mailto=";"+mailto; $("#sendbtnmailreply").html("Envoyer"); $("#sendbtnmailreply").removeClass("btn-danger"); $("#sendbtnmailreply").css('cursor','auto'); @@ -681,21 +724,19 @@ $(document).on('click', '.btnreplymessagemail', function(){ CKEDITOR.instances["chat_messagemail"].setData(""); $("#mailsuject").val("{{app.session.get('appname')}} = Notification {{ group.label }}"); - $("#mailto").val(""); - $("#listtoavatar").html(""); - - {% for user in group.users %} - {%if(user.user!=app.user)%} - $("#mailto").val($("#mailto").val()+";{{user.user.email}}"); - $("#listtoavatar").append($("")); - {%endif%} - {% endfor %} $("#sendbtnmail").hide(); $("#sendbtnmailreply").show(); $("#sendbtnmailreply").data("id",$(this).data("id")); - $('#mymodal-sendmail').modal('show'); + $("#checkalldestinataires").prop( "checked", false ); + $("#destinataires > option").removeAttr("selected"); + $("#destinataires").trigger("change"); + $('#destinataires').select2({ + templateResult: formatState, + templateSelection: formatState, + sorter: data => data.sort((a, b) => a.text.localeCompare(b.text)), + }); }); @@ -734,12 +775,6 @@ } - $(document).on('click', '#listtoavatar img', function(){ - var mail = ";"+$(this).data("mail"); - $("#mailto").val($("#mailto").val().replace(mail, "")); - $(this).remove(); - }); - function recuplastmsg() { console.log("recuplastmsg"); @@ -827,7 +862,7 @@ if(!$("#online"+userid).length) { html = ""; html+= ""; - html+= ""+userlastname+" "+userfirstname+""; + html+= "
    "+userlastname+" "+userfirstname+""; html+= "
    "; $("#useronline").append(html); } diff --git a/src/ninegate-1.0/web/css/images/ui-icons_444444_256x240.png b/src/ninegate-1.0/web/css/images/ui-icons_444444_256x240.png new file mode 100644 index 00000000..c2daae16 Binary files /dev/null and b/src/ninegate-1.0/web/css/images/ui-icons_444444_256x240.png differ diff --git a/src/ninegate-1.0/web/css/images/ui-icons_555555_256x240.png b/src/ninegate-1.0/web/css/images/ui-icons_555555_256x240.png new file mode 100644 index 00000000..47849283 Binary files /dev/null and b/src/ninegate-1.0/web/css/images/ui-icons_555555_256x240.png differ diff --git a/src/ninegate-1.0/web/css/images/ui-icons_777620_256x240.png b/src/ninegate-1.0/web/css/images/ui-icons_777620_256x240.png new file mode 100644 index 00000000..d2f58d25 Binary files /dev/null and b/src/ninegate-1.0/web/css/images/ui-icons_777620_256x240.png differ diff --git a/src/ninegate-1.0/web/css/images/ui-icons_777777_256x240.png b/src/ninegate-1.0/web/css/images/ui-icons_777777_256x240.png new file mode 100644 index 00000000..1d532588 Binary files /dev/null and b/src/ninegate-1.0/web/css/images/ui-icons_777777_256x240.png differ diff --git a/src/ninegate-1.0/web/css/images/ui-icons_cc0000_256x240.png b/src/ninegate-1.0/web/css/images/ui-icons_cc0000_256x240.png new file mode 100644 index 00000000..2825f200 Binary files /dev/null and b/src/ninegate-1.0/web/css/images/ui-icons_cc0000_256x240.png differ diff --git a/src/ninegate-1.0/web/css/images/ui-icons_ffffff_256x240.png b/src/ninegate-1.0/web/css/images/ui-icons_ffffff_256x240.png new file mode 100644 index 00000000..136a4f97 Binary files /dev/null and b/src/ninegate-1.0/web/css/images/ui-icons_ffffff_256x240.png differ diff --git a/tmpl/ninegate-init-01.sql b/tmpl/ninegate-init-01.sql index 2e1a423a..702d2dba 100644 --- a/tmpl/ninegate-init-01.sql +++ b/tmpl/ninegate-init-01.sql @@ -120,6 +120,7 @@ INSERT IGNORE INTO `config` (`order`, `visible`, `changeable`, `required`, `type %end if ('500', 1, 1, 1, 'permgroup', 'permgroup', 'ROLE_ANIM', '', 'Determine quel rôle aura la permission de créer des groupes de travail'), -('501', 1, 1, 1, 'permgroup', 'permannu', 'ROLE_USER', '', 'Determine quel rôle aura la permission de voir l\'annuaire'); +('501', 1, 1, 1, 'permgroup', 'permannu', 'ROLE_USER', '', 'Determine quel rôle aura la permission de voir l\'annuaire'), +('502', 1, 1, 1, 'boolean', 'permunsubscribe', '0', '', 'Permettre aux utilisateurs de se désinscrire par eux-mêmes des groupes de travail'); diff --git a/tmpl/ninegate-template.yml b/tmpl/ninegate-template.yml index 9abe2541..9593f65c 100644 --- a/tmpl/ninegate-template.yml +++ b/tmpl/ninegate-template.yml @@ -534,7 +534,7 @@ parameters: # Si mode_auth = CAS cas_host: %%eolesso_adresse - cas_path: %%eolesso_cas_folder + cas_path: %%getVar("eolesso_cas_folder", '') cas_port: %%eolesso_port # Si mode_aut = SAML