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 | +Statut | +|
---|---|---|
+ {% if invitation.relance %} + + {% endif %} + | +{{invitation.email}} | +{{invitation.statut}} | +
{% 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 %} +