diff --git a/CTRV/CommonBundle/CTRVCommonBundle.php b/CTRV/CommonBundle/CTRVCommonBundle.php new file mode 100644 index 0000000..8279e75 --- /dev/null +++ b/CTRV/CommonBundle/CTRVCommonBundle.php @@ -0,0 +1,9 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + //pagination + $nb_entities = $abuses = $this->getDoctrine()->getRepository('CTRVCommonBundle:Abuse')->getAllAbuseNumber($city); + $nb_entities_page = Constants::abuse_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $abusesPublicMessage = $this->getDoctrine()->getRepository("CTRVCommonBundle:Abuse")->getAllPublicMessageAbuses($city, $offset, $nb_entities_page); + $abusesComment = $this->getDoctrine()->getRepository("CTRVCommonBundle:Abuse")->getAllCommentAbuses($city, $offset, $nb_entities_page); + $abuses = $abusesPublicMessage; + $abuses = array_merge($abuses, $abusesComment ); + + return array ( + 'entities' => $abuses, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * Supprimer un abus + * + * @Route("/{id}/delete", name="abuse_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:Comment')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } +} diff --git a/CTRV/CommonBundle/Controller/AuthController.php b/CTRV/CommonBundle/Controller/AuthController.php new file mode 100644 index 0000000..7da8c7f --- /dev/null +++ b/CTRV/CommonBundle/Controller/AuthController.php @@ -0,0 +1,112 @@ +getRequest(); + $session = $request->getSession(); + + // get the login error if there is one + if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { + $error = $request->attributes->get( + SecurityContext::AUTHENTICATION_ERROR + ); + } else { + $error = $session->get(SecurityContext::AUTHENTICATION_ERROR); + $session->remove(SecurityContext::AUTHENTICATION_ERROR); + } + + return array( + // last username entered by the user + 'last_username' => $session->get(SecurityContext::LAST_USERNAME), + 'error' => $error + ); + } + + /** + * Affiche la page indiquant que vous n'avez pas les droits d'acces + * @Route("/insufficient_access",name="insufficient_access") + * @Template() + */ + public function insufficientAccessAction () { + + $referer = $this->getRequest()->headers->get('referer'); + return array("url"=>$referer); + } + + /** + * Afficher et traite le formulaire d'inscription d'un utilisateur + * @Route("/register",name="register") + * @Template() + * @Secure(roles="ROLE_ADMIN") + */ + public function registerAction () { + + $em = $this->getDoctrine()->getEntityManager(); + $form = $this->createForm(new RegistrationType(), new User()); + + if ($this->getRequest()->getMethod()=="POST") { + + $form->bind($this->getRequest()); + + if ($form->isValid()) { + + $user = $form->getData(); + $userid = hash('ripemd160',$user->getLogin().$user->getEmail().date('d/m/y-H:i:s')); + + $encoder = $this->get('password_service'); + + $role = $this->getDoctrine()->getEntityManager()->getRepository("CTRVCommonBundle:Role")->findOneBy(array("name"=>Constants::ROLE_USER)); + + $user->setSalt(uniqid(mt_rand())); + $user->setRole($role); + $user->setUserid($userid); + $user->setPassword($encoder->encodePassword($user->getPassword(), $user->getSalt())); + $user->setIsActive(true); + $user->setIsBlocked(false); + + $em->persist($user); + $em->flush(); + + return $this->redirect($this->generateUrl("home")); + } + } + + return array('form' => $form->createView()); + } + + +} diff --git a/CTRV/CommonBundle/Controller/CityController.php b/CTRV/CommonBundle/Controller/CityController.php new file mode 100644 index 0000000..55fd27c --- /dev/null +++ b/CTRV/CommonBundle/Controller/CityController.php @@ -0,0 +1,133 @@ +getDoctrine()->getEntityManager(); + $currentCity = $this->get('session_service')->getCity(); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $page = intval($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $cities = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->getAllCitiesNumber(); + $nb_entities_page = Constants::city_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $cities = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->getAllCities($offset, $nb_entities_page); + + return array ( + 'entities' => $cities, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * ajouter une nouvelle ville + * @Route("/add",name="addCity") + * @Template() + */ + public function addCityAction () { + $em = $this->getDoctrine()->getEntityManager(); + $form = $this->createForm(new CityType(),new City()); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $city dans la base de données + $city = $form->getData(); + $em->persist($city); + $em->flush(); + // on redirige vers la liste des types de place + return $this->redirect($this->generateUrl("city")); + } + } + return array('form'=>$form->createView()); + + } + + /** + * modifier une ville + * @Route("/editCity/{id}",name="edit_city") + * @Template() + */ + public function editCityAction(City $city) { + $form = $this->createForm(new CityType(), $city); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $city dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($city); + $em->flush(); + // on redirige vers la liste des places existantes + return $this->redirect($this->generateUrl("city")); + } + + } + + + return array( + 'city'=> $city, + 'form'=>$form->createView()); + + } + /** + * Deletes a City entity. + * + * @Route("/{id}/delete", name="city_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:City')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + + + +} diff --git a/CTRV/CommonBundle/Controller/CommentController.php b/CTRV/CommonBundle/Controller/CommentController.php new file mode 100644 index 0000000..56c94b2 --- /dev/null +++ b/CTRV/CommonBundle/Controller/CommentController.php @@ -0,0 +1,114 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getEventCommentAbuseNumber($city); + $nb_entities_page = Constants::abuse_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $comments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getEventCommentAbuse($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $comments, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$currentCity + ); + } + + /** + * @Route("/placeCommentAbuse",name="placeCommentAbuse") + * @Template() + * Retourne la liste de tous les commentaires signalés portant sur les places de la ville courante + */ + public function placeCommentAbuseAction(){ + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $comments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getPlaceCommentAbuseNumber($city); + $nb_entities_page = Constants::abuse_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $comments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getPlaceCommentAbuse($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $comments, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$currentCity + ); + } + + /** + * Supprimer un commentaire + * + * @Route("/{id}/delete", name="comment_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:Comment')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + +} diff --git a/CTRV/CommonBundle/Controller/CommonController.php b/CTRV/CommonBundle/Controller/CommonController.php new file mode 100644 index 0000000..9127241 --- /dev/null +++ b/CTRV/CommonBundle/Controller/CommonController.php @@ -0,0 +1,131 @@ +stripAccents('1 beis rue Mirepoix'), $this->stripAccents("1 Béis rue Mirepoix"), $similarity); +// var_dump($this->stripAccents("1 béis rue Mirepoix"));var_dump($similarity);die; + + return array(); + + } + + public function stripAccents($str, $charset='utf-8'){ + $str = htmlentities($str, ENT_NOQUOTES, $charset); + $str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); + $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ' + $str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères + + return strtolower($str); + } + + + /** + * Retourne le formulaire de choix d ville + * @Template() + */ + public function renderChooseCityFormAction () { + + $city = null; + if ($this->get('session_service')->getCity() == null) { + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->findOneBy(array()); + $this->get('session_service')->setCity($city); + } + + $form = $this->createForm(new ChooseCityType()); + return array('form'=>$form->createView()); + } + +// /** +// * Met la ville selectionnée en session +// * @Route("/session/city",name="city_session") +// * @param City $city +// */ +// public function setCitySession () { +// $city_id = $this->getRequest()->request->get("city_id"); +// $this->get('session_service')->setCity($city_id); +// return new Response(json_encode(array('result'=>true))); +// } + + /** + * Met la ville selectionnée en session + * @Route("/set_city_session",name="set_city_session") + * @param City $city + */ + public function citySession () { + + $form = $this->createForm(new ChooseCityType(), array()); + + if ($this->getRequest()->getMethod()=="POST") { + + $form->bindRequest($this->getRequest()); + +// if ($form->isValid()) { + $form_data = $form->getData(); + $city = $form_data['choose_city']; + $this->get('session_service')->setCity($city); + return $this->redirect($this->getRequest()->headers->get('referer')); +// } + } + } + + /** + * Affiche les numeros de page + * @param unknown_type $nb_pages + * @param unknown_type $page + * @param unknown_type $url_path + */ + public function renderPaginationAction ($nb_pages, $page, $url_path,$href_active) { + return $this->render ('CTRVCommonBundle:Common:pagination.html.twig',array( + 'nb_pages' => $nb_pages, + 'page' => $page, + 'url_path' => $url_path, + 'href_active' => $href_active + )); + } + + + /** + * Retourne le formulaire de choix de la ville + */ + public function getChooseCityForm () { + + return $this->createFormBuilder( array()) + ->add('choose_city', 'entity', array( + 'class' => 'CTRVCommonBundle:City', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.name', 'ASC'); + }, + 'label'=>'common.chooseCity' + )) + ->getForm() + ; + } + +} diff --git a/CTRV/CommonBundle/Controller/UserController.php b/CTRV/CommonBundle/Controller/UserController.php new file mode 100644 index 0000000..5c48eae --- /dev/null +++ b/CTRV/CommonBundle/Controller/UserController.php @@ -0,0 +1,262 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $form = $this->createForm(new UserRechercheType(),array()); + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $users = $this->getDoctrine()->getRepository('CTRVCommonBundle:User')->getAllUsersNumberByCity($city); + $nb_entities_page = Constants::users_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $users = $this->getDoctrine()->getRepository('CTRVCommonBundle:User')->getUsersByCity($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $users, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$currentCity, + 'users' => $users, + 'form' => $form->createView() + ); + } + + /** + * Charge les données de l'ensemble des utilisateurs Connectés + * @Route("/connected", name="userConnectedByCity") + * @Template() + */ + public function loadUserConnectedByCityAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $users = $this->getDoctrine()->getRepository('CTRVCommonBundle:ConnectedUsers')->getUsersConnectedNumberByCity($city); + $nb_entities_page = Constants::users_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $users = $this->getDoctrine()->getRepository('CTRVCommonBundle:ConnectedUsers')->getUsersConnectedByCity($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $users, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$currentCity, + 'users' => $users + ); + } + + /** + * Charge les données de l'ensemble des utilisateurs du Systéme + * @Route("/all", name="userAll") + * @Template() + */ + public function statsUserAction () { + + $em = $this->getDoctrine()->getEntityManager(); + $currentCity = $this->get('session_service')->getCity(); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + // Calcul du nombre d'utilisateurs récupérés pour chaque fonction + $nb_users = $this->get("user_service")->getAllUsersNumber(); + $nb_users_by_city = $this->get("user_service")->getAllUsersNumberByCity($currentCity); + $nb_connected_users = $this->get("user_service")->getUsersConnectedNumber(); + $nb_connected_users_by_city = $this->get("user_service")->getUsersConnectedNumberByCity($currentCity); + + return array ( + 'nb_users' => $nb_users, + 'nb_users_by_city' => $nb_users_by_city, + 'nb_connected_users' => $nb_connected_users, + 'nb_connected_users_by_city' => $nb_connected_users_by_city + ); + } + + /** + * Activer un utilisateur + * + * @Route("/active/{id}", name="user_active" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function activeAction (User $id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:User')->find($id); + $entity->setIsActive("1"); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("utilisateur")); + } + + /** + * Desactiver un utilisateur + * + * @Route("/desactive/{id}", name="user_desactive" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function desactiveAction (User $id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:User')->find($id); + $entity->setIsActive("0"); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("utilisateur")); + } + /** + * Bloquer un utilisateur + * + * @Route("/block/{id}", name="user_block" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function blockAction (User $id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:User')->find($id); + $entity->setisBlocked("1"); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("utilisateur")); + } + /** + * Debloquer un utilisateur + * + * @Route("/deblock/{id}", name="user_deblock" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function deblockAction (User $id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVCommonBundle:User')->find($id); + $entity->setisBlocked("0"); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("utilisateur")); + } + + /** + * Resultat de la recherche d'utilisateur + * @Route("/rechercherResult",name="rechercher_user_result") + * @Template() + */ + public function rechercherUserResultAction () { + + $searchText = $this->getRequest()->get("searchText",""); + $etat = $this->getRequest()->get("etat",""); + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $users = $this->getDoctrine()->getRepository('CTRVCommonBundle:User')->getUserByNameAndStateNumber($searchText,$etat, $city); + $nb_entities_page = Constants::users_search_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $users = $this->getDoctrine()->getRepository('CTRVCommonBundle:User')->getUserByNameAndState($searchText,$etat, $city, $offset, $nb_entities_page); + + return array ( + 'entities' => $users, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * modifier un utilisateur + * @Route("/userEdit/{id}",name="user_edit") + * @Template() + */ + public function userEditAction(User $user) { + $form = $this->createForm(new UserType(), $user); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $user dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($user); + $em->flush(); + // on redirige vers la liste des places existantes + return $this->redirect($this->generateUrl("utilisateur")); + } + + } + + + return array( + 'user'=> $user, + 'form'=>$form->createView()); + + } + + +} diff --git a/CTRV/CommonBundle/DependencyInjection/CTRVCommonExtension.php b/CTRV/CommonBundle/DependencyInjection/CTRVCommonExtension.php new file mode 100644 index 0000000..7414220 --- /dev/null +++ b/CTRV/CommonBundle/DependencyInjection/CTRVCommonExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/CTRV/CommonBundle/DependencyInjection/Configuration.php b/CTRV/CommonBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..b7169d8 --- /dev/null +++ b/CTRV/CommonBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root('ctrv_common'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/CTRV/CommonBundle/DependencyInjection/Constants.php b/CTRV/CommonBundle/DependencyInjection/Constants.php new file mode 100644 index 0000000..e658fb7 --- /dev/null +++ b/CTRV/CommonBundle/DependencyInjection/Constants.php @@ -0,0 +1,65 @@ +id; + } +} diff --git a/CTRV/CommonBundle/Entity/AbuseRepository.php b/CTRV/CommonBundle/Entity/AbuseRepository.php new file mode 100644 index 0000000..0184904 --- /dev/null +++ b/CTRV/CommonBundle/Entity/AbuseRepository.php @@ -0,0 +1,85 @@ +createQueryBuilder("a") + ->select("a.entityType, pm.content, pm.date, pm.id") + ->from('CTRV\FlowBundle\Entity\PublicMessage','pm') + ->where("a.entityId=pm.id") + ->orderBy("a.id","desc") + ->setFirstResult($first) + ->setMaxResults($last) + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getResult(); + } + + public function getAllCommentAbuses($city, $first, $last) { + $qb= $this->createQueryBuilder("a") + ->select("a.entityType, c.content,c.date, c.id") + ->from('CTRV\CommonBundle\Entity\Comment','c') + ->where("a.entityId=c.id") + ->orderBy("a.id","desc") + ->setFirstResult($first) + ->setMaxResults($last) + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getResult(); + } + + public function getAllCommentAbusesNumber () { + $qb= $this->createQueryBuilder("a") + ->select("count(c.id)") + ->from('CTRV\CommonBundle\Entity\Comment','c') + ->where("a.entityId=c.id") + ->orderBy("a.id","desc") + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getSingleScalarResult(); + } + + public function getAllPublicMessageAbusesNumber() { + $qb= $this->createQueryBuilder("a") + ->select("count(pm.id)") + ->from('CTRV\FlowBundle\Entity\PublicMessage','pm') + ->where("a.entityId=pm.id") + ->orderBy("a.id","desc") + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne le nombre total d'abus + * @param unknown_type $city + */ + public function getAllAbuseNumber($city){ + $qb= $this->createQueryBuilder("a") + ->select ("count(DISTINCT a.entityId )") + ->from('CTRV\CommonBundle\Entity\Comment','c') + ->from('CTRV\FlowBundle\Entity\PublicMessage','pm') + ->where("a.entityId=c.id") + ->orWhere("a.entityId=pm.id") + ; + return $qb->getQuery()->getSingleScalarResult(); + } +} diff --git a/CTRV/CommonBundle/Entity/City.php b/CTRV/CommonBundle/Entity/City.php new file mode 100644 index 0000000..918ad3d --- /dev/null +++ b/CTRV/CommonBundle/Entity/City.php @@ -0,0 +1,449 @@ +name); + } + + /** + * Constructor + */ + public function __construct() + { + $this->publicMessages = new \Doctrine\Common\Collections\ArrayCollection(); + $this->users = new \Doctrine\Common\Collections\ArrayCollection(); + } + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set name + * + * @param string $name + * @return City + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set latitude + * + * @param string $latitude + * @return City + */ + public function setLatitude($latitude) + { + $this->latitude = $latitude; + + return $this; + } + + /** + * Get latitude + * + * @return string + */ + public function getLatitude() + { + return $this->latitude; + } + + /** + * Set longitude + * + * @param string $longitude + * @return City + */ + public function setLongitude($longitude) + { + $this->longitude = $longitude; + + return $this; + } + + /** + * Get longitude + * + * @return string + */ + public function getLongitude() + { + return $this->longitude; + } + + /** + * Set latitudeInf + * + * @param string $latitudeInf + * @return City + */ + public function setLatitudeInf($latitudeInf) + { + $this->latitudeInf = $latitudeInf; + + return $this; + } + + /** + * Get latitudeInf + * + * @return string + */ + public function getLatitudeInf() + { + return $this->latitudeInf; + } + + /** + * Set latitudeSup + * + * @param string $latitudeSup + * @return City + */ + public function setLatitudeSup($latitudeSup) + { + $this->latitudeSup = $latitudeSup; + + return $this; + } + + /** + * Get latitudeSup + * + * @return string + */ + public function getLatitudeSup() + { + return $this->latitudeSup; + } + + /** + * Set longitudeInf + * + * @param string $longitudeInf + * @return City + */ + public function setLongitudeInf($longitudeInf) + { + $this->longitudeInf = $longitudeInf; + + return $this; + } + + /** + * Get longitudeInf + * + * @return string + */ + public function getLongitudeInf() + { + return $this->longitudeInf; + } + + /** + * Set longitudeSup + * + * @param string $longitudeSup + * @return City + */ + public function setLongitudeSup($longitudeSup) + { + $this->longitudeSup = $longitudeSup; + + return $this; + } + + /** + * Get longitudeSup + * + * @return string + */ + public function getLongitudeSup() + { + return $this->longitudeSup; + } + + /** + * Set defaultAddress + * + * @param string $defaultAddress + * @return City + */ + public function setdefaultAddress($defaultAddress) + { + $this->defaultAddress = $defaultAddress; + + return $this; + } + + /** + * Get defaultAddress + * + * @return string + */ + public function getDefaultAddress() + { + return $this->defaultAddress; + } + + /** + * Set defaultZipcode + * + * @param string $defaultZipcode + * @return City + */ + public function setdefaultZipcode($defaultZipcode) + { + $this->defaultZipcode = $defaultZipcode; + + return $this; + } + + /** + * Get defaultZipcode + * + * @return string + */ + public function getDefaultZipcode() + { + return $this->defaultZipcode; + } + + /** + * Set defaultAddressLongitude + * + * @param string $defaultAddressLongitude + * @return City + */ + public function setdefaultAddressLongitude($defaultAddressLongitude) + { + $this->defaultAddressLongitude = $defaultAddressLongitude; + + return $this; + } + + /** + * Get defaultAddressLongitude + * + * @return string + */ + public function getDefaultAddressLongitude() + { + return $this->defaultAddressLongitude; + } + + /** + * Set defaultAddressLatitude + * + * @param string $defaultAddressLatitude + * @return City + */ + public function setdefaultAddressLatitude($defaultAddressLatitude) + { + $this->defaultAddressLatitude = $defaultAddressLatitude; + + return $this; + } + + /** + * Get defaultAddressLatitude + * + * @return string + */ + public function getDefaultAddressLatitude() + { + return $this->defaultAddressLatitude; + } + + /** + * Add publicMessages + * + * @param CTRV\CommonBundle\Entity\PublicMessage $publicMessages + * @return City + */ + public function addPublicMessage(PublicMessage $publicMessages) + { + $this->publicMessages[] = $publicMessages; + + return $this; + } + + /** + * Remove publicMessages + * + * @param CTRV\CommonBundle\Entity\PublicMessage $publicMessages + */ + public function removePublicMessage(PublicMessage $publicMessages) + { + $this->publicMessages->removeElement($publicMessages); + } + + /** + * Get publicMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getPublicMessages() + { + return $this->publicMessages; + } + + /** + * Add users + * + * @param CTRV\CommonBundle\Entity\User $users + * @return City + */ + public function addUser(\CTRV\CommonBundle\Entity\User $users) + { + $this->users[] = $users; + + return $this; + } + + /** + * Remove users + * + * @param CTRV\CommonBundle\Entity\User $users + */ + public function removeUser(\CTRV\CommonBundle\Entity\User $users) + { + $this->users->removeElement($users); + } + + /** + * Get users + * + * @return Doctrine\Common\Collections\Collection + */ + public function getUsers() + { + return $this->users; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/CityRepository.php b/CTRV/CommonBundle/Entity/CityRepository.php new file mode 100644 index 0000000..6f1ee61 --- /dev/null +++ b/CTRV/CommonBundle/Entity/CityRepository.php @@ -0,0 +1,32 @@ +createQueryBuilder("c") + ->orderBy('c.name','ASC') + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + /** + * Retourne le nombre total de Villes + */ + public function getAllCitiesNumber () { + $qb = $this->createQueryBuilder("c") + ->select('count(c)') + ; + return $qb->getQuery()->getSingleScalarResult(); + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/Comment.php b/CTRV/CommonBundle/Entity/Comment.php new file mode 100644 index 0000000..e529a2e --- /dev/null +++ b/CTRV/CommonBundle/Entity/Comment.php @@ -0,0 +1,193 @@ +id; + } + + /** + * Set content + * + * @param string $content + * @return Comment + */ + public function setContent($content) + { + $this->content = $content; + + return $this; + } + + /** + * Get content + * + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * Set date + * + * @param \DateTime $date + * @return Comment + */ + public function setDate($date) + { + $this->date = $date; + + return $this; + } + + /** + * Get date + * + * @return \DateTime + */ + public function getDate() + { + return $this->date; + } + + /** + * Set auteur + * + * @param CTRV\CommonBundle\Entity\User $auteur + * @return Comment + */ + public function setAuteur(\CTRV\CommonBundle\Entity\User $auteur = null) + { + $this->auteur = $auteur; + + return $this; + } + + /** + * Get auteur + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getAuteur() + { + return $this->auteur; + } + + /** + * Set typeEntity + * + * @param string $typeEntity + * @return Comment + */ + public function setTypeEntity($typeEntity) + { + $this->typeEntity = $typeEntity; + + return $this; + } + + /** + * Get typeEntity + * + * @return string + */ + public function getTypeEntity() + { + return $this->typeEntity; + } + + /** + * Set idEntity + * + * @param integer $idEntity + * @return Comment + */ + public function setIdEntity($idEntity) + { + $this->idEntity = $idEntity; + + return $this; + } + + /** + * Get idEntity + * + * @return integer + */ + public function getIdEntity() + { + return $this->idEntity; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/CommentRepository.php b/CTRV/CommonBundle/Entity/CommentRepository.php new file mode 100644 index 0000000..1ba100d --- /dev/null +++ b/CTRV/CommonBundle/Entity/CommentRepository.php @@ -0,0 +1,251 @@ +createQueryBuilder("p") + ->select('p as comment') + ->from('CTRV\EventBundle\Entity\Event','a') + ->addSelect('a.title') + ->where("p.idEntity=a.id") + ->andwhere("p.typeEntity=?1") + ->andWhere("a.city=?2") + ->andWhere('a.isPrivate=?3') + ->andWhere('a.isRealtime=?4') + ->orderBy('p.date', 'DESC') + ->setParameter(1, Constants::TYPE_ENTIY_AGENDA) + ->setParameter(2, $city) + ->setParameter(3,false) + ->setParameter(4,false) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre de commnetaires d'agendas de la ville courante + */ + public function getAgendaCommentNumber($city) { + + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->from('CTRV\EventBundle\Entity\Event','a') + ->where("p.idEntity=a.id") + ->andwhere("p.typeEntity=?1") + ->andWhere("a.city=?2") + ->andWhere('a.isPrivate=?3') + ->andWhere('a.isRealtime=?4') + ->orderBy('p.date', 'DESC') + ->setParameter(1, Constants::TYPE_ENTIY_AGENDA) + ->setParameter(2, $city) + ->setParameter(3,false) + ->setParameter(4,false) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * retourne la liste de commnetaires d'événements de la ville courante + */ + public function getEventComment($city, $first, $last) { + + $qb = $this->createQueryBuilder("p") + ->select('p as comment') + ->from('CTRV\EventBundle\Entity\Event','a') + ->addSelect('a.title') + ->where("p.idEntity=a.id") + ->andwhere("p.typeEntity=?1") + ->andWhere("a.city=?2") + ->andWhere('a.isPrivate=?3') + ->andWhere('a.isRealtime=?4') + ->orderBy('p.date', 'DESC') + ->setParameter(1, Constants::TYPE_ENTIY_EVENT) + ->setParameter(2, $city) + ->setParameter(3,false) + ->setParameter(4,true) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre de commnetaires d'événements de la ville courante + */ + public function getEventCommentNumber($city) { + + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->from('CTRV\EventBundle\Entity\Event','a') + ->where("p.idEntity=a.id") + ->andwhere("p.typeEntity=?1") + ->andWhere("a.city=?2") + ->andWhere('a.isPrivate=?3') + ->andWhere('a.isRealtime=?4') + ->orderBy('p.date', 'DESC') + ->setParameter(1, Constants::TYPE_ENTIY_EVENT) + ->setParameter(2, $city) + ->setParameter(3,false) + ->setParameter(4,true) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * retourne la liste de commnetaires de places de la ville courante + */ + public function getPlaceComment($city, $first, $last) { + + $qb = $this->createQueryBuilder("p") + ->select('p as comment') + ->from('CTRV\PlaceBundle\Entity\Place','a') + ->addSelect('a.title') + ->where("p.idEntity=a.id") + ->andwhere("p.typeEntity=?1") + ->andWhere("a.city=?2") + ->orderBy('p.date', 'DESC') + ->setParameter(1, Constants::TYPE_ENTIY_PLACE) + ->setParameter(2, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne la liste de commnetaires de places de la ville courante + */ + public function getPlaceCommentNumber($city) { + + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->from('CTRV\PlaceBundle\Entity\Place','a') + ->where("p.idEntity=a.id") + ->andwhere("p.typeEntity=?1") + ->andWhere("a.city=?2") + ->orderBy('p.date', 'DESC') + ->setParameter(1, Constants::TYPE_ENTIY_PLACE) + ->setParameter(2, $city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne la liste de tous les commentaires signalés des évenements de la ville courante + */ + public function getEventCommentAbuse($city, $first, $last) { + + $qb= $this->createQueryBuilder("c") + ->select("a.entityType, c.content,c.date, c.id") + ->from('CTRV\CommonBundle\Entity\Abuse','a') + ->from('CTRV\EventBundle\Entity\Event','e') + ->addSelect("e.title") + ->where("a.entityId=c.id") + ->andWhere("c.typeEntity=?2") + ->andWhere("e.id=c.idEntity") + ->andWhere("a.entityType=?1") + ->orderBy("a.id","desc") + ->setFirstResult($first) + ->setMaxResults($last) + ->setParameter(1,Constants::TYPE_ENTIY_EVENT) + ->setParameter(2,Constants::TYPE_ENTIY_EVENT) + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getResult(); + } + + + + public function getAllCommentAbusesNumber () { + $qb= $this->createQueryBuilder("a") + ->select("count(c.id)") + ->from('CTRV\CommonBundle\Entity\Comment','c') + ->where("a.entityId=c.id") + ->orderBy("a.id","desc") + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne le nombre de commentaires signalés des évenements de la ville courante + */ + public function getEventCommentAbuseNumber($city){ + + $qb= $this->createQueryBuilder("c") + ->select("count (distinct c.id)") + ->from('CTRV\CommonBundle\Entity\Abuse','a') + ->from('CTRV\EventBundle\Entity\Event','e') + ->where("a.entityId=c.id") + ->andWhere("c.typeEntity=?2") + ->andWhere("e.id=c.idEntity") + ->andWhere("a.entityType=?1") + ->orderBy("a.id","desc") + ->setParameter(1,Constants::TYPE_ENTIY_EVENT) + ->setParameter(2,Constants::TYPE_ENTIY_EVENT) + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * Retourne la liste de tous les abus sur les commentaires des places + */ + public function getPlaceCommentAbuse($city, $first, $last) { + $qb= $this->createQueryBuilder("c") + ->select("a.entityId, a.entityType, c.content,c.date, c.id") + ->from('CTRV\CommonBundle\Entity\Abuse','a') + ->from('CTRV\PlaceBundle\Entity\Place','p') + ->addSelect("p.title") + ->where("a.entityId=c.id") + ->andWhere("c.typeEntity=?2") + ->andWhere("p.id=c.idEntity") + ->andWhere("a.entityType=?1") + ->setFirstResult($first) + ->setMaxResults($last) + ->setParameter(1,Constants::TYPE_ENTIY_PLACE) + ->setParameter(2,Constants::TYPE_ENTIY_PLACE) + ->groupBy('a.entityId') + ; + return $qb->getQuery()->getResult(); + } + + + /** + * Retourne la liste de tous les abus sur les commentaires des places + */ + public function getPlaceCommentAbuseNumber($city) { + $qb= $this->createQueryBuilder("c") + ->select("count (distinct c.id)") + ->from('CTRV\CommonBundle\Entity\Abuse','a') + ->from('CTRV\PlaceBundle\Entity\Place','p') + ->where("a.entityId=c.id") + ->andWhere("c.typeEntity=?2") + ->andWhere("p.id=c.idEntity") + ->andWhere("a.entityType=?1") + ->setParameter(1,Constants::TYPE_ENTIY_PLACE) + ->setParameter(2,Constants::TYPE_ENTIY_PLACE) + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getSingleScalarResult(); + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/ConnectedUsers.php b/CTRV/CommonBundle/Entity/ConnectedUsers.php new file mode 100644 index 0000000..79d855c --- /dev/null +++ b/CTRV/CommonBundle/Entity/ConnectedUsers.php @@ -0,0 +1,58 @@ +userid; + } + + /** + * Set id + * + * @param string $id + * @return ConnectedUsers + */ + public function setId($id) + { + $this->id = $id; + + return $this; + } + + /** + * Get id + * + * @return string + */ + public function getId() + { + return $this->id; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/ConnectedUsersRepository.php b/CTRV/CommonBundle/Entity/ConnectedUsersRepository.php new file mode 100644 index 0000000..ee84c3f --- /dev/null +++ b/CTRV/CommonBundle/Entity/ConnectedUsersRepository.php @@ -0,0 +1,62 @@ +createQueryBuilder("cu") + ->from('CTRV\CommonBundle\Entity\User','u') + ->where("cu.id=u.userid") + ->select ('count(cu)') + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne la liste des utilisateurs connectés de la ville courante + */ + public function getUsersConnectedByCity ($city, $first, $last) { + $qb = $this->createQueryBuilder("cu") + ->select ('cu') + ->from('CTRV\CommonBundle\Entity\User','u') + ->addSelect('u.firstName, u.lastName, u.address, u.id') + ->where("cu.id=u.userid") + ->andWhere("u.city=?1") + ->setParameter(1, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + + /** + * Retourne le nombre d'utilisateurs connectés de la ville courante + */ + public function getUsersConnectedNumberByCity($city) { + $qb = $this->createQueryBuilder("cu") + ->select ('count(cu)') + ->from('CTRV\CommonBundle\Entity\User','u') + ->where("cu.id=u.userid") + ->andWhere("u.city=?1") + ->setParameter(1, $city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + +} diff --git a/CTRV/CommonBundle/Entity/Contact.php b/CTRV/CommonBundle/Entity/Contact.php new file mode 100644 index 0000000..68932cd --- /dev/null +++ b/CTRV/CommonBundle/Entity/Contact.php @@ -0,0 +1,126 @@ +id; + } + + /** + * Set isAccepted + * + * @param boolean $isAccepted + * @return Contact + */ + public function setIsAccepted($isAccepted) + { + $this->isAccepted = $isAccepted; + + return $this; + } + + /** + * Get isAccepted + * + * @return boolean + */ + public function getIsAccepted() + { + return $this->isAccepted; + } + + /** + * Set ownerUserid + * + * @param CTRV\CommonBundle\Entity\User $ownerUserid + * @return Contact + */ + public function setOwnerUserid(\CTRV\CommonBundle\Entity\User $ownerUserid = null) + { + $this->ownerUserid = $ownerUserid; + + return $this; + } + + /** + * Get ownerUserid + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getOwnerUserid() + { + return $this->ownerUserid; + } + + /** + * Set contactPublicKey + * + * @param CTRV\CommonBundle\Entity\User $contactPublicKey + * @return Contact + */ + public function setContactPublicKey(\CTRV\CommonBundle\Entity\User $contactPublicKey = null) + { + $this->contactPublicKey = $contactPublicKey; + + return $this; + } + + /** + * Get contactPublicKey + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getContactPublicKey() + { + return $this->contactPublicKey; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/Filtre.php b/CTRV/CommonBundle/Entity/Filtre.php new file mode 100644 index 0000000..1aa29c4 --- /dev/null +++ b/CTRV/CommonBundle/Entity/Filtre.php @@ -0,0 +1,109 @@ +id; + } + + /** + * Set entityType + * + * @param string $entityType + * @return Filtre + */ + public function setEntityType($entityType) + { + $this->entityType = $entityType; + + return $this; + } + + /** + * Get entityType + * + * @return string + */ + public function getEntityType() + { + return $this->entityType; + } + + /** + * Set distance + * + * @param integer $distance + * @return Filtre + */ + public function setDistance($distance) + { + $this->distance = $distance; + + return $this; + } + + /** + * Get distance + * + * @return integer + */ + public function getDistance() + { + return $this->distance; + } +} diff --git a/CTRV/CommonBundle/Entity/FiltreRepository.php b/CTRV/CommonBundle/Entity/FiltreRepository.php new file mode 100644 index 0000000..0299040 --- /dev/null +++ b/CTRV/CommonBundle/Entity/FiltreRepository.php @@ -0,0 +1,15 @@ +id; + } + + /** + * Set idEntity + * + * @param integer $idEntity + * @return ImageEntity + */ + public function setIdEntity($idEntity) + { + $this->idEntity = $idEntity; + + return $this; + } + + /** + * Get idEntity + * + * @return integer + */ + public function getIdEntity() + { + return $this->idEntity; + } + + /** + * Set typeEntity + * + * @param string $typeEntity + * @return ImageEntity + */ + public function setTypeEntity($typeEntity) + { + $this->typeEntity = $typeEntity; + + return $this; + } + + /** + * Get typeEntity + * + * @return string + */ + public function getTypeEntity() + { + return $this->typeEntity; + } + + /** + * Set imgPath + * + * @param string $imgPath + * @return ImageEntity + */ + public function setImgPath($imgPath) + { + $this->imgPath = $imgPath; + + return $this; + } + + /** + * Get imgPath + * + * @return string + */ + public function getImgPath() + { + return $this->imgPath; + } + + /** + * Set author + * + * @param string $author + * @return ImageEntity + */ + public function setAuthor($author) + { + $this->author = $author; + + return $this; + } + + /** + * Get author + * + * @return string + */ + public function getAuthor() + { + return $this->author; + } + + /** + * Set addedDate + * + * @param \DateTime $addedDate + * @return ImageEntity + */ + public function setAddedDate($addedDate) + { + $this->addedDate = $addedDate; + + return $this; + } + + /** + * Get addedDate + * + * @return \DateTime + */ + public function getAddedDate() + { + return $this->addedDate; + } + + /** + * Set idItem + * + * @param integer $idItem + * @return ImageEntity + */ + public function setIdItem($idItem) + { + $this->idItem = $idItem; + + return $this; + } + + /** + * Get idItem + * + * @return integer + */ + public function getIdItem() + { + return $this->idItem; + } + + /** + * Set typeItem + * + * @param string $typeItem + * @return ImageEntity + */ + public function setTypeItem($typeItem) + { + $this->typeItem = $typeItem; + + return $this; + } + + /** + * Get typeItem + * + * @return string + */ + public function getTypeItem() + { + return $this->typeItem; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/ImageEntityRepository.php b/CTRV/CommonBundle/Entity/ImageEntityRepository.php new file mode 100644 index 0000000..c198605 --- /dev/null +++ b/CTRV/CommonBundle/Entity/ImageEntityRepository.php @@ -0,0 +1,15 @@ +id; + } + + /** + * Set note + * + * @param integer $note + * @return Note + */ + public function setNote($note) + { + $this->note = $note; + + return $this; + } + + /** + * Get note + * + * @return integer + */ + public function getNote() + { + return $this->note; + } + + /** + * Set type + * + * @param string $type + * @return Note + */ + public function setType($type) + { + $this->type = $type; + + return $this; + } + + /** + * Get type + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Set id_entite + * + * @param integer $idEntite + * @return Note + */ + public function setIdEntite($idEntite) + { + $this->id_entite = $idEntite; + + return $this; + } + + /** + * Get id_entite + * + * @return integer + */ + public function getIdEntite() + { + return $this->id_entite; + } + + /** + * Set auteur + * + * @param CTRV\CommonBundle\Entity\User $auteur + * @return Note + */ + public function setAuteur(\CTRV\CommonBundle\Entity\User $auteur) + { + $this->auteur = $auteur; + + return $this; + } + + /** + * Get auteur + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getAuteur() + { + return $this->auteur; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/NoteRepository.php b/CTRV/CommonBundle/Entity/NoteRepository.php new file mode 100644 index 0000000..da42080 --- /dev/null +++ b/CTRV/CommonBundle/Entity/NoteRepository.php @@ -0,0 +1,15 @@ +name; + } + +// ** +// * @ORM\OneToMany(targetEntity="User",mappedBy="role") +// * @var unknown_type +// */ +// protected $users; + + + /** + * Get id + * + * @return integer + */ + public function getId() { + return $this->id; + } + + /** + * Set name + * + * @param string $name + * @return Role + */ + public function setName($name) { + $this->name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() { + return $this->name; + } + + /** + * + */ + public function getRole() { + return $this->name; + + } + + /** + * Constructor + */ + public function __construct() + { + $this->users = new \Doctrine\Common\Collections\ArrayCollection(); + } + + /** + * Add users + * + * @param CTRV\CommonBundle\Entity\User $users + * @return Role + */ + public function addUser(\CTRV\CommonBundle\Entity\User $users) + { + $this->users[] = $users; + + return $this; + } + + /** + * Remove users + * + * @param CTRV\CommonBundle\Entity\User $users + */ + public function removeUser(\CTRV\CommonBundle\Entity\User $users) + { + $this->users->removeElement($users); + } + + /** + * Get users + * + * @return Doctrine\Common\Collections\Collection + */ + public function getUsers() + { + return $this->users; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/RoleRepository.php b/CTRV/CommonBundle/Entity/RoleRepository.php new file mode 100644 index 0000000..e5a9d44 --- /dev/null +++ b/CTRV/CommonBundle/Entity/RoleRepository.php @@ -0,0 +1,15 @@ +login; + } + + /** + * Constructor + */ + public function __construct() { + $this->followedEvents = new \Doctrine\Common\Collections\ArrayCollection(); + $this->groupsAdmin = new \Doctrine\Common\Collections\ArrayCollection(); + $this->groupsMember = new \Doctrine\Common\Collections\ArrayCollection(); + $this->sentPendingsPrivateMessages = new \Doctrine\Common\Collections\ArrayCollection(); + $this->receivedPendingsPrivateMessages = new \Doctrine\Common\Collections\ArrayCollection(); + $this->sentPrivateMessages = new \Doctrine\Common\Collections\ArrayCollection(); + $this->receivedPrivateMessages = new \Doctrine\Common\Collections\ArrayCollection(); + $this->sentPublicMessages = new \Doctrine\Common\Collections\ArrayCollection(); + $this->agendas = new \Doctrine\Common\Collections\ArrayCollection(); + $this->events = new \Doctrine\Common\Collections\ArrayCollection(); + $this->places = new \Doctrine\Common\Collections\ArrayCollection(); + $this->contacts = new \Doctrine\Common\Collections\ArrayCollection(); + $this->owners = new \Doctrine\Common\Collections\ArrayCollection(); + $this->comments = new \Doctrine\Common\Collections\ArrayCollection(); + $this->notes = new \Doctrine\Common\Collections\ArrayCollection(); + } + + + /** + * @PrePersist() + */ + public function setRegistrationiDateValue () { + $this->registrationDate = new \DateTime(); + } + + /** + * Get id + * + * @return integer + */ + public function getId() { + return $this->id; + } + + /** + * Set userid + * + * @param string $userid + * @return User + */ + public function setUserid($userid) { + $this->userid = $userid; + + return $this; + } + + public function setUsername($username) { + $this->login = $username; + + return $this; + } + + + /** + * Get userid + * + * @return string + */ + public function getUserid() { + return $this->userid; + } + + /** + * Set login + * + * @param string $login + * @return User + */ + public function setLogin($login) { + $this->login = $login; + + return $this; + } + + /** + * Get login + * + * @return string + */ + public function getLogin() { + return $this->login; + } + + /** + * Set password + * + * @param string $password + * @return User + */ + public function setPassword($password) { + $this->password = $password; + + return $this; + } + + /** + * Get password + * + * @return string + */ + public function getPassword() { + return $this->password; + } + + /** + * Set firstName + * + * @param string $firstName + * @return User + */ + public function setFirstName($firstName) { + $this->firstName = $firstName; + + return $this; + } + + /** + * Get firstName + * + * @return string + */ + public function getFirstName() { + return $this->firstName; + } + + /** + * Set lastName + * + * @param string $lastName + * @return User + */ + public function setLastName($lastName) { + $this->lastName = $lastName; + + return $this; + } + + /** + * Get lastName + * + * @return string + */ + public function getLastName() { + return $this->lastName; + } + + /** + * Set email + * + * @param string $email + * @return User + */ + public function setEmail($email) { + $this->email = $email; + + return $this; + } + + /** + * Get email + * + * @return string + */ + public function getEmail() { + return $this->email; + } + + /** + * Set registrationDate + * + * @param \DateTime $registrationDate + * @return User + */ + public function setRegistrationDate($registrationDate) { + $this->registrationDate = $registrationDate; + + return $this; + } + + /** + * Get registrationDate + * + * @return \DateTime + */ + public function getRegistrationDate() { + return $this->registrationDate; + } + + /** + * Set latitude + * + * @param string $latitude + * @return User + */ + public function setLatitude($latitude) { + $this->latitude = $latitude; + + return $this; + } + + /** + * Get latitude + * + * @return string + */ + public function getLatitude() { + return $this->latitude; + } + + /** + * Set longitude + * + * @param string $longitude + * @return User + */ + public function setLongitude($longitude) { + $this->longitude = $longitude; + + return $this; + } + + /** + * Get longitude + * + * @return string + */ + public function getLongitude() { + return $this->longitude; + } + + /** + * Set isActive + * + * @param boolean $isActive + * @return User + */ + public function setIsActive($isActive) { + $this->isActive = $isActive; + + return $this; + } + + /** + * Get isActive + * + * @return boolean + */ + public function getIsActive() { + return $this->isActive; + } + + /** + * Set isBlocked + * + * @param boolean $isBlocked + * @return User + */ + public function setIsBlocked($isBlocked) { + $this->isBlocked = $isBlocked; + + return $this; + } + + /** + * Get isBlocked + * + * @return boolean + */ + public function getIsBlocked() { + return $this->isBlocked; + } + + /** + * Set city + * + * @param CTRV\CommonBundle\Entity\City $city + * @return User + */ + public function setCity(\CTRV\CommonBundle\Entity\City $city = null) { + $this->city = $city; + + return $this; + } + + /** + * Get city + * + * @return CTRV\CommonBundle\Entity\City + */ + public function getCity() { + return $this->city; + } + + /** + * Add followedEvents + * + * @param CTRV\EventBundle\Entity\EventFollower $followedEvents + * @return User + */ + public function addFollowedEvent( + \CTRV\EventBundle\Entity\EventFollower $followedEvents) { + $this->followedEvents[] = $followedEvents; + + return $this; + } + + /** + * Remove followedEvents + * + * @param CTRV\EventBundle\Entity\EventFollower $followedEvents + */ + public function removeFollowedEvent( + \CTRV\EventBundle\Entity\EventFollower $followedEvents) { + $this->followedEvents->removeElement($followedEvents); + } + + /** + * Get followedEvents + * + * @return Doctrine\Common\Collections\Collection + */ + public function getFollowedEvents() { + return $this->followedEvents; + } + + /** + * Add groupsAdmin + * + * @param CTRV\FlowBundle\Entity\GroupUser $groupsAdmin + * @return User + */ + public function addGroupsAdmin( + \CTRV\FlowBundle\Entity\GroupUser $groupsAdmin) { + $this->groupsAdmin[] = $groupsAdmin; + + return $this; + } + + /** + * Remove groupsAdmin + * + * @param CTRV\FlowBundle\Entity\GroupUser $groupsAdmin + */ + public function removeGroupsAdmin( + \CTRV\FlowBundle\Entity\GroupUser $groupsAdmin) { + $this->groupsAdmin->removeElement($groupsAdmin); + } + + /** + * Get groupsAdmin + * + * @return Doctrine\Common\Collections\Collection + */ + public function getGroupsAdmin() { + return $this->groupsAdmin; + } + + /** + * Add groupsMember + * + * @param CTRV\FlowBundle\Entity\GroupMember $groupsMember + * @return User + */ + public function addGroupsMember( + \CTRV\FlowBundle\Entity\GroupMember $groupsMember) { + $this->groupsMember[] = $groupsMember; + + return $this; + } + + /** + * Remove groupsMember + * + * @param CTRV\FlowBundle\Entity\GroupMember $groupsMember + */ + public function removeGroupsMember( + \CTRV\FlowBundle\Entity\GroupMember $groupsMember) { + $this->groupsMember->removeElement($groupsMember); + } + + /** + * Get groupsMember + * + * @return Doctrine\Common\Collections\Collection + */ + public function getGroupsMember() { + return $this->groupsMember; + } + + /** + * Add sentPendingsPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PendingPrivateMessage $sentPendingsPrivateMessages + * @return User + */ + public function addSentPendingsPrivateMessage( + \CTRV\FlowBundle\Entity\PendingPrivateMessage $sentPendingsPrivateMessages) { + $this->sentPendingsPrivateMessages[] = $sentPendingsPrivateMessages; + + return $this; + } + + /** + * Remove sentPendingsPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PendingPrivateMessage $sentPendingsPrivateMessages + */ + public function removeSentPendingsPrivateMessage( + \CTRV\FlowBundle\Entity\PendingPrivateMessage $sentPendingsPrivateMessages) { + $this->sentPendingsPrivateMessages + ->removeElement($sentPendingsPrivateMessages); + } + + /** + * Get sentPendingsPrivateMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getSentPendingsPrivateMessages() { + return $this->sentPendingsPrivateMessages; + } + + /** + * Add receivedPendingsPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PendingPrivateMessage $receivedPendingsPrivateMessages + * @return User + */ + public function addReceivedPendingsPrivateMessage( + \CTRV\FlowBundle\Entity\PendingPrivateMessage $receivedPendingsPrivateMessages) { + $this->receivedPendingsPrivateMessages[] = $receivedPendingsPrivateMessages; + + return $this; + } + + /** + * Remove receivedPendingsPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PendingPrivateMessage $receivedPendingsPrivateMessages + */ + public function removeReceivedPendingsPrivateMessage( + \CTRV\FlowBundle\Entity\PendingPrivateMessage $receivedPendingsPrivateMessages) { + $this->receivedPendingsPrivateMessages + ->removeElement($receivedPendingsPrivateMessages); + } + + /** + * Get receivedPendingsPrivateMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getReceivedPendingsPrivateMessages() { + return $this->receivedPendingsPrivateMessages; + } + + /** + * Add sentPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $sentPrivateMessages + * @return User + */ + public function addSentPrivateMessage( + \CTRV\FlowBundle\Entity\PrivateMessage $sentPrivateMessages) { + $this->sentPrivateMessages[] = $sentPrivateMessages; + + return $this; + } + + /** + * Remove sentPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $sentPrivateMessages + */ + public function removeSentPrivateMessage( + \CTRV\FlowBundle\Entity\PrivateMessage $sentPrivateMessages) { + $this->sentPrivateMessages->removeElement($sentPrivateMessages); + } + + /** + * Get sentPrivateMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getSentPrivateMessages() { + return $this->sentPrivateMessages; + } + + /** + * Add receivedPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $receivedPrivateMessages + * @return User + */ + public function addReceivedPrivateMessage( + \CTRV\FlowBundle\Entity\PrivateMessage $receivedPrivateMessages) { + $this->receivedPrivateMessages[] = $receivedPrivateMessages; + + return $this; + } + + /** + * Remove receivedPrivateMessages + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $receivedPrivateMessages + */ + public function removeReceivedPrivateMessage( + \CTRV\FlowBundle\Entity\PrivateMessage $receivedPrivateMessages) { + $this->receivedPrivateMessages->removeElement($receivedPrivateMessages); + } + + /** + * Get receivedPrivateMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getReceivedPrivateMessages() { + return $this->receivedPrivateMessages; + } + + /** + * Add sentPublicMessages + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $sentPublicMessages + * @return User + */ + public function addSentPublicMessage( + \CTRV\FlowBundle\Entity\PrivateMessage $sentPublicMessages) { + $this->sentPublicMessages[] = $sentPublicMessages; + + return $this; + } + + /** + * Remove sentPublicMessages + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $sentPublicMessages + */ + public function removeSentPublicMessage( + \CTRV\FlowBundle\Entity\PrivateMessage $sentPublicMessages) { + $this->sentPublicMessages->removeElement($sentPublicMessages); + } + + /** + * Get sentPublicMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getSentPublicMessages() { + return $this->sentPublicMessages; + } + + + /** + * Add events + * + * @param CTRV\EventBundle\Entity\Event $events + * @return User + */ + public function addEvent(\CTRV\EventBundle\Entity\Event $events) { + $this->events[] = $events; + + return $this; + } + + /** + * Remove events + * + * @param CTRV\EventBundle\Entity\Event $events + */ + public function removeEvent(\CTRV\EventBundle\Entity\Event $events) { + $this->events->removeElement($events); + } + + /** + * Get events + * + * @return Doctrine\Common\Collections\Collection + */ + public function getEvents() { + return $this->events; + } + + /** + * Add places + * + * @param CTRV\PlaceBundle\Entity\Place $places + * @return User + */ + public function addPlace(\CTRV\PlaceBundle\Entity\Place $places) { + $this->places[] = $places; + + return $this; + } + + /** + * Remove places + * + * @param CTRV\PlaceBundle\Entity\Place $places + */ + public function removePlace(\CTRV\PlaceBundle\Entity\Place $places) { + $this->places->removeElement($places); + } + + /** + * Get places + * + * @return Doctrine\Common\Collections\Collection + */ + public function getPlaces() { + return $this->places; + } + + /** + * Add contacts + * + * @param CTRV\CommonBundle\Entity\Contact $contacts + * @return User + */ + public function addContact(\CTRV\CommonBundle\Entity\Contact $contacts) { + $this->contacts[] = $contacts; + + return $this; + } + + /** + * Remove contacts + * + * @param CTRV\CommonBundle\Entity\Contact $contacts + */ + public function removeContact(\CTRV\CommonBundle\Entity\Contact $contacts) { + $this->contacts->removeElement($contacts); + } + + /** + * Get contacts + * + * @return Doctrine\Common\Collections\Collection + */ + public function getContacts() { + return $this->contacts; + } + + /** + * Add owners + * + * @param CTRV\CommonBundle\Entity\Contact $owners + * @return User + */ + public function addOwner(\CTRV\CommonBundle\Entity\Contact $owners) { + $this->owners[] = $owners; + + return $this; + } + + /** + * Remove owners + * + * @param CTRV\CommonBundle\Entity\Contact $owners + */ + public function removeOwner(\CTRV\CommonBundle\Entity\Contact $owners) { + $this->owners->removeElement($owners); + } + + /** + * Get owners + * + * @return Doctrine\Common\Collections\Collection + */ + public function getOwners() { + return $this->owners; + } + + /** + * Add comments + * + * @param CTRV\CommonBundle\Entity\Comment $comments + * @return User + */ + public function addComment(\CTRV\CommonBundle\Entity\Comment $comments) { + $this->comments[] = $comments; + + return $this; + } + + /** + * Remove comments + * + * @param CTRV\CommonBundle\Entity\Comment $comments + */ + public function removeComment(\CTRV\CommonBundle\Entity\Comment $comments) { + $this->comments->removeElement($comments); + } + + /** + * Get comments + * + * @return Doctrine\Common\Collections\Collection + */ + public function getComments() { + return $this->comments; + } + + /** + * Add notes + * + * @param CTRV\CommonBundle\Entity\Note $notes + * @return User + */ + public function addNote(\CTRV\CommonBundle\Entity\Note $notes) { + $this->notes[] = $notes; + + return $this; + } + + /** + * Remove notes + * + * @param CTRV\CommonBundle\Entity\Note $notes + */ + public function removeNote(\CTRV\CommonBundle\Entity\Note $notes) { + $this->notes->removeElement($notes); + } + + /** + * Get notes + * + * @return Doctrine\Common\Collections\Collection + */ + public function getNotes() { + return $this->notes; + } + + /** + * Set address + * + * @param string $address + * @return User + */ + public function setAddress($address) { + $this->address = $address; + + return $this; + } + + /** + * Get address + * + * @return string + */ + public function getAddress() { + return $this->address; + } + + /** + * Set salt + * + * @param string $salt + * @return User + */ + public function setSalt($salt) { + $this->salt = $salt; + + return $this; + } + + /** + * Get salt + * + * @return string + */ + public function getSalt() { + return $this->salt; + } + + /** + * Set numeroRue + * + * @param integer $numeroRue + * @return User + */ + public function setNumeroRue($numeroRue) { + $this->numeroRue = $numeroRue; + + return $this; + } + + /** + * Get numeroRue + * + * @return integer + */ + public function getNumeroRue() { + return $this->numeroRue; + } + + /** + * + */ + public function serialize() + { + return serialize(array( + $this->id,//$this->login,$this->password,$this->email, + )); + } + + /** + * @see \Serializable::unserialize() + */ + public function unserialize($serialized) + { + list ( + $this->id,//$this->login,$this->password,$this->email, + ) = unserialize($serialized); + } + + /** + * (non-PHPdoc) + * @see Symfony\Component\Security\Core\User.UserInterface::getRoles() + */ + public function getRoles() { + + $roles = array(); + array_push($roles, $this->getRole()); + return $roles; + + } + + /** + * (non-PHPdoc) + * @see Symfony\Component\Security\Core\User.UserInterface::getUsername() + */ + public function getUsername() { + return $this->login; + + } + + /** + * (non-PHPdoc) + * @see Symfony\Component\Security\Core\User.UserInterface::eraseCredentials() + */ + public function eraseCredentials() { + // TODO: Auto-generated method stub + + } + + /** + * + */ + public function isAccountNonExpired() + { + return true; + } + + public function isEqualTo(UserInterface $user) + { + return $this->login === $user->getLogin(); + } + + /** + * + */ + public function isAccountNonLocked() + { + return true;//return !$this->isBlocked; + } + + public function isCredentialsNonExpired() + { + return true; + } + + public function isEnabled() + { + return true; + } + +// public function isEqualTo(UserInterface $user) +// { +// return $this->login === $user->getLogin(); +// } + + + /** + * Set language + * + * @param string $language + * @return User + */ + public function setLanguage($language) + { + $this->language = $language; + + return $this; + } + + /** + * Get language + * + * @return string + */ + public function getLanguage() + { + return $this->language; + } + + + /** + * Add updated_events + * + * @param CTRV\EventBundle\Entity\UpdatedEvent $updatedEvents + * @return User + */ + public function addUpdatedEvent(\CTRV\EventBundle\Entity\UpdatedEvent $updatedEvents) + { + $this->updated_events[] = $updatedEvents; + + return $this; + } + + /** + * Remove updated_events + * + * @param CTRV\EventBundle\Entity\UpdatedEvent $updatedEvents + */ + public function removeUpdatedEvent(\CTRV\EventBundle\Entity\UpdatedEvent $updatedEvents) + { + $this->updated_events->removeElement($updatedEvents); + } + + /** + * Get updated_events + * + * @return Doctrine\Common\Collections\Collection + */ + public function getUpdatedEvents() + { + return $this->updated_events; + } + + /** + * Set role + * + * @param CTRV\CommonBundle\Entity\Role $role + * @return User + */ + public function setRole(\CTRV\CommonBundle\Entity\Role $role = null) + { + $this->role = $role; + + return $this; + } + + /** + * Get role + * + * @return CTRV\CommonBundle\Entity\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Set state + * + * @param string $state + * @return User + */ + public function setState($state) + { + $this->state = $state; + + return $this; + } + + /** + * Get state + * + * @return string + */ + public function getState() + { + return $this->state; + } + + /** + * Set lastLoginDate + * + * @param \DateTime $lastLoginDate + * @return User + */ + public function setLastLoginDate($lastLoginDate) + { + $this->lastLoginDate = $lastLoginDate; + + return $this; + } + + /** + * Get lastLoginDate + * + * @return \DateTime + */ + public function getLastLoginDate() + { + return $this->lastLoginDate; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/UserBlackList.php b/CTRV/CommonBundle/Entity/UserBlackList.php new file mode 100644 index 0000000..7bd894e --- /dev/null +++ b/CTRV/CommonBundle/Entity/UserBlackList.php @@ -0,0 +1,126 @@ +id; + } + + /** + * Set date + * + * @param \DateTime $date + * @return UserBlackList + */ + public function setDate($date) + { + $this->date = $date; + + return $this; + } + + /** + * Get date + * + * @return \DateTime + */ + public function getDate() + { + return $this->date; + } + + /** + * Set contact + * + * @param CTRV\CommonBundle\Entity\User $contact + * @return UserBlackList + */ + public function setContact(\CTRV\CommonBundle\Entity\User $contact = null) + { + $this->contact = $contact; + + return $this; + } + + /** + * Get contact + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getContact() + { + return $this->contact; + } + + /** + * Set user + * + * @param CTRV\CommonBundle\Entity\User $user + * @return UserBlackList + */ + public function setUser(\CTRV\CommonBundle\Entity\User $user = null) + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getUser() + { + return $this->user; + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Entity/UserBlackListRepository.php b/CTRV/CommonBundle/Entity/UserBlackListRepository.php new file mode 100644 index 0000000..42967b9 --- /dev/null +++ b/CTRV/CommonBundle/Entity/UserBlackListRepository.php @@ -0,0 +1,15 @@ +createQueryBuilder("p") + ->select('a.name, p.login,p.firstName,p.lastName, p.address, p.isActive,p.id, p.isBlocked') + ->from('CTRV\CommonBundle\Entity\Role','a') + ->where("p.city=?1") + ->andWhere("p.role=a.id") + ->orderBy('p.registrationDate', 'DESC') + ->setParameter(1, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre total d'utilisateurs par ville + * @return multitype: + */ + public function getAllUsersNumberByCity ($city) { + + $qb = $this->createQueryBuilder("u") + ->select('count(u)') + ->where('u.city=?1') + ->setParameter(1, $city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne le nombre total d'utilisateurs + * @return multitype: + */ + public function getAllUsersNumber () { + + $qb = $this->createQueryBuilder("p") + ->select('count(p)'); + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * (non-PHPdoc) + * @see Symfony\Component\Security\Core\User.UserProviderInterface::loadUserByUsername() + */ + public function loadUserByUsername($username) { + $q = $this + ->createQueryBuilder('u') + ->where('u.login = :login OR u.email = :email') + ->setParameter('login', $username) + ->setParameter('email', $username) + ->getQuery() + ; + + try { + // The Query::getSingleResult() method throws an exception + // if there is no record matching the criteria. + $user = $q->getSingleResult(); + } catch (NoResultException $e) { + $message = sprintf( + 'Unable to find an active admin AcmeUserBundle:User object identified by "%s".', + $username + ); + throw new UsernameNotFoundException($message, 0, $e); + } + + return $user; + } + + /** + * (non-PHPdoc) + * @see Symfony\Component\Security\Core\User.UserProviderInterface::refreshUser() + */ + public function refreshUser(UserInterface $user) + { + $class = get_class($user); + if (!$this->supportsClass($class)) { + throw new UnsupportedUserException( + sprintf( + 'Instances of "%s" are not supported.', + $class + ) + ); + } + + return $this->find($user->getId()); + } + + /** + * (non-PHPdoc) + * @see Symfony\Component\Security\Core\User.UserProviderInterface::supportsClass() + */ + public function supportsClass($class) + { + return $this->getEntityName() === $class + || is_subclass_of($class, $this->getEntityName()); + } + + /** + * Retourne la liste des users de nom ou prenom spécifié spécifiée + * @param unknown_type $searchText + */ + public function getUserByNameAndState($searchText, $etat, $city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->select('a.name, p.login,p.firstName,p.lastName, p.address, p.isActive,p.id, p.isBlocked') + ->from('CTRV\CommonBundle\Entity\Role','a'); + + if ($searchText!="") { + $qb + ->where("p.firstName like ?1 OR p.lastName like ?1 OR p.login like ?1") + ->setParameter(1, "%".$searchText."%"); + } + + $qb + ->andWhere("p.city=?2") + ->andWhere("p.role=a.id") + ->orderBy("p.login","ASC") + ->setParameter(2, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + + if ($etat==Constants::STATE_USER_FILTER_BLOCKED) { + $qb->andWhere("p.isBlocked=?3") + ->setParameter(3, true); + } + + if ($etat==Constants::STATE_USER_FILTER_DISABED) { + $qb->andWhere("p.isActive=?4") + ->setParameter(4, false); + } + + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre d'utilisateurs de noms ou prénoms spécifié + * @param unknown_type $searchText + */ + public function getUserByNameAndStateNumber($searchText, $etat, $city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)'); + + if ($searchText!="") { + $qb + ->where("p.firstName like ?1 OR p.lastName like ?1 OR p.login like ?1") + ->setParameter(1, "%".$searchText."%"); + } + + $qb + ->andWhere("p.city=?2") + ->setParameter(2, $city) + ; + + if ($etat==Constants::STATE_USER_FILTER_BLOCKED) { + $qb->andWhere("p.isBlocked=?3") + ->setParameter(3, true); + } + + if ($etat==Constants::STATE_USER_FILTER_DISABED) { + $qb->andWhere("p.isActive=?4") + ->setParameter(4, false); + } + return $qb->getQuery()->getSingleScalarResult(); + } +} diff --git a/CTRV/CommonBundle/Form/ChooseCityType.php b/CTRV/CommonBundle/Form/ChooseCityType.php new file mode 100644 index 0000000..bc23e9b --- /dev/null +++ b/CTRV/CommonBundle/Form/ChooseCityType.php @@ -0,0 +1,30 @@ +add('choose_city', 'entity', array( + 'class' => 'CTRVCommonBundle:City', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.name', 'ASC'); + }, + 'label'=>'common.chooseCity' + )) + ; + } + + public function getName() + { + return 'choose_city_type'; + } +} diff --git a/CTRV/CommonBundle/Form/CityType.php b/CTRV/CommonBundle/Form/CityType.php new file mode 100644 index 0000000..ff7cd83 --- /dev/null +++ b/CTRV/CommonBundle/Form/CityType.php @@ -0,0 +1,39 @@ +add('name','text', array('label' => 'city.form.name')) + ->add('latitude','text', array('label' => 'city.form.latitude')) + ->add('longitude','text', array('label' => 'city.form.longitude')) + ->add('latitudeInf','text', array('label' => 'city.form.latitudeInf')) + ->add('latitudeSup','text', array('label' => 'city.form.latitudeSup')) + ->add('longitudeInf','text', array('label' => 'city.form.longitudeInf')) + ->add('longitudeSup','text', array('label' => 'city.form.longitudeSup')) + ->add('defaultAddress','text', array('label' => 'city.form.defaultAddress')) + ->add('defaultZipcode','text', array('label' => 'city.form.defaultZipcode')) + ->add('defaultAddressLongitude','text', array('label' => 'city.form.defaultAddressLongitude')) + ->add('defaultAddressLatitude','text', array('label' => 'city.form.defaultAddressLatitude')) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\CommonBundle\Entity\City' + )); + } + + public function getName() + { + return 'ctrv_commonbundle_citytype'; + } +} diff --git a/CTRV/CommonBundle/Form/RegistrationType.php b/CTRV/CommonBundle/Form/RegistrationType.php new file mode 100644 index 0000000..d67d0f4 --- /dev/null +++ b/CTRV/CommonBundle/Form/RegistrationType.php @@ -0,0 +1,50 @@ +add('firstName',null,array('label'=>'registration.form.firstName')) + ->add('lastName',null,array('label'=>'registration.form.lastName')) + ->add('login',null,array('label'=>'registration.form.login')) + ->add('email', 'email',array('label'=>'registration.form.email')) + ->add('password', 'repeated', array ( + 'first_name' => 'password', + 'second_name' => 'confirm', + 'type' => 'password', + 'first_options' => array('label' => 'registration.form.password'), + 'second_options' => array('label' => 'registration.form.confirmation') + )) + ->add('city', 'entity', array ( + 'class' => 'CTRVCommonBundle:City', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.name', 'ASC'); + },'label'=>'registration.form.city' + ) + ); + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\CommonBundle\Entity\User' + )); + } + + public function getName() + { + return 'ctrv_commonbundle_usertype'; + } +} diff --git a/CTRV/CommonBundle/Form/UserRechercheType.php b/CTRV/CommonBundle/Form/UserRechercheType.php new file mode 100644 index 0000000..e520efc --- /dev/null +++ b/CTRV/CommonBundle/Form/UserRechercheType.php @@ -0,0 +1,31 @@ +add('motcle','text', array('label' => 'utilisateur.rechercheForm.rechercher','required'=>false)) + + ->add('Etat','choice',array('label'=>'utilisateur.rechercheForm.etat', + 'choices'=>array( Constants::STATE_USER_FILTER_ALL => 'utilisateur.rechercheForm.all', + Constants::STATE_USER_FILTER_BLOCKED => 'utilisateur.rechercheForm.block', + Constants::STATE_USER_FILTER_DISABED => 'utilisateur.rechercheForm.desactive' + ), + ) + ); +} +public function getName(){ + + return 'userrecherche'; +} + +} diff --git a/CTRV/CommonBundle/Form/UserType.php b/CTRV/CommonBundle/Form/UserType.php new file mode 100644 index 0000000..62fe184 --- /dev/null +++ b/CTRV/CommonBundle/Form/UserType.php @@ -0,0 +1,47 @@ +add('userid',null,array('label'=>'utilisateur.editForm.userid','read_only' => true,'required'=>false)) + ->add('login',null,array('label'=>'utilisateur.editForm.login','read_only' => true,'required'=>false)) + ->add('salt',null,array('label'=>'utilisateur.editForm.salt','read_only' => true,'required'=>false)) + ->add('password',null,array('label'=>'utilisateur.editForm.password','read_only' => true,'required'=>false)) + ->add('firstName',null,array('label'=>'utilisateur.editForm.firstName','read_only' => true,'required'=>false)) + ->add('lastName',null,array('label'=>'utilisateur.editForm.lastName','read_only' => true,'required'=>false)) + ->add('email',null,array('label'=>'utilisateur.editForm.email','read_only' => true,'required'=>false)) + ->add('registrationDate','date',array('label'=>'utilisateur.editForm.registrationDate','read_only' => true,'required'=>false)) + ->add('latitude',null,array('label'=>'utilisateur.editForm.latitude','read_only' => true,'required'=>false)) + ->add('longitude',null,array('label'=>'utilisateur.editForm.longitude','read_only' => true,'required'=>false)) + ->add('isActive',null,array('label'=>'utilisateur.editForm.isActive','read_only' => true,'required'=>false)) + ->add('isBlocked',null,array('label'=>'utilisateur.editForm.isBlocked','read_only' => true,'required'=>false)) + ->add('state',null,array('label'=>'utilisateur.editForm.state','read_only' => true,'required'=>false)) + ->add('lastLoginDate','date',array('label'=>'utilisateur.editForm.lastLoginDate','read_only' => true,'required'=>false)) + ->add('numeroRue',null,array('label'=>'utilisateur.editForm.numeroRue','read_only' => true,'required'=>false)) + ->add('address',null,array('label'=>'utilisateur.editForm.address','read_only' => true,'required'=>false)) + ->add('language',null,array('label'=>'utilisateur.editForm.language','read_only' => true,'required'=>false)) + ->add('city',null,array('label'=>'utilisateur.editForm.city','read_only' => true,'required'=>false)) + ->add('role',null,array('label'=>'utilisateur.editForm.role')) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\CommonBundle\Entity\User' + )); + } + + public function getName() + { + return 'ctrv_commonbundle_usertype'; + } +} diff --git a/CTRV/CommonBundle/Listener/CustomExceptionListener.php b/CTRV/CommonBundle/Listener/CustomExceptionListener.php new file mode 100644 index 0000000..19df7ea --- /dev/null +++ b/CTRV/CommonBundle/Listener/CustomExceptionListener.php @@ -0,0 +1,38 @@ +getException(); + $message = 'Error : ' . $exception->getMessage() . ' --- Ccode: ' . $exception->getCode(); + + // personnalise notre objet réponse pour afficher les détails de notre exception + $response = new Response(); + $response->setContent($message); + + // HttpExceptionInterface est un type d'exception spécial qui + // contient le code statut et les détails de l'entête + if ($exception instanceof HttpExceptionInterface) { + $response->setStatusCode($exception->getStatusCode()); + $response->headers->replace($exception->getHeaders()); + } else { + $response->setStatusCode(500); + } + + // envoie notre objet réponse modifié à l'évènement + $event->setResponse($response); + } +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/config/services.yml b/CTRV/CommonBundle/Resources/config/services.yml new file mode 100644 index 0000000..1dc8e3e --- /dev/null +++ b/CTRV/CommonBundle/Resources/config/services.yml @@ -0,0 +1,29 @@ +services: + common_service: + class: CTRV\CommonBundle\Service\CommonService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator,@router] + abuse_service: + class: CTRV\CommonBundle\Service\AbuseService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator,@router] + session_service: + class: CTRV\CommonBundle\Service\SessionService + arguments: [@session,@doctrine,@translator,@service_container] + password_service: + class: CTRV\CommonBundle\Service\MyPasswordEncoder + user_service: + class: CTRV\CommonBundle\Service\UserService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + comment_service: + class: CTRV\CommonBundle\Service\CommentService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + city_service: + class: CTRV\CommonBundle\Service\CityService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] +# kernel.listener.access_denied.handler: +# class: CTRV\CommonBundle\Service\AccessDeniedService +# tags: +# - { name: kernel.event_listener, event: security.kernel_response, method: handle } +# kernel_listener_service: +# class: CTRV\CommonBundle\Listener\CustomExceptionListener +# tags: +# - { name: kernel.event_listener, event: kernel.exception, method: onKernelException } \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/doc/index.rst b/CTRV/CommonBundle/Resources/doc/index.rst new file mode 100644 index 0000000..248de9d --- /dev/null +++ b/CTRV/CommonBundle/Resources/doc/index.rst @@ -0,0 +1,50 @@ +Procédure reverse engineering symfony2 : + +php app/console doctrine:mapping:convert xml ./src/CTRV/CommonBundle/Resources/config/doctrine/metadata/orm --from-database --force + +php app/console doctrine:mapping:import CTRVCommonBundle annotation + +generate:doctrine:entities CTRVCommonBundle + +renomme idPlace en id et getIdXXX en getId + +deplacer entite + +corriger target entity + +generer crud + + +exec ("JobTest_run.bat --context_param ParamA=ValueA --context_param ParamB=ValueB") + + + +Appel web service +// $service_url = 'http://webservice.com/v1/getAllUser?search_key=d&userid=52'; + // $curl = curl_init($service_url); + + // curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + // // curl_setopt($curl, CURLOPT_HTTPGET, true); + // $curl_response = json_decode(curl_exec($curl)); + // curl_close($curl); + // var_dump(($curl_response)); + + + // $service_url = 'http://webservice.com/v1/registerUser'; + // $curl = curl_init($service_url); + // $curl_post_data = array( + // "firstname"=>"amady", + // "lastname"=>"faye", + // "email"=>"faye@faye", + // "login"=>"faye", + // "password"=>"faye", + // "registration_date"=>"2012/01/10", + // "userid"=>"sssss52", + // "city_id"=>1 + // ); + // curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + // curl_setopt($curl, CURLOPT_POST, true); + // curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data); + // $curl_response = json_decode(curl_exec($curl)); + // curl_close($curl); + // var_dump($curl_response);die; \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/accordion.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/accordion.less new file mode 100644 index 0000000..d63523b --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/accordion.less @@ -0,0 +1,34 @@ +// +// Accordion +// -------------------------------------------------- + + +// Parent container +.accordion { + margin-bottom: @baseLineHeight; +} + +// Group == heading + body +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + .border-radius(@baseBorderRadius); +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +// General toggle styles +.accordion-toggle { + cursor: pointer; +} + +// Inner needs the styles because you can't animate properly with any styles on the element +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/alerts.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/alerts.less new file mode 100644 index 0000000..0116b19 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/alerts.less @@ -0,0 +1,79 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: @baseLineHeight; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + background-color: @warningBackground; + border: 1px solid @warningBorder; + .border-radius(@baseBorderRadius); +} +.alert, +.alert h4 { + // Specified for the h4 to prevent conflicts of changing @headingsColor + color: @warningText; +} +.alert h4 { + margin: 0; +} + +// Adjust close link position +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: @baseLineHeight; +} + + +// Alternate styles +// ------------------------- + +.alert-success { + background-color: @successBackground; + border-color: @successBorder; + color: @successText; +} +.alert-success h4 { + color: @successText; +} +.alert-danger, +.alert-error { + background-color: @errorBackground; + border-color: @errorBorder; + color: @errorText; +} +.alert-danger h4, +.alert-error h4 { + color: @errorText; +} +.alert-info { + background-color: @infoBackground; + border-color: @infoBorder; + color: @infoText; +} +.alert-info h4 { + color: @infoText; +} + + +// Block alerts +// ------------------------- + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/bootstrap.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/bootstrap.less new file mode 100644 index 0000000..b56327a --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/bootstrap.less @@ -0,0 +1,63 @@ +/*! + * Bootstrap v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +// Core variables and mixins +@import "variables.less"; // Modify this for custom colors, font-sizes, etc +@import "mixins.less"; + +// CSS Reset +@import "reset.less"; + +// Grid system and page structure +@import "scaffolding.less"; +@import "grid.less"; +@import "layouts.less"; + +// Base CSS +@import "type.less"; +@import "code.less"; +@import "forms.less"; +@import "tables.less"; + +// Components: common +@import "sprites.less"; +@import "dropdowns.less"; +@import "wells.less"; +@import "component-animations.less"; +@import "close.less"; + +// Components: Buttons & Alerts +@import "buttons.less"; +@import "button-groups.less"; +@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less + +// Components: Nav +@import "navs.less"; +@import "navbar.less"; +@import "breadcrumbs.less"; +@import "pagination.less"; +@import "pager.less"; + +// Components: Popovers +@import "modals.less"; +@import "tooltip.less"; +@import "popovers.less"; + +// Components: Misc +@import "thumbnails.less"; +@import "media.less"; +@import "labels-badges.less"; +@import "progress-bars.less"; +@import "accordion.less"; +@import "carousel.less"; +@import "hero-unit.less"; + +// Utility classes +@import "utilities.less"; // Has to be last to override when necessary diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/breadcrumbs.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/breadcrumbs.less new file mode 100644 index 0000000..f753df6 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/breadcrumbs.less @@ -0,0 +1,24 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: 8px 15px; + margin: 0 0 @baseLineHeight; + list-style: none; + background-color: #f5f5f5; + .border-radius(@baseBorderRadius); + > li { + display: inline-block; + .ie7-inline-block(); + text-shadow: 0 1px 0 @white; + > .divider { + padding: 0 5px; + color: #ccc; + } + } + > .active { + color: @grayLight; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/button-groups.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/button-groups.less new file mode 100644 index 0000000..55cdc60 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/button-groups.less @@ -0,0 +1,229 @@ +// +// Button groups +// -------------------------------------------------- + + +// Make the div behave like a button +.btn-group { + position: relative; + display: inline-block; + .ie7-inline-block(); + font-size: 0; // remove as part 1 of font-size inline-block hack + vertical-align: middle; // match .btn alignment given font-size hack above + white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page) + .ie7-restore-left-whitespace(); +} + +// Space out series of button groups +.btn-group + .btn-group { + margin-left: 5px; +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + font-size: 0; // Hack to remove whitespace that results from using inline-block + margin-top: @baseLineHeight / 2; + margin-bottom: @baseLineHeight / 2; + > .btn + .btn, + > .btn-group + .btn, + > .btn + .btn-group { + margin-left: 5px; + } +} + +// Float them, remove border radius, then re-add to first and last elements +.btn-group > .btn { + position: relative; + .border-radius(0); +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack +} + +// Reset fonts for other sizes +.btn-group > .btn-mini { + font-size: @fontSizeMini; +} +.btn-group > .btn-small { + font-size: @fontSizeSmall; +} +.btn-group > .btn-large { + font-size: @fontSizeLarge; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + .border-top-left-radius(@baseBorderRadius); + .border-bottom-left-radius(@baseBorderRadius); +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + .border-top-right-radius(@baseBorderRadius); + .border-bottom-right-radius(@baseBorderRadius); +} +// Reset corners for large buttons +.btn-group > .btn.large:first-child { + margin-left: 0; + .border-top-left-radius(@borderRadiusLarge); + .border-bottom-left-radius(@borderRadiusLarge); +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + .border-top-right-radius(@borderRadiusLarge); + .border-bottom-right-radius(@borderRadiusLarge); +} + +// On hover/focus/active, bring the proper btn to front +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} + +.btn-group.open { + + // The clickable button for toggling the menu + // Remove the gradient and set the same inset shadow as the :active state + .dropdown-toggle { + background-image: none; + .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); + } + + // Keep the hover's background when dropdown is open + .btn.dropdown-toggle { + background-color: @btnBackgroundHighlight; + } + .btn-primary.dropdown-toggle { + background-color: @btnPrimaryBackgroundHighlight; + } + .btn-warning.dropdown-toggle { + background-color: @btnWarningBackgroundHighlight; + } + .btn-danger.dropdown-toggle { + background-color: @btnDangerBackgroundHighlight; + } + .btn-success.dropdown-toggle { + background-color: @btnSuccessBackgroundHighlight; + } + .btn-info.dropdown-toggle { + background-color: @btnInfoBackgroundHighlight; + } + .btn-inverse.dropdown-toggle { + background-color: @btnInverseBackgroundHighlight; + } +} + + +// Reposition the caret +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +// Carets in other button sizes +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} +// Upside down carets for .dropup +.dropup .btn-large .caret { + border-bottom-width: 5px; +} + + + +// Account for other colors +.btn-primary, +.btn-warning, +.btn-danger, +.btn-info, +.btn-success, +.btn-inverse { + .caret { + border-top-color: @white; + border-bottom-color: @white; + } +} + + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + display: inline-block; // makes buttons only take up the width they need + .ie7-inline-block(); +} +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + .border-radius(0); +} +.btn-group-vertical > .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical > .btn:first-child { + .border-radius(@baseBorderRadius @baseBorderRadius 0 0); +} +.btn-group-vertical > .btn:last-child { + .border-radius(0 0 @baseBorderRadius @baseBorderRadius); +} +.btn-group-vertical > .btn-large:first-child { + .border-radius(@borderRadiusLarge @borderRadiusLarge 0 0); +} +.btn-group-vertical > .btn-large:last-child { + .border-radius(0 0 @borderRadiusLarge @borderRadiusLarge); +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/buttons.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/buttons.less new file mode 100644 index 0000000..4cd4d86 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/buttons.less @@ -0,0 +1,228 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +// Core +.btn { + display: inline-block; + .ie7-inline-block(); + padding: 4px 12px; + margin-bottom: 0; // For input.btn + font-size: @baseFontSize; + line-height: @baseLineHeight; + text-align: center; + vertical-align: middle; + cursor: pointer; + .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75)); + border: 1px solid @btnBorder; + *border: 0; // Remove the border to prevent IE7's black border on input:focus + border-bottom-color: darken(@btnBorder, 10%); + .border-radius(@baseBorderRadius); + .ie7-restore-left-whitespace(); // Give IE7 some love + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)"); + + // Hover/focus state + &:hover, + &:focus { + color: @grayDark; + text-decoration: none; + background-position: 0 -15px; + + // transition is only when going to hover/focus, otherwise the background + // behind the gradient (there for IE<=9 fallback) gets mismatched + .transition(background-position .1s linear); + } + + // Focus state for keyboard and accessibility + &:focus { + .tab-focus(); + } + + // Active state + &.active, + &:active { + background-image: none; + outline: 0; + .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)"); + } + + // Disabled state + &.disabled, + &[disabled] { + cursor: default; + background-image: none; + .opacity(65); + .box-shadow(none); + } + +} + + + +// Button Sizes +// -------------------------------------------------- + +// Large +.btn-large { + padding: @paddingLarge; + font-size: @fontSizeLarge; + .border-radius(@borderRadiusLarge); +} +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} + +// Small +.btn-small { + padding: @paddingSmall; + font-size: @fontSizeSmall; + .border-radius(@borderRadiusSmall); +} +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} + +// Mini +.btn-mini { + padding: @paddingMini; + font-size: @fontSizeMini; + .border-radius(@borderRadiusSmall); +} + + +// Block button +// ------------------------- + +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + .box-sizing(border-box); +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} + + + +// Alternate buttons +// -------------------------------------------------- + +// Provide *some* extra contrast for those who can get it +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255,255,255,.75); +} + +// Set the backgrounds +// ------------------------- +.btn-primary { + .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight); +} +// Warning appears are orange +.btn-warning { + .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight); +} +// Danger and error appear as red +.btn-danger { + .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight); +} +// Success appears as green +.btn-success { + .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight); +} +// Info appears as a neutral blue +.btn-info { + .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight); +} +// Inverse appears as dark gray +.btn-inverse { + .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight); +} + + +// Cross-browser Jank +// -------------------------------------------------- + +button.btn, +input[type="submit"].btn { + + // Firefox 3.6 only I believe + &::-moz-focus-inner { + padding: 0; + border: 0; + } + + // IE7 has some default padding on button controls + *padding-top: 3px; + *padding-bottom: 3px; + + &.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; + } + &.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; + } + &.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; + } +} + + +// Link buttons +// -------------------------------------------------- + +// Make a button look and behave like a link +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + .box-shadow(none); +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: @linkColor; + .border-radius(0); +} +.btn-link:hover, +.btn-link:focus { + color: @linkColorHover; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: @grayDark; + text-decoration: none; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/carousel.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/carousel.less new file mode 100644 index 0000000..55bc050 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/carousel.less @@ -0,0 +1,158 @@ +// +// Carousel +// -------------------------------------------------- + + +.carousel { + position: relative; + margin-bottom: @baseLineHeight; + line-height: 1; +} + +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} + +.carousel-inner { + + > .item { + display: none; + position: relative; + .transition(.6s ease-in-out left); + + // Account for jankitude on images + > img, + > a > img { + display: block; + line-height: 1; + } + } + + > .active, + > .next, + > .prev { display: block; } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: @white; + text-align: center; + background: @grayDarker; + border: 3px solid @white; + .border-radius(23px); + .opacity(50); + + // we can't have this transition here + // because webkit cancels the carousel + // animation if you trip this while + // in the middle of another animation + // ;_; + // .transition(opacity .2s linear); + + // Reposition the right one + &.right { + left: auto; + right: 15px; + } + + // Hover/focus state + &:hover, + &:focus { + color: @white; + text-decoration: none; + .opacity(90); + } +} + +// Carousel indicator pips +// ----------------------------- +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; + + li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255,255,255,.25); + border-radius: 5px; + } + .active { + background-color: #fff; + } +} + +// Caption for text below images +// ----------------------------- + +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 15px; + background: @grayDark; + background: rgba(0,0,0,.75); +} +.carousel-caption h4, +.carousel-caption p { + color: @white; + line-height: @baseLineHeight; +} +.carousel-caption h4 { + margin: 0 0 5px; +} +.carousel-caption p { + margin-bottom: 0; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/close.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/close.less new file mode 100644 index 0000000..4c626bd --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/close.less @@ -0,0 +1,32 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: @baseLineHeight; + color: @black; + text-shadow: 0 1px 0 rgba(255,255,255,1); + .opacity(20); + &:hover, + &:focus { + color: @black; + text-decoration: none; + cursor: pointer; + .opacity(40); + } +} + +// Additional properties for button version +// iOS requires the button element instead of an anchor tag. +// If you want the anchor version, it requires `href="#"`. +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/code.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/code.less new file mode 100644 index 0000000..266a926 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/code.less @@ -0,0 +1,61 @@ +// +// Code (inline and blocK) +// -------------------------------------------------- + + +// Inline and block code styles +code, +pre { + padding: 0 3px 2px; + #font > #family > .monospace; + font-size: @baseFontSize - 2; + color: @grayDark; + .border-radius(3px); +} + +// Inline code +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + white-space: nowrap; +} + +// Blocks of code +pre { + display: block; + padding: (@baseLineHeight - 1) / 2; + margin: 0 0 @baseLineHeight / 2; + font-size: @baseFontSize - 1; // 14px to 13px + line-height: @baseLineHeight; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; // fallback for IE7-8 + border: 1px solid rgba(0,0,0,.15); + .border-radius(@baseBorderRadius); + + // Make prettyprint styles more spaced out for readability + &.prettyprint { + margin-bottom: @baseLineHeight; + } + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/component-animations.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/component-animations.less new file mode 100644 index 0000000..d614263 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/component-animations.less @@ -0,0 +1,22 @@ +// +// Component animations +// -------------------------------------------------- + + +.fade { + opacity: 0; + .transition(opacity .15s linear); + &.in { + opacity: 1; + } +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + .transition(height .35s ease); + &.in { + height: auto; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/dropdowns.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/dropdowns.less new file mode 100644 index 0000000..bbfe3fd --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/dropdowns.less @@ -0,0 +1,237 @@ +// +// Dropdown menus +// -------------------------------------------------- + + +// Use the .menu class on any
  • element within the topbar or ul.tabs and you'll get some superfancy dropdowns +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + // The caret makes the toggle a bit too tall in IE7 + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +// Dropdown arrow/caret +// -------------------- +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid @black; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} + +// Place the caret +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +// The dropdown menu (ul) +// ---------------------- +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: @zindexDropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + background-color: @dropdownBackground; + border: 1px solid #ccc; // Fallback for IE7-8 + border: 1px solid @dropdownBorder; + *border-right-width: 2px; + *border-bottom-width: 2px; + .border-radius(6px); + .box-shadow(0 5px 10px rgba(0,0,0,.2)); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + + // Aligns the dropdown menu to right + &.pull-right { + right: 0; + left: auto; + } + + // Dividers (basically an hr) within the dropdown + .divider { + .nav-divider(@dropdownDividerTop, @dropdownDividerBottom); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: @baseLineHeight; + color: @dropdownLinkColor; + white-space: nowrap; + } +} + +// Hover/Focus state +// ----------- +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + text-decoration: none; + color: @dropdownLinkColorHover; + #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%)); +} + +// Active state +// ------------ +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: @dropdownLinkColorActive; + text-decoration: none; + outline: 0; + #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%)); +} + +// Disabled state +// -------------- +// Gray out text and ensure the hover/focus state remains gray +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: @grayLight; +} +// Nuke hover/focus effects +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + .reset-filter(); + cursor: default; +} + +// Open state for the dropdown +// --------------------------- +.open { + // IE7's z-index only goes to the nearest positioned ancestor, which would + // make the menu appear below buttons that appeared later on the page + *z-index: @zindexDropdown; + + & > .dropdown-menu { + display: block; + } +} + +// Right aligned dropdowns +// --------------------------- +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// ------------------------------------------------------ +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: 4px solid @black; + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; + } +} + +// Sub menus +// --------------------------- +.dropdown-submenu { + position: relative; +} +// Default dropdowns +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + .border-radius(0 6px 6px 6px); +} +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} + +// Dropups +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + .border-radius(5px 5px 5px 0); +} + +// Caret to indicate there is a submenu +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: darken(@dropdownBackground, 20%); + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: @dropdownLinkColorHover; +} + +// Left aligned submenus +.dropdown-submenu.pull-left { + // Undo the float + // Yes, this is awkward since .pull-left adds a float, but it sticks to our conventions elsewhere. + float: none; + + // Positioning the submenu + > .dropdown-menu { + left: -100%; + margin-left: 10px; + .border-radius(6px 0 6px 6px); + } +} + +// Tweak nav headers +// ----------------- +// Increase padding from 15px to 20px on sides +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} + +// Typeahead +// --------- +.typeahead { + z-index: 1051; + margin-top: 2px; // give it some space to breathe + .border-radius(@baseBorderRadius); +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/forms.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/forms.less new file mode 100644 index 0000000..06767bd --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/forms.less @@ -0,0 +1,690 @@ +// +// Forms +// -------------------------------------------------- + + +// GENERAL STYLES +// -------------- + +// Make all forms have space below them +form { + margin: 0 0 @baseLineHeight; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +// Groups of fields with labels on top (legends) +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: @baseLineHeight; + font-size: @baseFontSize * 1.5; + line-height: @baseLineHeight * 2; + color: @grayDark; + border: 0; + border-bottom: 1px solid #e5e5e5; + + // Small + small { + font-size: @baseLineHeight * .75; + color: @grayLight; + } +} + +// Set font for forms +label, +input, +button, +select, +textarea { + #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here +} +input, +button, +select, +textarea { + font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element) +} + +// Identify controls by their labels +label { + display: block; + margin-bottom: 5px; +} + +// Form controls +// ------------------------- + +// Shared size and type resets +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: @baseLineHeight; + padding: 4px 6px; + margin-bottom: @baseLineHeight / 2; + font-size: @baseFontSize; + line-height: @baseLineHeight; + color: @gray; + .border-radius(@inputBorderRadius); + vertical-align: middle; +} + +// Reset appearance properties for textual inputs and textarea +// Declare width for legacy (can't be on input[type=*] selectors or it's too specific) +input, +textarea, +.uneditable-input { + width: 206px; // plus 12px padding and 2px border +} +// Reset height since textareas have rows +textarea { + height: auto; +} +// Everything else +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: @inputBackground; + border: 1px solid @inputBorder; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + .transition(~"border linear .2s, box-shadow linear .2s"); + + // Focus state + &:focus { + border-color: rgba(82,168,236,.8); + outline: 0; + outline: thin dotted \9; /* IE6-9 */ + .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)"); + } +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; /* IE7 */ + margin-top: 1px \9; /* IE8-9 */ + line-height: normal; +} + +// Reset width of input images, buttons, radios, checkboxes +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; // Override of generic input selector +} + +// Set the height of select and file controls to match text inputs +select, +input[type="file"] { + height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */ + *margin-top: 4px; /* For IE7, add top margin to align select with labels */ + line-height: @inputHeight; +} + +// Make select elements obey height by applying a border +select { + width: 220px; // default input width + 10px of padding that doesn't get applied + border: 1px solid @inputBorder; + background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for select, file, radio, and checkbox +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + .tab-focus(); +} + + +// Uneditable inputs +// ------------------------- + +// Make uneditable inputs look inactive +.uneditable-input, +.uneditable-textarea { + color: @grayLight; + background-color: darken(@inputBackground, 1%); + border-color: @inputBorder; + .box-shadow(inset 0 1px 2px rgba(0,0,0,.025)); + cursor: not-allowed; +} + +// For text that needs to appear as an input but should not be an input +.uneditable-input { + overflow: hidden; // prevent text from wrapping, but still cut it off like an input does + white-space: nowrap; +} + +// Make uneditable textareas behave like a textarea +.uneditable-textarea { + width: auto; + height: auto; +} + + +// Placeholder +// ------------------------- + +// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector +input, +textarea { + .placeholder(); +} + + +// CHECKBOXES & RADIOS +// ------------------- + +// Indent the labels to position radios/checkboxes as hanging +.radio, +.checkbox { + min-height: @baseLineHeight; // clear the floating input if there is no label text + padding-left: 20px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} + +// Move the options list down to align with labels +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; // has to be padding because margin collaspes +} + +// Radios and checkboxes on same line +// TODO v3: Convert .inline to .control-inline +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; // space out consecutive inline controls +} + + + +// INPUT SIZES +// ----------- + +// General classes for quick sizes +.input-mini { width: 60px; } +.input-small { width: 90px; } +.input-medium { width: 150px; } +.input-large { width: 210px; } +.input-xlarge { width: 270px; } +.input-xxlarge { width: 530px; } + +// Grid style input sizes +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +// Redeclare since the fluid row class is more specific +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +// Ensure input-prepend/append never wraps +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + + + +// GRID SIZING FOR INPUTS +// ---------------------- + +// Grid sizes +#grid > .input(@gridColumnWidth, @gridGutterWidth); + +// Control row for multiple inputs per line +.controls-row { + .clearfix(); // Clear the float from controls +} + +// Float to collapse white-space for proper grid alignment +.controls-row [class*="span"], +// Redeclare the fluid grid collapse since we undo the float for inputs +.row-fluid .controls-row [class*="span"] { + float: left; +} +// Explicity set top padding on all checkboxes/radios, not just first-child +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} + + + + +// DISABLED STATE +// -------------- + +// Disabled and read-only inputs +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: @inputDisabledBackground; +} +// Explicitly reset the colors here +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + + + + +// FORM FIELD FEEDBACK STATES +// -------------------------- + +// Warning +.control-group.warning { + .formFieldState(@warningText, @warningText, @warningBackground); +} +// Error +.control-group.error { + .formFieldState(@errorText, @errorText, @errorBackground); +} +// Success +.control-group.success { + .formFieldState(@successText, @successText, @successBackground); +} +// Success +.control-group.info { + .formFieldState(@infoText, @infoText, @infoBackground); +} + +// HTML5 invalid states +// Shares styles with the .control-group.error above +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; + &:focus { + border-color: darken(#ee5f5b, 10%); + @shadow: 0 0 6px lighten(#ee5f5b, 20%); + .box-shadow(@shadow); + } +} + + + +// FORM ACTIONS +// ------------ + +.form-actions { + padding: (@baseLineHeight - 1) 20px @baseLineHeight; + margin-top: @baseLineHeight; + margin-bottom: @baseLineHeight; + background-color: @formActionsBackground; + border-top: 1px solid #e5e5e5; + .clearfix(); // Adding clearfix to allow for .pull-right button containers +} + + + +// HELP TEXT +// --------- + +.help-block, +.help-inline { + color: lighten(@textColor, 15%); // lighten the text some for contrast +} + +.help-block { + display: block; // account for any element using help-block + margin-bottom: @baseLineHeight / 2; +} + +.help-inline { + display: inline-block; + .ie7-inline-block(); + vertical-align: middle; + padding-left: 5px; +} + + + +// INPUT GROUPS +// ------------ + +// Allow us to put symbols and text within the input field for a cleaner look +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: @baseLineHeight / 2; + vertical-align: middle; + font-size: 0; // white space collapse hack + white-space: nowrap; // Prevent span and input from separating + + // Reset the white space collapse hack + input, + select, + .uneditable-input, + .dropdown-menu, + .popover { + font-size: @baseFontSize; + } + + input, + select, + .uneditable-input { + position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness + margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms + *margin-left: 0; + vertical-align: top; + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + // Make input on top when focused so blue border and shadow always show + &:focus { + z-index: 2; + } + } + .add-on { + display: inline-block; + width: auto; + height: @baseLineHeight; + min-width: 16px; + padding: 4px 5px; + font-size: @baseFontSize; + font-weight: normal; + line-height: @baseLineHeight; + text-align: center; + text-shadow: 0 1px 0 @white; + background-color: @grayLighter; + border: 1px solid #ccc; + } + .add-on, + .btn, + .btn-group > .dropdown-toggle { + vertical-align: top; + .border-radius(0); + } + .active { + background-color: lighten(@green, 30); + border-color: @green; + } +} + +.input-prepend { + .add-on, + .btn { + margin-right: -1px; + } + .add-on:first-child, + .btn:first-child { + // FYI, `.btn:first-child` accounts for a button group that's prepended + .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + } +} + +.input-append { + input, + select, + .uneditable-input { + .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + + .btn-group .btn:last-child { + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + } + } + .add-on, + .btn, + .btn-group { + margin-left: -1px; + } + .add-on:last-child, + .btn:last-child, + .btn-group:last-child > .dropdown-toggle { + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + } +} + +// Remove all border-radius for inputs with both prepend and append +.input-prepend.input-append { + input, + select, + .uneditable-input { + .border-radius(0); + + .btn-group .btn { + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + } + } + .add-on:first-child, + .btn:first-child { + margin-right: -1px; + .border-radius(@inputBorderRadius 0 0 @inputBorderRadius); + } + .add-on:last-child, + .btn:last-child { + margin-left: -1px; + .border-radius(0 @inputBorderRadius @inputBorderRadius 0); + } + .btn-group:first-child { + margin-left: 0; + } +} + + + + +// SEARCH FORM +// ----------- + +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */ + margin-bottom: 0; // Remove the default margin on all inputs + .border-radius(15px); +} + +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + .border-radius(0); // Override due to specificity +} +.form-search .input-append .search-query { + .border-radius(14px 0 0 14px); +} +.form-search .input-append .btn { + .border-radius(0 14px 14px 0); +} +.form-search .input-prepend .search-query { + .border-radius(0 14px 14px 0); +} +.form-search .input-prepend .btn { + .border-radius(14px 0 0 14px); +} + + + + +// HORIZONTAL & VERTICAL FORMS +// --------------------------- + +// Common properties +// ----------------- + +.form-search, +.form-inline, +.form-horizontal { + input, + textarea, + select, + .help-inline, + .uneditable-input, + .input-prepend, + .input-append { + display: inline-block; + .ie7-inline-block(); + margin-bottom: 0; + vertical-align: middle; + } + // Re-hide hidden elements due to specifity + .hide { + display: none; + } +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +// Remove margin for input-prepend/-append +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +// Inline checkbox/radio labels (remove padding on left) +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +// Remove float and margin, set to inline-block +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + + +// Margin to space out fieldsets +.control-group { + margin-bottom: @baseLineHeight / 2; +} + +// Legend collapses margin, so next element is responsible for spacing +legend + .control-group { + margin-top: @baseLineHeight; + -webkit-margin-top-collapse: separate; +} + +// Horizontal-specific styles +// -------------------------- + +.form-horizontal { + // Increase spacing between groups + .control-group { + margin-bottom: @baseLineHeight; + .clearfix(); + } + // Float the labels left + .control-label { + float: left; + width: @horizontalComponentOffset - 20; + padding-top: 5px; + text-align: right; + } + // Move over all input controls and content + .controls { + // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend + // don't inherit the margin of the parent, in this case .controls + *display: inline-block; + *padding-left: 20px; + margin-left: @horizontalComponentOffset; + *margin-left: 0; + &:first-child { + *padding-left: @horizontalComponentOffset; + } + } + // Remove bottom margin on block level help text since that's accounted for on .control-group + .help-block { + margin-bottom: 0; + } + // And apply it only to .help-block instances that follow a form control + input, + select, + textarea, + .uneditable-input, + .input-prepend, + .input-append { + + .help-block { + margin-top: @baseLineHeight / 2; + } + } + // Move over buttons in .form-actions to align with .controls + .form-actions { + padding-left: @horizontalComponentOffset; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/grid.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/grid.less new file mode 100644 index 0000000..750d203 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/grid.less @@ -0,0 +1,21 @@ +// +// Grid system +// -------------------------------------------------- + + +// Fixed (940px) +#grid > .core(@gridColumnWidth, @gridGutterWidth); + +// Fluid (940px) +#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth); + +// Reset utility classes due to specificity +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} + +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/hero-unit.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/hero-unit.less new file mode 100644 index 0000000..763d86a --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/hero-unit.less @@ -0,0 +1,25 @@ +// +// Hero unit +// -------------------------------------------------- + + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: @baseLineHeight * 1.5; + color: @heroUnitLeadColor; + background-color: @heroUnitBackground; + .border-radius(6px); + h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: @heroUnitHeadingColor; + letter-spacing: -1px; + } + li { + line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/labels-badges.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/labels-badges.less new file mode 100644 index 0000000..bc321fe --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/labels-badges.less @@ -0,0 +1,84 @@ +// +// Labels and badges +// -------------------------------------------------- + + +// Base classes +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: @baseFontSize * .846; + font-weight: bold; + line-height: 14px; // ensure proper line-height if floated + color: @white; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + background-color: @grayLight; +} +// Set unique padding and border-radii +.label { + .border-radius(3px); +} +.badge { + padding-left: 9px; + padding-right: 9px; + .border-radius(9px); +} + +// Empty labels/badges collapse +.label, +.badge { + &:empty { + display: none; + } +} + +// Hover/focus state, but only for links +a { + &.label:hover, + &.label:focus, + &.badge:hover, + &.badge:focus { + color: @white; + text-decoration: none; + cursor: pointer; + } +} + +// Colors +// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute) +.label, +.badge { + // Important (red) + &-important { background-color: @errorText; } + &-important[href] { background-color: darken(@errorText, 10%); } + // Warnings (orange) + &-warning { background-color: @orange; } + &-warning[href] { background-color: darken(@orange, 10%); } + // Success (green) + &-success { background-color: @successText; } + &-success[href] { background-color: darken(@successText, 10%); } + // Info (turquoise) + &-info { background-color: @infoText; } + &-info[href] { background-color: darken(@infoText, 10%); } + // Inverse (black) + &-inverse { background-color: @grayDark; } + &-inverse[href] { background-color: darken(@grayDark, 10%); } +} + +// Quick fix for labels/badges in buttons +.btn { + .label, + .badge { + position: relative; + top: -1px; + } +} +.btn-mini { + .label, + .badge { + top: 0; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/layouts.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/layouts.less new file mode 100644 index 0000000..24a2062 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/layouts.less @@ -0,0 +1,16 @@ +// +// Layouts +// -------------------------------------------------- + + +// Container (centered, fixed-width layouts) +.container { + .container-fixed(); +} + +// Fluid layouts (left aligned, with sidebar, min- & max-width content) +.container-fluid { + padding-right: @gridGutterWidth; + padding-left: @gridGutterWidth; + .clearfix(); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/media.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/media.less new file mode 100644 index 0000000..e461e44 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/media.less @@ -0,0 +1,55 @@ +// Media objects +// Source: http://stubbornella.org/content/?p=497 +// -------------------------------------------------- + + +// Common styles +// ------------------------- + +// Clear the floats +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} + +// Proper spacing between instances of .media +.media, +.media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} + +// For images and videos, set to block +.media-object { + display: block; +} + +// Reset margins on headings for tighter default spacing +.media-heading { + margin: 0 0 5px; +} + + +// Media image alignment +// ------------------------- + +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-right { + margin-left: 10px; +} + + +// Media list variation +// ------------------------- + +// Undo default ul/ol styles +.media-list { + margin-left: 0; + list-style: none; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/mixins.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/mixins.less new file mode 100644 index 0000000..79d8892 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/mixins.less @@ -0,0 +1,702 @@ +// +// Mixins +// -------------------------------------------------- + + +// UTILITY MIXINS +// -------------------------------------------------- + +// Clearfix +// -------- +// For clearing floats like a boss h5bp.com/q +.clearfix { + *zoom: 1; + &:before, + &:after { + display: table; + content: ""; + // Fixes Opera/contenteditable bug: + // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952 + line-height: 0; + } + &:after { + clear: both; + } +} + +// Webkit-style focus +// ------------------ +.tab-focus() { + // Default + outline: thin dotted #333; + // Webkit + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +// Center-align a block level element +// ---------------------------------- +.center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} + +// IE7 inline-block +// ---------------- +.ie7-inline-block() { + *display: inline; /* IE7 inline-block hack */ + *zoom: 1; +} + +// IE7 likes to collapse whitespace on either side of the inline-block elements. +// Ems because we're attempting to match the width of a space character. Left +// version is for form buttons, which typically come after other elements, and +// right version is for icons, which come before. Applying both is ok, but it will +// mean that space between those elements will be .6em (~2 space characters) in IE7, +// instead of the 1 space in other browsers. +.ie7-restore-left-whitespace() { + *margin-left: .3em; + + &:first-child { + *margin-left: 0; + } +} + +.ie7-restore-right-whitespace() { + *margin-right: .3em; +} + +// Sizing shortcuts +// ------------------------- +.size(@height, @width) { + width: @width; + height: @height; +} +.square(@size) { + .size(@size, @size); +} + +// Placeholder text +// ------------------------- +.placeholder(@color: @placeholderText) { + &:-moz-placeholder { + color: @color; + } + &:-ms-input-placeholder { + color: @color; + } + &::-webkit-input-placeholder { + color: @color; + } +} + +// Text overflow +// ------------------------- +// Requires inline-block or block for proper styling +.text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// CSS image replacement +// ------------------------- +// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757 +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + + +// FONTS +// -------------------------------------------------- + +#font { + #family { + .serif() { + font-family: @serifFontFamily; + } + .sans-serif() { + font-family: @sansFontFamily; + } + .monospace() { + font-family: @monoFontFamily; + } + } + .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + font-size: @size; + font-weight: @weight; + line-height: @lineHeight; + } + .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + #font > #family > .serif; + #font > .shorthand(@size, @weight, @lineHeight); + } + .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + #font > #family > .sans-serif; + #font > .shorthand(@size, @weight, @lineHeight); + } + .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) { + #font > #family > .monospace; + #font > .shorthand(@size, @weight, @lineHeight); + } +} + + +// FORMS +// -------------------------------------------------- + +// Block level inputs +.input-block-level { + display: block; + width: 100%; + min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + .box-sizing(border-box); // Makes inputs behave like true block-level elements +} + + + +// Mixin for form field states +.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) { + // Set the text color + .control-label, + .help-block, + .help-inline { + color: @textColor; + } + // Style inputs accordingly + .checkbox, + .radio, + input, + select, + textarea { + color: @textColor; + } + input, + select, + textarea { + border-color: @borderColor; + .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work + &:focus { + border-color: darken(@borderColor, 10%); + @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%); + .box-shadow(@shadow); + } + } + // Give a small background color for input-prepend/-append + .input-prepend .add-on, + .input-append .add-on { + color: @textColor; + background-color: @backgroundColor; + border-color: @textColor; + } +} + + + +// CSS3 PROPERTIES +// -------------------------------------------------- + +// Border Radius +.border-radius(@radius) { + -webkit-border-radius: @radius; + -moz-border-radius: @radius; + border-radius: @radius; +} + +// Single Corner Border Radius +.border-top-left-radius(@radius) { + -webkit-border-top-left-radius: @radius; + -moz-border-radius-topleft: @radius; + border-top-left-radius: @radius; +} +.border-top-right-radius(@radius) { + -webkit-border-top-right-radius: @radius; + -moz-border-radius-topright: @radius; + border-top-right-radius: @radius; +} +.border-bottom-right-radius(@radius) { + -webkit-border-bottom-right-radius: @radius; + -moz-border-radius-bottomright: @radius; + border-bottom-right-radius: @radius; +} +.border-bottom-left-radius(@radius) { + -webkit-border-bottom-left-radius: @radius; + -moz-border-radius-bottomleft: @radius; + border-bottom-left-radius: @radius; +} + +// Single Side Border Radius +.border-top-radius(@radius) { + .border-top-right-radius(@radius); + .border-top-left-radius(@radius); +} +.border-right-radius(@radius) { + .border-top-right-radius(@radius); + .border-bottom-right-radius(@radius); +} +.border-bottom-radius(@radius) { + .border-bottom-right-radius(@radius); + .border-bottom-left-radius(@radius); +} +.border-left-radius(@radius) { + .border-top-left-radius(@radius); + .border-bottom-left-radius(@radius); +} + +// Drop shadows +.box-shadow(@shadow) { + -webkit-box-shadow: @shadow; + -moz-box-shadow: @shadow; + box-shadow: @shadow; +} + +// Transitions +.transition(@transition) { + -webkit-transition: @transition; + -moz-transition: @transition; + -o-transition: @transition; + transition: @transition; +} +.transition-delay(@transition-delay) { + -webkit-transition-delay: @transition-delay; + -moz-transition-delay: @transition-delay; + -o-transition-delay: @transition-delay; + transition-delay: @transition-delay; +} +.transition-duration(@transition-duration) { + -webkit-transition-duration: @transition-duration; + -moz-transition-duration: @transition-duration; + -o-transition-duration: @transition-duration; + transition-duration: @transition-duration; +} + +// Transformations +.rotate(@degrees) { + -webkit-transform: rotate(@degrees); + -moz-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + -o-transform: rotate(@degrees); + transform: rotate(@degrees); +} +.scale(@ratio) { + -webkit-transform: scale(@ratio); + -moz-transform: scale(@ratio); + -ms-transform: scale(@ratio); + -o-transform: scale(@ratio); + transform: scale(@ratio); +} +.translate(@x, @y) { + -webkit-transform: translate(@x, @y); + -moz-transform: translate(@x, @y); + -ms-transform: translate(@x, @y); + -o-transform: translate(@x, @y); + transform: translate(@x, @y); +} +.skew(@x, @y) { + -webkit-transform: skew(@x, @y); + -moz-transform: skew(@x, @y); + -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885 + -o-transform: skew(@x, @y); + transform: skew(@x, @y); + -webkit-backface-visibility: hidden; // See https://github.com/twitter/bootstrap/issues/5319 +} +.translate3d(@x, @y, @z) { + -webkit-transform: translate3d(@x, @y, @z); + -moz-transform: translate3d(@x, @y, @z); + -o-transform: translate3d(@x, @y, @z); + transform: translate3d(@x, @y, @z); +} + +// Backface visibility +// Prevent browsers from flickering when using CSS 3D transforms. +// Default value is `visible`, but can be changed to `hidden +// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples +.backface-visibility(@visibility){ + -webkit-backface-visibility: @visibility; + -moz-backface-visibility: @visibility; + backface-visibility: @visibility; +} + +// Background clipping +// Heads up: FF 3.6 and under need "padding" instead of "padding-box" +.background-clip(@clip) { + -webkit-background-clip: @clip; + -moz-background-clip: @clip; + background-clip: @clip; +} + +// Background sizing +.background-size(@size) { + -webkit-background-size: @size; + -moz-background-size: @size; + -o-background-size: @size; + background-size: @size; +} + + +// Box sizing +.box-sizing(@boxmodel) { + -webkit-box-sizing: @boxmodel; + -moz-box-sizing: @boxmodel; + box-sizing: @boxmodel; +} + +// User select +// For selecting text on the page +.user-select(@select) { + -webkit-user-select: @select; + -moz-user-select: @select; + -ms-user-select: @select; + -o-user-select: @select; + user-select: @select; +} + +// Resize anything +.resizable(@direction) { + resize: @direction; // Options: horizontal, vertical, both + overflow: auto; // Safari fix +} + +// CSS3 Content Columns +.content-columns(@columnCount, @columnGap: @gridGutterWidth) { + -webkit-column-count: @columnCount; + -moz-column-count: @columnCount; + column-count: @columnCount; + -webkit-column-gap: @columnGap; + -moz-column-gap: @columnGap; + column-gap: @columnGap; +} + +// Optional hyphenation +.hyphens(@mode: auto) { + word-wrap: break-word; + -webkit-hyphens: @mode; + -moz-hyphens: @mode; + -ms-hyphens: @mode; + -o-hyphens: @mode; + hyphens: @mode; +} + +// Opacity +.opacity(@opacity) { + opacity: @opacity / 100; + filter: ~"alpha(opacity=@{opacity})"; +} + + + +// BACKGROUNDS +// -------------------------------------------------- + +// Add an alphatransparency value to any background or border color (via Elyse Holladay) +#translucent { + .background(@color: @white, @alpha: 1) { + background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha); + } + .border(@color: @white, @alpha: 1) { + border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha); + .background-clip(padding-box); + } +} + +// Gradient Bar Colors for buttons and alerts +.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { + color: @textColor; + text-shadow: @textShadow; + #gradient > .vertical(@primaryColor, @secondaryColor); + border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%); + border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%); +} + +// Gradients +#gradient { + .horizontal(@startColor: #555, @endColor: #333) { + background-color: @endColor; + background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+ + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+ + background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10 + background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10 + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down + } + .vertical(@startColor: #555, @endColor: #333) { + background-color: mix(@startColor, @endColor, 60%); + background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+ + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+ + background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10 + background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10 + background-repeat: repeat-x; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down + } + .directional(@startColor: #555, @endColor: #333, @deg: 45deg) { + background-color: @endColor; + background-repeat: repeat-x; + background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+ + background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+ + background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10 + background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10 + } + .horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) { + background-color: mix(@midColor, @endColor, 80%); + background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor)); + background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor); + background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor); + background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor); + background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback + } + + .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) { + background-color: mix(@midColor, @endColor, 80%); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor)); + background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor); + background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor); + background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor); + background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor); + background-repeat: no-repeat; + filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback + } + .radial(@innerColor: #555, @outerColor: #333) { + background-color: @outerColor; + background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor)); + background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor); + background-image: -moz-radial-gradient(circle, @innerColor, @outerColor); + background-image: -o-radial-gradient(circle, @innerColor, @outerColor); + background-repeat: no-repeat; + } + .striped(@color: #555, @angle: 45deg) { + background-color: @color; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent); + } +} +// Reset filters for IE +.reset-filter() { + filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); +} + + + +// COMPONENT MIXINS +// -------------------------------------------------- + +// Horizontal dividers +// ------------------------- +// Dividers (basically an hr) within dropdowns and nav lists +.nav-divider(@top: #e5e5e5, @bottom: @white) { + // IE7 needs a set width since we gave a height. Restricting just + // to IE7 to keep the 1px left/right space in other browsers. + // It is unclear where IE is getting the extra space that we need + // to negative-margin away, but so it goes. + *width: 100%; + height: 1px; + margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px + *margin: -5px 0 5px; + overflow: hidden; + background-color: @top; + border-bottom: 1px solid @bottom; +} + +// Button backgrounds +// ------------------ +.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { + // gradientBar will set the background to a pleasing blend of these, to support IE<=9 + .gradientBar(@startColor, @endColor, @textColor, @textShadow); + *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + .reset-filter(); + + // in these cases the gradient won't cover the background, so we override + &:hover, &:focus, &:active, &.active, &.disabled, &[disabled] { + color: @textColor; + background-color: @endColor; + *background-color: darken(@endColor, 5%); + } + + // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves + &:active, + &.active { + background-color: darken(@endColor, 10%) e("\9"); + } +} + +// Navbar vertical align +// ------------------------- +// Vertically center elements in the navbar. +// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin. +.navbarVerticalAlign(@elementHeight) { + margin-top: (@navbarHeight - @elementHeight) / 2; +} + + + +// Grid System +// ----------- + +// Centered container element +.container-fixed() { + margin-right: auto; + margin-left: auto; + .clearfix(); +} + +// Table columns +.tableColumns(@columnSpan: 1) { + float: none; // undo default grid column styles + width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells + margin-left: 0; // undo default grid column styles +} + +// Make a Grid +// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior +.makeRow() { + margin-left: @gridGutterWidth * -1; + .clearfix(); +} +.makeColumn(@columns: 1, @offset: 0) { + float: left; + margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2); + width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); +} + +// The Grid +#grid { + + .core (@gridColumnWidth, @gridGutterWidth) { + + .spanX (@index) when (@index > 0) { + .span@{index} { .span(@index); } + .spanX(@index - 1); + } + .spanX (0) {} + + .offsetX (@index) when (@index > 0) { + .offset@{index} { .offset(@index); } + .offsetX(@index - 1); + } + .offsetX (0) {} + + .offset (@columns) { + margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1)); + } + + .span (@columns) { + width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); + } + + .row { + margin-left: @gridGutterWidth * -1; + .clearfix(); + } + + [class*="span"] { + float: left; + min-height: 1px; // prevent collapsing columns + margin-left: @gridGutterWidth; + } + + // Set the container width, and override it for fixed navbars in media queries + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { .span(@gridColumns); } + + // generate .spanX and .offsetX + .spanX (@gridColumns); + .offsetX (@gridColumns); + + } + + .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) { + + .spanX (@index) when (@index > 0) { + .span@{index} { .span(@index); } + .spanX(@index - 1); + } + .spanX (0) {} + + .offsetX (@index) when (@index > 0) { + .offset@{index} { .offset(@index); } + .offset@{index}:first-child { .offsetFirstChild(@index); } + .offsetX(@index - 1); + } + .offsetX (0) {} + + .offset (@columns) { + margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2); + *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%); + } + + .offsetFirstChild (@columns) { + margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth); + *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%); + } + + .span (@columns) { + width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)); + *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%); + } + + .row-fluid { + width: 100%; + .clearfix(); + [class*="span"] { + .input-block-level(); + float: left; + margin-left: @fluidGridGutterWidth; + *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%); + } + [class*="span"]:first-child { + margin-left: 0; + } + + // Space grid-sized controls properly if multiple per line + .controls-row [class*="span"] + [class*="span"] { + margin-left: @fluidGridGutterWidth; + } + + // generate .spanX and .offsetX + .spanX (@gridColumns); + .offsetX (@gridColumns); + } + + } + + .input(@gridColumnWidth, @gridGutterWidth) { + + .spanX (@index) when (@index > 0) { + input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); } + .spanX(@index - 1); + } + .spanX (0) {} + + .span(@columns) { + width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14; + } + + input, + textarea, + .uneditable-input { + margin-left: 0; // override margin-left from core grid system + } + + // Space grid-sized controls properly if multiple per line + .controls-row [class*="span"] + [class*="span"] { + margin-left: @gridGutterWidth; + } + + // generate .spanX + .spanX (@gridColumns); + + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/modals.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/modals.less new file mode 100644 index 0000000..8e272d4 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/modals.less @@ -0,0 +1,95 @@ +// +// Modals +// -------------------------------------------------- + +// Background +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: @zindexModalBackdrop; + background-color: @black; + // Fade for backdrop + &.fade { opacity: 0; } +} + +.modal-backdrop, +.modal-backdrop.fade.in { + .opacity(80); +} + +// Base modal +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: @zindexModal; + width: 560px; + margin-left: -280px; + background-color: @white; + border: 1px solid #999; + border: 1px solid rgba(0,0,0,.3); + *border: 1px solid #999; /* IE6-7 */ + .border-radius(6px); + .box-shadow(0 3px 7px rgba(0,0,0,0.3)); + .background-clip(padding-box); + // Remove focus outline from opened modal + outline: none; + + &.fade { + .transition(e('opacity .3s linear, top .3s ease-out')); + top: -25%; + } + &.fade.in { top: 10%; } +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; + // Close icon + .close { margin-top: 2px; } + // Heading + h3 { + margin: 0; + line-height: 30px; + } +} + +// Body (where all modal content resides) +.modal-body { + position: relative; + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +// Remove bottom margin if need be +.modal-form { + margin-bottom: 0; +} + +// Footer (for actions) +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; // right align buttons + background-color: #f5f5f5; + border-top: 1px solid #ddd; + .border-radius(0 0 6px 6px); + .box-shadow(inset 0 1px 0 @white); + .clearfix(); // clear it in case folks use .pull-* classes on buttons + + // Properly space out buttons + .btn + .btn { + margin-left: 5px; + margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs + } + // but override that for button groups + .btn-group .btn + .btn { + margin-left: -1px; + } + // and override it for block buttons as well + .btn-block + .btn-block { + margin-left: 0; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/navbar.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/navbar.less new file mode 100644 index 0000000..93d09bc --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/navbar.less @@ -0,0 +1,497 @@ +// +// Navbars (Redux) +// -------------------------------------------------- + + +// COMMON STYLES +// ------------- + +// Base class and wrapper +.navbar { + overflow: visible; + margin-bottom: @baseLineHeight; + + // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar + *position: relative; + *z-index: 2; +} + +// Inner for background effects +// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present +.navbar-inner { + min-height: @navbarHeight; + padding-left: 20px; + padding-right: 20px; + #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground); + border: 1px solid @navbarBorder; + .border-radius(@baseBorderRadius); + .box-shadow(0 1px 4px rgba(0,0,0,.065)); + + // Prevent floats from breaking the navbar + .clearfix(); +} + +// Set width to auto for default container +// We then reset it for fixed navbars in the #gridSystem mixin +.navbar .container { + width: auto; +} + +// Override the default collapsed state +.nav-collapse.collapse { + height: auto; + overflow: visible; +} + + +// Brand: website or project name +// ------------------------- +.navbar .brand { + float: left; + display: block; + // Vertically center the text given @navbarHeight + padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2); + margin-left: -20px; // negative indent to left-align the text down the page + font-size: 20px; + font-weight: 200; + color: @navbarBrandColor; + text-shadow: 0 1px 0 @navbarBackgroundHighlight; + &:hover, + &:focus { + text-decoration: none; + } +} + +// Plain text in topbar +// ------------------------- +.navbar-text { + margin-bottom: 0; + line-height: @navbarHeight; + color: @navbarText; +} + +// Janky solution for now to account for links outside the .nav +// ------------------------- +.navbar-link { + color: @navbarLinkColor; + &:hover, + &:focus { + color: @navbarLinkColorHover; + } +} + +// Dividers in navbar +// ------------------------- +.navbar .divider-vertical { + height: @navbarHeight; + margin: 0 9px; + border-left: 1px solid @navbarBackground; + border-right: 1px solid @navbarBackgroundHighlight; +} + +// Buttons in navbar +// ------------------------- +.navbar .btn, +.navbar .btn-group { + .navbarVerticalAlign(30px); // Vertically center in navbar +} +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; // then undo the margin here so we don't accidentally double it +} + +// Navbar forms +// ------------------------- +.navbar-form { + margin-bottom: 0; // remove default bottom margin + .clearfix(); + input, + select, + .radio, + .checkbox { + .navbarVerticalAlign(30px); // Vertically center in navbar + } + input, + select, + .btn { + display: inline-block; + margin-bottom: 0; + } + input[type="image"], + input[type="checkbox"], + input[type="radio"] { + margin-top: 3px; + } + .input-append, + .input-prepend { + margin-top: 5px; + white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left + input { + margin-top: 0; // remove the margin on top since it's on the parent + } + } +} + +// Navbar search +// ------------------------- +.navbar-search { + position: relative; + float: left; + .navbarVerticalAlign(30px); // Vertically center in navbar + margin-bottom: 0; + .search-query { + margin-bottom: 0; + padding: 4px 14px; + #font > .sans-serif(13px, normal, 1); + .border-radius(15px); // redeclare because of specificity of the type attribute + } +} + + + +// Static navbar +// ------------------------- + +.navbar-static-top { + position: static; + margin-bottom: 0; // remove 18px margin for default navbar + .navbar-inner { + .border-radius(0); + } +} + + + +// Fixed navbar +// ------------------------- + +// Shared (top/bottom) styles +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: @zindexFixedNavbar; + margin-bottom: 0; // remove 18px margin for default navbar +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + .border-radius(0); +} + +// Reset container width +// Required here as we reset the width earlier on and the grid mixins don't override early enough +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + #grid > .core > .span(@gridColumns); +} + +// Fixed to top +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-top, +.navbar-static-top { + .navbar-inner { + .box-shadow(~"0 1px 10px rgba(0,0,0,.1)"); + } +} + +// Fixed to bottom +.navbar-fixed-bottom { + bottom: 0; + .navbar-inner { + .box-shadow(~"0 -1px 10px rgba(0,0,0,.1)"); + } +} + + + +// NAVIGATION +// ---------- + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; // redeclare due to specificity + margin-right: 0; // remove margin on float right nav +} +.navbar .nav > li { + float: left; +} + +// Links +.navbar .nav > li > a { + float: none; + // Vertically center the text given @navbarHeight + padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2); + color: @navbarLinkColor; + text-decoration: none; + text-shadow: 0 1px 0 @navbarBackgroundHighlight; +} +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} + +// Hover/focus +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover/:focus from .active + color: @navbarLinkColorHover; + text-decoration: none; +} + +// Active nav items +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: @navbarLinkColorActive; + text-decoration: none; + background-color: @navbarLinkBackgroundActive; + .box-shadow(inset 0 3px 8px rgba(0,0,0,.125)); +} + +// Navbar button for toggling navbar items in responsive layouts +// These definitions need to come after '.navbar .btn' +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%)); + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)"); +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + .border-radius(1px); + .box-shadow(0 1px 0 rgba(0,0,0,.25)); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + + + +// Dropdown menus +// -------------- + +// Menu position and menu carets +.navbar .nav > li > .dropdown-menu { + &:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: @dropdownBorder; + position: absolute; + top: -7px; + left: 9px; + } + &:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid @dropdownBackground; + position: absolute; + top: -6px; + left: 10px; + } +} +// Menu position and menu caret support for dropups via extra dropup class +.navbar-fixed-bottom .nav > li > .dropdown-menu { + &:before { + border-top: 7px solid #ccc; + border-top-color: @dropdownBorder; + border-bottom: 0; + bottom: -7px; + top: auto; + } + &:after { + border-top: 6px solid @dropdownBackground; + border-bottom: 0; + bottom: -6px; + top: auto; + } +} + +// Caret should match text color on hover/focus +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: @navbarLinkColorHover; + border-bottom-color: @navbarLinkColorHover; +} + +// Remove background color from open dropdown +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: @navbarLinkBackgroundActive; + color: @navbarLinkColorActive; +} +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: @navbarLinkColor; + border-bottom-color: @navbarLinkColor; +} +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: @navbarLinkColorActive; + border-bottom-color: @navbarLinkColorActive; +} + +// Right aligned menus need alt position +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; + &:before { + left: auto; + right: 12px; + } + &:after { + left: auto; + right: 13px; + } + .dropdown-menu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: -1px; + .border-radius(6px 0 6px 6px); + } +} + + +// Inverted navbar +// ------------------------- + +.navbar-inverse { + + .navbar-inner { + #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground); + border-color: @navbarInverseBorder; + } + + .brand, + .nav > li > a { + color: @navbarInverseLinkColor; + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + &:hover, + &:focus { + color: @navbarInverseLinkColorHover; + } + } + + .brand { + color: @navbarInverseBrandColor; + } + + .navbar-text { + color: @navbarInverseText; + } + + .nav > li > a:focus, + .nav > li > a:hover { + background-color: @navbarInverseLinkBackgroundHover; + color: @navbarInverseLinkColorHover; + } + + .nav .active > a, + .nav .active > a:hover, + .nav .active > a:focus { + color: @navbarInverseLinkColorActive; + background-color: @navbarInverseLinkBackgroundActive; + } + + // Inline text links + .navbar-link { + color: @navbarInverseLinkColor; + &:hover, + &:focus { + color: @navbarInverseLinkColorHover; + } + } + + // Dividers in navbar + .divider-vertical { + border-left-color: @navbarInverseBackground; + border-right-color: @navbarInverseBackgroundHighlight; + } + + // Dropdowns + .nav li.dropdown.open > .dropdown-toggle, + .nav li.dropdown.active > .dropdown-toggle, + .nav li.dropdown.open.active > .dropdown-toggle { + background-color: @navbarInverseLinkBackgroundActive; + color: @navbarInverseLinkColorActive; + } + .nav li.dropdown > a:hover .caret, + .nav li.dropdown > a:focus .caret { + border-top-color: @navbarInverseLinkColorActive; + border-bottom-color: @navbarInverseLinkColorActive; + } + .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: @navbarInverseLinkColor; + border-bottom-color: @navbarInverseLinkColor; + } + .nav li.dropdown.open > .dropdown-toggle .caret, + .nav li.dropdown.active > .dropdown-toggle .caret, + .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: @navbarInverseLinkColorActive; + border-bottom-color: @navbarInverseLinkColorActive; + } + + // Navbar search + .navbar-search { + .search-query { + color: @white; + background-color: @navbarInverseSearchBackground; + border-color: @navbarInverseSearchBorder; + .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)"); + .transition(none); + .placeholder(@navbarInverseSearchPlaceholderColor); + + // Focus states (we use .focused since IE7-8 and down doesn't support :focus) + &:focus, + &.focused { + padding: 5px 15px; + color: @grayDark; + text-shadow: 0 1px 0 @white; + background-color: @navbarInverseSearchBackgroundFocus; + border: 0; + .box-shadow(0 0 3px rgba(0,0,0,.15)); + outline: 0; + } + } + } + + // Navbar collapse button + .btn-navbar { + .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%)); + } + +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/navs.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/navs.less new file mode 100644 index 0000000..01cd805 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/navs.less @@ -0,0 +1,409 @@ +// +// Navs +// -------------------------------------------------- + + +// BASE CLASS +// ---------- + +.nav { + margin-left: 0; + margin-bottom: @baseLineHeight; + list-style: none; +} + +// Make links block level +.nav > li > a { + display: block; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: @grayLighter; +} + +// Prevent IE8 from misplacing imgs +// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989 +.nav > li > a > img { + max-width: none; +} + +// Redeclare pull classes because of specifity +.nav > .pull-right { + float: right; +} + +// Nav headers (for dropdowns and lists) +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: @baseLineHeight; + color: @grayLight; + text-shadow: 0 1px 0 rgba(255,255,255,.5); + text-transform: uppercase; +} +// Space them out when they follow another list item (link) +.nav li + .nav-header { + margin-top: 9px; +} + + + +// NAV LIST +// -------- + +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255,255,255,.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: @white; + text-shadow: 0 -1px 0 rgba(0,0,0,.2); + background-color: @linkColor; +} +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} +// Dividers (basically an hr) within the dropdown +.nav-list .divider { + .nav-divider(); +} + + + +// TABS AND PILLS +// ------------- + +// Common styles +.nav-tabs, +.nav-pills { + .clearfix(); +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; // keeps the overall height an even number +} + +// TABS +// ---- + +// Give the tabs something to sit on +.nav-tabs { + border-bottom: 1px solid #ddd; +} +// Make the list-items overlay the bottom border +.nav-tabs > li { + margin-bottom: -1px; +} +// Actual tabs (as links) +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: @baseLineHeight; + border: 1px solid transparent; + .border-radius(4px 4px 0 0); + &:hover, + &:focus { + border-color: @grayLighter @grayLighter #ddd; + } +} +// Active state, and it's :hover/:focus to override normal :hover/:focus +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: @gray; + background-color: @bodyBackground; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} + + +// PILLS +// ----- + +// Links rendered as pills +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + .border-radius(5px); +} + +// Active state +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: @white; + background-color: @linkColor; +} + + + +// STACKED NAV +// ----------- + +// Stacked tabs and pills +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; // no need for the gap between nav items +} + +// Tabs +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + .border-radius(0); +} +.nav-tabs.nav-stacked > li:first-child > a { + .border-top-radius(4px); +} +.nav-tabs.nav-stacked > li:last-child > a { + .border-bottom-radius(4px); +} +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + border-color: #ddd; + z-index: 2; +} + +// Pills +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; // decrease margin to match sizing of stacked tabs +} + + + +// DROPDOWNS +// --------- + +.nav-tabs .dropdown-menu { + .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu +} +.nav-pills .dropdown-menu { + .border-radius(6px); // make rounded corners match the pills +} + +// Default dropdown links +// ------------------------- +// Make carets use linkColor to start +.nav .dropdown-toggle .caret { + border-top-color: @linkColor; + border-bottom-color: @linkColor; + margin-top: 6px; +} +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: @linkColorHover; + border-bottom-color: @linkColorHover; +} +/* move down carets for tabs */ +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} + +// Active dropdown links +// ------------------------- +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: @gray; + border-bottom-color: @gray; +} + +// Active:hover/:focus dropdown links +// ------------------------- +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} + +// Open dropdowns +// ------------------------- +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: @white; + background-color: @grayLight; + border-color: @grayLight; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: @white; + border-bottom-color: @white; + .opacity(100); +} + +// Dropdowns in stacked tabs +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: @grayLight; +} + + + +// TABBABLE +// -------- + + +// COMMON STYLES +// ------------- + +// Clear any floats +.tabbable { + .clearfix(); +} +.tab-content { + overflow: auto; // prevent content from running below tabs +} + +// Remove border on bottom, left, right +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +// Show/hide tabbable areas +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} + + +// BOTTOM +// ------ + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + .border-radius(0 0 4px 4px); + &:hover, + &:focus { + border-bottom-color: transparent; + border-top-color: #ddd; + } +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} + +// LEFT & RIGHT +// ------------ + +// Common styles +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +// Tabs on the left +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + .border-radius(4px 0 0 4px); +} +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: @grayLighter #ddd @grayLighter @grayLighter; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: @white; +} + +// Tabs on the right +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + .border-radius(0 4px 4px 0); +} +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: @grayLighter @grayLighter @grayLighter #ddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: @white; +} + + + +// DISABLED STATES +// --------------- + +// Gray out text +.nav > .disabled > a { + color: @grayLight; +} +// Nuke hover/focus effects +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + cursor: default; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/pager.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/pager.less new file mode 100644 index 0000000..1476188 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/pager.less @@ -0,0 +1,43 @@ +// +// Pager pagination +// -------------------------------------------------- + + +.pager { + margin: @baseLineHeight 0; + list-style: none; + text-align: center; + .clearfix(); +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + .border-radius(15px); +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: @grayLight; + background-color: #fff; + cursor: default; +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/pagination.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/pagination.less new file mode 100644 index 0000000..a789db2 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/pagination.less @@ -0,0 +1,123 @@ +// +// Pagination (multiple pages) +// -------------------------------------------------- + +// Space out pagination from surrounding content +.pagination { + margin: @baseLineHeight 0; +} + +.pagination ul { + // Allow for text-based alignment + display: inline-block; + .ie7-inline-block(); + // Reset default ul styles + margin-left: 0; + margin-bottom: 0; + // Visuals + .border-radius(@baseBorderRadius); + .box-shadow(0 1px 2px rgba(0,0,0,.05)); +} +.pagination ul > li { + display: inline; // Remove list-style and block-level defaults +} +.pagination ul > li > a, +.pagination ul > li > span { + float: left; // Collapse white-space + padding: 4px 12px; + line-height: @baseLineHeight; + text-decoration: none; + background-color: @paginationBackground; + border: 1px solid @paginationBorder; + border-left-width: 0; +} +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: @paginationActiveBackground; +} +.pagination ul > .active > a, +.pagination ul > .active > span { + color: @grayLight; + cursor: default; +} +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: @grayLight; + background-color: transparent; + cursor: default; +} +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + .border-left-radius(@baseBorderRadius); +} +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + .border-right-radius(@baseBorderRadius); +} + + +// Alignment +// -------------------------------------------------- + +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} + + +// Sizing +// -------------------------------------------------- + +// Large +.pagination-large { + ul > li > a, + ul > li > span { + padding: @paddingLarge; + font-size: @fontSizeLarge; + } + ul > li:first-child > a, + ul > li:first-child > span { + .border-left-radius(@borderRadiusLarge); + } + ul > li:last-child > a, + ul > li:last-child > span { + .border-right-radius(@borderRadiusLarge); + } +} + +// Small and mini +.pagination-mini, +.pagination-small { + ul > li:first-child > a, + ul > li:first-child > span { + .border-left-radius(@borderRadiusSmall); + } + ul > li:last-child > a, + ul > li:last-child > span { + .border-right-radius(@borderRadiusSmall); + } +} + +// Small +.pagination-small { + ul > li > a, + ul > li > span { + padding: @paddingSmall; + font-size: @fontSizeSmall; + } +} +// Mini +.pagination-mini { + ul > li > a, + ul > li > span { + padding: @paddingMini; + font-size: @fontSizeMini; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/popovers.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/popovers.less new file mode 100644 index 0000000..aae35c8 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/popovers.less @@ -0,0 +1,133 @@ +// +// Popovers +// -------------------------------------------------- + + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: @zindexPopover; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; // Reset given new insertion method + background-color: @popoverBackground; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0,0,0,.2); + .border-radius(6px); + .box-shadow(0 5px 10px rgba(0,0,0,.2)); + + // Overrides for proper insertion + white-space: normal; + + // Offset the popover to account for the popover arrow + &.top { margin-top: -10px; } + &.right { margin-left: 10px; } + &.bottom { margin-top: 10px; } + &.left { margin-left: -10px; } +} + +.popover-title { + margin: 0; // reset heading margin + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: @popoverTitleBackground; + border-bottom: 1px solid darken(@popoverTitleBackground, 5%); + .border-radius(5px 5px 0 0); + + &:empty { + display: none; + } +} + +.popover-content { + padding: 9px 14px; +} + +// Arrows +// +// .arrow is outer, .arrow:after is inner + +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: @popoverArrowOuterWidth; +} +.popover .arrow:after { + border-width: @popoverArrowWidth; + content: ""; +} + +.popover { + &.top .arrow { + left: 50%; + margin-left: -@popoverArrowOuterWidth; + border-bottom-width: 0; + border-top-color: #999; // IE8 fallback + border-top-color: @popoverArrowOuterColor; + bottom: -@popoverArrowOuterWidth; + &:after { + bottom: 1px; + margin-left: -@popoverArrowWidth; + border-bottom-width: 0; + border-top-color: @popoverArrowColor; + } + } + &.right .arrow { + top: 50%; + left: -@popoverArrowOuterWidth; + margin-top: -@popoverArrowOuterWidth; + border-left-width: 0; + border-right-color: #999; // IE8 fallback + border-right-color: @popoverArrowOuterColor; + &:after { + left: 1px; + bottom: -@popoverArrowWidth; + border-left-width: 0; + border-right-color: @popoverArrowColor; + } + } + &.bottom .arrow { + left: 50%; + margin-left: -@popoverArrowOuterWidth; + border-top-width: 0; + border-bottom-color: #999; // IE8 fallback + border-bottom-color: @popoverArrowOuterColor; + top: -@popoverArrowOuterWidth; + &:after { + top: 1px; + margin-left: -@popoverArrowWidth; + border-top-width: 0; + border-bottom-color: @popoverArrowColor; + } + } + + &.left .arrow { + top: 50%; + right: -@popoverArrowOuterWidth; + margin-top: -@popoverArrowOuterWidth; + border-right-width: 0; + border-left-color: #999; // IE8 fallback + border-left-color: @popoverArrowOuterColor; + &:after { + right: 1px; + border-right-width: 0; + border-left-color: @popoverArrowColor; + bottom: -@popoverArrowWidth; + } + } + +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/progress-bars.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/progress-bars.less new file mode 100644 index 0000000..5e0c3dd --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/progress-bars.less @@ -0,0 +1,122 @@ +// +// Progress bars +// -------------------------------------------------- + + +// ANIMATIONS +// ---------- + +// Webkit +@-webkit-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Firefox +@-moz-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// IE9 +@-ms-keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + +// Opera +@-o-keyframes progress-bar-stripes { + from { background-position: 0 0; } + to { background-position: 40px 0; } +} + +// Spec +@keyframes progress-bar-stripes { + from { background-position: 40px 0; } + to { background-position: 0 0; } +} + + + +// THE BARS +// -------- + +// Outer container +.progress { + overflow: hidden; + height: @baseLineHeight; + margin-bottom: @baseLineHeight; + #gradient > .vertical(#f5f5f5, #f9f9f9); + .box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); + .border-radius(@baseBorderRadius); +} + +// Bar of progress +.progress .bar { + width: 0%; + height: 100%; + color: @white; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0,0,0,.25); + #gradient > .vertical(#149bdf, #0480be); + .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); + .box-sizing(border-box); + .transition(width .6s ease); +} +.progress .bar + .bar { + .box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)"); +} + +// Striped bars +.progress-striped .bar { + #gradient > .striped(#149bdf); + .background-size(40px 40px); +} + +// Call animation for the active one +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + + + +// COLORS +// ------ + +// Danger (red) +.progress-danger .bar, .progress .bar-danger { + #gradient > .vertical(#ee5f5b, #c43c35); +} +.progress-danger.progress-striped .bar, .progress-striped .bar-danger { + #gradient > .striped(#ee5f5b); +} + +// Success (green) +.progress-success .bar, .progress .bar-success { + #gradient > .vertical(#62c462, #57a957); +} +.progress-success.progress-striped .bar, .progress-striped .bar-success { + #gradient > .striped(#62c462); +} + +// Info (teal) +.progress-info .bar, .progress .bar-info { + #gradient > .vertical(#5bc0de, #339bb9); +} +.progress-info.progress-striped .bar, .progress-striped .bar-info { + #gradient > .striped(#5bc0de); +} + +// Warning (orange) +.progress-warning .bar, .progress .bar-warning { + #gradient > .vertical(lighten(@orange, 15%), @orange); +} +.progress-warning.progress-striped .bar, .progress-striped .bar-warning { + #gradient > .striped(lighten(@orange, 15%)); +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/reset.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/reset.less new file mode 100644 index 0000000..4806bd5 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/reset.less @@ -0,0 +1,216 @@ +// +// Reset CSS +// Adapted from http://github.com/necolas/normalize.css +// -------------------------------------------------- + + +// Display in IE6-9 and FF3 +// ------------------------- + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +// Display block in IE6-9 and FF3 +// ------------------------- + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +// Prevents modern browsers from displaying 'audio' without controls +// ------------------------- + +audio:not([controls]) { + display: none; +} + +// Base settings +// ------------------------- + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +// Focus states +a:focus { + .tab-focus(); +} +// Hover & Active +a:hover, +a:active { + outline: 0; +} + +// Prevents sub and sup affecting line-height in all browsers +// ------------------------- + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} + +// Img border in a's and image quality +// ------------------------- + +img { + /* Responsive images (ensure images don't scale beyond their parents) */ + max-width: 100%; /* Part 1: Set a maxium relative to the parent */ + width: auto\9; /* IE7-8 need help adjusting responsive images */ + height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */ + + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +// Prevent max-width from affecting Google Maps +#map_canvas img, +.google-maps img { + max-width: none; +} + +// Forms +// ------------------------- + +// Font size in all browsers, margin changes, misc consistency +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; // Inner spacing ie IE6/7 + line-height: normal; // FF3/4 have !important on line-height in UA stylesheet +} +button::-moz-focus-inner, +input::-moz-focus-inner { // Inner padding and border oddities in FF3/4 + padding: 0; + border: 0; +} +button, +html input[type="button"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS. + cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others. +} +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others. +} +input[type="search"] { // Appearance in Safari/Chrome + .box-sizing(content-box); + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5 +} +textarea { + overflow: auto; // Remove vertical scrollbar in IE6-9 + vertical-align: top; // Readability and alignment cross-browser +} + + +// Printing +// ------------------------- +// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css + +@media print { + + * { + text-shadow: none !important; + color: #000 !important; // Black prints faster: h5bp.com/s + background: transparent !important; + box-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + // Don't show links for images, or javascript/internal links + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; // h5bp.com/t + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + @page { + margin: 0.5cm; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-1200px-min.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-1200px-min.less new file mode 100644 index 0000000..4f35ba6 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-1200px-min.less @@ -0,0 +1,28 @@ +// +// Responsive: Large desktop and up +// -------------------------------------------------- + + +@media (min-width: 1200px) { + + // Fixed grid + #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200); + + // Fluid grid + #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200); + + // Input grid + #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200); + + // Thumbnails + .thumbnails { + margin-left: -@gridGutterWidth1200; + } + .thumbnails > li { + margin-left: @gridGutterWidth1200; + } + .row-fluid .thumbnails { + margin-left: 0; + } + +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-767px-max.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-767px-max.less new file mode 100644 index 0000000..128f4ce --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-767px-max.less @@ -0,0 +1,193 @@ +// +// Responsive: Landscape phone to desktop/tablet +// -------------------------------------------------- + + +@media (max-width: 767px) { + + // Padding to set content in a bit + body { + padding-left: 20px; + padding-right: 20px; + } + // Negative indent the now static "fixed" navbar + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-left: -20px; + margin-right: -20px; + } + // Remove padding on container given explicit padding set on body + .container-fluid { + padding: 0; + } + + // TYPOGRAPHY + // ---------- + // Reset horizontal dl + .dl-horizontal { + dt { + float: none; + clear: none; + width: auto; + text-align: left; + } + dd { + margin-left: 0; + } + } + + // GRID & CONTAINERS + // ----------------- + // Remove width from containers + .container { + width: auto; + } + // Fluid rows + .row-fluid { + width: 100%; + } + // Undo negative margin on rows and thumbnails + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present + } + // Make all grid-sized elements block level again + [class*="span"], + .uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing + .row-fluid [class*="span"] { + float: none; + display: block; + width: 100%; + margin-left: 0; + .box-sizing(border-box); + } + .span12, + .row-fluid .span12 { + width: 100%; + .box-sizing(border-box); + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + + // FORM FIELDS + // ----------- + // Make span* classes full width + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + .input-block-level(); + } + // But don't let it screw up prepend/append inputs + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; // redeclare so they don't wrap to new lines + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + + // Modals + .modal { + position: fixed; + top: 20px; + left: 20px; + right: 20px; + width: auto; + margin: 0; + &.fade { top: -100px; } + &.fade.in { top: 20px; } + } + +} + + + +// UP TO LANDSCAPE PHONE +// --------------------- + +@media (max-width: 480px) { + + // Smooth out the collapsing/expanding nav + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); // activate the GPU + } + + // Block level the page header small tag for readability + .page-header h1 small { + display: block; + line-height: @baseLineHeight; + } + + // Update checkboxes for iOS + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + + // Remove the horizontal form styles + .form-horizontal { + .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + // Move over all input controls and content + .controls { + margin-left: 0; + } + // Move the options list down to align with labels + .control-list { + padding-top: 0; // has to be padding because margin collaspes + } + // Move over buttons in .form-actions to align with .controls + .form-actions { + padding-left: 10px; + padding-right: 10px; + } + } + + // Medias + // Reset float and spacing to stack + .media .pull-left, + .media .pull-right { + float: none; + display: block; + margin-bottom: 10px; + } + // Remove side margins since we stack instead of indent + .media-object { + margin-right: 0; + margin-left: 0; + } + + // Modals + .modal { + top: 10px; + left: 10px; + right: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + + // Carousel + .carousel-caption { + position: static; + } + +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-768px-979px.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-768px-979px.less new file mode 100644 index 0000000..8e8c486 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-768px-979px.less @@ -0,0 +1,19 @@ +// +// Responsive: Tablet to desktop +// -------------------------------------------------- + + +@media (min-width: 768px) and (max-width: 979px) { + + // Fixed grid + #grid > .core(@gridColumnWidth768, @gridGutterWidth768); + + // Fluid grid + #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768); + + // Input grid + #grid > .input(@gridColumnWidth768, @gridGutterWidth768); + + // No need to reset .thumbnails here since it's the same @gridGutterWidth + +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-navbar.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-navbar.less new file mode 100644 index 0000000..21cd3ba --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-navbar.less @@ -0,0 +1,189 @@ +// +// Responsive: Navbar +// -------------------------------------------------- + + +// TABLETS AND BELOW +// ----------------- +@media (max-width: @navbarCollapseWidth) { + + // UNFIX THE TOPBAR + // ---------------- + // Remove any padding from the body + body { + padding-top: 0; + } + // Unfix the navbars + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: @baseLineHeight; + } + .navbar-fixed-bottom { + margin-top: @baseLineHeight; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + // Account for brand name + .navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + } + + // COLLAPSIBLE NAVBAR + // ------------------ + // Nav collapse clears brand + .nav-collapse { + clear: both; + } + // Block-level the nav + .nav-collapse .nav { + float: none; + margin: 0 0 (@baseLineHeight / 2); + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: @navbarText; + text-shadow: none; + } + // Nav and dropdown links in navbar + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: @navbarLinkColor; + .border-radius(3px); + } + // Buttons + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + .border-radius(@baseBorderRadius); + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: @navbarBackground; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: @navbarInverseLinkColor; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: @navbarInverseBackground; + } + // Buttons in the navbar + .nav-collapse.in .btn-group { + margin-top: 5px; + padding: 0; + } + // Dropdowns in the navbar + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: none; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + .border-radius(0); + .box-shadow(none); + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu { + &:before, + &:after { + display: none; + } + } + // Forms in navbar + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: (@baseLineHeight / 2) 15px; + margin: (@baseLineHeight / 2) 0; + border-top: 1px solid @navbarBackground; + border-bottom: 1px solid @navbarBackground; + .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)"); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: @navbarInverseBackground; + border-bottom-color: @navbarInverseBackground; + } + // Pull right (secondary) nav content + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + // Hide everything in the navbar save .brand and toggle button */ + .nav-collapse, + .nav-collapse.collapse { + overflow: hidden; + height: 0; + } + // Navbar button + .navbar .btn-navbar { + display: block; + } + + // STATIC NAVBAR + // ------------- + .navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; + } + + +} + + +// DEFAULT DESKTOP +// --------------- + +@media (min-width: @navbarCollapseDesktopWidth) { + + // Required to make the collapsing navbar work on regular desktops + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } + +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-utilities.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-utilities.less new file mode 100644 index 0000000..bf43e8e --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive-utilities.less @@ -0,0 +1,59 @@ +// +// Responsive: Utility classes +// -------------------------------------------------- + + +// IE10 Metro responsive +// Required for Windows 8 Metro split-screen snapping with IE10 +// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ +@-ms-viewport{ + width: device-width; +} + +// Hide from screenreaders and browsers +// Credit: HTML5 Boilerplate +.hidden { + display: none; + visibility: hidden; +} + +// Visibility utilities + +// For desktops +.visible-phone { display: none !important; } +.visible-tablet { display: none !important; } +.hidden-phone { } +.hidden-tablet { } +.hidden-desktop { display: none !important; } +.visible-desktop { display: inherit !important; } + +// Tablets & small desktops only +@media (min-width: 768px) and (max-width: 979px) { + // Hide everything else + .hidden-desktop { display: inherit !important; } + .visible-desktop { display: none !important ; } + // Show + .visible-tablet { display: inherit !important; } + // Hide + .hidden-tablet { display: none !important; } +} + +// Phones only +@media (max-width: 767px) { + // Hide everything else + .hidden-desktop { display: inherit !important; } + .visible-desktop { display: none !important; } + // Show + .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior + // Hide + .hidden-phone { display: none !important; } +} + +// Print utilities +.visible-print { display: none !important; } +.hidden-print { } + +@media print { + .visible-print { display: inherit !important; } + .hidden-print { display: none !important; } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive.less new file mode 100644 index 0000000..b8366de --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/responsive.less @@ -0,0 +1,48 @@ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + + +// Responsive.less +// For phone and tablet devices +// ------------------------------------------------------------- + + +// REPEAT VARIABLES & MIXINS +// ------------------------- +// Required since we compile the responsive stuff separately + +@import "variables.less"; // Modify this for custom colors, font-sizes, etc +@import "mixins.less"; + + +// RESPONSIVE CLASSES +// ------------------ + +@import "responsive-utilities.less"; + + +// MEDIA QUERIES +// ------------------ + +// Large desktops +@import "responsive-1200px-min.less"; + +// Tablets to regular desktops +@import "responsive-768px-979px.less"; + +// Phones to portrait tablets and narrow desktops +@import "responsive-767px-max.less"; + + +// RESPONSIVE NAVBAR +// ------------------ + +// From 979px and below, show a button to toggle navbar contents +@import "responsive-navbar.less"; diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/scaffolding.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/scaffolding.less new file mode 100644 index 0000000..f17e8ca --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/scaffolding.less @@ -0,0 +1,53 @@ +// +// Scaffolding +// -------------------------------------------------- + + +// Body reset +// ------------------------- + +body { + margin: 0; + font-family: @baseFontFamily; + font-size: @baseFontSize; + line-height: @baseLineHeight; + color: @textColor; + background-color: @bodyBackground; +} + + +// Links +// ------------------------- + +a { + color: @linkColor; + text-decoration: none; +} +a:hover, +a:focus { + color: @linkColorHover; + text-decoration: underline; +} + + +// Images +// ------------------------- + +// Rounded corners +.img-rounded { + .border-radius(6px); +} + +// Add polaroid-esque trim +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0,0,0,.2); + .box-shadow(0 1px 3px rgba(0,0,0,.1)); +} + +// Perfect circle +.img-circle { + .border-radius(500px); // crank the border-radius so it works with most reasonably sized images +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/sprites.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/sprites.less new file mode 100644 index 0000000..1812bf7 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/sprites.less @@ -0,0 +1,197 @@ +// +// Sprites +// -------------------------------------------------- + + +// ICONS +// ----- + +// All icons receive the styles of the tag with a base class +// of .i and are then given a unique class to add width, height, +// and background-position. Your resulting HTML will look like +// . + +// For the white version of the icons, just add the .icon-white class: +// + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + .ie7-restore-right-whitespace(); + line-height: 14px; + vertical-align: text-top; + background-image: url("@{iconSpritePath}"); + background-position: 14px 14px; + background-repeat: no-repeat; + margin-top: 1px; +} + +/* White icons with optional class, or on hover/focus/active states of certain elements */ +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("@{iconWhiteSpritePath}"); +} + +.icon-glass { background-position: 0 0; } +.icon-music { background-position: -24px 0; } +.icon-search { background-position: -48px 0; } +.icon-envelope { background-position: -72px 0; } +.icon-heart { background-position: -96px 0; } +.icon-star { background-position: -120px 0; } +.icon-star-empty { background-position: -144px 0; } +.icon-user { background-position: -168px 0; } +.icon-film { background-position: -192px 0; } +.icon-th-large { background-position: -216px 0; } +.icon-th { background-position: -240px 0; } +.icon-th-list { background-position: -264px 0; } +.icon-ok { background-position: -288px 0; } +.icon-remove { background-position: -312px 0; } +.icon-zoom-in { background-position: -336px 0; } +.icon-zoom-out { background-position: -360px 0; } +.icon-off { background-position: -384px 0; } +.icon-signal { background-position: -408px 0; } +.icon-cog { background-position: -432px 0; } +.icon-trash { background-position: -456px 0; } + +.icon-home { background-position: 0 -24px; } +.icon-file { background-position: -24px -24px; } +.icon-time { background-position: -48px -24px; } +.icon-road { background-position: -72px -24px; } +.icon-download-alt { background-position: -96px -24px; } +.icon-download { background-position: -120px -24px; } +.icon-upload { background-position: -144px -24px; } +.icon-inbox { background-position: -168px -24px; } +.icon-play-circle { background-position: -192px -24px; } +.icon-repeat { background-position: -216px -24px; } +.icon-refresh { background-position: -240px -24px; } +.icon-list-alt { background-position: -264px -24px; } +.icon-lock { background-position: -287px -24px; } // 1px off +.icon-flag { background-position: -312px -24px; } +.icon-headphones { background-position: -336px -24px; } +.icon-volume-off { background-position: -360px -24px; } +.icon-volume-down { background-position: -384px -24px; } +.icon-volume-up { background-position: -408px -24px; } +.icon-qrcode { background-position: -432px -24px; } +.icon-barcode { background-position: -456px -24px; } + +.icon-tag { background-position: 0 -48px; } +.icon-tags { background-position: -25px -48px; } // 1px off +.icon-book { background-position: -48px -48px; } +.icon-bookmark { background-position: -72px -48px; } +.icon-print { background-position: -96px -48px; } +.icon-camera { background-position: -120px -48px; } +.icon-font { background-position: -144px -48px; } +.icon-bold { background-position: -167px -48px; } // 1px off +.icon-italic { background-position: -192px -48px; } +.icon-text-height { background-position: -216px -48px; } +.icon-text-width { background-position: -240px -48px; } +.icon-align-left { background-position: -264px -48px; } +.icon-align-center { background-position: -288px -48px; } +.icon-align-right { background-position: -312px -48px; } +.icon-align-justify { background-position: -336px -48px; } +.icon-list { background-position: -360px -48px; } +.icon-indent-left { background-position: -384px -48px; } +.icon-indent-right { background-position: -408px -48px; } +.icon-facetime-video { background-position: -432px -48px; } +.icon-picture { background-position: -456px -48px; } + +.icon-pencil { background-position: 0 -72px; } +.icon-map-marker { background-position: -24px -72px; } +.icon-adjust { background-position: -48px -72px; } +.icon-tint { background-position: -72px -72px; } +.icon-edit { background-position: -96px -72px; } +.icon-share { background-position: -120px -72px; } +.icon-check { background-position: -144px -72px; } +.icon-move { background-position: -168px -72px; } +.icon-step-backward { background-position: -192px -72px; } +.icon-fast-backward { background-position: -216px -72px; } +.icon-backward { background-position: -240px -72px; } +.icon-play { background-position: -264px -72px; } +.icon-pause { background-position: -288px -72px; } +.icon-stop { background-position: -312px -72px; } +.icon-forward { background-position: -336px -72px; } +.icon-fast-forward { background-position: -360px -72px; } +.icon-step-forward { background-position: -384px -72px; } +.icon-eject { background-position: -408px -72px; } +.icon-chevron-left { background-position: -432px -72px; } +.icon-chevron-right { background-position: -456px -72px; } + +.icon-plus-sign { background-position: 0 -96px; } +.icon-minus-sign { background-position: -24px -96px; } +.icon-remove-sign { background-position: -48px -96px; } +.icon-ok-sign { background-position: -72px -96px; } +.icon-question-sign { background-position: -96px -96px; } +.icon-info-sign { background-position: -120px -96px; } +.icon-screenshot { background-position: -144px -96px; } +.icon-remove-circle { background-position: -168px -96px; } +.icon-ok-circle { background-position: -192px -96px; } +.icon-ban-circle { background-position: -216px -96px; } +.icon-arrow-left { background-position: -240px -96px; } +.icon-arrow-right { background-position: -264px -96px; } +.icon-arrow-up { background-position: -289px -96px; } // 1px off +.icon-arrow-down { background-position: -312px -96px; } +.icon-share-alt { background-position: -336px -96px; } +.icon-resize-full { background-position: -360px -96px; } +.icon-resize-small { background-position: -384px -96px; } +.icon-plus { background-position: -408px -96px; } +.icon-minus { background-position: -433px -96px; } +.icon-asterisk { background-position: -456px -96px; } + +.icon-exclamation-sign { background-position: 0 -120px; } +.icon-gift { background-position: -24px -120px; } +.icon-leaf { background-position: -48px -120px; } +.icon-fire { background-position: -72px -120px; } +.icon-eye-open { background-position: -96px -120px; } +.icon-eye-close { background-position: -120px -120px; } +.icon-warning-sign { background-position: -144px -120px; } +.icon-plane { background-position: -168px -120px; } +.icon-calendar { background-position: -192px -120px; } +.icon-random { background-position: -216px -120px; width: 16px; } +.icon-comment { background-position: -240px -120px; } +.icon-magnet { background-position: -264px -120px; } +.icon-chevron-up { background-position: -288px -120px; } +.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off +.icon-retweet { background-position: -336px -120px; } +.icon-shopping-cart { background-position: -360px -120px; } +.icon-folder-close { background-position: -384px -120px; width: 16px; } +.icon-folder-open { background-position: -408px -120px; width: 16px; } +.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off +.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off + +.icon-hdd { background-position: 0 -144px; } +.icon-bullhorn { background-position: -24px -144px; } +.icon-bell { background-position: -48px -144px; } +.icon-certificate { background-position: -72px -144px; } +.icon-thumbs-up { background-position: -96px -144px; } +.icon-thumbs-down { background-position: -120px -144px; } +.icon-hand-right { background-position: -144px -144px; } +.icon-hand-left { background-position: -168px -144px; } +.icon-hand-up { background-position: -192px -144px; } +.icon-hand-down { background-position: -216px -144px; } +.icon-circle-arrow-right { background-position: -240px -144px; } +.icon-circle-arrow-left { background-position: -264px -144px; } +.icon-circle-arrow-up { background-position: -288px -144px; } +.icon-circle-arrow-down { background-position: -312px -144px; } +.icon-globe { background-position: -336px -144px; } +.icon-wrench { background-position: -360px -144px; } +.icon-tasks { background-position: -384px -144px; } +.icon-filter { background-position: -408px -144px; } +.icon-briefcase { background-position: -432px -144px; } +.icon-fullscreen { background-position: -456px -144px; } diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/tables.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/tables.less new file mode 100644 index 0000000..0e35271 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/tables.less @@ -0,0 +1,244 @@ +// +// Tables +// -------------------------------------------------- + + +// BASE TABLES +// ----------------- + +table { + max-width: 100%; + background-color: @tableBackground; + border-collapse: collapse; + border-spacing: 0; +} + +// BASELINE STYLES +// --------------- + +.table { + width: 100%; + margin-bottom: @baseLineHeight; + // Cells + th, + td { + padding: 8px; + line-height: @baseLineHeight; + text-align: left; + vertical-align: top; + border-top: 1px solid @tableBorder; + } + th { + font-weight: bold; + } + // Bottom align for column headings + thead th { + vertical-align: bottom; + } + // Remove top border from thead by default + caption + thead tr:first-child th, + caption + thead tr:first-child td, + colgroup + thead tr:first-child th, + colgroup + thead tr:first-child td, + thead:first-child tr:first-child th, + thead:first-child tr:first-child td { + border-top: 0; + } + // Account for multiple tbody instances + tbody + tbody { + border-top: 2px solid @tableBorder; + } + + // Nesting + .table { + background-color: @bodyBackground; + } +} + + + +// CONDENSED TABLE W/ HALF PADDING +// ------------------------------- + +.table-condensed { + th, + td { + padding: 4px 5px; + } +} + + +// BORDERED VERSION +// ---------------- + +.table-bordered { + border: 1px solid @tableBorder; + border-collapse: separate; // Done so we can round those corners! + *border-collapse: collapse; // IE7 can't round corners anyway + border-left: 0; + .border-radius(@baseBorderRadius); + th, + td { + border-left: 1px solid @tableBorder; + } + // Prevent a double border + caption + thead tr:first-child th, + caption + tbody tr:first-child th, + caption + tbody tr:first-child td, + colgroup + thead tr:first-child th, + colgroup + tbody tr:first-child th, + colgroup + tbody tr:first-child td, + thead:first-child tr:first-child th, + tbody:first-child tr:first-child th, + tbody:first-child tr:first-child td { + border-top: 0; + } + // For first th/td in the first row in the first thead or tbody + thead:first-child tr:first-child > th:first-child, + tbody:first-child tr:first-child > td:first-child, + tbody:first-child tr:first-child > th:first-child { + .border-top-left-radius(@baseBorderRadius); + } + // For last th/td in the first row in the first thead or tbody + thead:first-child tr:first-child > th:last-child, + tbody:first-child tr:first-child > td:last-child, + tbody:first-child tr:first-child > th:last-child { + .border-top-right-radius(@baseBorderRadius); + } + // For first th/td (can be either) in the last row in the last thead, tbody, and tfoot + thead:last-child tr:last-child > th:first-child, + tbody:last-child tr:last-child > td:first-child, + tbody:last-child tr:last-child > th:first-child, + tfoot:last-child tr:last-child > td:first-child, + tfoot:last-child tr:last-child > th:first-child { + .border-bottom-left-radius(@baseBorderRadius); + } + // For last th/td (can be either) in the last row in the last thead, tbody, and tfoot + thead:last-child tr:last-child > th:last-child, + tbody:last-child tr:last-child > td:last-child, + tbody:last-child tr:last-child > th:last-child, + tfoot:last-child tr:last-child > td:last-child, + tfoot:last-child tr:last-child > th:last-child { + .border-bottom-right-radius(@baseBorderRadius); + } + + // Clear border-radius for first and last td in the last row in the last tbody for table with tfoot + tfoot + tbody:last-child tr:last-child td:first-child { + .border-bottom-left-radius(0); + } + tfoot + tbody:last-child tr:last-child td:last-child { + .border-bottom-right-radius(0); + } + + // Special fixes to round the left border on the first td/th + caption + thead tr:first-child th:first-child, + caption + tbody tr:first-child td:first-child, + colgroup + thead tr:first-child th:first-child, + colgroup + tbody tr:first-child td:first-child { + .border-top-left-radius(@baseBorderRadius); + } + caption + thead tr:first-child th:last-child, + caption + tbody tr:first-child td:last-child, + colgroup + thead tr:first-child th:last-child, + colgroup + tbody tr:first-child td:last-child { + .border-top-right-radius(@baseBorderRadius); + } + +} + + + + +// ZEBRA-STRIPING +// -------------- + +// Default zebra-stripe styles (alternating gray and transparent backgrounds) +.table-striped { + tbody { + > tr:nth-child(odd) > td, + > tr:nth-child(odd) > th { + background-color: @tableBackgroundAccent; + } + } +} + + +// HOVER EFFECT +// ------------ +// Placed here since it has to come after the potential zebra striping +.table-hover { + tbody { + tr:hover > td, + tr:hover > th { + background-color: @tableBackgroundHover; + } + } +} + + +// TABLE CELL SIZING +// ----------------- + +// Reset default grid behavior +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; // undo default grid column styles + margin-left: 0; // undo default grid column styles +} + +// Change the column widths to account for td/th padding +.table td, +.table th { + &.span1 { .tableColumns(1); } + &.span2 { .tableColumns(2); } + &.span3 { .tableColumns(3); } + &.span4 { .tableColumns(4); } + &.span5 { .tableColumns(5); } + &.span6 { .tableColumns(6); } + &.span7 { .tableColumns(7); } + &.span8 { .tableColumns(8); } + &.span9 { .tableColumns(9); } + &.span10 { .tableColumns(10); } + &.span11 { .tableColumns(11); } + &.span12 { .tableColumns(12); } +} + + + +// TABLE BACKGROUNDS +// ----------------- +// Exact selectors below required to override .table-striped + +.table tbody tr { + &.success > td { + background-color: @successBackground; + } + &.error > td { + background-color: @errorBackground; + } + &.warning > td { + background-color: @warningBackground; + } + &.info > td { + background-color: @infoBackground; + } +} + +// Hover states for .table-hover +.table-hover tbody tr { + &.success:hover > td { + background-color: darken(@successBackground, 5%); + } + &.error:hover > td { + background-color: darken(@errorBackground, 5%); + } + &.warning:hover > td { + background-color: darken(@warningBackground, 5%); + } + &.info:hover > td { + background-color: darken(@infoBackground, 5%); + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/thumbnails.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/thumbnails.less new file mode 100644 index 0000000..4fd07d2 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/thumbnails.less @@ -0,0 +1,53 @@ +// +// Thumbnails +// -------------------------------------------------- + + +// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files + +// Make wrapper ul behave like the grid +.thumbnails { + margin-left: -@gridGutterWidth; + list-style: none; + .clearfix(); +} +// Fluid rows have no left margin +.row-fluid .thumbnails { + margin-left: 0; +} + +// Float li to make thumbnails appear in a row +.thumbnails > li { + float: left; // Explicity set the float since we don't require .span* classes + margin-bottom: @baseLineHeight; + margin-left: @gridGutterWidth; +} + +// The actual thumbnail (can be `a` or `div`) +.thumbnail { + display: block; + padding: 4px; + line-height: @baseLineHeight; + border: 1px solid #ddd; + .border-radius(@baseBorderRadius); + .box-shadow(0 1px 3px rgba(0,0,0,.055)); + .transition(all .2s ease-in-out); +} +// Add a hover/focus state for linked versions only +a.thumbnail:hover, +a.thumbnail:focus { + border-color: @linkColor; + .box-shadow(0 1px 4px rgba(0,105,214,.25)); +} + +// Images and captions +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: @gray; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/tooltip.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/tooltip.less new file mode 100644 index 0000000..83d5f2b --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/tooltip.less @@ -0,0 +1,70 @@ +// +// Tooltips +// -------------------------------------------------- + + +// Base class +.tooltip { + position: absolute; + z-index: @zindexTooltip; + display: block; + visibility: visible; + font-size: 11px; + line-height: 1.4; + .opacity(0); + &.in { .opacity(80); } + &.top { margin-top: -3px; padding: 5px 0; } + &.right { margin-left: 3px; padding: 0 5px; } + &.bottom { margin-top: 3px; padding: 5px 0; } + &.left { margin-left: -3px; padding: 0 5px; } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: @tooltipColor; + text-align: center; + text-decoration: none; + background-color: @tooltipBackground; + .border-radius(@baseBorderRadius); +} + +// Arrows +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip { + &.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -@tooltipArrowWidth; + border-width: @tooltipArrowWidth @tooltipArrowWidth 0; + border-top-color: @tooltipArrowColor; + } + &.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -@tooltipArrowWidth; + border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0; + border-right-color: @tooltipArrowColor; + } + &.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -@tooltipArrowWidth; + border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth; + border-left-color: @tooltipArrowColor; + } + &.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -@tooltipArrowWidth; + border-width: 0 @tooltipArrowWidth @tooltipArrowWidth; + border-bottom-color: @tooltipArrowColor; + } +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/type.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/type.less new file mode 100644 index 0000000..337138a --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/type.less @@ -0,0 +1,247 @@ +// +// Typography +// -------------------------------------------------- + + +// Body text +// ------------------------- + +p { + margin: 0 0 @baseLineHeight / 2; +} +.lead { + margin-bottom: @baseLineHeight; + font-size: @baseFontSize * 1.5; + font-weight: 200; + line-height: @baseLineHeight * 1.5; +} + + +// Emphasis & misc +// ------------------------- + +// Ex: 14px base font * 85% = about 12px +small { font-size: 85%; } + +strong { font-weight: bold; } +em { font-style: italic; } +cite { font-style: normal; } + +// Utility classes +.muted { color: @grayLight; } +a.muted:hover, +a.muted:focus { color: darken(@grayLight, 10%); } + +.text-warning { color: @warningText; } +a.text-warning:hover, +a.text-warning:focus { color: darken(@warningText, 10%); } + +.text-error { color: @errorText; } +a.text-error:hover, +a.text-error:focus { color: darken(@errorText, 10%); } + +.text-info { color: @infoText; } +a.text-info:hover, +a.text-info:focus { color: darken(@infoText, 10%); } + +.text-success { color: @successText; } +a.text-success:hover, +a.text-success:focus { color: darken(@successText, 10%); } + +.text-left { text-align: left; } +.text-right { text-align: right; } +.text-center { text-align: center; } + + +// Headings +// ------------------------- + +h1, h2, h3, h4, h5, h6 { + margin: (@baseLineHeight / 2) 0; + font-family: @headingsFontFamily; + font-weight: @headingsFontWeight; + line-height: @baseLineHeight; + color: @headingsColor; + text-rendering: optimizelegibility; // Fix the character spacing for headings + small { + font-weight: normal; + line-height: 1; + color: @grayLight; + } +} + +h1, +h2, +h3 { line-height: @baseLineHeight * 2; } + +h1 { font-size: @baseFontSize * 2.75; } // ~38px +h2 { font-size: @baseFontSize * 2.25; } // ~32px +h3 { font-size: @baseFontSize * 1.75; } // ~24px +h4 { font-size: @baseFontSize * 1.25; } // ~18px +h5 { font-size: @baseFontSize; } +h6 { font-size: @baseFontSize * 0.85; } // ~12px + +h1 small { font-size: @baseFontSize * 1.75; } // ~24px +h2 small { font-size: @baseFontSize * 1.25; } // ~18px +h3 small { font-size: @baseFontSize; } +h4 small { font-size: @baseFontSize; } + + +// Page header +// ------------------------- + +.page-header { + padding-bottom: (@baseLineHeight / 2) - 1; + margin: @baseLineHeight 0 (@baseLineHeight * 1.5); + border-bottom: 1px solid @grayLighter; +} + + + +// Lists +// -------------------------------------------------- + +// Unordered and Ordered lists +ul, ol { + padding: 0; + margin: 0 0 @baseLineHeight / 2 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: @baseLineHeight; +} + +// Remove default list styles +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +// Single-line list items +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; + > li { + display: inline-block; + .ie7-inline-block(); + padding-left: 5px; + padding-right: 5px; + } +} + +// Description Lists +dl { + margin-bottom: @baseLineHeight; +} +dt, +dd { + line-height: @baseLineHeight; +} +dt { + font-weight: bold; +} +dd { + margin-left: @baseLineHeight / 2; +} +// Horizontal layout (like forms) +.dl-horizontal { + .clearfix(); // Ensure dl clears floats if empty dd elements present + dt { + float: left; + width: @horizontalComponentOffset - 20; + clear: left; + text-align: right; + .text-overflow(); + } + dd { + margin-left: @horizontalComponentOffset; + } +} + +// MISC +// ---- + +// Horizontal rules +hr { + margin: @baseLineHeight 0; + border: 0; + border-top: 1px solid @hrBorder; + border-bottom: 1px solid @white; +} + +// Abbreviations and acronyms +abbr[title], +// Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257 +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted @grayLight; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +// Blockquotes +blockquote { + padding: 0 0 0 15px; + margin: 0 0 @baseLineHeight; + border-left: 5px solid @grayLighter; + p { + margin-bottom: 0; + font-size: @baseFontSize * 1.25; + font-weight: 300; + line-height: 1.25; + } + small { + display: block; + line-height: @baseLineHeight; + color: @grayLight; + &:before { + content: '\2014 \00A0'; + } + } + + // Float right with text-align: right + &.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid @grayLighter; + border-left: 0; + p, + small { + text-align: right; + } + small { + &:before { + content: ''; + } + &:after { + content: '\00A0 \2014'; + } + } + } +} + +// Quotes +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +// Addresses +address { + display: block; + margin-bottom: @baseLineHeight; + font-style: normal; + line-height: @baseLineHeight; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/utilities.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/utilities.less new file mode 100644 index 0000000..314b4ff --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/utilities.less @@ -0,0 +1,30 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Quick floats +.pull-right { + float: right; +} +.pull-left { + float: left; +} + +// Toggling content +.hide { + display: none; +} +.show { + display: block; +} + +// Visibility +.invisible { + visibility: hidden; +} + +// For Affix plugin +.affix { + position: fixed; +} diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/variables.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/variables.less new file mode 100644 index 0000000..68367c7 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/variables.less @@ -0,0 +1,283 @@ +// +// Variables +// -------------------------------------------------- + + +// Global values +// -------------------------------------------------- + + +// Grays +// ------------------------- +@black: #000; +@grayDarker: #222; +@grayDark: #333; +@gray: #555; +@grayLight: #999; +@grayLighter: #eee; +@white: #fff; + + +// Accent colors +// ------------------------- +@blue: #049cdb; +@blueDark: #0064cd; +@green: #46a546; +@red: #9d261d; +@yellow: #ffc40d; +@orange: #f89406; +@pink: #c3325f; +@purple: #7a43b6; + + +// Scaffolding +// ------------------------- +@bodyBackground: @white; +@textColor: @grayDark; + + +// Links +// ------------------------- +@linkColor: #22bbf0; //#08c; +@linkColorHover: darken(@linkColor, 15%); + + +// Typography +// ------------------------- +@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif; +@serifFontFamily: Georgia, "Times New Roman", Times, serif; +@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace; + +@baseFontSize: 14px; +@baseFontFamily: @sansFontFamily; +@baseLineHeight: 20px; +@altFontFamily: @serifFontFamily; + +@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily +@headingsFontWeight: bold; // instead of browser default, bold +@headingsColor: inherit; // empty to use BS default, @textColor + + +// Component sizing +// ------------------------- +// Based on 14px font-size and 20px line-height + +@fontSizeLarge: @baseFontSize * 1.25; // ~18px +@fontSizeSmall: @baseFontSize * 0.85; // ~12px +@fontSizeMini: @baseFontSize * 0.75; // ~11px + +@paddingLarge: 11px 19px; // 44px +@paddingSmall: 2px 10px; // 26px +@paddingMini: 0 6px; // 22px + +@baseBorderRadius: 4px; +@borderRadiusLarge: 6px; +@borderRadiusSmall: 3px; + + +// Tables +// ------------------------- +@tableBackground: transparent; // overall background-color +@tableBackgroundAccent: #f9f9f9; // for striping +@tableBackgroundHover: #f5f5f5; // for hover +@tableBorder: #ddd; // table and cell border + +// Buttons +// ------------------------- +@btnBackground: @white; +@btnBackgroundHighlight: darken(@white, 10%); +@btnBorder: #ccc; + +@btnPrimaryBackground: @linkColor; +@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%); + +@btnInfoBackground: #5bc0de; +@btnInfoBackgroundHighlight: #2f96b4; + +@btnSuccessBackground: #62c462; +@btnSuccessBackgroundHighlight: #51a351; + +@btnWarningBackground: lighten(@orange, 15%); +@btnWarningBackgroundHighlight: @orange; + +@btnDangerBackground: #ee5f5b; +@btnDangerBackgroundHighlight: #bd362f; + +@btnInverseBackground: #444; +@btnInverseBackgroundHighlight: @grayDarker; + + +// Forms +// ------------------------- +@inputBackground: @white; +@inputBorder: #ccc; +@inputBorderRadius: @baseBorderRadius; +@inputDisabledBackground: @grayLighter; +@formActionsBackground: #f5f5f5; +@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border + + +// Dropdowns +// ------------------------- +@dropdownBackground: @white; +@dropdownBorder: rgba(0,0,0,.2); +@dropdownDividerTop: #e5e5e5; +@dropdownDividerBottom: @white; + +@dropdownLinkColor: @grayDark; +@dropdownLinkColorHover: @white; +@dropdownLinkColorActive: @white; + +@dropdownLinkBackgroundActive: @linkColor; +@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive; + + + +// COMPONENT VARIABLES +// -------------------------------------------------- + + +// Z-index master list +// ------------------------- +// Used for a bird's eye view of components dependent on the z-axis +// Try to avoid customizing these :) +@zindexDropdown: 1000; +@zindexPopover: 1010; +@zindexTooltip: 1030; +@zindexFixedNavbar: 1030; +@zindexModalBackdrop: 1040; +@zindexModal: 1050; + + +// Sprite icons path +// ------------------------- +@iconSpritePath: "../../images/glyphicons-halflings.png"; +@iconWhiteSpritePath: "../../images/glyphicons-halflings-white.png"; + +// Input placeholder text color +// ------------------------- +@placeholderText: @grayLight; + + +// Hr border color +// ------------------------- +@hrBorder: @grayLighter; + + +// Horizontal forms & lists +// ------------------------- +@horizontalComponentOffset: 180px; + + +// Wells +// ------------------------- +@wellBackground: #f5f5f5; + + +// Navbar +// ------------------------- +@navbarCollapseWidth: 979px; +@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1; + +@navbarHeight: 40px; +@navbarBackgroundHighlight: #ffffff; +@navbarBackground: darken(@navbarBackgroundHighlight, 5%); +@navbarBorder: darken(@navbarBackground, 12%); + +@navbarText: #777; +@navbarLinkColor: #777; +@navbarLinkColorHover: @grayDark; +@navbarLinkColorActive: @gray; +@navbarLinkBackgroundHover: transparent; +@navbarLinkBackgroundActive: darken(@navbarBackground, 5%); + +@navbarBrandColor: @navbarLinkColor; + +// Inverted navbar +@navbarInverseBackground: #111111; +@navbarInverseBackgroundHighlight: #222222; +@navbarInverseBorder: #252525; + +@navbarInverseText: @grayLight; +@navbarInverseLinkColor: @grayLight; +@navbarInverseLinkColorHover: @white; +@navbarInverseLinkColorActive: @navbarInverseLinkColorHover; +@navbarInverseLinkBackgroundHover: transparent; +@navbarInverseLinkBackgroundActive: @navbarInverseBackground; + +@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%); +@navbarInverseSearchBackgroundFocus: @white; +@navbarInverseSearchBorder: @navbarInverseBackground; +@navbarInverseSearchPlaceholderColor: #ccc; + +@navbarInverseBrandColor: @navbarInverseLinkColor; + + +// Pagination +// ------------------------- +@paginationBackground: #fff; +@paginationBorder: #ddd; +@paginationActiveBackground: #f5f5f5; + + +// Hero unit +// ------------------------- +@heroUnitBackground: @grayLighter; +@heroUnitHeadingColor: inherit; +@heroUnitLeadColor: inherit; + + +// Form states and alerts +// ------------------------- +@warningText: #c09853; +@warningBackground: #fcf8e3; +@warningBorder: darken(spin(@warningBackground, -10), 3%); + +@errorText: #b94a48; +@errorBackground: #f2dede; +@errorBorder: darken(spin(@errorBackground, -10), 3%); + +@successText: #468847; +@successBackground: #dff0d8; +@successBorder: darken(spin(@successBackground, -10), 5%); + +@infoText: #3a87ad; +@infoBackground: #d9edf7; +@infoBorder: darken(spin(@infoBackground, -10), 7%); + + +// Tooltips and popovers +// ------------------------- +@tooltipColor: #fff; +@tooltipBackground: #000; +@tooltipArrowWidth: 5px; +@tooltipArrowColor: @tooltipBackground; + +@popoverBackground: #fff; +@popoverArrowWidth: 10px; +@popoverArrowColor: #fff; +@popoverTitleBackground: darken(@popoverBackground, 3%); + +// Special enhancement for popovers +@popoverArrowOuterWidth: @popoverArrowWidth + 1; +@popoverArrowOuterColor: rgba(0,0,0,.25); + + + +// GRID +// -------------------------------------------------- + +// Default 940px grid +// ------------------------- +@gridColumns: 120; +@gridColumnWidth: 6px; +@gridGutterWidth: 2px; +@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1)); + +// Fluid grid +// ------------------------- +@fluidGridColumnWidth: 6.382978723%; +@fluidGridGutterWidth: 2.127659574%; + + + diff --git a/CTRV/CommonBundle/Resources/public/css/bootstrap/wells.less b/CTRV/CommonBundle/Resources/public/css/bootstrap/wells.less new file mode 100644 index 0000000..84a744b --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/bootstrap/wells.less @@ -0,0 +1,29 @@ +// +// Wells +// -------------------------------------------------- + + +// Base class +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: @wellBackground; + border: 1px solid darken(@wellBackground, 7%); + .border-radius(@baseBorderRadius); + .box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); + blockquote { + border-color: #ddd; + border-color: rgba(0,0,0,.15); + } +} + +// Sizes +.well-large { + padding: 24px; + .border-radius(@borderRadiusLarge); +} +.well-small { + padding: 9px; + .border-radius(@borderRadiusSmall); +} diff --git a/CTRV/CommonBundle/Resources/public/css/common.css b/CTRV/CommonBundle/Resources/public/css/common.css new file mode 100644 index 0000000..33df63d --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/common.css @@ -0,0 +1,72 @@ +@CHARSET "ISO-8859-1"; + + +h3 { + text-align: center; + font-size: 1.6em; +} + +/* pour indiquer champs obligatoire */ +.required:AFTER { + content: " *"; + color:red; + font-weight: bold; + font-size: 1.4em; +} + +.header-img { + padding: 0px; + margin: 0px; + border-radius: 5px; + background-image: url("/bundles/ctrvcommon/images/header.jpg"); + background-repeat:repeat-x; + height: 120px; + color: #22bbf0; +} + +.header-title { + color: #22bbf0; + padding-top: 20px; +} + +/* affichage des sous menu sur hover et non au click */ +ul.nav li.dropdown:hover ul.dropdown-menu { + display: block; +} +.navbar .dropdown-menu { + margin-top: 0px; + padding-top: 0px; + color: #22bbf0; +} + +/* loader */ +.ctrv-loader { + width: 128px; + height: 300px; + margin: 0 auto; + background: url('/bundles/ctrvcommon/images/loading.gif') no-repeat center center;; +} + +.center { + text-align:center; +} + +/* supprimer le background sur les boutons de validation de formulaire*/ +.form-actions { + background: none; + border: none; +} + +/* formnulaire de choix de la ville */ +.chooseCity select { + color:#22bbf0; +} + +.pagination-select { + margin-left: 15px; + width: 60px; +} + +.btn-block { + margin-bottom: 8px; +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/css/tiny_mce_default.css b/CTRV/CommonBundle/Resources/public/css/tiny_mce_default.css new file mode 100644 index 0000000..efc80ce --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/css/tiny_mce_default.css @@ -0,0 +1,6 @@ +body, td, pre { +/* color:#000; */ + font-family:Verdana, Arial, Helvetica, sans-serif; + font-size:12px; +/* margin:8px; */ + } \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/images/glyphicons-halflings-white.png b/CTRV/CommonBundle/Resources/public/images/glyphicons-halflings-white.png new file mode 100644 index 0000000..3bf6484 Binary files /dev/null and b/CTRV/CommonBundle/Resources/public/images/glyphicons-halflings-white.png differ diff --git a/CTRV/CommonBundle/Resources/public/images/glyphicons-halflings.png b/CTRV/CommonBundle/Resources/public/images/glyphicons-halflings.png new file mode 100644 index 0000000..a996999 Binary files /dev/null and b/CTRV/CommonBundle/Resources/public/images/glyphicons-halflings.png differ diff --git a/CTRV/CommonBundle/Resources/public/images/header.jpg b/CTRV/CommonBundle/Resources/public/images/header.jpg new file mode 100644 index 0000000..0c46467 Binary files /dev/null and b/CTRV/CommonBundle/Resources/public/images/header.jpg differ diff --git a/CTRV/CommonBundle/Resources/public/images/loading.gif b/CTRV/CommonBundle/Resources/public/images/loading.gif new file mode 100644 index 0000000..3f7aba7 Binary files /dev/null and b/CTRV/CommonBundle/Resources/public/images/loading.gif differ diff --git a/CTRV/CommonBundle/Resources/public/js/abuse.js b/CTRV/CommonBundle/Resources/public/js/abuse.js new file mode 100644 index 0000000..43e141a --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/abuse.js @@ -0,0 +1,15 @@ +/** + * Supprime un abus + */ +function deleteAbuse (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/agendaComment.js b/CTRV/CommonBundle/Resources/public/js/agendaComment.js new file mode 100644 index 0000000..95b65d8 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/agendaComment.js @@ -0,0 +1,33 @@ +/** + * Retourne la liste des commentaires de la page spécifiée + */ +function loadAgendaComment (urlAction,ptypeEntity,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + typeEntity:ptypeEntity, + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un commentaires + */ +function deleteAgendaComment (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-affix.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-affix.js new file mode 100644 index 0000000..827ff45 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-affix.js @@ -0,0 +1,117 @@ +/* ========================================================== + * bootstrap-affix.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#affix + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* AFFIX CLASS DEFINITION + * ====================== */ + + var Affix = function (element, options) { + this.options = $.extend({}, $.fn.affix.defaults, options) + this.$window = $(window) + .on('scroll.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.affix.data-api', $.proxy(function () { setTimeout($.proxy(this.checkPosition, this), 1) }, this)) + this.$element = $(element) + this.checkPosition() + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var scrollHeight = $(document).height() + , scrollTop = this.$window.scrollTop() + , position = this.$element.offset() + , offset = this.options.offset + , offsetBottom = offset.bottom + , offsetTop = offset.top + , reset = 'affix affix-top affix-bottom' + , affix + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top() + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() + + affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? + false : offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? + 'bottom' : offsetTop != null && scrollTop <= offsetTop ? + 'top' : false + + if (this.affixed === affix) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? position.top - scrollTop : null + + this.$element.removeClass(reset).addClass('affix' + (affix ? '-' + affix : '')) + } + + + /* AFFIX PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.affix + + $.fn.affix = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('affix') + , options = typeof option == 'object' && option + if (!data) $this.data('affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.affix.Constructor = Affix + + $.fn.affix.defaults = { + offset: 0 + } + + + /* AFFIX NO CONFLICT + * ================= */ + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + /* AFFIX DATA-API + * ============== */ + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + , data = $spy.data() + + data.offset = data.offset || {} + + data.offsetBottom && (data.offset.bottom = data.offsetBottom) + data.offsetTop && (data.offset.top = data.offsetTop) + + $spy.affix(data) + }) + }) + + +}(window.jQuery); \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-alert.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-alert.js new file mode 100644 index 0000000..8917f94 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-alert.js @@ -0,0 +1,99 @@ +/* ========================================================== + * bootstrap-alert.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#alerts + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* ALERT CLASS DEFINITION + * ====================== */ + + var dismiss = '[data-dismiss="alert"]' + , Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.prototype.close = function (e) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + + e && e.preventDefault() + + $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) + + $parent.trigger(e = $.Event('close')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + $parent + .trigger('closed') + .remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent.on($.support.transition.end, removeElement) : + removeElement() + } + + + /* ALERT PLUGIN DEFINITION + * ======================= */ + + var old = $.fn.alert + + $.fn.alert = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('alert') + if (!data) $this.data('alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.alert.Constructor = Alert + + + /* ALERT NO CONFLICT + * ================= */ + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + /* ALERT DATA-API + * ============== */ + + $(document).on('click.alert.data-api', dismiss, Alert.prototype.close) + +}(window.jQuery); \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-button.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-button.js new file mode 100644 index 0000000..66df0a2 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-button.js @@ -0,0 +1,105 @@ +/* ============================================================ + * bootstrap-button.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#buttons + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* BUTTON PUBLIC CLASS DEFINITION + * ============================== */ + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.button.defaults, options) + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + , $el = this.$element + , data = $el.data() + , val = $el.is('input') ? 'val' : 'html' + + state = state + 'Text' + data.resetText || $el.data('resetText', $el[val]()) + + $el[val](data[state] || this.options[state]) + + // push to event loop to allow forms to submit + setTimeout(function () { + state == 'loadingText' ? + $el.addClass(d).attr(d, d) : + $el.removeClass(d).removeAttr(d) + }, 0) + } + + Button.prototype.toggle = function () { + var $parent = this.$element.closest('[data-toggle="buttons-radio"]') + + $parent && $parent + .find('.active') + .removeClass('active') + + this.$element.toggleClass('active') + } + + + /* BUTTON PLUGIN DEFINITION + * ======================== */ + + var old = $.fn.button + + $.fn.button = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('button') + , options = typeof option == 'object' && option + if (!data) $this.data('button', (data = new Button(this, options))) + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + $.fn.button.defaults = { + loadingText: 'loading...' + } + + $.fn.button.Constructor = Button + + + /* BUTTON NO CONFLICT + * ================== */ + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + /* BUTTON DATA-API + * =============== */ + + $(document).on('click.button.data-api', '[data-toggle^=button]', function (e) { + var $btn = $(e.target) + if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') + $btn.button('toggle') + }) + +}(window.jQuery); \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-carousel.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-carousel.js new file mode 100644 index 0000000..b40edd7 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-carousel.js @@ -0,0 +1,207 @@ +/* ========================================================== + * bootstrap-carousel.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#carousel + * ========================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CAROUSEL CLASS DEFINITION + * ========================= */ + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.options.pause == 'hover' && this.$element + .on('mouseenter', $.proxy(this.pause, this)) + .on('mouseleave', $.proxy(this.cycle, this)) + } + + Carousel.prototype = { + + cycle: function (e) { + if (!e) this.paused = false + if (this.interval) clearInterval(this.interval); + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + return this + } + + , getActiveIndex: function () { + this.$active = this.$element.find('.item.active') + this.$items = this.$active.parent().children() + return this.$items.index(this.$active) + } + + , to: function (pos) { + var activeIndex = this.getActiveIndex() + , that = this + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) { + return this.$element.one('slid', function () { + that.to(pos) + }) + } + + if (activeIndex == pos) { + return this.pause().cycle() + } + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + , pause: function (e) { + if (!e) this.paused = true + if (this.$element.find('.next, .prev').length && $.support.transition.end) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + clearInterval(this.interval) + this.interval = null + return this + } + + , next: function () { + if (this.sliding) return + return this.slide('next') + } + + , prev: function () { + if (this.sliding) return + return this.slide('prev') + } + + , slide: function (type, next) { + var $active = this.$element.find('.item.active') + , $next = next || $active[type]() + , isCycling = this.interval + , direction = type == 'next' ? 'left' : 'right' + , fallback = type == 'next' ? 'first' : 'last' + , that = this + , e + + this.sliding = true + + isCycling && this.pause() + + $next = $next.length ? $next : this.$element.find('.item')[fallback]() + + e = $.Event('slide', { + relatedTarget: $next[0] + , direction: direction + }) + + if ($next.hasClass('active')) return + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + this.$element.one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid') }, 0) + }) + } else { + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid') + } + + isCycling && this.cycle() + + return this + } + + } + + + /* CAROUSEL PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('carousel') + , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) + , action = typeof option == 'string' ? option : options.slide + if (!data) $this.data('carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.defaults = { + interval: 5000 + , pause: 'hover' + } + + $.fn.carousel.Constructor = Carousel + + + /* CAROUSEL NO CONFLICT + * ==================== */ + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + /* CAROUSEL DATA-API + * ================= */ + + $(document).on('click.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + , options = $.extend({}, $target.data(), $this.data()) + , slideIndex + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('carousel').pause().to(slideIndex).cycle() + } + + e.preventDefault() + }) + +}(window.jQuery); \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-collapse.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-collapse.js new file mode 100644 index 0000000..2bede4a --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-collapse.js @@ -0,0 +1,167 @@ +/* ============================================================= + * bootstrap-collapse.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#collapse + * ============================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* COLLAPSE PUBLIC CLASS DEFINITION + * ================================ */ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, $.fn.collapse.defaults, options) + + if (this.options.parent) { + this.$parent = $(this.options.parent) + } + + this.options.toggle && this.toggle() + } + + Collapse.prototype = { + + constructor: Collapse + + , dimension: function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + , show: function () { + var dimension + , scroll + , actives + , hasData + + if (this.transitioning || this.$element.hasClass('in')) return + + dimension = this.dimension() + scroll = $.camelCase(['scroll', dimension].join('-')) + actives = this.$parent && this.$parent.find('> .accordion-group > .in') + + if (actives && actives.length) { + hasData = actives.data('collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('collapse', null) + } + + this.$element[dimension](0) + this.transition('addClass', $.Event('show'), 'shown') + $.support.transition && this.$element[dimension](this.$element[0][scroll]) + } + + , hide: function () { + var dimension + if (this.transitioning || !this.$element.hasClass('in')) return + dimension = this.dimension() + this.reset(this.$element[dimension]()) + this.transition('removeClass', $.Event('hide'), 'hidden') + this.$element[dimension](0) + } + + , reset: function (size) { + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + [dimension](size || 'auto') + [0].offsetWidth + + this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') + + return this + } + + , transition: function (method, startEvent, completeEvent) { + var that = this + , complete = function () { + if (startEvent.type == 'show') that.reset() + that.transitioning = 0 + that.$element.trigger(completeEvent) + } + + this.$element.trigger(startEvent) + + if (startEvent.isDefaultPrevented()) return + + this.transitioning = 1 + + this.$element[method]('in') + + $.support.transition && this.$element.hasClass('collapse') ? + this.$element.one($.support.transition.end, complete) : + complete() + } + + , toggle: function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + } + + + /* COLLAPSE PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('collapse') + , options = $.extend({}, $.fn.collapse.defaults, $this.data(), typeof option == 'object' && option) + if (!data) $this.data('collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.defaults = { + toggle: true + } + + $.fn.collapse.Constructor = Collapse + + + /* COLLAPSE NO CONFLICT + * ==================== */ + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + /* COLLAPSE DATA-API + * ================= */ + + $(document).on('click.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + , target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + , option = $(target).data('collapse') ? 'toggle' : $this.data() + $this[$(target).hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + $(target).collapse(option) + }) + +}(window.jQuery); \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-dropdown.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-dropdown.js new file mode 100644 index 0000000..a1d5151 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-dropdown.js @@ -0,0 +1,165 @@ +/* ============================================================ + * bootstrap-dropdown.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle=dropdown]' + , Dropdown = function (element) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function (e) { + var $this = $(this) + , $parent + , isActive + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + $parent.toggleClass('open') + } + + $this.focus() + + return false + } + + , keydown: function (e) { + var $this + , $items + , $active + , $parent + , isActive + , index + + if (!/(38|40|27)/.test(e.keyCode)) return + + $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + $parent = getParent($this) + + isActive = $parent.hasClass('open') + + if (!isActive || (isActive && e.keyCode == 27)) { + if (e.which == 27) $parent.find(toggle).focus() + return $this.click() + } + + $items = $('[role=menu] li:not(.divider):visible a', $parent) + + if (!$items.length) return + + index = $items.index($items.filter(':focus')) + + if (e.keyCode == 38 && index > 0) index-- // up + if (e.keyCode == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items + .eq(index) + .focus() + } + + } + + function clearMenus() { + $(toggle).each(function () { + getParent($(this)).removeClass('open') + }) + } + + function getParent($this) { + var selector = $this.attr('data-target') + , $parent + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = selector && $(selector) + + if (!$parent || !$parent.length) $parent = $this.parent() + + return $parent + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + var old = $.fn.dropdown + + $.fn.dropdown = function (option) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* DROPDOWN NO CONFLICT + * ==================== */ + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(document) + .on('click.dropdown.data-api', clearMenus) + .on('click.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.dropdown-menu', function (e) { e.stopPropagation() }) + .on('click.dropdown.data-api' , toggle, Dropdown.prototype.toggle) + .on('keydown.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) + +}(window.jQuery); diff --git a/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-modal.js b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-modal.js new file mode 100644 index 0000000..12abe06 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/bootstrap/bootstrap-modal.js @@ -0,0 +1,247 @@ +/* ========================================================= + * bootstrap-modal.js v2.3.1 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden') + }) + } + + , removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('
  • ' + , minLength: 1 + } + + $.fn.typeahead.Constructor = Typeahead + + + /* TYPEAHEAD NO CONFLICT + * =================== */ + + $.fn.typeahead.noConflict = function () { + $.fn.typeahead = old + return this + } + + + /* TYPEAHEAD DATA-API + * ================== */ + + $(document).on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { + var $this = $(this) + if ($this.data('typeahead')) return + $this.typeahead($this.data()) + }) + +}(window.jQuery); diff --git a/CTRV/CommonBundle/Resources/public/js/city.js b/CTRV/CommonBundle/Resources/public/js/city.js new file mode 100644 index 0000000..10f33b5 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/city.js @@ -0,0 +1,15 @@ +/** + * Supprime une cité + */ +function deleteCity (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/comment.js b/CTRV/CommonBundle/Resources/public/js/comment.js new file mode 100644 index 0000000..0d3d71b --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/comment.js @@ -0,0 +1,33 @@ +/** + * Retourne la liste des commentaires de la page spécifiée + */ +function loadComment (urlAction,ptypeEntity,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + typeEntity:ptypeEntity, + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un commentaires + */ +function deleteComment (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/common.js b/CTRV/CommonBundle/Resources/public/js/common.js new file mode 100644 index 0000000..35bd04b --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/common.js @@ -0,0 +1,14 @@ +function setCitySession (urlAction,city_id,container) { + container.html('
    '); + $.post(urlAction, + { + city_id:city_id + }, + function(data) { + //on recharge la page + if(data.result==true) + location.reload(); + }, + 'json' + ); +} diff --git a/CTRV/CommonBundle/Resources/public/js/eventComment.js b/CTRV/CommonBundle/Resources/public/js/eventComment.js new file mode 100644 index 0000000..f03db83 --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/eventComment.js @@ -0,0 +1,33 @@ +/** + * Retourne la liste des commentaires de la page spécifiée + */ +function loadEventComment (urlAction,ptypeEntity,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + typeEntity:ptypeEntity, + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un commentaires + */ +function deleteEventComment (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/placeComment.js b/CTRV/CommonBundle/Resources/public/js/placeComment.js new file mode 100644 index 0000000..9dc02fb --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/placeComment.js @@ -0,0 +1,33 @@ +/** + * Retourne la liste des commentaires de la page spécifiée + */ +function loadPlaceComment (urlAction,ptypeEntity,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + typeEntity:ptypeEntity, + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un commentaires + */ +function deletePlaceComment (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/user.js b/CTRV/CommonBundle/Resources/public/js/user.js new file mode 100644 index 0000000..141272b --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/user.js @@ -0,0 +1,36 @@ +/** + * Retourne la liste des utilisateurs selon le nom ou prénom spécifié + */ +function loadSearchedUsers (urlAction, p_searchText, p_etat, ppage, container_id ) { + $('#'+container_id).html('
    '); + + $.post(urlAction, + { + searchText:p_searchText, + etat: p_etat, + page:ppage + + }, + function (data) { + $('#'+container_id).html(data); + }, + 'html' + ); +} + + +/** + * Désactiver un utilisateur + */ +function desactiveUser (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.append(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/public/js/userConnected.js b/CTRV/CommonBundle/Resources/public/js/userConnected.js new file mode 100644 index 0000000..dcc79fa --- /dev/null +++ b/CTRV/CommonBundle/Resources/public/js/userConnected.js @@ -0,0 +1,32 @@ +/** + * Retourne la liste des utilisateurs selon la page spécifié + */ +function loadUserConnected (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un utilisateur + */ +function deleteUserConnected (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/translations/messages.fr.yml b/CTRV/CommonBundle/Resources/translations/messages.fr.yml new file mode 100644 index 0000000..10650d7 --- /dev/null +++ b/CTRV/CommonBundle/Resources/translations/messages.fr.yml @@ -0,0 +1,161 @@ +common: + chooseCity: Vous travaillez sur les données de + insufficient_right: + text: Vous n'avez pas les droits d'accès à cette page. + back: Retour + logout: Se déconnecter +session: + city: + not_found: La session a expirée (ville sélecctionnée inconnu) + +utilisateur: + menu: + afficher: Statistique Utilisateurs + groupe: Groupes + users: Utilisateurs + register: Créer un utilisateur + userConnected : Utilisateurs Connectés + + list: + title: Liste des utilisateurs de + titleAllUsers: Nombre total d'utilisateurs + titleStat: Statistique Utilisateurs + titleAllUserAt: Le nombre total d'utilisateurs à + titleAllUsersCity: Nombre d'utilisateurs de la Ville Courante + titleUsersConnectedNumber: Nombre d'utilisateurs connectés + titleUsersConnectedNumberAt: Nombre d'utilisateurs connectés à + titleUsersConnectedNumberByCity: Nombre d'utilisateurs connectés de la ville courante + titleUsersConnectedByCity : Liste des utilisateurs connectés de + table: + firstName: Noms + lastName: Prénoms + login: Login + adress: Adresse + role: Role + action : Action + addedDate: Date d'ajout + edit_action : Modifier + block_action: Bloquer + deblock_action: Débloquer + active_action: Activer + desactive_action: Désactiver + etat: Désactiver + disconnect : Déconnecter + no_result: Aucun utilisateur trouvé + rechercheForm: + title : Liste des utilisateurs correspondant à votre recherche + rechercher: Prénoms ou Nom + submit: Rechercher + etat : Etat + all : Tous + block : Bloqués + desactive : Désactivés + list: + table: + Noms: Noms + Prenoms: Prenoms + login: login + name: Role + address: Adresse + action: Actions + no_result: Aucun utilisateur trouvé + editForm: + titleUserEdit : Modifier le role d'un utilisateur + userid : Identifiant + login : Login + salt : Salt + password : Mot de Passe + firstName : Prénoms + lastName : Nom + email : Email + registrationDate : Date d'enregistrement + latitude : Latitude + longitude: Longitude + isActive : Est Activé + isBlocked : Est Bloqué + state : Etat + lastLoginDate : Derniére connection + numeroRue : Numéro de Rue + address : Addresse + language : Langue + city : Ville + role : Role + save : Sauvegarder + + +authentication: + form: + login: Login ou email + password: Mot de passe + submit: Se connecter + +registration: + form: + email: Email + city: Ville + firstName: Prénom + lastName: Nom + login: Login + password: Mot de passe + confirmation: Confirmation + submit: S'inscriire + +abus: + menu: + afficher: Tous les Abus + eventCommentAbus: Abus sur les évenements + placeCommentAbus: Abus sur les places + messageCommentAbus: Abus sur les Message Publics + list : + titleAll: Liste des abus signalés + number: Nombre total d'entités signalés comme abus + numberEvent: Nombre de commentaires d'évenements signalés sur + numberPlace : Nombre de commentaires de places signalés sur + numberPublicMessage : Nombre de messages publics signalés sur + titleEvent: Liste des commentaires signalés sur les évenements + titlePlace: Liste des commentaires signalés sur les places + titlePublicMessage : Liste des messages publics signalés + table : + type: Type + content: Texte abusif signalé + titleEvent : Titre de l'évenement + titlePlace : Nom de la Place + idEvent: Identifiant + delete_action : Supprimer + action : Action + no_result : Aucun abus trouvé +city: + menu: + afficher : Toutes les villes + ajouter : Ajouter une ville + list : + titleAll: Liste de toutes les villes + titleAdd: Ajouter une nouvelle ville + titleEdit : Modifier une ville + number : Nombre total de villes + table : + name: Nom de la ville + delete_action : Supprimer + edit_action : Modifier + action : Action + no_result : Aucun abus trouvé + form : + name : Nom de la ville + latitude : Latitude + longitude : Longitude + latitudeInf : Latitude Inférieure + latitudeSup : Latitude Supérieure + longitudeInf : Longitude Inférieure + longitudeSup : Longitude Supérieure + defaultAddress : Adresse par defaut + defaultZipcode : Code Zip + defaultAddressLongitude: Longitude par défaut + defaultAddressLatitude : Latitude par defaut + titleAddCity : Ajouter une nouvelle ville + titleEditCity: Modifier une ville + save : Sauvegarder + +#defaut authentication message customization +The presented password cannot be empty.: Le champ mot de passe est obligatoire +The presented password is invalid.: Le mot de passe ou le login est incorrect +Bad credentials: Les données saisies sont incorrectes \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/translations/validators.fr.yml b/CTRV/CommonBundle/Resources/translations/validators.fr.yml new file mode 100644 index 0000000..14b4c88 --- /dev/null +++ b/CTRV/CommonBundle/Resources/translations/validators.fr.yml @@ -0,0 +1,7 @@ +user: + register: + form: + login_already_exist: Ce login est déjà utilisé + email_already_exist: Cet adresse e-mail est déjà utilisée + + diff --git a/CTRV/CommonBundle/Resources/views/Abus/allAbuse.html.twig b/CTRV/CommonBundle/Resources/views/Abus/allAbuse.html.twig new file mode 100644 index 0000000..338cb79 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Abus/allAbuse.html.twig @@ -0,0 +1,58 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + +
    + + {% include "CTRVCommonBundle::menuAbus.html.twig" %} + +
    + +

    {% trans %}abus.list.titleAll{% endtrans %}

    +

    {% trans %}abus.list.number{% endtrans %} : {{ nb_entities }}


    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + +
    {% trans %}abus.list.table.type{% endtrans %}{% trans %}abus.list.table.content{% endtrans %}{% trans %}abus.list.table.idEvent{% endtrans %}{% trans %}abus.list.table.action{% endtrans %}
    {{entity.entityType}}{{entity.content}}{{entity.id}} + {% trans %}abus.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'abuse' } %} + + {% else%} +
    {% trans %}abus.list.table.no_result{% endtrans %}
    + {% endif %} +
    +
    + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Auth/insufficientAccess.html.twig b/CTRV/CommonBundle/Resources/views/Auth/insufficientAccess.html.twig new file mode 100644 index 0000000..8c5f00d --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Auth/insufficientAccess.html.twig @@ -0,0 +1,22 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + {% trans %} common.insufficient_right.text {% endtrans %} +
    + +
    + +
    + {% trans %} common.insufficient_right.back {% endtrans %} + {% if is_granted('IS_AUTHENTICATED_REMEMBERED') %} + {% trans %}common.insufficient_right.logout{% endtrans %} + {% else %} +
  • {% trans %}menu.login{% endtrans %}
  • + {% endif %} +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Auth/login.html.twig b/CTRV/CommonBundle/Resources/views/Auth/login.html.twig new file mode 100644 index 0000000..4727616 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Auth/login.html.twig @@ -0,0 +1,40 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + +

    + + + + +
    + + {% if error %} +
    {{ error.message|trans({},'messages') }}
    + {#
    {{ error.message }}
    #} + {% endif %} +
    + +
    + +
    + +
    +
    + +
    + +
    + +
    +
    +{# #} + + {{ forms.input('authentication.form.submit','home') }} + +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Auth/register.html.twig b/CTRV/CommonBundle/Resources/views/Auth/register.html.twig new file mode 100644 index 0000000..ebbb8e3 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Auth/register.html.twig @@ -0,0 +1,11 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + + +{% block body %} + +
    + {{ form_widget(form) }} + {{ forms.input('registration.form.submit','home') }} +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/City/addCity.html.twig b/CTRV/CommonBundle/Resources/views/City/addCity.html.twig new file mode 100644 index 0000000..1c07380 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/City/addCity.html.twig @@ -0,0 +1,25 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuCity.html.twig" %} + +
    + +

    {% trans %}city.form.titleAddCity{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('city.form.save','city') }} +
    +
    +
    +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/City/editCity.html.twig b/CTRV/CommonBundle/Resources/views/City/editCity.html.twig new file mode 100644 index 0000000..f1970fe --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/City/editCity.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuCity.html.twig" %} + +
    + +

    {% trans %}city.form.titleEditCity{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('city.form.save','city') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/City/getAllCities.html.twig b/CTRV/CommonBundle/Resources/views/City/getAllCities.html.twig new file mode 100644 index 0000000..e747b41 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/City/getAllCities.html.twig @@ -0,0 +1,58 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuCity.html.twig" %} + +
    + +

    {% trans %}city.list.titleAll{% endtrans %}

    + {% if entities is not empty %} + +
    {% trans %}city.list.number{% endtrans %} : {{ nb_entities }}{% trans %}city.menu.ajouter{% endtrans %}

    + + + + + + + + + {% for entity in entities %} + + + + + {% endfor %} + +
    {% trans %}city.list.table.name{% endtrans %}{% trans %}city.list.table.action{% endtrans %}
    {{entity.name|capitalize}} + {% trans %}city.list.table.delete_action{% endtrans %} + {% trans %}city.list.table.edit_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'city' } %} + + {% else%} +
    {% trans %}city.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Comment/eventCommentAbuse.html.twig b/CTRV/CommonBundle/Resources/views/Comment/eventCommentAbuse.html.twig new file mode 100644 index 0000000..ccf9e00 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Comment/eventCommentAbuse.html.twig @@ -0,0 +1,65 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuAbus.html.twig" %} + +
    + +

    {% trans %}abus.list.titleEvent{% endtrans %}

    +

    {% trans %}abus.list.numberEvent{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}abus.list.table.type{% endtrans %}{% trans %}abus.list.table.content{% endtrans %}{% trans %}abus.list.table.titleEvent{% endtrans %}{% trans %}abus.list.table.action{% endtrans %}
    {{entity.entityType}}{{entity.content}}{{entity.title}} + {% trans %}abus.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'eventCommentAbuse' } %} + + {% else%} +
    {% trans %}abus.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    + + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Comment/placeCommentAbuse.html.twig b/CTRV/CommonBundle/Resources/views/Comment/placeCommentAbuse.html.twig new file mode 100644 index 0000000..03a3a4e --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Comment/placeCommentAbuse.html.twig @@ -0,0 +1,62 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuAbus.html.twig" %} + +
    + +

    {% trans %}abus.list.titlePlace{% endtrans %}

    +

    {% trans %}abus.list.numberPlace{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}abus.list.table.type{% endtrans %}{% trans %}abus.list.table.content{% endtrans %}{% trans %}abus.list.table.titlePlace{% endtrans %}{% trans %}abus.list.table.action{% endtrans %}
    {{entity.entityType}}{{entity.content}}{{entity.title}} + {% trans %}abus.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'placeCommentAbuse' } %} + + {% else%} +
    {% trans %}abus.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Common/index.html.twig b/CTRV/CommonBundle/Resources/views/Common/index.html.twig new file mode 100644 index 0000000..930f849 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Common/index.html.twig @@ -0,0 +1,10 @@ +{% extends "::base.html.twig" %} + + +{% block body %} + + +Welcome to cityrovers {{ app.security.getToken().getUser()}} + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Common/pagination.html.twig b/CTRV/CommonBundle/Resources/views/Common/pagination.html.twig new file mode 100644 index 0000000..fa1f7f4 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Common/pagination.html.twig @@ -0,0 +1,113 @@ +{% set number_page_before_and_after = 5 %} + +{% if(nb_pages>1) %} + +{% endif %} + + + \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/Common/renderChooseCityForm.html.twig b/CTRV/CommonBundle/Resources/views/Common/renderChooseCityForm.html.twig new file mode 100644 index 0000000..0d3ccf7 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/Common/renderChooseCityForm.html.twig @@ -0,0 +1,14 @@ + +
    +
    +
    + {{ form_label(form.choose_city) }} +
    +
    + {{ form_widget(form.choose_city) }} +
    +
    + {{ form_errors(form.choose_city) }} +
    +
    +
    diff --git a/CTRV/CommonBundle/Resources/views/User/loadUser.html.twig b/CTRV/CommonBundle/Resources/views/User/loadUser.html.twig new file mode 100644 index 0000000..d5d0f6c --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/User/loadUser.html.twig @@ -0,0 +1,60 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menu.html.twig" %} + +
    + +

    {% trans %}utilisateur.list.title{% endtrans %} {{ city|capitalize }}

    + +

    {% trans %}utilisateur.list.titleAllUserAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    + +
    + {{ form_widget(form) }} +
    + +
    +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/User/loadUserConnectedByCity.html.twig b/CTRV/CommonBundle/Resources/views/User/loadUserConnectedByCity.html.twig new file mode 100644 index 0000000..1138aaa --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/User/loadUserConnectedByCity.html.twig @@ -0,0 +1,55 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menu.html.twig" %} + +
    + +

    {% trans %}utilisateur.list.titleUsersConnectedByCity{% endtrans %} {{ city|capitalize }}

    + +

    {% trans %}utilisateur.list.titleUsersConnectedNumberAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    + + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + +
    {% trans %}utilisateur.list.table.firstName{% endtrans %}{% trans %}utilisateur.list.table.lastName{% endtrans %}{% trans %}utilisateur.list.table.adress{% endtrans %}{% trans %}utilisateur.list.table.action{% endtrans %}
    {{ entity.firstName }}{{ entity.lastName }}{{ entity.address}} + {% trans %}utilisateur.list.table.disconnect{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'utilisateur' } %} + + {% else%} +
    {% trans %}utilisateur.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    + + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/User/rechercherUserResult.html.twig b/CTRV/CommonBundle/Resources/views/User/rechercherUserResult.html.twig new file mode 100644 index 0000000..f679640 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/User/rechercherUserResult.html.twig @@ -0,0 +1,75 @@ +{% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + + {% endfor %} + +
    {% trans %}utilisateur.rechercheForm.list.table.login {% endtrans %}{% trans %}utilisateur.rechercheForm.list.table.Noms {% endtrans %}{% trans %}utilisateur.rechercheForm.list.table.Prenoms {% endtrans %}{% trans %}utilisateur.rechercheForm.list.table.address {% endtrans %}{% trans %}utilisateur.rechercheForm.list.table.name {% endtrans %}{% trans %}utilisateur.rechercheForm.list.table.action {% endtrans %}
    {{ entity.login }}{{ entity.firstName }}{{ entity.lastName }}{{ entity.address }}{{ entity.name }} + {% if entity.isActive == "0" %} + {% trans %}utilisateur.list.table.active_action{% endtrans %} + {% else %} + {% trans %}utilisateur.list.table.desactive_action{% endtrans %} + {% endif %} + {% if entity.isBlocked == "0" %} + {% trans %}utilisateur.list.table.block_action{% endtrans %} + {% else %} + {% trans %}utilisateur.list.table.deblock_action{% endtrans %} + {% endif %} + {% trans %}utilisateur.list.table.edit_action{% endtrans %} +
    +{% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'false', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'utilisateur' } %} + +{% else %} +
    {% trans %}utilisateur.rechercheForm.list.table.no_result{% endtrans %}
    +{% endif %} + + + \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/User/statsUser.html.twig b/CTRV/CommonBundle/Resources/views/User/statsUser.html.twig new file mode 100644 index 0000000..7ce3b6c --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/User/statsUser.html.twig @@ -0,0 +1,26 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + +
    + + {% include "CTRVCommonBundle::menu.html.twig" %} + +
    + +

    {% trans %}utilisateur.list.titleStat{% endtrans %}

    + +
    +

    {% trans %}utilisateur.list.titleAllUsers{% endtrans %} : {{ nb_users }}

    +

    {% trans %}utilisateur.list.titleUsersConnectedNumber{% endtrans %} : {{ nb_connected_users }}

    +
    + +
    +

    {% trans %}utilisateur.list.titleAllUsersCity{% endtrans %} : {{ nb_users_by_city }}

    +

    {% trans %}utilisateur.list.titleUsersConnectedNumberByCity{% endtrans %} : {{ nb_connected_users_by_city }}

    +
    + +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/User/userEdit.html.twig b/CTRV/CommonBundle/Resources/views/User/userEdit.html.twig new file mode 100644 index 0000000..9eed84b --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/User/userEdit.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menu.html.twig" %} + +
    + +

    {% trans %}utilisateur.editForm.titleUserEdit{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('utilisateur.editForm.save','utilisateur') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/menu.html.twig b/CTRV/CommonBundle/Resources/views/menu.html.twig new file mode 100644 index 0000000..ff63336 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/menu.html.twig @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/menuAbus.html.twig b/CTRV/CommonBundle/Resources/views/menuAbus.html.twig new file mode 100644 index 0000000..3032200 --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/menuAbus.html.twig @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/CTRV/CommonBundle/Resources/views/menuCity.html.twig b/CTRV/CommonBundle/Resources/views/menuCity.html.twig new file mode 100644 index 0000000..a69d4ca --- /dev/null +++ b/CTRV/CommonBundle/Resources/views/menuCity.html.twig @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/CTRV/CommonBundle/Service/AbuseService.php b/CTRV/CommonBundle/Service/AbuseService.php new file mode 100644 index 0000000..e2e2f37 --- /dev/null +++ b/CTRV/CommonBundle/Service/AbuseService.php @@ -0,0 +1,44 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + $this->router = $router; + } + + /** + * retourne la liste des abus sur les commentaires + * @return unknown + */ + public function getAllAbuseNumber($currentCity) { + $entities = $this->em->getRepository('CTRVCommonBundle:Abuse') + ->getAllAbuseNumber($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + +} diff --git a/CTRV/CommonBundle/Service/AccessDeniedService.php b/CTRV/CommonBundle/Service/AccessDeniedService.php new file mode 100644 index 0000000..8f18af6 --- /dev/null +++ b/CTRV/CommonBundle/Service/AccessDeniedService.php @@ -0,0 +1,27 @@ +isXmlHttpRequest()) { + $response = new Response(json_encode(array('status' => 'protected'))); + return $response; + } + else { + return new RedirectResponse($this->router->generate('home')); + } + } + +} diff --git a/CTRV/CommonBundle/Service/CityService.php b/CTRV/CommonBundle/Service/CityService.php new file mode 100644 index 0000000..47014b1 --- /dev/null +++ b/CTRV/CommonBundle/Service/CityService.php @@ -0,0 +1,32 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + +} diff --git a/CTRV/CommonBundle/Service/CommentService.php b/CTRV/CommonBundle/Service/CommentService.php new file mode 100644 index 0000000..6f22fc2 --- /dev/null +++ b/CTRV/CommonBundle/Service/CommentService.php @@ -0,0 +1,81 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + + /** + * Retourne les commentaires des agendas de la ville spécifié + */ + public function getAgendaComment ($currentCity) { + + $entities = $this->em->getRepository('CTRVCommonBundle:Comment') + ->getAgendaComment($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + /** + * Retourne les commentaires des événements de la ville spécifié + */ + public function getEventComment ($currentCity) { + + $entities = $this->em->getRepository('CTRVCommonBundle:Comment') + ->getEventComment($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + /** + * Retourne les commentaires des places de la ville spécifié + */ + public function getPlaceComment ($currentCity) { + + $entities = $this->em->getRepository('CTRVCommonBundle:Comment') + ->getPlaceComment($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + /** + * retourne la liste des abus sur les commentaires + * @return unknown + */ + public function getEventCommentAbuse($currentCity) { + $entities = $this->em->getRepository('CTRVCommonBundle:Comment') + ->getEventCommentAbuse($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + /** + * retourne la liste des abus sur les commentaires des places + * @return unknown + */ + public function getPlaceCommentAbuse($currentCity) { + $entities = $this->em->getRepository('CTRVCommonBundle:Comment') + ->getPlaceCommentAbuse($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + +} diff --git a/CTRV/CommonBundle/Service/CommonService.php b/CTRV/CommonBundle/Service/CommonService.php new file mode 100644 index 0000000..771d674 --- /dev/null +++ b/CTRV/CommonBundle/Service/CommonService.php @@ -0,0 +1,31 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + $this->router = $router; + } + +} diff --git a/CTRV/CommonBundle/Service/MyPasswordEncoder.php b/CTRV/CommonBundle/Service/MyPasswordEncoder.php new file mode 100644 index 0000000..5fbddfb --- /dev/null +++ b/CTRV/CommonBundle/Service/MyPasswordEncoder.php @@ -0,0 +1,26 @@ +encodePassword($raw, $salt); + } + +} diff --git a/CTRV/CommonBundle/Service/SessionService.php b/CTRV/CommonBundle/Service/SessionService.php new file mode 100644 index 0000000..f119385 --- /dev/null +++ b/CTRV/CommonBundle/Service/SessionService.php @@ -0,0 +1,39 @@ +session = $session; + $this->doctrine = $doctrine; + $this->service_container = $service_container; + $this->em = $doctrine->getEntityManager(); + $this->translator = $translator; + } + + public function getCity() { + return $this->session->get('city'); + } + + public function setCity($city) { + $this->session->remove('city'); + $this->session->set('city', $city); + } + +} diff --git a/CTRV/CommonBundle/Service/UserService.php b/CTRV/CommonBundle/Service/UserService.php new file mode 100644 index 0000000..efe7e4a --- /dev/null +++ b/CTRV/CommonBundle/Service/UserService.php @@ -0,0 +1,78 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + + /** + * Retourne la liste des utilisateurs de la ville courante + * @param unknown_type $currentCity + */ + public function getUsersByCity($currentCity) { + return $this->em->getRepository('CTRVCommonBundle:User') + ->getUsersByCity($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + } + + /** + * retourne le nombre d'utilisateurs de la ville courante + * @param unknown_type $currentCity + * @return unknown + */ + public function getAllUsersNumberByCity ($currentCity) { + $userNumber = $this->em->getRepository('CTRVCommonBundle:User') + ->getAllUsersNumberByCity($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $userNumber; + } + + /** + * retourne le nombre d'utlisateur connectés + */ + public function getUsersConnectedNumber() { + $userConnectedNumber = $this->em->getRepository('CTRVCommonBundle:ConnectedUsers')->getUsersConnectedNumber(); + return $userConnectedNumber; + } + + /** + * retourne le nombre d'utilisateurs connectés de la ville courante + * @param unknown_type $currentCity + */ +public function getUsersConnectedNumberByCity($currentCity) { + $entities = $this->em->getRepository('CTRVCommonBundle:ConnectedUsers') + ->getUsersConnectedNumberByCity($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + /** + * retourne le nomber total d'utilisateurs + * @return unknown + */ + public function getAllUsersNumber() { + $userNumber = $this->em->getRepository('CTRVCommonBundle:User')->getAllUsersNumber(); + return $userNumber; + } + +} diff --git a/CTRV/EventBundle/CTRVEventBundle.php b/CTRV/EventBundle/CTRVEventBundle.php new file mode 100644 index 0000000..19ae704 --- /dev/null +++ b/CTRV/EventBundle/CTRVEventBundle.php @@ -0,0 +1,9 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $eventComments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getEventCommentNumber($city); + $nb_entities_page = Constants::eventsComment_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $eventComments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getEventComment($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $eventComments, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + /** + * Charge les commentaires des agendas + * @Route("/agendaComment", name="agendaComment") + * @Template() + */ + public function loadAgendaCommentAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $agendaComments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getAgendaCommentNumber($city); + $nb_entities_page = Constants::agendasComment_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $agendaComments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getAgendaComment($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $agendaComments, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + + +} diff --git a/CTRV/EventBundle/Controller/EventController.php b/CTRV/EventBundle/Controller/EventController.php new file mode 100644 index 0000000..35adff1 --- /dev/null +++ b/CTRV/EventBundle/Controller/EventController.php @@ -0,0 +1,391 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $events = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getEventNumber($city); + $nb_entities_page = Constants::events_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $events = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getEvent($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $events, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$city + ); + + + } + + /** + * Charge tous les événements ayant des mis à jour proposés de la ville courante + * @Route("/eventUpdated", name="eventUpdated") + * @Template() + */ + public function loadEventUpdatedAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getEventUpdatedByCityNumber($city); + $nb_entities_page = Constants::events_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + //On récupére l'ensemble des événements ayant des mis à jour proposés par ville + $eventsUpdatedByCity = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getEventUpdatedByCity($city, $offset, $nb_entities_page ); + + // on crée un tableau + $tab = array(); + // On récupére le nombre de mis à jour pour chaque event pour le placer dans le tableau + foreach ($eventsUpdatedByCity as $entity) { + $tab[$entity->getId()] = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getUpdatePerEventNumber($entity); + + } + + return array ( + 'update_per_event'=>$tab, + 'entities' => $eventsUpdatedByCity, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=> $city + ); + + } + + /** + * Charge tous les mis à jour proposés de l'événement spécifié de la ville courante + * @Route("/updatePerEvent/{id}", name="updatePerEvent") //requirements={"id" = "\d+"} + * @Template() + */ + public function loadUpdatePerEventAction ($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVEventBundle:Event')->find($id); + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + + $nb_entities = $this->getDoctrine()->getRepository('CTRVEventBundle:UpdatedEvent')->getUpdatePerEventNumber($entity, $city); + $nb_entities_page = Constants::events_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + $update_per_event = $this->getDoctrine()->getRepository('CTRVEventBundle:UpdatedEvent')->getUpdatePerEvent($entity,$city, $offset, $nb_entities_page); + $currentEventWithUpdateProposed = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getcurrentEventWithUpdateProposed($entity ,$city, $offset, $nb_entities_page); + + return array ( + 'entities' => $update_per_event, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'events'=> $currentEventWithUpdateProposed, + 'city'=>$city + ); + + + } + + /** + * Valider un mis à jour d'événement + * + * @Route("/validate/{id}", name="validateEventUpdated" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function validateEventUpdatedAction ($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVEventBundle:UpdatedEvent')->find($id); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("eventUpdated")); + } + + + /** + * Charge tous les événements passés de la ville courante + * @Route("/eventPassed", name="eventPassed") + * @Template() + */ + public function loadEventPassedAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $events = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getEventPassedNumber($city); + $nb_entities_page = Constants::events_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $events = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getEventPassed($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $events, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$city + ); + + + } + + /** + * Charge tous les agendas en cours de la ville courante + * @Route("/listagenda", name="agenda") + * @Template() + */ + public function loadAgendaAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $date = date(gmdate("Y-m-d H:i:s")); + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $agendas = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getCurrentAgendaNumber($city, $date); + $nb_entities_page = Constants::agendas_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $agendas = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getCurrentAgenda($city, $offset, $nb_entities_page, $date); + + return array ( + 'entities' => $agendas, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$city + ); + } + + + /** + * Charge tous les agendas passés de la ville courante + * @Route("/passedAgenda", name="passedAgenda") + * @Template() + */ + public function loadPassedAgendaAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $date = date(gmdate("Y-m-d H:i:s")); + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $agendas = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getPassedAgendaNumber($city, $date); + $nb_entities_page = Constants::agendas_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $agendas = $this->getDoctrine()->getRepository('CTRVEventBundle:Event')->getPassedAgenda($city, $offset, $nb_entities_page, $date); + + return array ( + 'entities' => $agendas, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$city + ); + } + + + /** + * ajouter un type d'évenement + * @Route("/ajouter",name="ajouter_evenement") + * @Template() + */ + public function addEventTypeAction () { + $em = $this->getDoctrine()->getEntityManager(); + $form = $this->createForm(new EventTypeType(),new EventType()); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On l'enregistre notre objet $placeType dans la base de données + $eventType = $form->getData(); + $em->persist($eventType); + $em->flush(); + return $this->redirect($this->generateUrl("loadTypeEvents")); + } + } + + + return array('form'=>$form->createView()); + + } + /** + * modifier un type d'evenment + * @Route("/modifier/{id}",name="modifier_evenement") + * @Template() + */ + public function updateEventTypeAction(EventType $eventType) { + $form = $this->createForm(new EventTypeType, $eventType); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $placeType dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($eventType); + $em->flush(); + // on redirige vers les types de place + return $this->redirect($this->generateUrl("loadTypeEvents")); + } + + } + + return array( + 'eventType'=> $eventType, + 'form'=>$form->createView()); + + } + /** + * Charge les type d'évenement + * @Route("/loadTypeEvents", name="loadTypeEvents") + * @Template() + */ + public function loadTypeEventsAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $typeEvents = $this->getDoctrine()->getRepository('CTRVEventBundle:EventType')->getTypeEventsNumber(); + $nb_entities_page = Constants::eventsComment_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $typeEvents = $this->getDoctrine()->getRepository('CTRVEventBundle:EventType')->getTypeEvents($offset, $nb_entities_page); + + return array ( + 'entities' => $typeEvents, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + + } + + + + /** + * Deletes an Event entity. + * + * @Route("/{id}/delete", name="event_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVEventBundle:Event')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + + /** + * Deletes an EventType entity. + * + * @Route("/{id}/deleteType", name="eventType_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteTypeAction($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVEventBundle:EventType')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + +} diff --git a/CTRV/EventBundle/DependencyInjection/CTRVEventExtension.php b/CTRV/EventBundle/DependencyInjection/CTRVEventExtension.php new file mode 100644 index 0000000..ada3e51 --- /dev/null +++ b/CTRV/EventBundle/DependencyInjection/CTRVEventExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/CTRV/EventBundle/DependencyInjection/Configuration.php b/CTRV/EventBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..156aad1 --- /dev/null +++ b/CTRV/EventBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root('ctrv_event'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/CTRV/EventBundle/Entity/Event.php b/CTRV/EventBundle/Entity/Event.php new file mode 100644 index 0000000..5bc2364 --- /dev/null +++ b/CTRV/EventBundle/Entity/Event.php @@ -0,0 +1,723 @@ +title; + } + + /** + * @ORM\PrePersist + */ + public function setAddedDateValue () { + $this->addedDate = new \DateTime(); + } + + /** + * @var integer $cityId + * @ORM\ManyToOne(targetEntity="\CTRV\CommonBundle\Entity\City") + * @JoinColumn(name="city_id",referencedColumnName="id", onDelete="CASCADE") + */ + private $city; + + /** + * @var integer $eventTypeId + * @ORM\ManyToOne(targetEntity="EventType") + * @JoinColumn(name="event_type_id",referencedColumnName="id", onDelete="CASCADE") + */ + private $eventType; + + /** + * @ORM\ManyToOne(targetEntity="\CTRV\CommonBundle\Entity\User",inversedBy="events") + * @JoinColumn(name="userid",referencedColumnName="userid", onDelete="CASCADE") + */ + private $auteur; + + /** + * @ORM\OneToMany(targetEntity="Event",mappedBy="event") + * @var unknown_type + */ + private $eventUpdates; + + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set latitude + * + * @param string $latitude + * @return Event + */ + public function setLatitude($latitude) + { + $this->latitude = $latitude; + + return $this; + } + + /** + * Get latitude + * + * @return string + */ + public function getLatitude() + { + return $this->latitude; + } + + /** + * Set longitude + * + * @param string $longitude + * @return Event + */ + public function setLongitude($longitude) + { + $this->longitude = $longitude; + + return $this; + } + + /** + * Get longitude + * + * @return string + */ + public function getLongitude() + { + return $this->longitude; + } + + /** + * Set duration + * + * @param integer $duration + * @return Event + */ + public function setDuration($duration) + { + $this->duration = $duration; + + return $this; + } + + /** + * Get duration + * + * @return integer + */ + public function getDuration() + { + return $this->duration; + } + + /** + * Set addedDate + * + * @param \DateTime $addedDate + * @return Event + */ + public function setAddedDate($addedDate) + { + $this->addedDate = $addedDate; + + return $this; + } + + /** + * Get addedDate + * + * @return \DateTime + */ + public function getAddedDate() + { + return $this->addedDate; + } + + /** + * Set description + * + * @param string $description + * @return Event + */ + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + /** + * Get description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Set title + * + * @param string $title + * @return Event + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set street + * + * @param string $street + * @return Event + */ + public function setStreet($street) + { + $this->street = $street; + + return $this; + } + + /** + * Get street + * + * @return string + */ + public function getStreet() + { + return $this->street; + } + + /** + * Set mark + * + * @param integer $mark + * @return Event + */ + public function setMark($mark) + { + $this->mark = $mark; + + return $this; + } + + /** + * Get mark + * + * @return integer + */ + public function getMark() + { + return $this->mark; + } + + /** + * Set numberMark + * + * @param integer $numberMark + * @return Event + */ + public function setNumberMark($numberMark) + { + $this->numberMark = $numberMark; + + return $this; + } + + /** + * Get numberMark + * + * @return integer + */ + public function getNumberMark() + { + return $this->numberMark; + } + + /** + * Set city + * + * @param CTRV\CommonBundle\Entity\City $city + * @return Event + */ + public function setCity(\CTRV\CommonBundle\Entity\City $city = null) + { + $this->city = $city; + + return $this; + } + + /** + * Get city + * + * @return CTRV\CommonBundle\Entity\City + */ + public function getCity() + { + return $this->city; + } + + /** + * Set eventType + * + * @param CTRV\CommonBundle\Entity\EventType $eventType + * @return Event + */ + public function setEventType(EventType $eventType = null) + { + $this->eventType = $eventType; + + return $this; + } + + /** + * Get eventType + * + * @return CTRV\CommonBundle\Entity\EventType + */ + public function getEventType() + { + return $this->eventType; + } + + /** + * Set auteur + * + * @param CTRV\CommonBundle\Entity\User $auteur + * @return Event + */ + public function setAuteur(\CTRV\CommonBundle\Entity\User $auteur = null) + { + $this->auteur = $auteur; + + return $this; + } + + /** + * Get auteur + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getAuteur() + { + return $this->auteur; + } + + + /** + * Set isPrivate + * + * @param boolean $isPrivate + * @return Event + */ + public function setIsPrivate($isPrivate) + { + $this->isPrivate = $isPrivate; + } + + /** + * Get isPrivate + * + * @return boolean + */ + public function getIsPrivate() + { + return $this->isPrivate; + } + + /** + * Set visibility + * + * @param string $visibility + * @return Event + */ + public function setVisibility($visibility) + { + $this->visibility = $visibility; + + return $this; + } + + /** + * Get visibility + * + * @return string + */ + public function getVisibility() + { + return $this->visibility; + } + + /** + * Set accessRight + * + * @param string $accessRight + * @return Event + */ + public function setAccessRight($accessRight) + { + $this->accessRight = $accessRight; + + return $this; + } + + /** + * Get accessRight + * + * @return string + */ + public function getAccessRight() + { + return $this->accessRight; + } + + /** + * Set startDate + * + * @param \DateTime $startDate + * @return Event + */ + public function setStartDate($startDate) + { + $this->startDate = $startDate; + + return $this; + } + + /** + * Get startDate + * + * @return \DateTime + */ + public function getStartDate() + { + return $this->startDate; + } + + /** + * Set endDate + * + * @param \DateTime $endDate + * @return Event + */ + public function setEndDate($endDate) + { + $this->endDate = $endDate; + + return $this; + } + + /** + * Get endDate + * + * @return \DateTime + */ + public function getEndDate() + { + return $this->endDate; + } + + /** + * Set startTime + * + * @param string $startTime + * @return Event + */ + public function setStartTime($startTime) + { + $this->startTime = $startTime; + + return $this; + } + + /** + * Get startTime + * + * @return string + */ + public function getStartTime() + { + return $this->startTime; + } + + /** + * Set endTime + * + * @param string $endTime + * @return Event + */ + public function setEndTime($endTime) + { + $this->endTime = $endTime; + + return $this; + } + + /** + * Get endTime + * + * @return string + */ + public function getEndTime() + { + return $this->endTime; + } + + /** + * Set isRealtime + * + * @param boolean $isRealtime + * @return Event + */ + public function setIsRealtime($isRealtime) + { + $this->isRealtime = $isRealtime; + + return $this; + } + + /** + * Get isRealtime + * + * @return boolean + */ + public function getIsRealtime() + { + return $this->isRealtime; + } + /** + * Constructor + */ + public function __construct() + { + $this->eventUpdates = new \Doctrine\Common\Collections\ArrayCollection(); + } + + /** + * Set lastUpdateDate + * + * @param \DateTime $lastUpdateDate + * @return Event + */ + public function setLastUpdateDate($lastUpdateDate) + { + $this->lastUpdateDate = $lastUpdateDate; + + return $this; + } + + /** + * Get lastUpdateDate + * + * @return \DateTime + */ + public function getLastUpdateDate() + { + return $this->lastUpdateDate; + } + + /** + * Add eventUpdates + * + * @param CTRV\EventBundle\Entity\Event $eventUpdates + * @return Event + */ + public function addEventUpdate(\CTRV\EventBundle\Entity\Event $eventUpdates) + { + $this->eventUpdates[] = $eventUpdates; + + return $this; + } + + /** + * Remove eventUpdates + * + * @param CTRV\EventBundle\Entity\Event $eventUpdates + */ + public function removeEventUpdate(\CTRV\EventBundle\Entity\Event $eventUpdates) + { + $this->eventUpdates->removeElement($eventUpdates); + } + + /** + * Get eventUpdates + * + * @return Doctrine\Common\Collections\Collection + */ + public function getEventUpdates() + { + return $this->eventUpdates; + } +} \ No newline at end of file diff --git a/CTRV/EventBundle/Entity/EventFollower.php b/CTRV/EventBundle/Entity/EventFollower.php new file mode 100644 index 0000000..0f299cb --- /dev/null +++ b/CTRV/EventBundle/Entity/EventFollower.php @@ -0,0 +1,214 @@ +id; + } + + /** + * Set type + * + * @param string $type + * @return EventFollower + */ + public function setType($type) + { + $this->type = $type; + + return $this; + } + + /** + * Get type + * + * @return string + */ + public function getType() + { + return $this->type; + } + + /** + * Set participate + * + * @param boolean $participate + * @return EventFollower + */ + public function setParticipate($participate) + { + $this->participate = $participate; + + return $this; + } + + /** + * Get participate + * + * @return boolean + */ + public function getParticipate() + { + return $this->participate; + } + + /** + * Set wasThere + * + * @param boolean $wasThere + * @return EventFollower + */ + public function setWasThere($wasThere) + { + $this->wasThere = $wasThere; + + return $this; + } + + /** + * Get wasThere + * + * @return boolean + */ + public function getWasThere() + { + return $this->wasThere; + } + + /** + * Set user + * + * @param CTRV\CommonBundle\Entity\User $user + * @return EventFollower + */ + public function setUser(\CTRV\CommonBundle\Entity\User $user = null) + { + $this->user = $user; + + return $this; + } + + /** + * Get user + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getUser() + { + return $this->user; + } + + /** + * Set id_event_agenda_place + * + * @param integer $idEventAgendaPlace + * @return EventFollower + */ + public function setIdEventAgendaPlace($idEventAgendaPlace) + { + $this->id_event_agenda_place = $idEventAgendaPlace; + + return $this; + } + + /** + * Get id_event_agenda_place + * + * @return integer + */ + public function getIdEventAgendaPlace() + { + return $this->id_event_agenda_place; + } + + /** + * Set isAccepted + * + * @param boolean $isAccepted + * @return EventFollower + */ + public function setIsAccepted($isAccepted) + { + $this->isAccepted = $isAccepted; + + return $this; + } + + /** + * Get isAccepted + * + * @return boolean + */ + public function getIsAccepted() + { + return $this->isAccepted; + } +} \ No newline at end of file diff --git a/CTRV/EventBundle/Entity/EventFollowerRepository.php b/CTRV/EventBundle/Entity/EventFollowerRepository.php new file mode 100644 index 0000000..56a254d --- /dev/null +++ b/CTRV/EventBundle/Entity/EventFollowerRepository.php @@ -0,0 +1,15 @@ +createQueryBuilder("e") + ->where("e.auteur is not null") + ->andWhere("e.city=?1") + ->andWhere("e.isPrivate=?2") + ->andWhere("e.duration > 0") + ->andWhere("e.isRealtime=?3") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre d'événements en cours de la ville courante + */ + public function getEventNumber($city) { + $qb = $this->createQueryBuilder("e") + ->select("count(e)") + ->where("e.auteur is not null") + ->andWhere("e.duration > 0") + ->andWhere("e.city=?1") + ->andWhere("e.isPrivate=?2") + ->andWhere("e.isRealtime=?3") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * retourne la liste des événements ayant des mis à jour proposés de la ville courante + */ + public function getEventUpdatedByCity($city, $first, $last) { + $qb = $this->createQueryBuilder("e") + ->from('CTRV\EventBundle\Entity\UpdatedEvent','u') + ->where("e.id=u.event") + ->andWhere("e.auteur is not null") + ->andWhere("e.city=?1") + ->andWhere("e.isPrivate=?2") + ->andWhere("e.duration > 0") + ->andWhere("e.isRealtime=?3") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + /** + * retourne la liste des événements ayant des mis à jour proposés de la ville courante + */ + public function getEventWithUpdateProposedByCity($city) { + $qb = $this->createQueryBuilder("e") + ->from('CTRV\EventBundle\Entity\UpdatedEvent','u') + ->where("e.id=u.event") + ->andWhere("e.auteur is not null") + ->andWhere("e.city=?1") + ->andWhere("e.isPrivate=?2") + ->andWhere("e.duration > 0") + ->andWhere("e.isRealtime=?3") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne un événement ayant des mis à jour proposés de la ville courante + */ + public function getcurrentEventWithUpdateProposed($id, $city, $first, $last) { + $qb = $this->createQueryBuilder("e") + ->from('CTRV\EventBundle\Entity\UpdatedEvent','u') + ->where("e.id=u.event") + ->andWhere("e.auteur is not null") + ->andWhere("e.id=?1") + ->andWhere("e.city=?2") + ->andWhere("e.isPrivate=?3") + ->andWhere("e.duration > 0") + ->andWhere("e.isRealtime=?4") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $id) + ->setParameter(2, $city) + ->setParameter(3, false) + ->setParameter(4, true) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + + /** + * retourne le nombre d'événements ayant des mis à jour proposés de la ville courante + */ + public function getEventUpdatedByCityNumber($city) { + $qb = $this->createQueryBuilder("e") + ->select("count(DISTINCT u.event)") + ->from('CTRV\EventBundle\Entity\UpdatedEvent','u') + ->where("e.id=u.event") + ->andWhere("e.auteur is not null") + ->andWhere("e.city=?1") + ->andWhere("e.isPrivate=?2") + ->andWhere("e.duration > 0") + ->andWhere("e.isRealtime=?3") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * retourne la liste des événements passés de la ville courante + */ + public function getEventPassed($city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->where("p.auteur is not null") + ->andWhere("p.city=?1") + ->andWhere("p.isPrivate=?2") + ->andWhere("p.duration <= 0") + ->andWhere("p.isRealtime=?3") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre d'événements passés de la ville courante + */ + public function getEventPassedNumber($city) { + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->where("p.auteur is not null") + ->andWhere("p.duration <= 0") + ->andWhere("p.city=?1") + ->andWhere("p.isPrivate=?2") + ->andWhere("p.isRealtime=?3") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, true) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * retourne la liste des agendas passés de la ville courante + */ + public function getPassedAgenda ($city, $first, $last, $date) { + $qb = $this->createQueryBuilder("p") + ->where("p.auteur is not null") + ->andWhere("p.city=?1") + ->andWhere("p.isPrivate=?2") + ->andWhere("p.isRealtime=?3") + ->andWhere("p.startDate is not null ") + ->andWhere("p.startDateorderBy('p.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, false) + ->setParameter(4, $date) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre d'agendas en cours de la ville courante + */ + public function getPassedAgendaNumber($city, $date) { + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->where("p.auteur is not null") + ->andWhere("p.city=?1") + ->andWhere("p.isPrivate=?2") + ->andWhere("p.isRealtime=?3") + ->andWhere("p.startDate is not null ") + ->andWhere("p.startDateorderBy('p.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, false) + ->setParameter(4, $date) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * retourne la liste des agendas en cours de la ville courante + */ + public function getCurrentAgenda ($city, $first, $last, $date) { + $qb = $this->createQueryBuilder("p") + ->where("p.auteur is not null") + ->andWhere("p.city=?1") + ->andWhere("p.isPrivate=?2") + ->andWhere("p.isRealtime=?3") + ->andWhere("p.startDate is not null ") + ->andWhere("p.startDate >=?4") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, false) + ->setParameter(4, $date) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre d'agendas en cours de la ville courante + */ + public function getCurrentAgendaNumber($city, $date) { + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->where("p.auteur is not null") + ->andWhere("p.city=?1") + ->andWhere("p.isPrivate=?2") + ->andWhere("p.isRealtime=?3") + ->andWhere("p.startDate is not null ") + ->andWhere("p.startDate >=?4") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $city) + ->setParameter(2, false) + ->setParameter(3, false) + ->setParameter(4, $date) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * retourne la liste des mis à jour proposés pour l'événement spécifié + */ + public function getUpdatePerEvent ($id, $city, $first, $last) { + $qb = $this->createQueryBuilder("e") + ->select('e') + ->from('CTRV\EventBundle\Entity\UpdatedEvent','u') + ->where("e.id=?1") + ->andWhere("e.id=u.event") + ->andWhere("e.city=?2") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1,$id) + ->setParameter(2,$city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * retourne le nombre de mis à jour proposés pour l'événement spécifié + */ + public function getUpdatePerEventNumber ($id) { + $qb = $this->createQueryBuilder("e") + ->select("count(e)") + ->from('CTRV\EventBundle\Entity\UpdatedEvent','u') + ->where("e.id=?1") + ->andWhere("e.id=u.event") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1,$id) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + +} \ No newline at end of file diff --git a/CTRV/EventBundle/Entity/EventType.php b/CTRV/EventBundle/Entity/EventType.php new file mode 100644 index 0000000..d605de1 --- /dev/null +++ b/CTRV/EventBundle/Entity/EventType.php @@ -0,0 +1,158 @@ +id; + } + + /** + * Set label + * + * @param string $label + * @return EventType + */ + public function setLabel($label) + { + $this->label = $label; + + return $this; + } + + /** + * Get label + * + * @return string + */ + public function getLabel() + { + return $this->label; + } + public function __toString() { + return $this->label; + } + + + /** + * Set code + * + * @param string $code + * @return EventType + */ + public function setCode($code) + { + $this->code = $code; + + return $this; + } + + /** + * Get code + * + * @return string + */ + public function getCode() + { + return $this->code; + } + + /** + * Set language + * + * @param string $language + * @return EventType + */ + public function setLanguage($language) + { + $this->language = $language; + + return $this; + } + + /** + * Get language + * + * @return string + */ + public function getLanguage() + { + return $this->language; + } + + /** + * Set img_url + * + * @param string $imgUrl + * @return EventType + */ + public function setImgUrl($imgUrl) + { + $this->img_url = $imgUrl; + + return $this; + } + + /** + * Get img_url + * + * @return string + */ + public function getImgUrl() + { + return $this->img_url; + } +} \ No newline at end of file diff --git a/CTRV/EventBundle/Entity/EventTypeRepository.php b/CTRV/EventBundle/Entity/EventTypeRepository.php new file mode 100644 index 0000000..80d41b7 --- /dev/null +++ b/CTRV/EventBundle/Entity/EventTypeRepository.php @@ -0,0 +1,35 @@ +createQueryBuilder("p") + ->orderBy('p.code','ASC') + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre de types d'évenements + */ + public function getTypeEventsNumber(){ + $qb= $this->createQueryBuilder("p") + ->select("count(p)") + ->orderBy('p.code','ASC') + ; + return $qb->getQuery()->getSingleScalarResult(); + } + +} \ No newline at end of file diff --git a/CTRV/EventBundle/Entity/UpdatedEvent.php b/CTRV/EventBundle/Entity/UpdatedEvent.php new file mode 100644 index 0000000..3ec4361 --- /dev/null +++ b/CTRV/EventBundle/Entity/UpdatedEvent.php @@ -0,0 +1,433 @@ +addedDate = new \DateTime(); + } + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set latitude + * + * @param string $latitude + * @return UpdatedEvent + */ + public function setLatitude($latitude) + { + $this->latitude = $latitude; + + return $this; + } + + /** + * Get latitude + * + * @return string + */ + public function getLatitude() + { + return $this->latitude; + } + + /** + * Set longitude + * + * @param string $longitude + * @return UpdatedEvent + */ + public function setLongitude($longitude) + { + $this->longitude = $longitude; + + return $this; + } + + /** + * Get longitude + * + * @return string + */ + public function getLongitude() + { + return $this->longitude; + } + + /** + * Set duration + * + * @param integer $duration + * @return UpdatedEvent + */ + public function setDuration($duration) + { + $this->duration = $duration; + + return $this; + } + + /** + * Get duration + * + * @return integer + */ + public function getDuration() + { + return $this->duration; + } + + /** + * Set addedDate + * + * @param \DateTime $addedDate + * @return UpdatedEvent + */ + public function setAddedDate($addedDate) + { + $this->addedDate = $addedDate; + + return $this; + } + + /** + * Get addedDate + * + * @return \DateTime + */ + public function getAddedDate() + { + return $this->addedDate; + } + + /** + * Set description + * + * @param string $description + * @return UpdatedEvent + */ + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + /** + * Get description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Set title + * + * @param string $title + * @return UpdatedEvent + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set street + * + * @param string $street + * @return UpdatedEvent + */ + public function setStreet($street) + { + $this->street = $street; + + return $this; + } + + /** + * Get street + * + * @return string + */ + public function getStreet() + { + return $this->street; + } + + /** + * Set startDate + * + * @param \DateTime $startDate + * @return UpdatedEvent + */ + public function setStartDate($startDate) + { + $this->startDate = $startDate; + + return $this; + } + + /** + * Get startDate + * + * @return \DateTime + */ + public function getStartDate() + { + return $this->startDate; + } + + /** + * Set endDate + * + * @param \DateTime $endDate + * @return UpdatedEvent + */ + public function setEndDate($endDate) + { + $this->endDate = $endDate; + + return $this; + } + + /** + * Get endDate + * + * @return \DateTime + */ + public function getEndDate() + { + return $this->endDate; + } + + /** + * Set startTime + * + * @param string $startTime + * @return UpdatedEvent + */ + public function setStartTime($startTime) + { + $this->startTime = $startTime; + + return $this; + } + + /** + * Get startTime + * + * @return string + */ + public function getStartTime() + { + return $this->startTime; + } + + /** + * Set endTime + * + * @param string $endTime + * @return UpdatedEvent + */ + public function setEndTime($endTime) + { + $this->endTime = $endTime; + + return $this; + } + + /** + * Get endTime + * + * @return string + */ + public function getEndTime() + { + return $this->endTime; + } + + /** + * Set event + * + * @param CTRV\EventBundle\Entity\Event $event + * @return UpdatedEvent + */ + public function setEvent(\CTRV\EventBundle\Entity\Event $event = null) + { + $this->event = $event; + + return $this; + } + + /** + * Get event + * + * @return CTRV\EventBundle\Entity\Event + */ + public function getEvent() + { + return $this->event; + } + + /** + * Set auteur + * + * @param CTRV\CommonBundle\Entity\User $auteur + * @return UpdatedEvent + */ + public function setAuteur(\CTRV\CommonBundle\Entity\User $auteur = null) + { + $this->auteur = $auteur; + + return $this; + } + + /** + * Get auteur + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getAuteur() + { + return $this->auteur; + } +} \ No newline at end of file diff --git a/CTRV/EventBundle/Entity/UpdatedEventRepository.php b/CTRV/EventBundle/Entity/UpdatedEventRepository.php new file mode 100644 index 0000000..efdb863 --- /dev/null +++ b/CTRV/EventBundle/Entity/UpdatedEventRepository.php @@ -0,0 +1,55 @@ +createQueryBuilder("e") + ->from('CTRV\EventBundle\Entity\Event','ev') + ->where("e.auteur is not null") + ->andWhere("ev.id=e.event") + ->andWhere("e.event=?1") + ->andWhere("ev.city=?2") + ->andWhere("e.duration > 0") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $id) + ->setParameter(2,$city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre de mis à jour proposés pour un événement spécifié + */ + public function getUpdatePerEventNumber($id, $city) { + $qb = $this->createQueryBuilder("e") + ->select("count(e)") + ->from('CTRV\EventBundle\Entity\Event','ev') + ->where("e.auteur is not null") + ->andWhere("ev.id=e.event") + ->andWhere("e.event=?1") + ->andWhere("ev.city=?2") + ->andWhere("e.duration > 0") + ->orderBy('e.addedDate', 'DESC') + ->setParameter(1, $id) + ->setParameter(2,$city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + +} diff --git a/CTRV/EventBundle/Form/EventTypeType.php b/CTRV/EventBundle/Form/EventTypeType.php new file mode 100644 index 0000000..e70dc57 --- /dev/null +++ b/CTRV/EventBundle/Form/EventTypeType.php @@ -0,0 +1,38 @@ +add('label','text',array('label'=>'event.ajouterForm.libelle')) + ->add('code','text',array('label'=>'event.ajouterForm.code')) + ->add('language','choice',array('label'=>'event.ajouterForm.langue','choices'=>array( + 'FRENCH' => 'event.ajouterForm.fr', + 'ENGLISH' => 'event.ajouterForm.en', + 'SPANISH' => 'event.ajouterForm.es', + ), + )) + ->add('img_url','file',array('label'=>'event.ajouterForm.select_file', 'required'=>false)) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\EventBundle\Entity\EventType' + )); + } + + public function getName() + { + return 'ctrv_eventbundle_eventtypetype'; + } +} diff --git a/CTRV/EventBundle/Form/UpdatedEventType.php b/CTRV/EventBundle/Form/UpdatedEventType.php new file mode 100644 index 0000000..ac32465 --- /dev/null +++ b/CTRV/EventBundle/Form/UpdatedEventType.php @@ -0,0 +1,41 @@ +add('latitude') + ->add('longitude') + ->add('duration') + ->add('addedDate') + ->add('description') + ->add('title') + ->add('street') + ->add('startDate') + ->add('endDate') + ->add('startTime') + ->add('endTime') + ->add('event') + ->add('auteur') + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\EventBundle\Entity\UpdatedEvent' + )); + } + + public function getName() + { + return 'ctrv_eventbundle_updatedeventtype'; + } +} diff --git a/CTRV/EventBundle/Resources/config/services.yml b/CTRV/EventBundle/Resources/config/services.yml new file mode 100644 index 0000000..3d6e822 --- /dev/null +++ b/CTRV/EventBundle/Resources/config/services.yml @@ -0,0 +1,14 @@ +services: + event_service: + class: CTRV\EventBundle\Service\EventService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + agenda_service: + class: CTRV\EventBundle\Service\AgendaService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + agendaComment_service: + class: CTRV\EventBundle\Service\AgendaCommentService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + eventComment_service: + class: CTRV\EventBundle\Service\EventCommentService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/doc/index.rst b/CTRV/EventBundle/Resources/doc/index.rst new file mode 100644 index 0000000..e69de29 diff --git a/CTRV/EventBundle/Resources/public/js/agenda.js b/CTRV/EventBundle/Resources/public/js/agenda.js new file mode 100644 index 0000000..14ca76b --- /dev/null +++ b/CTRV/EventBundle/Resources/public/js/agenda.js @@ -0,0 +1,32 @@ +/** + * Retourne la liste des agendas selon la page spécifié + */ +function loadAgenda (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un agenda + */ +function deleteAgenda (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/public/js/event.js b/CTRV/EventBundle/Resources/public/js/event.js new file mode 100644 index 0000000..be079bf --- /dev/null +++ b/CTRV/EventBundle/Resources/public/js/event.js @@ -0,0 +1,48 @@ +/** + * Retourne la liste des événements selon le type et la page spécifié + */ +function loadEvent (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un évenements + */ +function deleteEvent (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} + +/** + * Supprime un type d'évenements + */ +function deleteEventType (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/translations/messages.fr.yml b/CTRV/EventBundle/Resources/translations/messages.fr.yml new file mode 100644 index 0000000..4ad42a6 --- /dev/null +++ b/CTRV/EventBundle/Resources/translations/messages.fr.yml @@ -0,0 +1,102 @@ +agenda: + menu: + currentAgenda: Liste des agendas en cours + passedAgenda : Liste des agendas passés + list: + title: Liste des évènements publics futur ajoutés + titlePassed: Liste des évènements publics futur dépassés + titleAllAgendaAt : Nombre total d'événements publics futurs à + titleAllAgendaPassedAt : Nombre d'événements passés à + table: + title: Titre + description: Description + adresse: Adresse + author: Auteur + start_date : Date de début + addedDate: Date d'ajout + action: Actions + delete_action: Supprimer + no_result: Aucun agenda trouvé + +event: + menu: + currentEvent: Liste des événements en cours + passedEvent : Liste des événements passés + eventUpdated : Liste des événements mis à jour + add : Ajouter + type : Types d'évenements + list: + titlePublicEvent: Liste des événements publics temps rééls ajoutés + titlePublicEventUpdated : Liste des événements avec mis à jour + titlePublicEventPassed: Liste des événements publics passés + titleTypeEvent: Liste des types d'évenements + titleAllEventAt : Nombre total d'événements à + titleAllEventPassedAt : Nombre d'événements passés à + titleEventUpdatedAt : Nombre d'événements mis à jour à + titleUpdatePerEvent: Liste des mis à jours de l'événement + LastValues : Anciennes valeurs + titleAllUpdate : Nombre total de mis à jour + table: + title: Titre + description: Description + adresse: Adresse + author: Auteur + duration : Durée + update_number : Nombre de mis à jour + addedDate: Date d'ajout + action: Actions + delete_action: Supprimer + update_action: Modifier + view_action : Afficher + validate_action : Valider + back_action : Retour + code: Code + label: Libellé + language: Langue + img_url: Icône + no_result: Aucun événement trouvé + ajouterForm: + titleAddEventType : Ajouter un type d'évenement + titleUpdateEventType: Modifier un type d'évenement + select_file : Selectionner un fichier + libelle: Libellé + code : Code + langue: Langue + fr : French + en : English + es : Spanish + save : Sauvegarder + rechercheForm: + title : Liste des évenements correspondant à votre recherche + rechercher: Entrer le nom d'un évenement + +agendaComment: + menu: + afficher: Commentaires des agendas + + list: + title: Liste des commentaires des évènements publics futur + table: + author: Auteur + content: Contenu + typeEntity: Type + addedDate: Date d'ajout + event: Evènement + action: Actions + delete_action: Supprimer + no_result: Aucun commentaire trouvé + +eventComment: + menu: + afficher: Commentaires des évènements + list: + title: Liste des commentaires des évènements publics temps rééls + table: + author: Auteur + content: Contenu + typeEntity: Type + addedDate: Date d'ajout + event: Evènement + action: Actions + delete_action: Supprimer + no_result: Aucun commentaire trouvé \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/addEventType.html.twig b/CTRV/EventBundle/Resources/views/Event/addEventType.html.twig new file mode 100644 index 0000000..8bd1883 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/addEventType.html.twig @@ -0,0 +1,25 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}event.ajouterForm.titleAddEventType{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('event.ajouterForm.save','loadTypeEvents') }} +
    +
    +
    +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadAgenda.html.twig b/CTRV/EventBundle/Resources/views/Event/loadAgenda.html.twig new file mode 100644 index 0000000..d210f10 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadAgenda.html.twig @@ -0,0 +1,66 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuAgenda.html.twig" %} + +
    + +

    {% trans %}agenda.list.title{% endtrans %}

    +

    {% trans %}agenda.list.titleAllAgendaAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    +
    + {% if entities is not empty %} + + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + + + {% endfor %} + +
    {% trans %}agenda.list.table.title{% endtrans %}{% trans %}agenda.list.table.description{% endtrans %}{% trans %}agenda.list.table.adresse{% endtrans %}{% trans %}agenda.list.table.start_date{% endtrans %}{% trans %}agenda.list.table.author{% endtrans %}{% trans %}agenda.list.table.addedDate{% endtrans %}{% trans %}agenda.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.startDate|date(constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')) }}{{ entity.auteur }}{{ entity.addedDate|date(constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')) }} + {% trans %}agenda.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'agenda' } %} + + {% else%} +
    {% trans %}agenda.list.table.no_result{% endtrans %}
    + {% endif %} +
    +
    +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadEvent.html.twig b/CTRV/EventBundle/Resources/views/Event/loadEvent.html.twig new file mode 100644 index 0000000..ad5c19b --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadEvent.html.twig @@ -0,0 +1,70 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}event.list.titlePublicEvent{% endtrans %}

    +

    {% trans %}event.list.titleAllEventAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    +
    + {% if entities is not empty %} + + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')%} + + + + {% endfor %} + +
    {% trans %}event.list.table.title{% endtrans %}{% trans %}event.list.table.description{% endtrans %}{% trans %}event.list.table.adresse{% endtrans %}{% trans %}event.list.table.duration{% endtrans %}{% trans %}event.list.table.author{% endtrans %}{% trans %}event.list.table.addedDate{% endtrans %}{% trans %}event.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.duration}}{{ entity.auteur }}{{ entity.addedDate|date(format) }} + {% trans %}event.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'event' } %} + + {% else %} +
    {% trans %}event.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadEventPassed.html.twig b/CTRV/EventBundle/Resources/views/Event/loadEventPassed.html.twig new file mode 100644 index 0000000..464480f --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadEventPassed.html.twig @@ -0,0 +1,68 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}event.list.titlePublicEventPassed{% endtrans %}

    +

    {% trans %}event.list.titleAllEventPassedAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    +
    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')%} + + + + {% endfor %} + +
    {% trans %}event.list.table.title{% endtrans %}{% trans %}event.list.table.description{% endtrans %}{% trans %}event.list.table.adresse{% endtrans %}{% trans %}event.list.table.author{% endtrans %}{% trans %}event.list.table.addedDate{% endtrans %}{% trans %}event.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.auteur }}{{ entity.addedDate|date(format) }} + {% trans %}event.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'event' } %} + + {% else %} +
    {% trans %}event.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadEventUpdated.html.twig b/CTRV/EventBundle/Resources/views/Event/loadEventUpdated.html.twig new file mode 100644 index 0000000..d637468 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadEventUpdated.html.twig @@ -0,0 +1,58 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}event.list.titlePublicEventUpdated{% endtrans %}

    +

    {% trans %}event.list.titleEventUpdatedAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    +
    + {% if entities is not empty %} + + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + + + {% endfor %} + +
    {% trans %}event.list.table.title{% endtrans %}{% trans %}event.list.table.description{% endtrans %}{% trans %}event.list.table.adresse{% endtrans %}{% trans %}event.list.table.duration{% endtrans %}{% trans %}event.list.table.author{% endtrans %}{% trans %}event.list.table.update_number{% endtrans %}{% trans %}event.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.duration }}{{ entity.auteur }} {{ update_per_event[entity.id]}} + {% trans %}event.list.table.view_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'eventUpdated' } %} + + {% else %} +
    {% trans %}event.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadPassedAgenda.html.twig b/CTRV/EventBundle/Resources/views/Event/loadPassedAgenda.html.twig new file mode 100644 index 0000000..5d25660 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadPassedAgenda.html.twig @@ -0,0 +1,64 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuAgenda.html.twig" %} + +
    + +

    {% trans %}agenda.list.titlePassed{% endtrans %}

    +

    {% trans %}agenda.list.titleAllAgendaPassedAt{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    +
    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + + {% endfor %} + +
    {% trans %}agenda.list.table.title{% endtrans %}{% trans %}agenda.list.table.description{% endtrans %}{% trans %}agenda.list.table.adresse{% endtrans %}{% trans %}agenda.list.table.author{% endtrans %}{% trans %}agenda.list.table.addedDate{% endtrans %}{% trans %}agenda.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.auteur }}{{ entity.addedDate|date(constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')) }} + {% trans %}agenda.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'agenda' } %} + + {% else%} +
    {% trans %}agenda.list.table.no_result{% endtrans %}
    + {% endif %} +
    +
    +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadTypeEvents.html.twig b/CTRV/EventBundle/Resources/views/Event/loadTypeEvents.html.twig new file mode 100644 index 0000000..5e58194 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadTypeEvents.html.twig @@ -0,0 +1,67 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}event.list.titleTypeEvent{% endtrans %}

    +
    {% trans %}event.menu.add{% endtrans %}

    + + +
    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}event.list.table.code{% endtrans %}{% trans %}event.list.table.label{% endtrans %}{% trans %}event.list.table.language{% endtrans %}{% trans %}event.list.table.img_url{% endtrans %}{% trans %}event.list.table.action{% endtrans %}
    {{ entity.code }}{{ entity.label }}{{ entity.language }} + {% trans %}event.list.table.delete_action{% endtrans %} + {% trans %}event.list.table.update_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'loadTypeEvents' } %} + + {% else%} +
    {% trans %}event.list.table.no_result{% endtrans %}
    + {% endif %} + +
    +
    +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/loadUpdatePerEvent.html.twig b/CTRV/EventBundle/Resources/views/Event/loadUpdatePerEvent.html.twig new file mode 100644 index 0000000..adacfc0 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/loadUpdatePerEvent.html.twig @@ -0,0 +1,89 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + {% if events is not empty %} + {% for entity in events %} +

    {% trans %}event.list.titleUpdatePerEvent{% endtrans %} : {{ entity.title }} " {{ entity.description }} "

    + {% endfor %} +

    {% trans %}event.list.LastValues{% endtrans %}


    + {% trans %}event.list.table.back_action{% endtrans %} + + + + + + + + + + + + + {% for entity in events %} + + + + + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')%} + + + {% endfor %} + +
    {% trans %}event.list.table.title{% endtrans %}{% trans %}event.list.table.description{% endtrans %}{% trans %}event.list.table.adresse{% endtrans %}{% trans %}event.list.table.duration{% endtrans %}{% trans %}event.list.table.author{% endtrans %}{% trans %}event.list.table.addedDate{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.duration}}{{ entity.auteur }}{{ entity.addedDate|date(format) }}
    +

    {% trans %}event.list.titleAllUpdate{% endtrans %} : {{ nb_entities }}


    +
    + + + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')%} + + + + {% endfor %} + +
    {% trans %}event.list.table.title{% endtrans %}{% trans %}event.list.table.description{% endtrans %}{% trans %}event.list.table.adresse{% endtrans %}{% trans %}event.list.table.duration{% endtrans %}{% trans %}event.list.table.author{% endtrans %}{% trans %}event.list.table.addedDate{% endtrans %}{% trans %}event.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.duration}}{{ entity.auteur }}{{ entity.addedDate|date(format) }} + {% trans %}event.list.table.validate_action{% endtrans %} + +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'event' } %} + + {% else %} +
    {% trans %}event.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/Event/updateEventType.html.twig b/CTRV/EventBundle/Resources/views/Event/updateEventType.html.twig new file mode 100644 index 0000000..5399f11 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/Event/updateEventType.html.twig @@ -0,0 +1,25 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}event.ajouterForm.titleUpdateEventType{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('event.ajouterForm.save','loadTypeEvents') }} +
    +
    +
    +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/EventComment/eventCommentAbuse.html.twig b/CTRV/EventBundle/Resources/views/EventComment/eventCommentAbuse.html.twig new file mode 100644 index 0000000..e176017 --- /dev/null +++ b/CTRV/EventBundle/Resources/views/EventComment/eventCommentAbuse.html.twig @@ -0,0 +1,53 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuEvent.html.twig" %} + +
    + +

    + + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + +
    Type de CommentaireContenuAction
    {{entity.entityType}}{{entity.content}} + Supprimer +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'utilisateur' } %} + + {% else%} +
    {% trans %}Aucun abus trouvé{% endtrans %}
    + {% endif %} +
    + +
    + + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/EventComment/loadAgendaComment.html.twig b/CTRV/EventBundle/Resources/views/EventComment/loadAgendaComment.html.twig new file mode 100644 index 0000000..57c60bf --- /dev/null +++ b/CTRV/EventBundle/Resources/views/EventComment/loadAgendaComment.html.twig @@ -0,0 +1,64 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuAgenda.html.twig" %} + +
    + +

    {% trans %}agendaComment.list.title{% endtrans %}

    +
    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}agendaComment.list.table.author{% endtrans %}{% trans %}agendaComment.list.table.content{% endtrans %}{% trans %}agendaComment.list.table.addedDate{% endtrans %}{% trans %}agendaComment.list.table.event{% endtrans %}{% trans %}agendaComment.list.table.action{% endtrans %}
    {{ entity['comment'].auteur }}{{ entity['comment'].content }}{{ entity['comment'].date|date(constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')) }}{{ entity['title'] }} + {% trans %}agendaComment.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'agendaComment' } %} + + {% else%} +
    {% trans %}agendaComment.list.table.no_result{% endtrans %}
    + {% endif %} +
    +
    + +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/EventComment/loadEventComment.html.twig b/CTRV/EventBundle/Resources/views/EventComment/loadEventComment.html.twig new file mode 100644 index 0000000..ea438ff --- /dev/null +++ b/CTRV/EventBundle/Resources/views/EventComment/loadEventComment.html.twig @@ -0,0 +1,63 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVEventBundle::menuEvent.html.twig" %} + +
    + +

    {% trans %}eventComment.list.title{% endtrans %}

    +
    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}eventComment.list.table.author{% endtrans %}{% trans %}eventComment.list.table.content{% endtrans %}{% trans %}eventComment.list.table.addedDate{% endtrans %}{% trans %}eventComment.list.table.event{% endtrans %}{% trans %}eventComment.list.table.action{% endtrans %}
    {{ entity['comment'].auteur }}{{ entity['comment'].content }}{{ entity['comment'].date|date(constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')) }}{{ entity['title'] }} + {% trans %}eventComment.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'eventComment' } %} + + {% else%} +
    {% trans %}eventComment.list.table.no_result{% endtrans %}
    + {% endif %} +
    +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/menuAgenda.html.twig b/CTRV/EventBundle/Resources/views/menuAgenda.html.twig new file mode 100644 index 0000000..9041f7d --- /dev/null +++ b/CTRV/EventBundle/Resources/views/menuAgenda.html.twig @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/CTRV/EventBundle/Resources/views/menuEvent.html.twig b/CTRV/EventBundle/Resources/views/menuEvent.html.twig new file mode 100644 index 0000000..c68055e --- /dev/null +++ b/CTRV/EventBundle/Resources/views/menuEvent.html.twig @@ -0,0 +1,10 @@ + + \ No newline at end of file diff --git a/CTRV/EventBundle/Service/EventService.php b/CTRV/EventBundle/Service/EventService.php new file mode 100644 index 0000000..78b2d72 --- /dev/null +++ b/CTRV/EventBundle/Service/EventService.php @@ -0,0 +1,56 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + /** + * retourne la lsite des événements de la ville courante + */ + public function getEvent($currentCity) { + $entities = $this->em->getRepository('CTRVEventBundle:Event') + ->getEvent($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + /** + * retourne la lsite des agendas de la ville courante + */ + public function getAgenda($currentCity) { + $entities = $this->em->getRepository('CTRVEventBundle:Event') + ->getAgenda($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + /** + * retourne la liste des types d'évenements + */ + public function getTypeEvents() { + $entities = $this->em->getRepository('CTRVEventBundle:EventType')->getTypeEvents(); + return $entities; + + } + } diff --git a/CTRV/FlowBundle/CTRVFlowBundle.php b/CTRV/FlowBundle/CTRVFlowBundle.php new file mode 100644 index 0000000..d17c003 --- /dev/null +++ b/CTRV/FlowBundle/CTRVFlowBundle.php @@ -0,0 +1,9 @@ +get('session_service')->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + //recupére l'ensemble des groupes existants + $groups = $this->getDoctrine()->getRepository('CTRVFlowBundle:GroupUser')->getGroup(); + //recupére l'ensemble des groupes de la ville courante + $groups_by_city = $this->getDoctrine()->getRepository('CTRVFlowBundle:GroupUser')->getGroupByCity($city); + // on crée un tableau + $tab = array(); + // On récupére le nombre de membres de chaque groupe pour le placer dans le tableau + foreach ($groups_by_city as $entity) { + $tab[$entity->getId()] = $this->getDoctrine()->getRepository('CTRVFlowBundle:GroupUser')->getGroupMemberNumber($entity); + } + + //pagination + $group_number = $this->getDoctrine()->getRepository('CTRVFlowBundle:GroupUser')->getGroupNumber(); + $nb_entities1 = $this->getDoctrine()->getRepository('CTRVFlowBundle:GroupUser')->getGroupByCityNumber($city); + $nb_entities_page = Constants::groupes_number_per_page; + $nb_pages = ceil($nb_entities1/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $groups_by_city = array_slice($groups_by_city, $offset,$nb_entities_page); + + return array ( + 'group_member'=>$tab, + 'entities' => $groups, + 'entities1' => $groups_by_city, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $group_number, + 'nb_entities1' => $nb_entities1, + 'city'=>$currentCity + ); + } + + /** + * Bloquer un groupe + * + * @Route("/block/{id}", name="groupe_block" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function blockAction ($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVFlowBundle:GroupUser')->find($id); + $entity->setIsBlocked("1"); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("groupe")); + } + /** + * Debloquer un groupe + * + * @Route("/deblock/{id}", name="groupe_deblock" ) //requirements={"id" = "\d+"} + * @Template() + */ + public function deblockAction ($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVFlowBundle:GroupUser')->find($id); + $entity->setIsBlocked("0"); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl("groupe")); + } + /** + * Deletes a groupe entity. + * + * @Route("/{id}/delete", name="groupe_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVFlowBundle:GroupUser')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } +} diff --git a/CTRV/FlowBundle/Controller/PublicMessageController.php b/CTRV/FlowBundle/Controller/PublicMessageController.php new file mode 100644 index 0000000..82e701b --- /dev/null +++ b/CTRV/FlowBundle/Controller/PublicMessageController.php @@ -0,0 +1,108 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //paginations + $nb_entities = $publicMessages = $this->getDoctrine()->getRepository('CTRVFlowBundle:PublicMessage')->getPublicMessageNumber($city); + $nb_entities_page = Constants::publicmessage_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $publicMessages = $this->getDoctrine()->getRepository('CTRVFlowBundle:PublicMessage')->getPublicMessage($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $publicMessages, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$currentCity + ); + } + + /** + * @Route("/publicMessageAbuse",name="publicMessageAbuse") + * @Template() + * Retourne la liste de tous les messages publics signalés de la ville courante + */ + public function publicMessageAbuseAction() { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //paginations + $nb_entities = $publicMessages = $this->getDoctrine()->getRepository('CTRVFlowBundle:PublicMessage')->getMessagePublicAbuseNumber($city); + $nb_entities_page = Constants::publicmessage_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $publicMessages = $this->getDoctrine()->getRepository('CTRVFlowBundle:PublicMessage')->getMessagePublicAbuse($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $publicMessages, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'city'=>$currentCity + ); + } + + /** + * Deletes an PublicMessage entity. + * + * @Route("/{id}/delete", name="publicmessage_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVFlowBundle:PublicMessage')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + + +} diff --git a/CTRV/FlowBundle/DependencyInjection/CTRVFlowExtension.php b/CTRV/FlowBundle/DependencyInjection/CTRVFlowExtension.php new file mode 100644 index 0000000..c669b45 --- /dev/null +++ b/CTRV/FlowBundle/DependencyInjection/CTRVFlowExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/CTRV/FlowBundle/DependencyInjection/Configuration.php b/CTRV/FlowBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..affd60c --- /dev/null +++ b/CTRV/FlowBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root('ctrv_flow'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/CTRV/FlowBundle/Entity/GroupMember.php b/CTRV/FlowBundle/Entity/GroupMember.php new file mode 100644 index 0000000..0ecefcd --- /dev/null +++ b/CTRV/FlowBundle/Entity/GroupMember.php @@ -0,0 +1,127 @@ +id; + } + + /** + * Set isAccepted + * + * @param boolean $isAccepted + * @return GroupMember + */ + public function setIsAccepted($isAccepted) + { + $this->isAccepted = $isAccepted; + + return $this; + } + + /** + * Get isAccepted + * + * @return boolean + */ + public function getIsAccepted() + { + return $this->isAccepted; + } + + /** + * Set groupUser + * + * @param CTRV\CommonBundle\Entity\GroupUser $groupUser + * @return GroupMember + */ + public function setGroupUser(GroupUser $groupUser = null) + { + $this->groupUser = $groupUser; + + return $this; + } + + /** + * Get groupUser + * + * @return CTRV\CommonBundle\Entity\GroupUser + */ + public function getGroupUser() + { + return $this->groupUser; + } + + /** + * Set member + * + * @param CTRV\CommonBundle\Entity\User $member + * @return GroupMember + */ + public function setMember(\CTRV\CommonBundle\Entity\User $member = null) + { + $this->member = $member; + + return $this; + } + + /** + * Get member + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getMember() + { + return $this->member; + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/GroupUser.php b/CTRV/FlowBundle/Entity/GroupUser.php new file mode 100644 index 0000000..dec42ac --- /dev/null +++ b/CTRV/FlowBundle/Entity/GroupUser.php @@ -0,0 +1,233 @@ +id; + } + + /** + * Set name + * + * @param string $name + * @return GroupUser + */ + public function setName($name) + { + $this->name = $name; + + return $this; + } + + /** + * Get name + * + * @return string + */ + public function getName() + { + return $this->name; + } + + /** + * Set description + * + * @param string $description + * @return GroupUser + */ + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + /** + * Get description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Set addedDate + * + * @param string $addedDate + * @return GroupUser + */ + public function setAddedDate($addedDate) + { + $this->addedDate = $addedDate; + + return $this; + } + + /** + * Get addedDate + * + * @return string + */ + public function getAddedDate() + { + return $this->addedDate; + } + + /** + * Set admin + * + * @param CTRV\CommonBundle\Entity\User $admin + * @return GroupUser + */ + public function setAdmin(\CTRV\CommonBundle\Entity\User $admin = null) + { + $this->admin = $admin; + + return $this; + } + + /** + * Get admin + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getAdmin() + { + return $this->admin; + } + /** + * Constructor + */ + public function __construct() + { + $this->pendingsPrivateGroupMessages = new \Doctrine\Common\Collections\ArrayCollection(); + } + + /** + * Add pendingsPrivateGroupMessages + * + * @param CTRV\FlowBundle\Entity\PendingPrivateMessage $pendingsPrivateGroupMessages + * @return GroupUser + */ + public function addPendingsPrivateGroupMessage(\CTRV\FlowBundle\Entity\PendingPrivateMessage $pendingsPrivateGroupMessages) + { + $this->pendingsPrivateGroupMessages[] = $pendingsPrivateGroupMessages; + + return $this; + } + + /** + * Remove pendingsPrivateGroupMessages + * + * @param CTRV\FlowBundle\Entity\PendingPrivateMessage $pendingsPrivateGroupMessages + */ + public function removePendingsPrivateGroupMessage(\CTRV\FlowBundle\Entity\PendingPrivateMessage $pendingsPrivateGroupMessages) + { + $this->pendingsPrivateGroupMessages->removeElement($pendingsPrivateGroupMessages); + } + + /** + * Get pendingsPrivateGroupMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getPendingsPrivateGroupMessages() + { + return $this->pendingsPrivateGroupMessages; + } + + /** + * Set isBlocked + * + * @param boolean $isBlocked + * @return GroupUser + */ + public function setIsBlocked($isBlocked) + { + $this->isBlocked = $isBlocked; + + return $this; + } + + /** + * Get isBlocked + * + * @return boolean + */ + public function getIsBlocked() + { + return $this->isBlocked; + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/GroupUserRepository.php b/CTRV/FlowBundle/Entity/GroupUserRepository.php new file mode 100644 index 0000000..52ee568 --- /dev/null +++ b/CTRV/FlowBundle/Entity/GroupUserRepository.php @@ -0,0 +1,95 @@ +createQueryBuilder("g") + ->select("count(g)") + ->where("g.admin is not null") + ->orderBy('g.addedDate', 'DESC') + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * retourne la liste de tous les groupes + */ + public function getGroup () { + $qb = $this->createQueryBuilder("g") + ->select('g') + ->where("g.admin is not null") + ->orderBy('g.addedDate', 'DESC') + ; + return $qb->getQuery()->getResult(); + } + +/** + * retourne la liste des groupes de la ville courante + */ + public function getGroupByCity ($city) { + $qb = $this->createQueryBuilder("g") + ->select('g') + ->from('CTRV\CommonBundle\Entity\User','gu') + ->where("g.admin=gu.userid") + ->andWhere("gu.city=?1") + ->orderBy('g.addedDate', 'DESC') + ->setParameter(1,$city) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre de groupes de la ville courante + */ + public function getGroupByCityNumber ($city) { + $qb = $this->createQueryBuilder("g") + ->select("count(g)") + ->from('CTRV\CommonBundle\Entity\User','gu') + ->where("g.admin=gu.userid") + ->andWhere("gu.city=?1") + ->orderBy('g.addedDate', 'DESC') + ->setParameter(1,$city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + +/** + * retourne la liste des membres du groupe spécifié + */ + public function getGroupMember ($id) { + $qb = $this->createQueryBuilder("g") + ->select('g') + ->from('CTRV\FlowBundle\Entity\GroupMember','gm') + ->where("g.id=?1") + ->andWhere("g.id=gm.groupUser") + ->orderBy('g.addedDate', 'DESC') + ->setParameter(1,$id) + ; + return $qb->getQuery()->getResult(); + } + + /** + * retourne le nombre de membres du groupe spécifié + */ + public function getGroupMemberNumber ($id) { + $qb = $this->createQueryBuilder("g") + ->select("count(g)") + ->from('CTRV\FlowBundle\Entity\GroupMember','gm') + ->where("g.id=?1") + ->andWhere("g.id=gm.groupUser") + ->orderBy('g.addedDate', 'DESC') + ->setParameter(1,$id) + ; + return $qb->getQuery()->getSingleScalarResult(); + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/MessageType.php b/CTRV/FlowBundle/Entity/MessageType.php new file mode 100644 index 0000000..08cd43b --- /dev/null +++ b/CTRV/FlowBundle/Entity/MessageType.php @@ -0,0 +1,64 @@ +id; + } + + /** + * Set label + * + * @param string $label + * @return MessageType + */ + public function setLabel($label) + { + $this->label = $label; + + return $this; + } + + /** + * Get label + * + * @return string + */ + public function getLabel() + { + return $this->label; + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/MessageTypeRepository.php b/CTRV/FlowBundle/Entity/MessageTypeRepository.php new file mode 100644 index 0000000..ac3fb76 --- /dev/null +++ b/CTRV/FlowBundle/Entity/MessageTypeRepository.php @@ -0,0 +1,15 @@ +id; + } + + /** + * Set senderUserid + * + * @param CTRV\CommonBundle\Entity\User $senderUserid + * @return PendingPrivateMessage + */ + public function setSenderUserid(\CTRV\CommonBundle\Entity\User $senderUserid = null) + { + $this->senderUserid = $senderUserid; + + return $this; + } + + /** + * Get senderUserid + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getSenderUserid() + { + return $this->senderUserid; + } + + /** + * Set receiverUserid + * + * @param CTRV\CommonBundle\Entity\User $receiverUserid + * @return PendingPrivateMessage + */ + public function setReceiverUserid(\CTRV\CommonBundle\Entity\User $receiverUserid = null) + { + $this->receiverUserid = $receiverUserid; + + return $this; + } + + /** + * Get receiverUserid + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getReceiverUserid() + { + return $this->receiverUserid; + } + + /** + * Set sender + * + * @param CTRV\CommonBundle\Entity\User $sender + * @return PendingPrivateMessage + */ + public function setSender(\CTRV\CommonBundle\Entity\User $sender = null) + { + $this->sender = $sender; + + return $this; + } + + /** + * Get sender + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getSender() + { + return $this->sender; + } + + /** + * Set receiver + * + * @param CTRV\CommonBundle\Entity\User $receiver + * @return PendingPrivateMessage + */ + public function setReceiver(\CTRV\CommonBundle\Entity\User $receiver = null) + { + $this->receiver = $receiver; + + return $this; + } + + /** + * Get receiver + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getReceiver() + { + return $this->receiver; + } + + + + + /** + * Set receiver_group + * + * @param CTRV\FlowBundle\Entity\GroupUser $receiverGroup + * @return PendingPrivateMessage + */ + public function setReceiverGroup(\CTRV\FlowBundle\Entity\GroupUser $receiverGroup = null) + { + $this->receiver_group = $receiverGroup; + + return $this; + } + + /** + * Get receiver_group + * + * @return CTRV\FlowBundle\Entity\GroupUser + */ + public function getReceiverGroup() + { + return $this->receiver_group; + } + + /** + * Set private_message + * + * @param CTRV\FlowBundle\Entity\PrivateMessage $privateMessage + * @return PendingPrivateMessage + */ + public function setPrivateMessage(\CTRV\FlowBundle\Entity\PrivateMessage $privateMessage = null) + { + $this->private_message = $privateMessage; + + return $this; + } + + /** + * Get private_message + * + * @return CTRV\FlowBundle\Entity\PrivateMessage + */ + public function getPrivateMessage() + { + return $this->private_message; + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/PrivateMessage.php b/CTRV/FlowBundle/Entity/PrivateMessage.php new file mode 100644 index 0000000..727d255 --- /dev/null +++ b/CTRV/FlowBundle/Entity/PrivateMessage.php @@ -0,0 +1,476 @@ +id; + } + + /** + * Set date + * + * @param string $date + * @return PrivateMessage + */ + public function setDate($date) + { + $this->date = $date; + + return $this; + } + + /** + * Get date + * + * @return string + */ + public function getDate() + { + return $this->date; + } + + /** + * Set content + * + * @param string $content + * @return PrivateMessage + */ + public function setContent($content) + { + $this->content = $content; + + return $this; + } + + /** + * Get content + * + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * Set senderStock + * + * @param boolean $senderStock + * @return PrivateMessage + */ + public function setSenderStock($senderStock) + { + $this->senderStock = $senderStock; + + return $this; + } + + /** + * Get senderStock + * + * @return boolean + */ + public function getSenderStock() + { + return $this->senderStock; + } + + /** + * Set receiverStock + * + * @param boolean $receiverStock + * @return PrivateMessage + */ + public function setReceiverStock($receiverStock) + { + $this->receiverStock = $receiverStock; + + return $this; + } + + /** + * Get receiverStock + * + * @return boolean + */ + public function getReceiverStock() + { + return $this->receiverStock; + } + + /** + * Set isDemand + * + * @param boolean $isDemand + * @return PrivateMessage + */ + public function setIsDemand($isDemand) + { + $this->isDemand = $isDemand; + + return $this; + } + + /** + * Get isDemand + * + * @return boolean + */ + public function getIsDemand() + { + return $this->isDemand; + } + + /** + * Set isRequestGroup + * + * @param boolean $isRequestGroup + * @return PrivateMessage + */ + public function setIsRequestGroup($isRequestGroup) + { + $this->isRequestGroup = $isRequestGroup; + + return $this; + } + + /** + * Get isRequestGroup + * + * @return boolean + */ + public function getIsRequestGroup() + { + return $this->isRequestGroup; + } + + /** + * Set isRequestGroupFromUser + * + * @param boolean $isRequestGroupFromUser + * @return PrivateMessage + */ + public function setIsRequestGroupFromUser($isRequestGroupFromUser) + { + $this->isRequestGroupFromUser = $isRequestGroupFromUser; + + return $this; + } + + /** + * Get isRequestGroupFromUser + * + * @return boolean + */ + public function getIsRequestGroupFromUser() + { + return $this->isRequestGroupFromUser; + } + + /** + * Set groupId + * + * @param integer $groupId + * @return PrivateMessage + */ + public function setGroupId($groupId) + { + $this->groupId = $groupId; + + return $this; + } + + /** + * Get groupId + * + * @return integer + */ + public function getGroupId() + { + return $this->groupId; + } + + /** + * Set sender + * + * @param CTRV\CommonBundle\Entity\User $sender + * @return PrivateMessage + */ + public function setSender(\CTRV\CommonBundle\Entity\User $sender = null) + { + $this->sender = $sender; + + return $this; + } + + /** + * Get sender + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getSender() + { + return $this->sender; + } + + /** + * Set receiver + * + * @param CTRV\CommonBundle\Entity\User $receiver + * @return PrivateMessage + */ + public function setReceiver(\CTRV\CommonBundle\Entity\User $receiver = null) + { + $this->receiver = $receiver; + + return $this; + } + + /** + * Get receiver + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getReceiver() + { + return $this->receiver; + } + + /** + * Set isGroupMessage + * + * @param boolean $isGroupMessage + * @return PrivateMessage + */ + public function setIsGroupMessage($isGroupMessage) + { + $this->isGroupMessage = $isGroupMessage; + + return $this; + } + + /** + * Get isGroupMessage + * + * @return boolean + */ + public function getIsGroupMessage() + { + return $this->isGroupMessage; + } + + /** + * Set agendaEventId + * + * @param integer $agendaEventId + * @return PrivateMessage + */ + public function setAgendaEventId($agendaEventId) + { + $this->agendaEventId = $agendaEventId; + + return $this; + } + + /** + * Get agendaEventId + * + * @return integer + */ + public function getAgendaEventId() + { + return $this->agendaEventId; + } + + /** + * Set type_item + * + * @param string $typeItem + * @return PrivateMessage + */ + public function setTypeItem($typeItem) + { + $this->type_item = $typeItem; + + return $this; + } + + /** + * Get type_item + * + * @return string + */ + public function getTypeItem() + { + return $this->type_item; + } + + /** + * Set messageType + * + * @param CTRV\FlowBundle\Entity\MessageType $messageType + * @return PrivateMessage + */ + public function setMessageType(\CTRV\FlowBundle\Entity\MessageType $messageType = null) + { + $this->messageType = $messageType; + + return $this; + } + + /** + * Get messageType + * + * @return CTRV\FlowBundle\Entity\MessageType + */ + public function getMessageType() + { + return $this->messageType; + } + + /** + * Set idItem + * + * @param integer $idItem + * @return PrivateMessage + */ + public function setIdItem($idItem) + { + $this->idItem = $idItem; + + return $this; + } + + /** + * Get idItem + * + * @return integer + */ + public function getIdItem() + { + return $this->idItem; + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/PublicMessage.php b/CTRV/FlowBundle/Entity/PublicMessage.php new file mode 100644 index 0000000..4f42515 --- /dev/null +++ b/CTRV/FlowBundle/Entity/PublicMessage.php @@ -0,0 +1,293 @@ +id; + } + + /** + * Set date + * + * @param string $date + * @return PublicMessage + */ + public function setDate($date) + { + $this->date = $date; + + return $this; + } + + /** + * Get date + * + * @return string + */ + public function getDate() + { + return $this->date; + } + + /** + * Set content + * + * @param string $content + * @return PublicMessage + */ + public function setContent($content) + { + $this->content = $content; + + return $this; + } + + /** + * Get content + * + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * Set isDeleted + * + * @param boolean $isDeleted + * @return PublicMessage + */ + public function setIsDeleted($isDeleted) + { + $this->isDeleted = $isDeleted; + + return $this; + } + + /** + * Get isDeleted + * + * @return boolean + */ + public function getIsDeleted() + { + return $this->isDeleted; + } + + /** + * Set sender + * + * @param CTRV\CommonBundle\Entity\User $sender + * @return PublicMessage + */ + public function setSender(\CTRV\CommonBundle\Entity\User $sender = null) + { + $this->sender = $sender; + + return $this; + } + + /** + * Get sender + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getSender() + { + return $this->sender; + } + + /** + * Set city + * + * @param CTRV\CommonBundle\Entity\City $city + * @return PublicMessage + */ + public function setCity(\CTRV\CommonBundle\Entity\City $city = null) + { + $this->city = $city; + + return $this; + } + + /** + * Get city + * + * @return CTRV\CommonBundle\Entity\City + */ + public function getCity() + { + return $this->city; + } + /** + * Constructor + */ + public function __construct() + { + $this->childrenMessages = new \Doctrine\Common\Collections\ArrayCollection(); + } + + /** + * Set answeredId + * + * @param CTRV\FlowBundle\Entity\PublicMessage $answeredId + * @return PublicMessage + */ + public function setAnsweredId(\CTRV\FlowBundle\Entity\PublicMessage $answeredId = null) + { + $this->answeredId = $answeredId; + + return $this; + } + + /** + * Get answeredId + * + * @return CTRV\FlowBundle\Entity\PublicMessage + */ + public function getAnsweredId() + { + return $this->answeredId; + } + + /** + * Add childrenMessages + * + * @param CTRV\FlowBundle\Entity\PublicMessage $childrenMessages + * @return PublicMessage + */ + public function addChildrenMessage(\CTRV\FlowBundle\Entity\PublicMessage $childrenMessages) + { + $this->childrenMessages[] = $childrenMessages; + + return $this; + } + + /** + * Remove childrenMessages + * + * @param CTRV\FlowBundle\Entity\PublicMessage $childrenMessages + */ + public function removeChildrenMessage(\CTRV\FlowBundle\Entity\PublicMessage $childrenMessages) + { + $this->childrenMessages->removeElement($childrenMessages); + } + + /** + * Get childrenMessages + * + * @return Doctrine\Common\Collections\Collection + */ + public function getChildrenMessages() + { + return $this->childrenMessages; + } + + /** + * Set parentMessage + * + * @param CTRV\FlowBundle\Entity\PublicMessage $parentMessage + * @return PublicMessage + */ + public function setParentMessage(\CTRV\FlowBundle\Entity\PublicMessage $parentMessage = null) + { + $this->parentMessage = $parentMessage; + + return $this; + } + + /** + * Get parentMessage + * + * @return CTRV\FlowBundle\Entity\PublicMessage + */ + public function getParentMessage() + { + return $this->parentMessage; + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Entity/PublicMessageRepository.php b/CTRV/FlowBundle/Entity/PublicMessageRepository.php new file mode 100644 index 0000000..6a8c0ff --- /dev/null +++ b/CTRV/FlowBundle/Entity/PublicMessageRepository.php @@ -0,0 +1,75 @@ +createQueryBuilder("pm") + ->where("pm.sender is not null") + ->andWhere("pm.city=?1") + ->orderBy('pm.date', 'DESC') + ->setParameter(1, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + + /** + * Retourne le nombre de Messages Publics de la ville courante + */ + public function getPublicMessageNumber ($city) { + $qb = $this->createQueryBuilder("pm") + ->select("count(pm)") + ->where("pm.sender is not null") + ->andWhere("pm.city=?1") + ->orderBy('pm.date', 'DESC') + ->setParameter(1, $city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne la liste de tous les messages publics signalés + */ + public function getMessagePublicAbuse($city, $first, $last) { + $qb= $this->createQueryBuilder("pm") + ->select("a.entityType, pm.content, pm.date, pm.id") + ->from('CTRV\CommonBundle\Entity\Abuse','a') + ->where("a.entityId=pm.id") + ->orderBy("a.id","desc") + ->setFirstResult($first) + ->setMaxResults($last) + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre de messages publics signalés + */ + public function getMessagePublicAbuseNumber($city) { + $qb= $this->createQueryBuilder("pm") + ->select("count(DISTINCT pm.id)") + ->from('CTRV\CommonBundle\Entity\Abuse','a') + ->where("a.entityId=pm.id") + ->orderBy("a.id","desc") + ->groupBy('a.entityId') + ; + + return $qb->getQuery()->getSingleScalarResult(); + } +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/config/services.yml b/CTRV/FlowBundle/Resources/config/services.yml new file mode 100644 index 0000000..e154393 --- /dev/null +++ b/CTRV/FlowBundle/Resources/config/services.yml @@ -0,0 +1,8 @@ +services: + publicMessage_service: + class: CTRV\FlowBundle\Service\PublicMessageService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + groupe_service: + class: CTRV\FlowBundle\Service\GroupeService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] + \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/doc/index.rst b/CTRV/FlowBundle/Resources/doc/index.rst new file mode 100644 index 0000000..e69de29 diff --git a/CTRV/FlowBundle/Resources/public/js/groupUser.js b/CTRV/FlowBundle/Resources/public/js/groupUser.js new file mode 100644 index 0000000..da53280 --- /dev/null +++ b/CTRV/FlowBundle/Resources/public/js/groupUser.js @@ -0,0 +1,32 @@ +/** + * Retourne la liste des Groupes selon la page spécifié + */ +function loadGroupe (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un groupe + */ +function deleteGroupe (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/public/js/publicMessage.js b/CTRV/FlowBundle/Resources/public/js/publicMessage.js new file mode 100644 index 0000000..1d37197 --- /dev/null +++ b/CTRV/FlowBundle/Resources/public/js/publicMessage.js @@ -0,0 +1,32 @@ +/** + * Retourne la liste des publicMessage selon la page spécifié + */ +function loadPublicMessage (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + +/** + * Supprime un publicMessage + */ +function deletePublicMessage (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/translations/messages.fr.yml b/CTRV/FlowBundle/Resources/translations/messages.fr.yml new file mode 100644 index 0000000..cf39dc1 --- /dev/null +++ b/CTRV/FlowBundle/Resources/translations/messages.fr.yml @@ -0,0 +1,38 @@ +publicMessage: + menu: + afficher: Gestion des Messages publics + + + list: + title: Gestion des Messages publics + table: + content: Contenu + description: Description + adresse: Adresse + author: Auteur + addedDate: Date d'ajout + action: Actions + delete_action: Supprimer + no_result: Aucun message public trouvé + numberPublicMessage: Nombre de message publics à +groupe: + menu: + afficher: Groupes + + + list: + title: Liste des groupes de + title1: Nombre total de groupes + title2 : Nombre total de groupes de la ville courante + table: + noms: Noms + description: Descriptions + addedDate: Date d'ajout + membre : Nombre de Membres + login : Login Administrateur + action: Actions + delete_action: Supprimer + block_action: Bloquer + deblock_action: Débloquer + no_result: Aucun groupe trouvé + \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/views/Groupe/loadGroup.html.twig b/CTRV/FlowBundle/Resources/views/Groupe/loadGroup.html.twig new file mode 100644 index 0000000..a1b8575 --- /dev/null +++ b/CTRV/FlowBundle/Resources/views/Groupe/loadGroup.html.twig @@ -0,0 +1,73 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVFlowBundle::menu.html.twig" %} + +
    + +

    {% trans %}groupe.list.title{% endtrans %} {{ city|capitalize }}

    +

    {% trans %}groupe.list.title1{% endtrans %} : {{ nb_entities }}


    +

    {% trans %}groupe.list.title2{% endtrans %} : {{ nb_entities1 }}


    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities1 %} + + + + + + + + + {% endfor %} + +
    {% trans %}groupe.list.table.noms{% endtrans %}{% trans %}groupe.list.table.description{% endtrans %}{% trans %}groupe.list.table.login{% endtrans %}{% trans %}groupe.list.table.membre{% endtrans %}{% trans %}groupe.list.table.action{% endtrans %}
    {{ entity.name }}{{ entity.description }}{{ entity.admin }} {{ group_member[entity.id]}} + {% trans %}groupe.list.table.delete_action{% endtrans %} + {% if entity.isBlocked == "0" %} + {% trans %}groupe.list.table.block_action{% endtrans %} + {% else %} + {% trans %}groupe.list.table.deblock_action{% endtrans %} + {% endif %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'groupe' } %} + + {% else%} +
    {% trans %}groupe.list.table.no_result{% endtrans %}
    + {% endif %} + +
    +
    + + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/views/PublicMessage/index.html.twig b/CTRV/FlowBundle/Resources/views/PublicMessage/index.html.twig new file mode 100644 index 0000000..9600d19 --- /dev/null +++ b/CTRV/FlowBundle/Resources/views/PublicMessage/index.html.twig @@ -0,0 +1,22 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVFlowBundle:PublicMessage:menuPublicMessage.html.twig" %} + +
    + +

    {% trans %}publicMessage.list.title{% endtrans %}

    + +
    + +
    + + + + +{% endblock body %} diff --git a/CTRV/FlowBundle/Resources/views/PublicMessage/loadPublicMessage.html.twig b/CTRV/FlowBundle/Resources/views/PublicMessage/loadPublicMessage.html.twig new file mode 100644 index 0000000..9ff2cd9 --- /dev/null +++ b/CTRV/FlowBundle/Resources/views/PublicMessage/loadPublicMessage.html.twig @@ -0,0 +1,61 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVFlowBundle::menu.html.twig" %} + +
    + +

    {% trans %}publicMessage.list.title{% endtrans %}

    +

    {% trans %}publicMessage.list.numberPublicMessage{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    + {% if entities is not empty %} + + + + + + + + + + {% for entity in entities %} + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT') %} + + + + {% endfor %} + +
    {% trans %}publicMessage.list.table.content{% endtrans %}{% trans %}publicMessage.list.table.addedDate{% endtrans %}{% trans %}publicMessage.list.table.action{% endtrans %}
    {{ entity.content }}{{ entity.Date|date(format) }} + {% trans %}publicMessage.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'publicMessage' } %} + + {% else%} +
    {% trans %}publicMessage.list.table.no_result{% endtrans %}
    + {% endif %} + +
    +
    + + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/views/PublicMessage/publicMessageAbuse.html.twig b/CTRV/FlowBundle/Resources/views/PublicMessage/publicMessageAbuse.html.twig new file mode 100644 index 0000000..38b70f7 --- /dev/null +++ b/CTRV/FlowBundle/Resources/views/PublicMessage/publicMessageAbuse.html.twig @@ -0,0 +1,61 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVCommonBundle::menuAbus.html.twig" %} + +
    + +

    {% trans %}abus.list.titlePublicMessage{% endtrans %}

    +

    {% trans %}abus.list.numberPublicMessage{% endtrans %} {{ city|capitalize }} : {{ nb_entities }}


    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + +
    {% trans %}abus.list.table.type{% endtrans %}{% trans %}abus.list.table.content{% endtrans %}{% trans %}abus.list.table.action{% endtrans %}
    {{entity.entityType}}{{entity.content}} + {% trans %}abus.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'publicMessageAbuse' } %} + + {% else%} +
    {% trans %}abus.list.table.no_result{% endtrans %}
    + {% endif %} +
    + +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/FlowBundle/Resources/views/menu.html.twig b/CTRV/FlowBundle/Resources/views/menu.html.twig new file mode 100644 index 0000000..1508746 --- /dev/null +++ b/CTRV/FlowBundle/Resources/views/menu.html.twig @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/CTRV/FlowBundle/Service/GroupeService.php b/CTRV/FlowBundle/Service/GroupeService.php new file mode 100644 index 0000000..5153215 --- /dev/null +++ b/CTRV/FlowBundle/Service/GroupeService.php @@ -0,0 +1,52 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } +/** + * retourne la liste de tous les groupes + */ + public function getGroup() { + $entities = $this->em->getRepository('CTRVFlowBundle:GroupUser')->getGroup(); + return $entities; + } + /** + * retourne la liste des groupes de la ville courante + */ + public function getGroupByCity($currentCity) { + $entities = $this->em->getRepository('CTRVFlowBundle:GroupUser') + ->getGroupByCity($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } +/** + * retourne la liste des membres du groupe spécifié + */ + public function getGroupMember($group_user) { + $entities = $this->em->getRepository('CTRVFlowBundle:GroupMember')->findByGroupUser($group_user); + return $entities; + } +} diff --git a/CTRV/FlowBundle/Service/PublicMessageService.php b/CTRV/FlowBundle/Service/PublicMessageService.php new file mode 100644 index 0000000..9b95016 --- /dev/null +++ b/CTRV/FlowBundle/Service/PublicMessageService.php @@ -0,0 +1,58 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } +/** + * retoune la liste des messages publics de la ville courante + */ + public function getPublicMessage($currentCity) { + $entities = $this->em->getRepository('CTRVFlowBundle:PublicMessage') + ->getPublicMessage($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + /** + * Retourne la liste des types de mails + * @return unknown + */ + public function getTypeMails() { + $entities = $this->em->getRepository('CTRVMailBundle:MailType')->getTypeMails(); + return $entities; + + } + /** + * retourne la liste des messages publics signalés de la ville courante + * @return unknown + */ + public function getMessagePublicAbuse($currentCity) { + $entities = $this->em->getRepository('CTRVFlowBundle:PublicMessage') + ->getMessagePublicAbuse($this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } +} diff --git a/CTRV/MailBundle/CTRVMailBundle.php b/CTRV/MailBundle/CTRVMailBundle.php new file mode 100644 index 0000000..13d6ae5 --- /dev/null +++ b/CTRV/MailBundle/CTRVMailBundle.php @@ -0,0 +1,9 @@ +getDoctrine()->getEntityManager()->getRepository("CTRVMailBundle:MailTemplate")->findAll(); + return array("entities"=>$entities); + } + + /** + * @Route("/send",name="send_mail") + * @Template() + */ + public function sendMailAction() { + + $form = $this->createForm(new MailTemplateType()); + $form1 = $this->createForm(new SendMailType()); + if( $this->get('request')->getMethod() == 'POST' ) { + $form1->bind($this->get('request')); + $form->bind($this->get('request')); + + if ( $form->isValid() ) { + + $mailTemplate = $form->getData(); + $this->getDoctrine()->getEntityManager()->persist($mailTemplate); + $this->getDoctrine()->getEntityManager()->flush(); + + return $this->redirect($this->generateUrl("mail")); + } + $message = \Swift_Message::newInstance(); + + if ($form1->isValid()){ + + $message->setSubject("Objet"); + $message->setFrom('cndiaye@iota-it.com'); + $message->setTo('ahmedtijane@gmail.com'); + $message->setBody('Hello world'); + $this->get('mailer')->send($message); + + return $this->redirect($this->generateUrl("send_mail")); + } + } + return array( + 'form'=>$form->createView(), + 'form1'=>$form1->createView() + ); + } + + + /** + * Ajouter, sauvegarder un mail template + * @Route("/mailTemplate/add",name="add_mail") + * @Template() + */ + public function addMailTemplateAction() { + + $form = $this->createForm(new MailTemplateType()); + + if( $this->get('request')->getMethod() == 'POST' ) { + + $form->bind($this->get('request')); + + if ( $form->isValid() ) { + + $mailTemplate = $form->getData(); + $this->getDoctrine()->getEntityManager()->persist($mailTemplate); + $this->getDoctrine()->getEntityManager()->flush(); + + return $this->redirect($this->generateUrl("mail")); + } + } + return array('form'=>$form->createView()); + } + + /** + * Editer puis sauvegarder un mail template + * @Route("/mailTemplate/edit/{id}",name="edit_mail") + * @Template() + */ + public function editMailTemplateAction (MailTemplate $mailTemplate) { + + $form = $this->createForm(new MailTemplateType,$mailTemplate); + + if( $this->get('request')->getMethod() == 'POST' ) { + + $form->bind($this->get('request')); + + if ( $form->isValid() ) { + + $data = $form->getData(); + + $mailTemplate->setContent($data->getContent()); + $mailTemplate->setSubject($data->getSubject()); + $mailTemplate->setMailType($data->getMailType()); + + $this->getDoctrine()->getEntityManager()->persist($mailTemplate); + $this->getDoctrine()->getEntityManager()->flush(); + + return $this->redirect($this->generateUrl("mail")); + } + } + + return array('form'=>$form->createView()); + } + + /** + * Charger les type de mail + * @Route("/loadTypeMails", name="loadTypeMails") + * @Template() + */ + public function loadTypeMailsAction () { + + $em = $this->getDoctrine()->getEntityManager(); + $currentCity = $this->get('session_service')->getCity(); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = $this->getRequest()->get("page",1); + $entities = $this->get("mail_service")->getTypeMails(); + + //pagination + $nb_entities = count($entities); + $nb_entities_page = Constants::mailstype_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $entities = array_slice($entities, $offset,$nb_entities_page); + + return array ( + 'entities' => $entities, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * ajouter un nouveau type de mail + * @Route("/addTypeMail",name="addType_mail") + * @Template() + */ + public function addTypeMailAction () { + $em = $this->getDoctrine()->getEntityManager(); + $form = $this->createForm(new MailTypeType(),new MailType()); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $mailType dans la base de données + $mailType = $form->getData(); + $em->persist($mailType); + $em->flush(); + // on redirige vers la liste des types de mails + return $this->redirect($this->generateUrl("loadTypeMails")); + } + } + + + return array('form'=>$form->createView()); + + } + + + + +/** + * modifier un type de mail + * @Route("/edit/{id}",name="editType_mail") + * @Template() + */ + public function editTypeMailAction (MailType $mailType) { + $form = $this->createForm(new MailTypeType, $mailType); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $mailType dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($mailType); + $em->flush(); + // on redirige vers les types de place + return $this->redirect($this->generateUrl("loadTypeMails")); + } + + } + + + return array( + 'mailType'=> $mailType, + 'form'=>$form->createView()); + +} +/** + * Deletes a MailType entity. + * + * @Route("/{id}/deleteType", name="mailType_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ +public function deleteMailTypeAction($id) { + + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVMailBundle:MailType')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); +} +} diff --git a/CTRV/MailBundle/DependencyInjection/CTRVMailExtension.php b/CTRV/MailBundle/DependencyInjection/CTRVMailExtension.php new file mode 100644 index 0000000..68d38e6 --- /dev/null +++ b/CTRV/MailBundle/DependencyInjection/CTRVMailExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/CTRV/MailBundle/DependencyInjection/Configuration.php b/CTRV/MailBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..6ce1aff --- /dev/null +++ b/CTRV/MailBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root('ctrv_mail'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/CTRV/MailBundle/Entity/MailTemplate.php b/CTRV/MailBundle/Entity/MailTemplate.php new file mode 100644 index 0000000..bc5cc68 --- /dev/null +++ b/CTRV/MailBundle/Entity/MailTemplate.php @@ -0,0 +1,181 @@ +id; + } + + /** + * Set sender + * + * @param string $sender + * @return MailTemplate + */ + public function setSender($sender) + { + $this->sender = $sender; + + return $this; + } + + /** + * Get sender + * + * @return string + */ + public function getSender() + { + return $this->sender; + } + + /** + * Set receiver + * + * @param string $receiver + * @return MailTemplate + */ + public function setReceiver($receiver) + { + $this->receiver = $receiver; + + return $this; + } + + /** + * Get receiver + * + * @return string + */ + public function getReceiver() + { + return $this->receiver; + } + + /** + * Set subject + * + * @param string $subject + * @return MailTemplate + */ + public function setSubject($subject) + { + $this->subject = $subject; + + return $this; + } + + /** + * Get subject + * + * @return string + */ + public function getSubject() + { + return $this->subject; + } + + /** + * Set content + * + * @param string $content + * @return MailTemplate + */ + public function setContent($content) + { + $this->content = $content; + + return $this; + } + + /** + * Get content + * + * @return string + */ + public function getContent() + { + return $this->content; + } + + /** + * Set mailType + * + * @param CTRV\MailBundle\Entity\MailType $mailType + * @return MailTemplate + */ + public function setMailType(\CTRV\MailBundle\Entity\MailType $mailType = null) + { + $this->mailType = $mailType; + + return $this; + } + + /** + * Get mailType + * + * @return CTRV\MailBundle\Entity\MailType + */ + public function getMailType() + { + return $this->mailType; + } +} \ No newline at end of file diff --git a/CTRV/MailBundle/Entity/MailTemplateRepository.php b/CTRV/MailBundle/Entity/MailTemplateRepository.php new file mode 100644 index 0000000..927a43d --- /dev/null +++ b/CTRV/MailBundle/Entity/MailTemplateRepository.php @@ -0,0 +1,15 @@ +id; + } + + /** + * Set code + * + * @param string $code + * @return MailType + */ + public function setCode($code) + { + $this->code = $code; + + return $this; + } + + /** + * Get code + * + * @return string + */ + public function getCode() + { + return $this->code; + } + + public function __toString() { + return $this->code; + } +} \ No newline at end of file diff --git a/CTRV/MailBundle/Entity/MailTypeRepository.php b/CTRV/MailBundle/Entity/MailTypeRepository.php new file mode 100644 index 0000000..ef015cd --- /dev/null +++ b/CTRV/MailBundle/Entity/MailTypeRepository.php @@ -0,0 +1,25 @@ +createQueryBuilder("p") + ->orderBy('p.code','ASC') + ; + return $qb->getQuery()->getResult(); + } +} diff --git a/CTRV/MailBundle/Form/MailTemplateType.php b/CTRV/MailBundle/Form/MailTemplateType.php new file mode 100644 index 0000000..bdcc56a --- /dev/null +++ b/CTRV/MailBundle/Form/MailTemplateType.php @@ -0,0 +1,31 @@ +add('mailType',null,array('label'=>'mail.form.type')) + ->add('subject',null,array('label'=>'mail.form.subject')) + ->add('content',null,array('label'=>'mail.form.content')) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\MailBundle\Entity\MailTemplate' + )); + } + + public function getName() + { + return 'ctrv_mailbundle_mailtemplatetype'; + } +} diff --git a/CTRV/MailBundle/Form/MailTypeType.php b/CTRV/MailBundle/Form/MailTypeType.php new file mode 100644 index 0000000..845864b --- /dev/null +++ b/CTRV/MailBundle/Form/MailTypeType.php @@ -0,0 +1,30 @@ +add('code','text',array('label'=>'mail.form.code')) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\MailBundle\Entity\MailType' + )); + } + + public function getName() + { + return 'ctrv_mailbundle_mailtypetype'; + } +} diff --git a/CTRV/MailBundle/Form/SendMailType.php b/CTRV/MailBundle/Form/SendMailType.php new file mode 100644 index 0000000..59718c3 --- /dev/null +++ b/CTRV/MailBundle/Form/SendMailType.php @@ -0,0 +1,27 @@ +add('mailType',null,array('label'=>'mail.form.type')) + ->add('subject',null,array('label'=>'mail.form.subject')) + ->add('content',null,array('label'=>'mail.form.content')) + ->add('destChoice','checkbox',array('label'=>'mail.sendMailform.destChoice1')) + ->add('destField','textarea',array ('label'=>'mail.sendMailform.destPersonalised')) + ; + } + + public function getName() + { + return 'ctrv_mailbundle_sendMailtemplatetype'; + } +} diff --git a/CTRV/MailBundle/Resources/config/services.yml b/CTRV/MailBundle/Resources/config/services.yml new file mode 100644 index 0000000..ac3157c --- /dev/null +++ b/CTRV/MailBundle/Resources/config/services.yml @@ -0,0 +1,4 @@ +services: + mail_service: + class: CTRV\FlowBundle\Service\PublicMessageService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] \ No newline at end of file diff --git a/CTRV/MailBundle/Resources/doc/index.rst b/CTRV/MailBundle/Resources/doc/index.rst new file mode 100644 index 0000000..e69de29 diff --git a/CTRV/MailBundle/Resources/public/js/mail.js b/CTRV/MailBundle/Resources/public/js/mail.js new file mode 100644 index 0000000..5d39b78 --- /dev/null +++ b/CTRV/MailBundle/Resources/public/js/mail.js @@ -0,0 +1,47 @@ +/** + * Retourne la liste des mails + * + */ +function loadMails (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} +/** + * Supprime un mail + */ +function deleteMail (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} +/** + * Supprime un type de mail + */ +function deleteMailType (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/MailBundle/Resources/translations/messages.fr.yml b/CTRV/MailBundle/Resources/translations/messages.fr.yml new file mode 100644 index 0000000..4a15564 --- /dev/null +++ b/CTRV/MailBundle/Resources/translations/messages.fr.yml @@ -0,0 +1,46 @@ +mail: + menu: + template: Templates de mail + send: Envoyer un email + add: Ajouter un template + type: Types de mail + addType: Ajouter + form: + titleUpdateTypeMail: Modifier un type de mail + titleAddTypeMail : Ajouter un type de mail + subject: Sujet + content: Contenu + type: Type de mail + code : Code + submit: Sauvegarder + list: + title: Liste des mails template + titleTypeMail: Liste des types de mail + table: + action: Action + subject: Sujet + content: Contenu + type: Type + code : Code + delete_action: Supprimer + edit_action: Modifier + no_result : Aucun template de mail trouvé + no_type_result: Aucun type de mail trouvé + addMailTemplate: + title: Ajouter un mail template + editMailTemplate: + title: Modifier un mail template + sendMailTemplate: + title: Envoi de mails + MultipleChoiceTitle : Choix destinataires multiples + suggestion : Parametre d'email disponible + sendMailform : + type: Type de Mail + subject : Sujet + content : Contenu + destChoice1 : Tous les utilisateurs + destChoice2 : Tous les utilisateurs de la ville courante + destChoice3 : Tous les professionnels de la ville courante + destPersonalised : Destinataires personnalisés (séparés par des ";") + send : Envoyer + submit : Sauvegarder comme modéle \ No newline at end of file diff --git a/CTRV/MailBundle/Resources/translations/validators.fr.yml b/CTRV/MailBundle/Resources/translations/validators.fr.yml new file mode 100644 index 0000000..2fb84d0 --- /dev/null +++ b/CTRV/MailBundle/Resources/translations/validators.fr.yml @@ -0,0 +1,6 @@ +mailTemplate: + addEdit: + form: + mail_type_already_exist: Ce type de mail existe déjà + + diff --git a/CTRV/MailBundle/Resources/views/Mail/addMailTemplate.html.twig b/CTRV/MailBundle/Resources/views/Mail/addMailTemplate.html.twig new file mode 100644 index 0000000..35d7b03 --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/addMailTemplate.html.twig @@ -0,0 +1,23 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} + +
    + +

    {% trans %}mail.addMailTemplate.title{% endtrans %}

    + +
    + {{ form_widget(form) }} + {{ forms.input('mail.form.submit','mail') }} +
    + +
    + +
    + +{% endblock body %} diff --git a/CTRV/MailBundle/Resources/views/Mail/addTypeMail.html.twig b/CTRV/MailBundle/Resources/views/Mail/addTypeMail.html.twig new file mode 100644 index 0000000..e2cba06 --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/addTypeMail.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} + +
    + +

    {% trans %}mail.form.titleAddTypeMail{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('mail.form.submit','loadTypeMails') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/MailBundle/Resources/views/Mail/editMailTemplate.html.twig b/CTRV/MailBundle/Resources/views/Mail/editMailTemplate.html.twig new file mode 100644 index 0000000..5c78f74 --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/editMailTemplate.html.twig @@ -0,0 +1,26 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} +
    + +

    {% trans %}mail.editMailTemplate.title{% endtrans %}

    +
    + {{ form_widget(form) }} + {{ forms.input('mail.form.submit','mail') }} +
    + +
    + +
    + +{% endblock body %} diff --git a/CTRV/MailBundle/Resources/views/Mail/editTypeMail.html.twig b/CTRV/MailBundle/Resources/views/Mail/editTypeMail.html.twig new file mode 100644 index 0000000..d34c74b --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/editTypeMail.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} + +
    + +

    {% trans %}mail.form.titleUpdateTypeMail{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('mail.form.submit','loadTypeMails') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/MailBundle/Resources/views/Mail/index.html.twig b/CTRV/MailBundle/Resources/views/Mail/index.html.twig new file mode 100644 index 0000000..b1af6bf --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/index.html.twig @@ -0,0 +1,58 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + + + +{% block body %} + + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} + +
    + +

    {% trans %}mail.list.title{% endtrans %}

    + +
    {% trans %}mail.menu.add{% endtrans %}


    + + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + +
    {% trans %}mail.list.table.subject{% endtrans %}{% trans %}mail.list.table.content{% endtrans %}{% trans %}mail.list.table.type{% endtrans %}{% trans %}mail.list.table.action{% endtrans %}
    {{ entity.subject }}{{ entity.content[0:100] }} ...{{ entity.mailType }} + {% trans %}mail.list.table.edit_action{% endtrans %} +
    + + {% else%} +
    {% trans %}mail.list.table.no_result{% endtrans %}
    + {% endif %} + +
    + +
    + +{# #} + + +{% endblock body %} diff --git a/CTRV/MailBundle/Resources/views/Mail/loadTypeMails.html.twig b/CTRV/MailBundle/Resources/views/Mail/loadTypeMails.html.twig new file mode 100644 index 0000000..02fd9f5 --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/loadTypeMails.html.twig @@ -0,0 +1,60 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} + +
    + +

    {% trans %}mail.list.titleTypeMail{% endtrans %}

    +
    {% trans %}mail.menu.addType{% endtrans %}

    +
    + {% if entities is not empty %} + + + + + + + + + + {% for entity in entities %} + + + + + {% endfor %} + +
    {% trans %}mail.list.table.code{% endtrans %}{% trans %}mail.list.table.action{% endtrans %}
    {{ entity.code }} + {% trans %}mail.list.table.delete_action{% endtrans %} + {% trans %}mail.list.table.edit_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'loadTypeMails' } %} + +{% else%} +
    {% trans %}mail.list.table.no_type_result{% endtrans %}
    +{% endif %} +
    +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/MailBundle/Resources/views/Mail/sendMail.html.twig b/CTRV/MailBundle/Resources/views/Mail/sendMail.html.twig new file mode 100644 index 0000000..cf361ad --- /dev/null +++ b/CTRV/MailBundle/Resources/views/Mail/sendMail.html.twig @@ -0,0 +1,47 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + + + +{% block body %} + + +
    + + {% include "CTRVMailBundle::menu.html.twig" %} + +
    + +

    {% trans %}mail.sendMailTemplate.title{% endtrans %}

    +
    +
    + {{ form_widget(form) }}
    + + +
    +
    + +
    + + {{ form_widget(form1.destChoice) }} + {{ form_label(form1.destChoice) }} + {{ form_widget(form1.destField) }} + {{ form_label(form1.destField) }} + {{ forms.input('mail.sendMailform.send','send_mail') }} + +
    + + + +
    + +
    + +{# #} + + +{% endblock body %} diff --git a/CTRV/MailBundle/Resources/views/menu.html.twig b/CTRV/MailBundle/Resources/views/menu.html.twig new file mode 100644 index 0000000..b5d66a1 --- /dev/null +++ b/CTRV/MailBundle/Resources/views/menu.html.twig @@ -0,0 +1,8 @@ + + \ No newline at end of file diff --git a/CTRV/MailBundle/Service/MailService.php b/CTRV/MailBundle/Service/MailService.php new file mode 100644 index 0000000..53474aa --- /dev/null +++ b/CTRV/MailBundle/Service/MailService.php @@ -0,0 +1,42 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + /** + * Retourne la liste des types de mails + * @return unknown + */ + public function getTypeMails() { + $entities = $this->em->getRepository('CTRVMailBundle:MailType')->getTypeMails(); + return $entities; + + } + +} diff --git a/CTRV/PlaceBundle/CTRVPlaceBundle.php b/CTRV/PlaceBundle/CTRVPlaceBundle.php new file mode 100644 index 0000000..ccee80c --- /dev/null +++ b/CTRV/PlaceBundle/CTRVPlaceBundle.php @@ -0,0 +1,9 @@ +get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval ($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $placeComments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getPlaceCommentNumber($city); + $nb_entities_page = Constants::agendasComment_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $placeComments = $this->getDoctrine()->getRepository('CTRVCommonBundle:Comment')->getPlaceComment($city, $offset, $nb_entities_page); + + return array ( + 'entities' => $placeComments, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + +} diff --git a/CTRV/PlaceBundle/Controller/PlaceController.php b/CTRV/PlaceBundle/Controller/PlaceController.php new file mode 100644 index 0000000..ddb722d --- /dev/null +++ b/CTRV/PlaceBundle/Controller/PlaceController.php @@ -0,0 +1,597 @@ +get('session_service')->getCity() == null) { + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->findOneBy(array()); + $this->get('session_service')->setCity($city); + } else { + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($this->get('session_service')->getCity()->getId()); + } + + return array("entities"=>$this->get("place_service")->deleteDoublePlaces($city)); + } + + /** + * Formulaire de recherche d'une place + * @Route("/rechercher",name="rechercher_place") + * @Template() + */ + public function rechercherPlaceAction () { + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + $localizedPlaceNumber = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getLocalizedPlacesByCityNumber($city); + $form = $this->createForm(new PlaceRechercheType()); + + return array('form'=>$form->createView(), + 'localizedPlaceNumber'=>$localizedPlaceNumber + ); + } + /** + * ajouter une nouvelle place + * @Route("/addNewPlace",name="addNew_place") + * @Template() + */ + public function addNewPlaceAction () { + $em = $this->getDoctrine()->getEntityManager(); + $form = $this->createForm(new PlaceForm(),new Place()); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $placeType dans la base de données + $place = $form->getData(); + $em->persist($place); + $em->flush(); + // on redirige vers l'ajout des types de place + return $this->redirect($this->generateUrl("place")); + } + } + + + return array('form'=>$form->createView()); + + } + /** + * ajouter un nouveau type de place + * @Route("/ajouter",name="ajouter_place") + * @Template() + */ + public function ajouterTypeAction () { + $em = $this->getDoctrine()->getEntityManager(); + $form = $this->createForm(new PlaceTypeType(),new PlaceType()); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $placeType dans la base de données + $placeType = $form->getData(); + $em->persist($placeType); + $em->flush(); + // on redirige vers la liste des types de place + return $this->redirect($this->generateUrl("loadTypePlaces")); } + } + + + return array('form'=>$form->createView()); + + } + /** + * modifier un type de place + * @Route("/modifier/{id}",name="modifier_place") + * @Template() + */ + public function modifierTypeAction(PlaceType $placeType) { + $form = $this->createForm(new PlaceTypeType, $placeType); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $placeType dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($placeType); + $em->flush(); + // on redirige vers les types de place + return $this->redirect($this->generateUrl("loadTypePlaces")); + } + + } + + + return array( + 'placeType'=> $placeType, + 'form'=>$form->createView()); + + } + /** + * modifier une place + * @Route("/updatePlace/{id}",name="update_place") + * @Template() + */ + public function updatePlaceAction(Place $place) { + $form = $this->createForm(new PlaceForm(), $place); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $place dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($place); + $em->flush(); + // on redirige vers la liste des places existantes + return $this->redirect($this->generateUrl("place")); + } + + } + + + return array( + 'place'=> $place, + 'form'=>$form->createView()); + + } + /** + * saisir latitude et longitude + * @Route("/saisir/{id}",name="saisir_lat_long") + * @Template() + */ + public function saisirLatLongAction(Place $place) { + $form = $this->createForm(new PlaceLatLongForm(), $place); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $place dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($place); + $em->flush(); + // on redirige vers la liste des places existantes + return $this->redirect($this->generateUrl("placeWithoutLatLong")); + } + + } + + + return array( + 'place'=> $place, + 'form'=>$form->createView()); + + } + /** + * saisir Description + * @Route("/saisirDescrition/{id}",name="saisir_description") + * @Template() + */ + public function saisirDescriptionAction(Place $place) { + $form = $this->createForm(new PlaceDescriptionForm(), $place); + $request=$this->getRequest(); + // On vérifie qu'elle est de type POST + if ($this->getRequest()->getMethod() == 'POST') { + // On fait le lien Requête <-> Formulaire + $form->bind($this->getRequest()); + // On vérifie que les valeurs rentrées sont correctes + if ($form->isValid()) { + // On enregistre notre objet $place dans la base de données + $em = $this->getDoctrine()->getEntityManager(); + $em->persist($place); + $em->flush(); + // on redirige vers la liste des places existantes + return $this->redirect($this->generateUrl("placeWithoutDescription")); + } + + } + + + return array( + 'place'=> $place, + 'form'=>$form->createView()); + + } + + /** + * Afficher le resultat de la recherche sur les places + * @Route("/rechercherResult",name="rechercher_place_result") + * @Template() + */ + public function rechercherPlaceResultAction () { + + $searchText = $this->getRequest()->get("searchText",""); + + $currentCity = $this->get("session_service")->getCity(); + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + $page = intval($this->getRequest()->get("page",1)); + //pagination + $nb_entities = $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getPlaceByStreetNumber($searchText, $city); + $nb_entities_page = Constants::places_search_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getPlaceByStreet($searchText, $city, $offset, $nb_entities_page); + + return array ( + 'entities' => $places, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + + /** + * Importer un fichier de données de place + * @Route("/import",name="import_place") + * @Template() + */ + public function importAction () { + + $form = $this->createForm(new ImportPlaceType(), new ImportPlace()); + + if( $this->get('request')->getMethod() == 'POST' ) { + + $form->bind($this->get('request')); + + if ( $form->isValid() ) { + + $city = $this->get('session')->get("city"); + + $importPlace = $form->getData(); + $fileName = uniqid($city->getName().$importPlace->placeType).'.'.$importPlace->file->guessExtension(); + $importPlace->file->move($importPlace->getUploadRootDir(), $fileName); + $importPlace->file = null; + + $res = $this->get("place_service")->savePlaceDataFromFile ($importPlace->getUploadRootDir().'/'.$fileName, $city, $importPlace->placeType); + + $this->get('session')->getFlashBag()->add('success', $this->get('translator') + ->trans('place.import.success',array("%imported%"=>$res['added'],"%already%"=>$res["already"],"%traited%"=>$res['latLngFound'],"%total%"=>$res['all']))); + + } + } + + $notLocalizedPlaceNumber = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getNotLocalizedPlaceNumber(); + $allPlaceNumber = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getAllPlaceNumber(); + //$localized = $allPlaceNumber - $notLocalizedPlaceNumber; + + return array('form'=>$form->createView(),'notLocalizedPlacesNumber'=>$notLocalizedPlaceNumber,'allPlaceNumber'=>$allPlaceNumber); + } + + /** + * Lance le calcul de la latitude et longitude des places dont les coordonnées n'ont encore été trouvées + * @Route("/calculate_Lat_Lng", name="calculate_Lat_Lng") + * @Template("CTRVPlaceBundle:Place:import.html.twig") + */ + public function calculateLatLngAction () { + + $form = $this->createForm(new ImportPlaceType(), new ImportPlace()); + + $city = $this->get('session')->get("city"); + $res = $this->get("place_service")->calculateLatLng($city); + $traitedPlaceNumber = $res[0]; + $totalPlaceNumber = $res[1]; + + $this->get('session')->getFlashBag()->add('success', $this->get('translator') + ->trans('place.import.relaunch_success',array("%traited%"=>$traitedPlaceNumber,"%total%"=>$totalPlaceNumber))); + + $notLocalizedPlaceNumber = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getNotLocalizedPlaceNumber(); + $allPlaceNumber = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getAllPlaceNumber(); + //$localized = $allPlaceNumber - $notLocalizedPlaceNumber; + + return array('form'=>$form->createView(),'notLocalizedPlacesNumber'=>$notLocalizedPlaceNumber,'allPlaceNumber'=>$allPlaceNumber); + } + + + /** + * Affiche le formulaire de choix de type de place + * @Route("/list", name="place") + * @Template() + */ + public function indexAction () { + + $form = $this->createForm(new ChoosePlaceTypeType()); + return array ( + 'form' => $form->createView(), + ); + } + + /** + * Charge les donnees du type de place spécifié en AJAX (places ajoutées par des utilisateurs sous forme de tableau paginé) + * @Route("/loadPlacesByType", name="loadPlacesByType") + * @Template() + */ + public function loadPlacesByTypeAction () { + + $currentCity = $this->get("session_service")->getCity(); + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + + $page = intval($this->getRequest()->get("page",1)); + $placeTypeId = $this->getRequest()->get("placeTypeId"); + + //pagination + $nb_entities = $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getPlaceAddedByUsersNumber($placeTypeId, $currentCity); + $nb_entities_page = Constants::places_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getPlaceAddedByUsers ($placeTypeId, $currentCity, $offset, $nb_entities_page); + + return array ( + 'entities' => $places, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * Charge les donnees des places avec le type spécifié ou non (toutes les places de l'application) + * @Route("/loadAllPlacesByTypeOrNot", name="loadAllPlacesByTypeOrNot") + * @Template() + */ + public function loadAllPlacesByTypeOrNotAction () { + + $currentCity = $this->get("session_service")->getCity(); + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + $city = $this->getDoctrine()->getEntityManager()->getRepository('CTRVCommonBundle:City')->find($currentCity->getId()); + $form = $this->createForm(new ChoosePlaceTypeType()); + $page = intval($this->getRequest()->get("page",1)); + $placeTypeId = $this->getRequest()->get("placeTypeId"); + + //pagination + $nb_entities = $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getPlacesByTypeNumber($placeTypeId, $currentCity); + $nb_entities_page = Constants::places_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:Place')->getPlacesByType ($placeTypeId, $currentCity, $offset, $nb_entities_page); + + return array ( + 'entities' => $places, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities, + 'form' => $form->createView() + ); + } + + /** + * Charge les données des places de la ville courante sans Latitude ou Longitude + * @Route("/placeWithoutLatLong", name="placeWithoutLatLong") + * @Template() + */ + public function placeWithoutLatLongAction () { + + $currentCity = $this->get('session_service')->getCity(); + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = $this->getRequest()->get("page",1); + + //pagination + $nb_entities = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getPlacesWithoutLatLongNumber($currentCity); + $nb_entities_page = Constants::places_without_lat_lng_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $entities = $this->get("place_service")->getPlacesWithoutLatLong($currentCity,$offset,$nb_entities_page); + + return array ( + 'entities' => $entities, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * Charge les données des places de la ville courante sans Description + * @Route("/placeWithoutDescription", name="placeWithoutDescription") + * @Template() + */ + public function placeWithoutDescriptionAction () { + + $currentCity = $this->get('session_service')->getCity(); + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = $this->getRequest()->get("page",1); + + //pagination + $nb_entities = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getPlacesWithoutDescriptionNumber($currentCity); + $nb_entities_page = Constants::places_without_description_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $entities = $this->get("place_service")->getPlacesWithoutDescription($currentCity,$offset,$nb_entities_page); + + return array ( + 'entities' => $entities, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + /** + * Charge tous les type de place + * @Route("/loadTypePlaces", name="loadTypePlaces") + * @Template() + */ + public function loadTypePlacesAction () { + + $currentCity = $this->get("session_service")->getCity(); + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = intval($this->getRequest()->get("page",1)); + + //pagination + $nb_entities = $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:PlaceType')->getTypePlacesNumber(); + $nb_entities_page = Constants::places_type_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $places = $this->getDoctrine()->getRepository('CTRVPlaceBundle:PlaceType')->getTypePlaces($offset, $nb_entities_page); + + return array ( + 'entities' => $places, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + + /** + * Deletes a Place entity. + * + * @Route("/{id}/delete", name="place_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deleteAction($id) { + + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVPlaceBundle:Place')->find(intval($id)); + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + + + /** + * Deletes a lit of Place entity. + * + * @Route("/deleteList", name="place_list_delete" ) + * @Template() + */ + public function deleteListAction() { + + $selectedIds = json_decode($this->getRequest()->get("selectedIds")); + $em = $this->getDoctrine()->getManager(); + + if ($selectedIds != null) + foreach ($selectedIds as $id ) { + $entity = $em->getRepository('CTRVPlaceBundle:Place')->find($id); + $em->remove($entity); + $em->flush(); + } + + return new Response(json_encode(array('result'=>true))); + } + + /** + * @Route("/placeWithSameAddress", name="placeWithSameAddress") + * @Template() + */ + public function placeWithSameAddressAction () { + + $currentCity = $this->get('session_service')->getCity(); + + if ($currentCity == null) { + $this->get('session')->getFlashBag()->add('error', $this->get('translator')->trans('session.city.not_found')); + $this->redirect($this->generateUrl("home")); + } + + $page = $this->getRequest()->get("page",1); + + //pagination + $nb_entities = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getPlacesHavinAddressInDoubleByCityNumber($currentCity->getId()); + $nb_entities_page = Constants::places_with_same_address_number_per_page; + $nb_pages = ceil($nb_entities/$nb_entities_page); + $offset = ($page-1) * $nb_entities_page; + + $places = $this->getDoctrine()->getEntityManager()->getRepository("CTRVPlaceBundle:Place")->getPlacesHavinAddressInDoubleByCity($currentCity->getId(), $offset, $nb_entities_page); + + +// var_dump($places);exit; + return array ( + 'entities' => $places, + 'nb_pages' => $nb_pages, + 'page' => $page, + 'nb_entities' => $nb_entities + ); + } + + /** + * Deletes a PlaceType entity. + * + * @Route("/{id}/deleteType", name="placeType_delete" ) //requirements={"id" = "\d+"} + * @Method("POST") + * @Template() + */ + public function deletePlaceTypeAction($id) { + + $em = $this->getDoctrine()->getManager(); + $entity = $em->getRepository('CTRVPlaceBundle:PlaceType')->find($id); + + $em->remove($entity); + $em->flush(); + + return new Response(json_encode(array('result'=>true))); + } + +} diff --git a/CTRV/PlaceBundle/DependencyInjection/CTRVPlaceExtension.php b/CTRV/PlaceBundle/DependencyInjection/CTRVPlaceExtension.php new file mode 100644 index 0000000..069c572 --- /dev/null +++ b/CTRV/PlaceBundle/DependencyInjection/CTRVPlaceExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/CTRV/PlaceBundle/DependencyInjection/Configuration.php b/CTRV/PlaceBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..4738548 --- /dev/null +++ b/CTRV/PlaceBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root('ctrv_place'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/CTRV/PlaceBundle/Entity/ImportPlace.php b/CTRV/PlaceBundle/Entity/ImportPlace.php new file mode 100644 index 0000000..6508e8e --- /dev/null +++ b/CTRV/PlaceBundle/Entity/ImportPlace.php @@ -0,0 +1,40 @@ +city; + } + + public function getUploadRootDir() + { + return __DIR__.'/../../../../web/'.$this->getUploadDir(); + } + + public function getUploadDir() + { + return Constants::IMPORT_FILE_PATH; + } + + +} diff --git a/CTRV/PlaceBundle/Entity/Place.php b/CTRV/PlaceBundle/Entity/Place.php new file mode 100644 index 0000000..f6433c0 --- /dev/null +++ b/CTRV/PlaceBundle/Entity/Place.php @@ -0,0 +1,671 @@ +addedDate = new \DateTime(); + } + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set activity + * + * @param string $activity + * @return Place + */ + public function setActivity($activity) + { + $this->activity = $activity; + + return $this; + } + + /** + * Get activity + * + * @return string + */ + public function getActivity() + { + return $this->activity; + } + + /** + * Set latitude + * + * @param string $latitude + * @return Place + */ + public function setLatitude($latitude) + { + $this->latitude = $latitude; + + return $this; + } + + /** + * Get latitude + * + * @return string + */ + public function getLatitude() + { + return $this->latitude; + } + + /** + * Set longitude + * + * @param string $longitude + * @return Place + */ + public function setLongitude($longitude) + { + $this->longitude = $longitude; + + return $this; + } + + /** + * Get longitude + * + * @return string + */ + public function getLongitude() + { + return $this->longitude; + } + + /** + * Set isApproximateAddress + * + * @param boolean $isApproximateAddress + * @return Place + */ + public function setIsApproximateAddress($isApproximateAddress) + { + $this->isApproximateAddress = $isApproximateAddress; + + return $this; + } + + /** + * Get isApproximateAddress + * + * @return boolean + */ + public function getIsApproximateAddress() + { + return $this->isApproximateAddress; + } + + /** + * Set description + * + * @param string $description + * @return Place + */ + public function setDescription($description) + { + $this->description = $description; + + return $this; + } + + /** + * Get description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Set title + * + * @param string $title + * @return Place + */ + public function setTitle($title) + { + $this->title = $title; + + return $this; + } + + /** + * Get title + * + * @return string + */ + public function getTitle() + { + return $this->title; + } + + /** + * Set siteUrl + * + * @param string $siteUrl + * @return Place + */ + public function setSiteUrl($siteUrl) + { + $this->siteUrl = $siteUrl; + + return $this; + } + + /** + * Get siteUrl + * + * @return string + */ + public function getSiteUrl() + { + return $this->siteUrl; + } + + /** + * Set town + * + * @param string $town + * @return Place + */ + public function setTown($town) + { + $this->town = $town; + + return $this; + } + + /** + * Get town + * + * @return string + */ + public function getTown() + { + return $this->town; + } + + /** + * Set street + * + * @param string $street + * @return Place + */ + public function setStreet($street) + { + $this->street = $street; + + return $this; + } + + /** + * Get street + * + * @return string + */ + public function getStreet() + { + return $this->street; + } + + /** + * Set mark + * + * @param integer $mark + * @return Place + */ + public function setMark($mark) + { + $this->mark = $mark; + + return $this; + } + + /** + * Get mark + * + * @return integer + */ + public function getMark() + { + return $this->mark; + } + + /** + * Set numberMark + * + * @param integer $numberMark + * @return Place + */ + public function setNumberMark($numberMark) + { + $this->numberMark = $numberMark; + + return $this; + } + + /** + * Get numberMark + * + * @return integer + */ + public function getNumberMark() + { + return $this->numberMark; + } + + /** + * Set addedDate + * + * @param \DateTime $addedDate + * @return Place + */ + public function setAddedDate($addedDate) + { + $this->addedDate = $addedDate; + + return $this; + } + + /** + * Get addedDate + * + * @return \DateTime + */ + public function getAddedDate() + { + return $this->addedDate; + } + + /** + * Set placeType + * + * @param CTRV\PlaceBundle\Entity\PlaceType $placeType + * @return Place + */ + public function setPlaceType(\CTRV\PlaceBundle\Entity\PlaceType $placeType = null) + { + $this->placeType = $placeType; + + return $this; + } + + /** + * Get placeType + * + * @return CTRV\PlaceBundle\Entity\PlaceType + */ + public function getPlaceType() + { + return $this->placeType; + } + + /** + * Set auteur + * + * @param CTRV\CommonBundle\Entity\User $auteur + * @return Place + */ + public function setAuteur(\CTRV\CommonBundle\Entity\User $auteur = null) + { + $this->auteur = $auteur; + + return $this; + } + + /** + * Get auteur + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getAuteur() + { + return $this->auteur; + } + + /** + * Set city + * + * @param CTRV\CommonBundle\Entity\City $city + * @return Place + */ + public function setCity(\CTRV\CommonBundle\Entity\City $city = null) + { + $this->city = $city; + + return $this; + } + + /** + * Get city + * + * @return CTRV\CommonBundle\Entity\City + */ + public function getCity() + { + return $this->city; + } + + /** + * Set tel + * + * @param string $tel + * @return Place + */ + public function setTel($tel) + { + $this->tel = $tel; + + return $this; + } + + /** + * Get tel + * + * @return string + */ + public function getTel() + { + return $this->tel; + } + + /** + * Set owner + * + * @param CTRV\CommonBundle\Entity\User $owner + * @return Place + */ + public function setOwner(\CTRV\CommonBundle\Entity\User $owner = null) + { + $this->owner = $owner; + + return $this; + } + + /** + * Get owner + * + * @return CTRV\CommonBundle\Entity\User + */ + public function getOwner() + { + return $this->owner; + } + + /** + * Set tel2 + * + * @param string $tel2 + * @return Place + */ + public function setTel2($tel2) + { + $this->tel2 = $tel2; + + return $this; + } + + /** + * Get tel2 + * + * @return string + */ + public function getTel2() + { + return $this->tel2; + } + + /** + * Set codePostal + * + * @param string $codePostal + * @return Place + */ + public function setCodePostal($codePostal) + { + $this->codePostal = $codePostal; + + return $this; + } + + /** + * Get codePostal + * + * @return string + */ + public function getCodePostal() + { + return $this->codePostal; + } + + /** + * Set fax + * + * @param string $fax + * @return Place + */ + public function setFax($fax) + { + $this->fax = $fax; + + return $this; + } + + /** + * Get fax + * + * @return string + */ + public function getFax() + { + return $this->fax; + } + + /** + * Set mobile + * + * @param string $mobile + * @return Place + */ + public function setMobile($mobile) + { + $this->mobile = $mobile; + + return $this; + } + + /** + * Get mobile + * + * @return string + */ + public function getMobile() + { + return $this->mobile; + } +} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Entity/PlaceRepository.php b/CTRV/PlaceBundle/Entity/PlaceRepository.php new file mode 100644 index 0000000..59dc1d5 --- /dev/null +++ b/CTRV/PlaceBundle/Entity/PlaceRepository.php @@ -0,0 +1,287 @@ +createQueryBuilder("p") + ->select("p.street") + ->where("p.city=?1") + ->groupBy("p.street") + ->having("count(p.id) >?2") + ->setParameter(1, $city_id) + ->setParameter(2, 1) + ; + + $list_address = $qbtemp->getQuery()->getResult(); + + $addresses = array(); + foreach ($list_address as $item) { + array_push($addresses, $item); + } + + return $addresses; + } + + /** + * Retourne la liste de tous les place dont les addresses existent en double. + * @param unknown_type $placeType + * @param unknown_type $city + */ + public function getPlacesHavinAddressInDoubleByCity ($city_id,$first, $last) { + + $addresses = $this->getAddressInDouble($city_id); + + $qb = $this->createQueryBuilder("p") + ->where("p.city=?1") + ->andWhere("p.street IN (?2)") + ->orderBy('p.street', 'ASC') + ->setParameter(1, $city_id) + ->setParameter(2, $addresses) + ->setFirstResult($first) + ->setMaxResults($last) + ; + + return $qb->getQuery()->getResult(); + } + + + /** + * Retourne le nombre de places dont les addresses existent en double. + * @param unknown_type $placeType + * @param unknown_type $city + */ + public function getPlacesHavinAddressInDoubleByCityNumber ($city_id) { + + $addresses = $this->getAddressInDouble($city_id); + + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->where("p.city=?1") + ->andWhere("p.street IN (?2)") + ->orderBy('p.street', 'ASC') + ->setParameter(1, $city_id) + ->setParameter(2, $addresses) + ; + + return $qb->getQuery()->getSingleScalarResult(); + } + + + + + /** + * Retourne la liste des places par types ajoutées par les utilisateurs + * @param unknown_type $placeType + * @param unknown_type $city + */ + public function getPlaceAddedByUsers ($placeType, $city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->where("p.auteur is not null") + ->andWhere("p.placeType=?1") + ->andWhere("p.city=?2") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $placeType) + ->setParameter(2, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre de places par types ajoutées par les utilisateurs + * @param unknown_type $placeType + * @param unknown_type $city + */ + public function getPlaceAddedByUsersNumber ($placeType, $city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)') + ->where("p.auteur is not null") + ->andWhere("p.placeType=?1") + ->andWhere("p.city=?2") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $placeType) + ->setParameter(2, $city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * Retourne la liste des places par types + * @param unknown_type $placeType + * @param unknown_type $city + */ + public function getPlacesByType ($placeType, $city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->where("p.latitude is null OR p.longitude is null") + ->andWhere("p.placeType=?1") + ->andWhere("p.city=?2") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $placeType) + ->setParameter(2, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre de places par types + * @param unknown_type $placeType + * @param unknown_type $city + */ + public function getPlacesByTypeNumber ($placeType, $city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)') + ->where("p.latitude is null OR p.longitude is null") + ->andWhere("p.placeType=?1") + ->andWhere("p.city=?2") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $placeType) + ->setParameter(2, $city) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + + /** + * Retourne la liste des places sans latitude ou longitude de la ville courante + * @param unknown_type $city + */ + public function getPlacesWithoutLatLong ($city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->where("p.latitude is null OR p.longitude is null") + ->andWhere("p.city=?1") + ->orderBy('p.title', 'ASC') + ->setParameter(1, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre de place sans latitude longitude de la ville courante + * @param unknown_type $city + */ + public function getPlacesWithoutLatLongNumber ($city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)') + ->where("p.latitude is null OR p.longitude is null") + ->andWhere("p.city=?1") + ->setParameter(1, $city->getId()) + ->getQuery()->getSingleScalarResult() + ; + return $qb; + } + + public function getLocalizedPlacesByCityNumber ($city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)') +// ->where("p.latitude is not null") + ->where("p.city=?1") + ->setParameter(1, $city) + ->getQuery()->getSingleScalarResult() + ; + return $qb; + } + + /** + * Retourne la liste des places sans description de la ville courante + * @param unknown_type $city + */ + public function getPlacesWithoutDescription ($city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->where("p.description is null") + ->andWhere("p.city=?1") + ->orderBy('p.title', 'ASC') + ->setParameter(1, $city) + ->setFirstResult($first) + ->setMaxResults($last) + + ; + return $qb->getQuery()->getResult(); + } + + /** + * Retourne le nombre de place sans description de la ville courante + * @param unknown_type $city + */ + public function getPlacesWithoutDescriptionNumber ($city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)') + ->where("p.description is null") + ->andWhere("p.city=?1") + ->orderBy('p.addedDate', 'DESC') + ->setParameter(1, $city->getId()) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne la liste des places de la rue spécifiée dans la ville courante + * @param unknown_type $searchText + */ + public function getPlaceByStreet ($searchText, $city, $first, $last) { + $qb = $this->createQueryBuilder("p") + ->where("p.street like ?1") + ->andWhere("p.city=?2") + ->setParameter(1, "%".$searchText."%") + ->setParameter(2, $city) + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + } + + /** + * + * @param unknown_type $searchText + * @param unknown_type $city + */ + public function getPlaceByStreetNumber ($searchText, $city) { + $qb = $this->createQueryBuilder("p") + ->select('count(p)') + ->where("p.street like ?1") + ->andWhere("p.city=?2") + ->setParameter(1, "%".$searchText."%") + ->setParameter(2, $city->getId()) + ; + return $qb->getQuery()->getSingleScalarResult(); + } + + /** + * Retourne le nombre de place localisée + */ + public function getNotLocalizedPlaceNumber () { + + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ->where("p.latitude is null") + ->orWhere("p.longitude is null") + ; + return $qb->getQuery()->getSingleScalarResult(); + } + /** + * Retourne le nombre total de place + */ + public function getAllPlaceNumber () { + + $qb = $this->createQueryBuilder("p") + ->select("count(p)") + ; + return $qb->getQuery()->getSingleScalarResult(); + } +} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Entity/PlaceType.php b/CTRV/PlaceBundle/Entity/PlaceType.php new file mode 100644 index 0000000..786b181 --- /dev/null +++ b/CTRV/PlaceBundle/Entity/PlaceType.php @@ -0,0 +1,156 @@ +id; + } + + /** + * Set label + * + * @param string $label + * @return PlaceType + */ + public function setLabel($label) + { + $this->label = $label; + + return $this; + } + + /** + * Get label + * + * @return string + */ + public function getLabel() + { + return $this->label; + } + + public function __toString() { + return $this->label; + } + + /** + * Set code + * + * @param string $code + * @return PlaceType + */ + public function setCode($code) + { + $this->code = $code; + + return $this; + } + + /** + * Get code + * + * @return string + */ + public function getCode() + { + return $this->code; + } + + /** + * Set language + * + * @param string $language + * @return PlaceType + */ + public function setLanguage($language) + { + $this->language = $language; + + return $this; + } + + /** + * Get language + * + * @return string + */ + public function getLanguage() + { + return $this->language; + } + + /** + * Set img_url + * + * @param string $imgUrl + * @return PlaceType + */ + public function setImgUrl($imgUrl) + { + $this->img_url = $imgUrl; + + return $this; + } + + /** + * Get img_url + * + * @return string + */ + public function getImgUrl() + { + return $this->img_url; + } +} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Entity/PlaceTypeRepository.php b/CTRV/PlaceBundle/Entity/PlaceTypeRepository.php new file mode 100644 index 0000000..b813824 --- /dev/null +++ b/CTRV/PlaceBundle/Entity/PlaceTypeRepository.php @@ -0,0 +1,35 @@ +createQueryBuilder("p") + ->orderBy('p.code','ASC') + ->setFirstResult($first) + ->setMaxResults($last) + ; + return $qb->getQuery()->getResult(); + + } + + /** + * retourne le nombre total de types de places + */ + public function getTypePlacesNumber(){ + $qb= $this->createQueryBuilder("p") + ->select('count(p)') + ; + return $qb->getQuery()->getSingleScalarResult(); + + } + +} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Entity/TraitedPlace.php b/CTRV/PlaceBundle/Entity/TraitedPlace.php new file mode 100644 index 0000000..28bd983 --- /dev/null +++ b/CTRV/PlaceBundle/Entity/TraitedPlace.php @@ -0,0 +1,63 @@ +id; + } + + /** + * Set idPlace + * + * @param integer $idPlace + * @return TraitedPlace + */ + public function setIdPlace($idPlace) + { + $this->idPlace = $idPlace; + + return $this; + } + + /** + * Get idPlace + * + * @return integer + */ + public function getIdPlace() + { + return $this->idPlace; + } +} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Entity/TraitedPlaceRepository.php b/CTRV/PlaceBundle/Entity/TraitedPlaceRepository.php new file mode 100644 index 0000000..9e52f3a --- /dev/null +++ b/CTRV/PlaceBundle/Entity/TraitedPlaceRepository.php @@ -0,0 +1,15 @@ +add('placeType', 'entity', array ( + 'class' => 'CTRVPlaceBundle:PlaceType', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.label', 'ASC'); + }, + 'label'=>'place.ajouterForm.placeType', + 'attr'=> array('class'=>'input-xlarge') + )) + ; + } + + + public function getName() + { + return 'choose_place_type'; + } +} diff --git a/CTRV/PlaceBundle/Form/ImportPlaceType.php b/CTRV/PlaceBundle/Form/ImportPlaceType.php new file mode 100644 index 0000000..ca76b66 --- /dev/null +++ b/CTRV/PlaceBundle/Form/ImportPlaceType.php @@ -0,0 +1,39 @@ +add('placeType','entity', array( + 'class' => 'CTRVPlaceBundle:PlaceType', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.label', 'ASC'); + }, + 'label'=>'place.import.form.placetype', + 'attr' =>array('class'=>'input-xlarge') + )) + ->add('file','file',array('label'=>'place.import.form.file')) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\PlaceBundle\Entity\ImportPlace' + )); + } + + public function getName() + { + return 'ctrv_placebundle_placetype_import_place'; + } +} diff --git a/CTRV/PlaceBundle/Form/PlaceDescriptionForm.php b/CTRV/PlaceBundle/Form/PlaceDescriptionForm.php new file mode 100644 index 0000000..c767eac --- /dev/null +++ b/CTRV/PlaceBundle/Form/PlaceDescriptionForm.php @@ -0,0 +1,60 @@ +add('activity','textarea',array('label'=>'place.ajouterForm.activity','read_only' => true,'required'=>false)) + ->add('latitude','text',array('label'=>'place.ajouterForm.latitude','required'=>false,'read_only' => true)) + ->add('longitude','text',array('label'=>'place.ajouterForm.longitude','required'=>false,'read_only' => true)) + ->add('isApproximateAddress','checkbox',array('label'=>'place.ajouterForm.isApproxAdress','read_only' => true,'required'=>false)) + ->add('description','textarea',array('label'=>'place.ajouterForm.description','required'=>false)) + ->add('title','text',array('label'=>'place.ajouterForm.TitlePlace','read_only' => true,'required'=>false)) + ->add('siteUrl','text',array('label'=>'place.ajouterForm.siteUrl','read_only' => true,'required'=>false)) + ->add('town','text',array('label'=>'place.ajouterForm.town','read_only' => true,'required'=>false)) + ->add('street','textarea',array('label'=>'place.ajouterForm.street','read_only' => true,'required'=>false)) + ->add('mark','text',array('label'=>'place.ajouterForm.mark','read_only' => true,'required'=>false)) + ->add('tel','text',array('label'=>'place.ajouterForm.tel','read_only' => true,'required'=>false)) + ->add('numberMark','text',array('label'=>'place.ajouterForm.numberMark','read_only' => true,'required'=>false)) + ->add('addedDate','date',array('label'=>'place.ajouterForm.date','read_only' => true,'required'=>false)) + ->add('placeType', 'entity', array ('read_only' => true, + 'class' => 'CTRVPlaceBundle:PlaceType', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.label', 'ASC'); + }, + 'label'=>'place.moderate.form.placeType' + )) + //->add('auteur') + //->add('owner') + ->add('city', 'entity', array ('read_only' => true, + 'class' => 'CTRVCommonBundle:City', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('c') + ->orderBy('c.name', 'ASC'); + }, + 'label'=>'place.ajouterForm.city' + )) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\PlaceBundle\Entity\Place' + )); + } + + public function getName() + { + return 'ctrv_placebundle_placeLatLongform'; + } +} diff --git a/CTRV/PlaceBundle/Form/PlaceForm.php b/CTRV/PlaceBundle/Form/PlaceForm.php new file mode 100644 index 0000000..713d871 --- /dev/null +++ b/CTRV/PlaceBundle/Form/PlaceForm.php @@ -0,0 +1,60 @@ +add('activity','textarea',array('label'=>'place.ajouterForm.activity','required'=>false)) + ->add('latitude','text',array('label'=>'place.ajouterForm.latitude','required'=>false)) + ->add('longitude','text',array('label'=>'place.ajouterForm.longitude','required'=>false)) + ->add('isApproximateAddress','checkbox',array('label'=>'place.ajouterForm.isApproxAdress','required'=>false)) + ->add('description','textarea',array('label'=>'place.ajouterForm.description','required'=>false)) + ->add('title','text',array('label'=>'place.ajouterForm.TitlePlace')) + ->add('siteUrl','text',array('label'=>'place.ajouterForm.siteUrl','required'=>false)) + ->add('town','text',array('label'=>'place.ajouterForm.town','required'=>false)) + ->add('street','textarea',array('label'=>'place.ajouterForm.street')) + ->add('mark','text',array('label'=>'place.ajouterForm.mark','required'=>false)) + ->add('tel','text',array('label'=>'place.ajouterForm.tel','required'=>false)) + ->add('numberMark','text',array('label'=>'place.ajouterForm.numberMark','required'=>false)) + ->add('addedDate','date',array('label'=>'place.ajouterForm.date','required'=>false)) + ->add('placeType', 'entity', array ( + 'class' => 'CTRVPlaceBundle:PlaceType', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.label', 'ASC'); + }, + 'label'=>'place.moderate.form.placeType', + )) + //->add('auteur') + //->add('owner') + ->add('city', 'entity', array ( + 'class' => 'CTRVCommonBundle:City', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('c') + ->orderBy('c.name', 'ASC'); + }, + 'label'=>'place.ajouterForm.city', + )) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\PlaceBundle\Entity\Place' + )); + } + + public function getName() + { + return 'ctrv_placebundle_placeform'; + } +} diff --git a/CTRV/PlaceBundle/Form/PlaceLatLongForm.php b/CTRV/PlaceBundle/Form/PlaceLatLongForm.php new file mode 100644 index 0000000..eac0f86 --- /dev/null +++ b/CTRV/PlaceBundle/Form/PlaceLatLongForm.php @@ -0,0 +1,60 @@ +add('activity','textarea',array('label'=>'place.ajouterForm.activity','read_only' => true,'required'=>false)) + ->add('latitude','text',array('label'=>'place.ajouterForm.latitude','required'=>false)) + ->add('longitude','text',array('label'=>'place.ajouterForm.longitude','required'=>false)) + ->add('isApproximateAddress','checkbox',array('label'=>'place.ajouterForm.isApproxAdress','read_only' => true,'required'=>false)) + ->add('description','textarea',array('label'=>'place.ajouterForm.description','read_only' => true,'required'=>false)) + ->add('title','text',array('label'=>'place.ajouterForm.TitlePlace','read_only' => true,'required'=>false)) + ->add('siteUrl','text',array('label'=>'place.ajouterForm.siteUrl','read_only' => true,'required'=>false)) + ->add('town','text',array('label'=>'place.ajouterForm.town','read_only' => true,'required'=>false)) + ->add('street','textarea',array('label'=>'place.ajouterForm.street','read_only' => false,'required'=>false)) + ->add('mark','text',array('label'=>'place.ajouterForm.mark','read_only' => true,'required'=>false)) + ->add('tel','text',array('label'=>'place.ajouterForm.tel','read_only' => true,'required'=>false)) + ->add('numberMark','text',array('label'=>'place.ajouterForm.numberMark','read_only' => true,'required'=>false)) + ->add('addedDate','date',array('label'=>'place.ajouterForm.date','read_only' => true,'required'=>false)) + ->add('placeType', 'entity', array ( + 'class' => 'CTRVPlaceBundle:PlaceType', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('u') + ->orderBy('u.label', 'ASC'); + }, + 'label'=>'place.moderate.form.placeType','read_only' => true,'required'=>false + )) + //->add('auteur') + //->add('owner') + ->add('city', 'entity', array ( + 'class' => 'CTRVCommonBundle:City', + 'query_builder' => function(EntityRepository $er) { + return $er->createQueryBuilder('c') + ->orderBy('c.name', 'ASC'); + }, + 'label'=>'place.ajouterForm.city','read_only' => true,'required'=>false + )) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\PlaceBundle\Entity\Place' + )); + } + + public function getName() + { + return 'ctrv_placebundle_placeLatLongform'; + } +} diff --git a/CTRV/PlaceBundle/Form/PlaceRechercheType.php b/CTRV/PlaceBundle/Form/PlaceRechercheType.php new file mode 100644 index 0000000..f5edf5f --- /dev/null +++ b/CTRV/PlaceBundle/Form/PlaceRechercheType.php @@ -0,0 +1,22 @@ +add('motcle','text', array('label' => 'place.rechercheForm.rechercher','required'=>false)) + ; +} + +public function getName() { + return 'placerecherche'; +} + +} diff --git a/CTRV/PlaceBundle/Form/PlaceType.php b/CTRV/PlaceBundle/Form/PlaceType.php new file mode 100644 index 0000000..8d60b1e --- /dev/null +++ b/CTRV/PlaceBundle/Form/PlaceType.php @@ -0,0 +1,41 @@ +add('activity') + ->add('latitude') + ->add('longitude') + ->add('isApproximateAddress') + ->add('description') + ->add('title') + ->add('siteUrl') + ->add('town') + ->add('street') + ->add('mark') + ->add('numberMark') + ->add('placeType') + ; + + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\PlaceBundle\Entity\Place' + )); + } + + public function getName() + { + return 'ctrv_placebundle_placetype'; + } +} diff --git a/CTRV/PlaceBundle/Form/PlaceTypeType.php b/CTRV/PlaceBundle/Form/PlaceTypeType.php new file mode 100644 index 0000000..82a3fcb --- /dev/null +++ b/CTRV/PlaceBundle/Form/PlaceTypeType.php @@ -0,0 +1,38 @@ +add('label','text',array('label'=>'place.ajouterForm.libelle')) + ->add('code','text',array('label'=>'place.ajouterForm.code')) + ->add('language','choice',array('label'=>'place.ajouterForm.langue','choices'=>array( + 'FRENCH' => 'place.ajouterForm.fr', + 'ENGLISH' => 'place.ajouterForm.en', + 'SPANISH' => 'place.ajouterForm.es', + ), + )) + ->add('img_url','file',array('label'=>'place.ajouterForm.select_file','required'=>false)) + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'CTRV\PlaceBundle\Entity\PlaceType' + )); + } + + public function getName() + { + return 'ctrv_placebundle_placetypetype'; + } +} diff --git a/CTRV/PlaceBundle/Resources/config/services.yml b/CTRV/PlaceBundle/Resources/config/services.yml new file mode 100644 index 0000000..fa3ea10 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/config/services.yml @@ -0,0 +1,4 @@ +services: + place_service: + class: CTRV\PlaceBundle\Service\PlaceService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/doc/index.rst b/CTRV/PlaceBundle/Resources/doc/index.rst new file mode 100644 index 0000000..2a4dad4 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/doc/index.rst @@ -0,0 +1,3 @@ +\CTRV\CommonBundle\Entity\ + +generate:doctrine:entities CTRVPlaceBundle \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/public/js/place.js b/CTRV/PlaceBundle/Resources/public/js/place.js new file mode 100644 index 0000000..d8568db --- /dev/null +++ b/CTRV/PlaceBundle/Resources/public/js/place.js @@ -0,0 +1,103 @@ +/** + * Retourne la liste de place selon la rue spécifiée + */ +function loadSearchedPlaces (urlAction, p_searchText, ppage, container_id ) { + $('#'+container_id).html('
    '); + + $.post(urlAction, + { + searchText:p_searchText, + page:ppage + + }, + function (data) { + $('#'+container_id).html(data); + }, + 'html' + ); +} + + + + +/** + * Retourne la liste des place selon le type et la page spécifiée + */ +function loadPlacesByType (urlAction,pplaceTypeId,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + placeTypeId:pplaceTypeId, + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} + + +/** + * Retourne la liste des places + */ +function loadPlaces (urlAction,ppage,container) { + container.html('
    '); + + $.post(urlAction, + { + page:ppage + }, + function (data) { + container.html(data); + }, + 'html' + ); +} +/** + * Supprime une place + */ +function deletePlace (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} + + +function deleteListPlace (urlAction, pselectedIds) { + $.post(urlAction, + { + selectedIds: JSON.stringify(pselectedIds) + }, + function (data) { + if(data.result){ + location.reload(); + } + }, + 'json' + ); +} + +/** + * Supprime un type de place + */ +function deletePlaceType (urlAction, tr_elem) { + $.post(urlAction, + { + }, + function (data) { + if(data.result){ + tr_elem.remove(); + } + }, + 'json' + ); +} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/translations/messages.fr.yml b/CTRV/PlaceBundle/Resources/translations/messages.fr.yml new file mode 100644 index 0000000..9c640a2 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/translations/messages.fr.yml @@ -0,0 +1,127 @@ +place: + menu: + moderate: Places ajoutées par les utilisateurs + moderateAll : Toutes les places + import: Importer des données + setLatLng: Saisir la latitude et la longitude + setPlaceDescription: Saisir description de places + placeWithSameAddress: Nettoyer les doublons (manuel) + search: Rechercher par rue + type: Types de places + add: Ajouter + show_delete_double: Nettoyer et afficher les doublons + import: + title: Importation de données de places + help: Uploader un fichier xls contenant des données sur un type d'endroit d'une ville donnée. + success: Importation des données terminées (%traited%/%total% coordonnées de place trouvées) : %imported% nouvelle(s) place(s) ajoutée(s) - %already% place(s) existe(nt) déjà + relaunch_success: Importation des données terminées - %traited%/%total% coordonnées de place trouvées + calculate_coordinate: Recalculer les coordonnées + delete_double: Supprimer les doublons de la ville + form: + city: Ville + placetype: Type de place + file: Sélectionner fichier xls de données + submit: Importer + list: + title: Liste des places ajoutées par les utilisateurs + titleAll : Liste de toutes les places + titlePlaceWithoutLatLong: Liste des places ajoutées sans Latitude ou longitude + titlePlaceWithoutDescription: Liste des places ajoutées sans Description + titleTypePlace: Liste des types de Places + table: + title: Titre + type : Type + description: Description + latitude: Latitude + longitude: Longitude + adresse: Adresse + town: Ville + siteUrl: Url du Site + author: Auteur + addedDate: Date d'ajout + action: Actions + delete_action: Supprimer + update_action: Modifier + code: Code + label: Libellé + language: Langue + img_url: Icône + no_result: Aucune place trouvée + moderate: + form: + placeType: Type de place + ajouterForm: + titleAddTypePlace : Ajouter un type de place + titleUpdateTypePlace : Modifier un type de place + titleAddPlace : Ajouter une nouvelle Place + titleUpdatePlace : Modifier une Place + titleLatLong : Saisir Latitude et Longitude + titleDescription : Saisir la Description + select_file : Selectionner un fichier + libelle: Libellé + code : Code + activity: Activité + longitude: Longitude + latitude: Latitude + isApproxAdress: Adresse Approximative + description: Description + TitlePlace: Titre + siteUrl: Url du Site + town: Ville + street: Adresse + mark: Marque + tel: Téléphone + numberMark: Numéro de marques + date: Date + placeType: Type de place + auteur: Auteur + city: Cité + owner: Propriétaire + langue: Langue + fr : French + en : English + es : Spanish + save : Sauvegarder + rechercheForm: + title : Liste des places correspondant à votre recherche + rechercher: Entrer le nom d'une rue + + list: + number: Il y a %number% places localisées dans cette ville + title: Liste des places de la ville + table: + title: Titre + type : Type de place + address: Adresse + action : Action + delete_action: Supprimer + no_result: Aucune place trouvée + placeWithSameAddress: + list: + title: Liste des places se trouvant à la même addresse + table: + title: Titre + type : Type + description: Description + adresse: Adresse + town: Ville + latitude: Latitude + longitude: Longitude + placeDeleteDouble: + title: Liste des groupes de places qui ont été considérées comme doublon + +placeComment: + menu: + afficher: Commentaires des Places + + list: + title: Liste des Commentaires + table: + author: Auteur + content: Contenu + typeEntity: Type + addedDate: Date d'ajout + place: Place + action: Actions + delete_action: Supprimer + no_result: Aucun commentaire trouvé \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/translations/validators.fr.yml b/CTRV/PlaceBundle/Resources/translations/validators.fr.yml new file mode 100644 index 0000000..53a4185 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/translations/validators.fr.yml @@ -0,0 +1,4 @@ +place: + import: + form: + file_format: Le format du fichier est incorrect. Le format attendu est xls diff --git a/CTRV/PlaceBundle/Resources/views/Place/addNewPlace.html.twig b/CTRV/PlaceBundle/Resources/views/Place/addNewPlace.html.twig new file mode 100644 index 0000000..ebeab44 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/addNewPlace.html.twig @@ -0,0 +1,25 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.ajouterForm.titleAddPlace{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.ajouterForm.save','place') }} +
    +
    +
    +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/ajouterType.html.twig b/CTRV/PlaceBundle/Resources/views/Place/ajouterType.html.twig new file mode 100644 index 0000000..0c791e6 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/ajouterType.html.twig @@ -0,0 +1,25 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.ajouterForm.titleAddTypePlace{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.ajouterForm.save','loadTypePlaces') }} +
    +
    +
    +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/autoDeleteDouble.html.twig b/CTRV/PlaceBundle/Resources/views/Place/autoDeleteDouble.html.twig new file mode 100644 index 0000000..b98dc15 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/autoDeleteDouble.html.twig @@ -0,0 +1,41 @@ +{% extends "::base.html.twig" %} + +{% block body %} + +{% trans %}place.placeDeleteDouble.title{% endtrans %} + + {% for entitys in entities %} + + + + + + + + + + + + + + + + {% for entity in entitys %} + + + + + + + + + + {% endfor %} +
    + +
    Id{% trans %}place.placeWithSameAddress.list.table.type{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.title{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.adresse{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.town{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.latitude{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.longitude{% endtrans %}
    {{ entity.id}}{{ entity.placeType }}{{ entity.title }}{{ entity.street}}{{ entity.town |upper}}{{ entity.latitude}}{{ entity.longitude}}
    +{% endfor %} + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/import.html.twig b/CTRV/PlaceBundle/Resources/views/Place/import.html.twig new file mode 100644 index 0000000..04b4718 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/import.html.twig @@ -0,0 +1,35 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.import.title{% endtrans %}

    + +
    + {% trans %}place.import.help{% endtrans %} +
    + +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.import.form.submit','place') }} +
    +
    + +
    + Il y a {{ notLocalizedPlacesNumber }}/{{ allPlaceNumber }} places non localisées + {% trans %}place.import.calculate_coordinate{% endtrans %} + +
    +
    + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/index.html.twig b/CTRV/PlaceBundle/Resources/views/Place/index.html.twig new file mode 100644 index 0000000..bc597ce --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/index.html.twig @@ -0,0 +1,51 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.list.title{% endtrans %}

    + +
    + {{ form_widget(form) }} +
    +
    {% trans %}place.menu.add{% endtrans %}

    +
    + +
    + +
    + + + + +{% endblock body %} diff --git a/CTRV/PlaceBundle/Resources/views/Place/loadAllPlacesByTypeOrNot.html.twig b/CTRV/PlaceBundle/Resources/views/Place/loadAllPlacesByTypeOrNot.html.twig new file mode 100644 index 0000000..fd53164 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/loadAllPlacesByTypeOrNot.html.twig @@ -0,0 +1,98 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.list.titleAll{% endtrans %}

    + +
    + {{ form_widget(form) }} +
    +
    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT') %} + + + + {% endfor %} + +
    {% trans %}place.list.table.title{% endtrans %}{% trans %}place.list.table.description{% endtrans %}{% trans %}place.list.table.adresse{% endtrans %}{% trans %}place.list.table.addedDate{% endtrans %}{% trans %}place.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.addedDate|date(format) }} + {% trans %}place.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'false', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'place' } %} + +{% else%} +
    {% trans %}place.list.table.no_result{% endtrans %}
    +{% endif %} +
    + +
    + +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/loadPlacesByType.html.twig b/CTRV/PlaceBundle/Resources/views/Place/loadPlacesByType.html.twig new file mode 100644 index 0000000..4cc50aa --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/loadPlacesByType.html.twig @@ -0,0 +1,62 @@ +{% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + {% set format = constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT') %} + + + + {% endfor %} + +
    {% trans %}place.list.table.title{% endtrans %}{% trans %}place.list.table.description{% endtrans %}{% trans %}place.list.table.adresse{% endtrans %}{% trans %}place.list.table.addedDate{% endtrans %}{% trans %}place.list.table.action{% endtrans %}
    {{ entity.title }}{{ entity.description }}{{ entity.street }}{{ entity.addedDate|date(format) }} + {% trans %}place.list.table.delete_action{% endtrans %} + {% trans %}place.list.table.update_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'false', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'place' } %} + +{% else%} +
    {% trans %}place.list.table.no_result{% endtrans %}
    +{% endif %} + + + \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/loadTypePlaces.html.twig b/CTRV/PlaceBundle/Resources/views/Place/loadTypePlaces.html.twig new file mode 100644 index 0000000..b44f4ff --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/loadTypePlaces.html.twig @@ -0,0 +1,66 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.list.titleTypePlace{% endtrans %}

    +
    {% trans %}place.menu.add{% endtrans %}

    +
    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}place.list.table.code{% endtrans %}{% trans %}place.list.table.label{% endtrans %}{% trans %}place.list.table.language{% endtrans %}{% trans %}place.list.table.img_url{% endtrans %}{% trans %}place.list.table.action{% endtrans %}
    {{ entity.code }}{{ entity.label }}{{ entity.language }} + {% trans %}place.list.table.delete_action{% endtrans %} + {% trans %}place.list.table.update_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'loadTypePlaces' } %} + +{% else%} +
    {% trans %}place.list.table.no_result{% endtrans %}
    +{% endif %} +
    +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/modifierType.html.twig b/CTRV/PlaceBundle/Resources/views/Place/modifierType.html.twig new file mode 100644 index 0000000..424ad51 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/modifierType.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.ajouterForm.titleUpdateTypePlace{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.ajouterForm.save','loadTypePlaces') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/placeWithSameAddress.html.twig b/CTRV/PlaceBundle/Resources/views/Place/placeWithSameAddress.html.twig new file mode 100644 index 0000000..a46fe17 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/placeWithSameAddress.html.twig @@ -0,0 +1,93 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.placeWithSameAddress.list.title{% endtrans %}

    +
    + + {% if entities is not empty %} + + + + + + + + + + + + + + + {% set oldStreet = "" %} + + {% for entity in entities %} + + {% if oldStreet != entity.street %} + + + + + + + {% endif %} + + + + + + + + + + + + + {% set oldStreet = entity.street %} + + {% endfor %} + +
    {% trans %}place.placeWithSameAddress.list.table.type{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.title{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.adresse{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.town{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.latitude{% endtrans %}{% trans %}place.placeWithSameAddress.list.table.longitude{% endtrans %}
    {{ entity.street }}
    {{ entity.placeType }}{{ entity.title }}{{ entity.street}}{{ entity.town |upper}}{{ entity.latitude}}{{ entity.longitude}}
    + + + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'placeWithSameAddress' } %} + + {% else%} +
    {% trans %}place.list.table.no_result{% endtrans %}
    + {% endif %} + +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/placeWithoutDescription.html.twig b/CTRV/PlaceBundle/Resources/views/Place/placeWithoutDescription.html.twig new file mode 100644 index 0000000..52f7f83 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/placeWithoutDescription.html.twig @@ -0,0 +1,64 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.list.titlePlaceWithoutDescription{% endtrans %}

    +
    + {% if entities is not empty %} + + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + + {% endfor %} + +
    {% trans %}place.list.table.type{% endtrans %}{% trans %}place.list.table.title{% endtrans %}{% trans %}place.list.table.adresse{% endtrans %}{% trans %}place.list.table.town{% endtrans %}{% trans %}place.list.table.siteUrl{% endtrans %}{% trans %}place.list.table.action{% endtrans %}
    {{ entity.placeType }}{{ entity.title }}{{ entity.street }}{{ entity.town|upper }}{{entity.siteUrl}} + {% trans %}place.list.table.delete_action{% endtrans %} + {% trans %}place.list.table.update_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'placeWithoutDescription' } %} + +{% else%} +
    {% trans %}place.list.table.no_result{% endtrans %}
    +{% endif %} + +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/placeWithoutLatLong.html.twig b/CTRV/PlaceBundle/Resources/views/Place/placeWithoutLatLong.html.twig new file mode 100644 index 0000000..e3250f8 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/placeWithoutLatLong.html.twig @@ -0,0 +1,62 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.list.titlePlaceWithoutLatLong{% endtrans %}

    +
    + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}place.list.table.type{% endtrans %}{% trans %}place.list.table.title{% endtrans %}{% trans %}place.list.table.adresse{% endtrans %}{% trans %}place.list.table.town{% endtrans %}{% trans %}place.list.table.action{% endtrans %}
    {{ entity.placeType }}{{ entity.title }}{{ entity.street}}{{ entity.town |upper}} + {% trans %}place.list.table.delete_action{% endtrans %} + {% trans %}place.list.table.update_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'placeWithoutLatLong' } %} + + {% else%} +
    {% trans %}place.list.table.no_result{% endtrans %}
    + {% endif %} + +
    + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/rechercherPlace.html.twig b/CTRV/PlaceBundle/Resources/views/Place/rechercherPlace.html.twig new file mode 100644 index 0000000..53568f6 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/rechercherPlace.html.twig @@ -0,0 +1,56 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.rechercheForm.list.title{% endtrans %}

    + +
    + {{ form_widget(form) }} +
    + {% trans with {'%number%':localizedPlaceNumber } %}place.rechercheForm.list.number{% endtrans %} +
    +
    +
    + + + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/rechercherPlaceResult.html.twig b/CTRV/PlaceBundle/Resources/views/Place/rechercherPlaceResult.html.twig new file mode 100644 index 0000000..4763df9 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/rechercherPlaceResult.html.twig @@ -0,0 +1,65 @@ + +{% if entities is not empty %} + + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + +
    {% trans %}place.rechercheForm.list.table.type {% endtrans %}{% trans %}place.rechercheForm.list.table.title {% endtrans %}{% trans %}place.rechercheForm.list.table.address {% endtrans %}{% trans %}place.rechercheForm.list.table.action {% endtrans %}
    {{ entity.placeType }}{{ entity.title }}{{ entity.street }} + {% trans %}place.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'false', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'place' } %} + +{% else %} +
    {% trans %}place.rechercheForm.list.table.no_result{% endtrans %}
    +{% endif %} + + + + \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/saisirDescription.html.twig b/CTRV/PlaceBundle/Resources/views/Place/saisirDescription.html.twig new file mode 100644 index 0000000..8f91058 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/saisirDescription.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.ajouterForm.titleDescription{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.ajouterForm.save','placeWithoutDescription') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/saisirLatLong.html.twig b/CTRV/PlaceBundle/Resources/views/Place/saisirLatLong.html.twig new file mode 100644 index 0000000..9718897 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/saisirLatLong.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.ajouterForm.titleLatLong{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.ajouterForm.save','placeWithoutLatLong') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/Place/updatePlace.html.twig b/CTRV/PlaceBundle/Resources/views/Place/updatePlace.html.twig new file mode 100644 index 0000000..46218fa --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/Place/updatePlace.html.twig @@ -0,0 +1,24 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}place.ajouterForm.titleUpdatePlace{% endtrans %}

    +
    + +
    +
    + {{ form_widget(form) }} + {{ forms.input('place.ajouterForm.save','place') }} +
    +
    +
    +
    +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/PlaceComment/loadPlaceComment.html.twig b/CTRV/PlaceBundle/Resources/views/PlaceComment/loadPlaceComment.html.twig new file mode 100644 index 0000000..d736fd4 --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/PlaceComment/loadPlaceComment.html.twig @@ -0,0 +1,70 @@ +{% extends "::base.html.twig" %} +{% import '::macro.html.twig' as forms %} + +{% block body %} + +
    + + {% include "CTRVPlaceBundle::menuPlace.html.twig" %} + +
    + +

    {% trans %}placeComment.list.title{% endtrans %}

    + + {% if entities is not empty %} + + + + + + + + + + + + {% for entity in entities %} + + + + + + + + {% endfor %} + +
    {% trans %}placeComment.list.table.author{% endtrans %}{% trans %}placeComment.list.table.content{% endtrans %}{% trans %}placeComment.list.table.addedDate{% endtrans %}{% trans %}placeComment.list.table.place{% endtrans %}{% trans %}placeComment.list.table.action{% endtrans %}
    {{ entity['comment'].auteur }}{{ entity['comment'].content }}{{ entity['comment'].date|date( constant('CTRV\\CommonBundle\\DependencyInjection\\Constants::DATE_FORMAT')) }}{{ entity['title'] }} + {% trans %}placeComment.list.table.delete_action{% endtrans %} +
    + + {% render "CTRVCommonBundle:Common:renderPagination" with { 'href_active':'true', 'nb_pages' : nb_pages, 'page' : page,'url_path' : 'placeComment' } %} + + {% else %} +
    {% trans %}placeComment.list.table.no_result{% endtrans %}
    + {% endif %} +
    +
    + + + + +{% endblock body %} \ No newline at end of file diff --git a/CTRV/PlaceBundle/Resources/views/menuPlace.html.twig b/CTRV/PlaceBundle/Resources/views/menuPlace.html.twig new file mode 100644 index 0000000..87f79dc --- /dev/null +++ b/CTRV/PlaceBundle/Resources/views/menuPlace.html.twig @@ -0,0 +1,15 @@ + + \ No newline at end of file diff --git a/CTRV/PlaceBundle/Service/PlaceService.php b/CTRV/PlaceBundle/Service/PlaceService.php new file mode 100644 index 0000000..01d500c --- /dev/null +++ b/CTRV/PlaceBundle/Service/PlaceService.php @@ -0,0 +1,579 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + + /** + * Retourne la liste des places ajoutés par les utilisateurs + * @param unknown_type $placeTypeId + * @param unknown_type $currentCity + */ + public function getPlaceAddedByUsers ($placeTypeId, $currentCity) { + $entities = $this->em->getRepository('CTRVPlaceBundle:Place') + ->getPlaceAddedByUsers($this->em->getRepository('CTRVPlaceBundle:PlaceType')->find($placeTypeId), + $this->em->getRepository('CTRVCommonBundle:City')->find($currentCity->getId())); + return $entities; + } + + /** + * Retourne la liste des places sans latitude ou longitude + * @param unknown_type $currentCity + */ + public function getPlacesWithoutLatLong ($currentCity, $first, $last) { + $entities = $this->em->getRepository('CTRVPlaceBundle:Place') + ->getPlacesWithoutLatLong($currentCity->getId(), $first, $last); + return $entities; + } + + /** + * Retourne la liste des places sans description + * @param unknown_type $currentCity + */ + public function getPlacesWithoutDescription ($currentCity, $first, $last) { + $entities = $this->em->getRepository('CTRVPlaceBundle:Place') + ->getPlacesWithoutDescription($currentCity->getId(), $first, $last); + return $entities; + } + + /** + * Retourne la liste des types de places + * @return unknown + */ + public function getTypePlaces() { + $entities = $this->em->getRepository('CTRVPlaceBundle:PlaceType')->getTypePlaces(); + return $entities; + + } + + /** + * Sauvegarde les données de place du fichier excel d'input dans la bdd apres récupération de la latitude et longitude + * @param unknown_type $p_file + * @param unknown_type $p_city + * @param unknown_type $p_place_type + */ + public function savePlaceDataFromFile ($p_file, $p_city, $p_place_type) { + + $placeAleradyExistNumber = 0; + $placesNumber=0; + $added=0; + + //$object = new \PHPExcel_Reader_Excel2007();$object-> + $objet = \PHPExcel_IOFactory::createReaderForFile($p_file); + $excel = $objet->load($p_file); + /* @var $excel \PHPExcel */ + $sheet = $excel->getActiveSheet(); + + foreach ($sheet->getRowIterator(2) as $row) { //on commence à lire à partir de la ligne 2 + + $placesNumber++; + + $cellIterator = $row->getCellIterator(); + // This loops all cells, even if it is not set By default, only cells that are set will be iterated. + $cellIterator->setIterateOnlyExistingCells(false); + + $tel2 = null; $tel = null; $fax = null; $siteUrl = null; $title = null; $activity = null; $street = null; $town = null; + + //parcours des colonnes du fichier excel + foreach ($cellIterator as $cell) { /* @var $cell \PHPExcel_Cell */ +// $line = intval($cell->getRow()); + + $column = $cell->getColumn(); + if ($column == "A") { + $title = $cell->getValue(); + } else if ($column == "B") { + $activity = $cell->getValue(); + } else if ($column == "C") { + $street = $this->traitAddress($cell->getValue()); + } else if ($column == "E") { + $town = $cell->getValue(); + } else if ($column == "F") { + $tel = $cell->getValue(); + } else if ($column == "G") { + $tel2 = $cell->getValue(); + } else if ($column == "H") { + $fax = $cell->getValue(); + } else if ($column == "K") { + $siteUrl = $cell->getValue(); + } + } + + //on cree la place + $placeType = $this->em->getRepository("CTRVPlaceBundle:PlaceType")->find($p_place_type->getId()); + $place = new Place(); + $place->setActivity($activity); + $place->setTitle($title); + $place->setStreet($street); + $place->setTown($town); + $place->setTel($tel); + $place->setTel2($tel2); + $place->setFax($fax); + $place->setSiteUrl($siteUrl); + $place->setCity($this->em->getRepository("CTRVCommonBundle:City")->find($p_city->getId())); + $place->setPlaceType($placeType); + + //on récupere les places situées à la même adresse + $placesTemp = $this->em->getRepository("CTRVPlaceBundle:Place")->findBy(array("placeType"=>$placeType/*,"title"=>$title*/,"street"=>$street,"town"=>$town)); + + //si aucune place n'existe à cette adresse on l'ajoute + if (count($placesTemp) == 0) { + + $this->em->persist($place); + $added++; + + } else { // il existe des places de même type à cette adresse + + //on vérifie si ces places ont un titre similaire + $hasSimilar = false; + foreach ($placesTemp as $placeItem) { + + $title1 = $this->stripAccents($place->getTitle()); + $title2 = $this->stripAccents($placeItem->getTitle()); + $similarity = 0; + + if ($title1==$title2) + $similarity = 100; + else + similar_text($title1, $title2, $similarity); + + if ($similarity > 65) { + $hasSimilar = true; + break; + } + } + + //s'il y a des place similaires + if($hasSimilar) { + $placeAleradyExistNumber++; + + } else { + $this->em->persist($place); + $added++; + } + + } + + } + + $this->em->flush(); + + return array('added'=>$added,'already'=>$placeAleradyExistNumber,'latLngFound'=>0,'all'=>$placesNumber); + } + + /** + * Lance le calcul de latitude longitude de tous les places importées à partir de leur adresse + */ + public function calculateLatLng ($city) { + + $traitedPlaceNumber = 0; + $totalPlaceNumber = 0; + $placeRepo = $this->em->getRepository("CTRVPlaceBundle:Place"); /* @var $placeRepo \Doctrine\ORM\EntityManager */ + + //liste des places dont on ne connait pas la latitude et la longitude + $places = $placeRepo->findBy(array("longitude"=>null, "latitude"=>null),array("id"=>"DESC")); + $totalPlaceNumber = count($places); + $maxRequestReached = false; + $maxRequestReachedOpenStreet = false; + + foreach ($places as $place) { + + $array = null; + + $addres = $place->getStreet().' '.$place->getTown(); + $addres = utf8_encode($addres); + + if (!$maxRequestReached) { //tant qu'on a pas atteint le nombre limite de requetes google + + $array = $this->lookupGoogleMap($addres); + + if ($array['status'] == 'OVER_QUERY_LIMIT') { //si on ateint le nombre max de requete => open street + + $array = null; + $maxRequestReached = true; + + if (!$maxRequestReachedOpenStreet) { + $array = $this->lookupOpenStreetMap($addres); + } + + if ($array!=null) { + $this->updateLatLng($place, $array); + $traitedPlaceNumber++; + } else { +// $maxRequestReachedOpenStreet = true; + } + + } else if ($array['status'] == 'OK') { + + $this->updateLatLng($place, $array); + $traitedPlaceNumber++; + + } else if ($array['status'] == 'INVALID_REQUEST' || $array['status']='ZERO_RESULTS') { + + //on passe à la place suivante +// $maxRequestReached = true; + + } else { + + $array = null; + if (!$maxRequestReachedOpenStreet) { + $array = $this->lookupOpenStreetMap($addres); + } + + if ($array!=null) { + $this->updateLatLng($place, $array); + $traitedPlaceNumber++; + } else { +// $maxRequestReachedOpenStreet = true; + } + } + +// $this->trace($array, $addres); + + } else { //si on atteint le nombre de requetes google max + + if (!$maxRequestReachedOpenStreet) { + $array = $this->lookupOpenStreetMap($addres); + } + + if ($array!=null) { + $this->updateLatLng($place, $array); + $traitedPlaceNumber++; + } else { +// $maxRequestReachedOpenStreet = true; + } + +// $this->trace($array,$addres); + } + + // si on n'a pas atteint le nombre de requetes max + if (!$maxRequestReached || !$maxRequestReachedOpenStreet) { + //sleep(1);//pour ne pas enchainer les requêtes sur un intervalle trop réduit + } else { + //break; + + } +// $this->em->persist($place); +// $this->em->flush();//pour ne pas perdre les lat lng deja trouve + } + + return array($traitedPlaceNumber,$totalPlaceNumber); + } + + public function trace ($array,$address,$saved=false) { + + $myFile = "logPlace.txt"; + $fh = fopen($myFile, 'a'); + + if ($array!=null && $array['status']!='INVALID_REQUEST' && isset($array['latitude']) && isset($array['longitude']) ) { +// var_dump($array);die; + fwrite($fh, "SAVED-".$array['status'].'-'.$array['latitude'].'-'.$array['longitude']."-".$address."-".PHP_EOL); + } else { + fwrite ($fh, "Null-".$array['status']."-".$address.PHP_EOL); + } + } + + /** + * Persist une place si une autre place ne se trouve pas déjà aux mêmes coordonnees + * @param unknown_type $place + * @param unknown_type $array + * @return false si la place existe dejà aux coordonnées passées en parametre + */ + public function updateLatLng ($place, $array) { + + $result = false; + + if ($array!=null && $place!=null) { + + $result = true; + $place->setLatitude($array['latitude']); + $place->setLongitude($array['longitude']); + $this->em->persist($place); + $this->em->flush(); + } + + return $result; + } + + /** + * + * @param unknown_type $address + */ + public function lookupGoogleMap ($address) { + + $result = null; + + $address = strtr($address,'@ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','aAAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); + $address = str_replace (" ", "+", urlencode($address)); + + $details_url = Constants::GOOGLE_MAP_API_URL.$address."&sensor=false";//google map API +// var_dump($details_url); + $ch = curl_init(); + curl_setopt ($ch, CURLOPT_URL, $details_url); + curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); + $response = json_decode(curl_exec($ch), true); + + // If Status Code is ZERO_RESULTS, OVER_QUERY_LIMIT, REQUEST_DENIED or INVALID_REQUEST + if ($response['status'] != 'OK') { + $result = array ( + 'status' => $response['status'], + ); + + } else { + + $geometry = $response['results'][0]['geometry']; + + $longitude = $geometry['location']['lat']; + $latitude = $geometry['location']['lng']; + + $result = array ( + 'status' => $response['status'], + 'longitude' => $geometry['location']['lng'], + 'latitude' => $geometry['location']['lat'], + 'location_type' => $geometry['location_type'], + ); + } +// var_dump($result);die; + return $result; + } + + /** + * Retourne la latitude et la longitude à partir de + * @param unknown_type $address + * @return Ambigous + */ + public function lookupOpenStreetMap ($address) { + + $result = null; +// $address = htmlentities($address,ENT_NOQUOTES,"UTF-8"); +// $address = htmlspecialchars_decode($address); + + $address = strtr($address,'@ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','aAAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy'); + $address = str_replace (" ", "+", urlencode($address)); + + $details_url = Constants::OPEN_STREET_API_URL.$address."&format=json";//open street API +// var_dump(">>>>>".$details_url); + + $ch = curl_init(); + curl_setopt ($ch, CURLOPT_URL, $details_url); + curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); + $response = json_decode(curl_exec($ch), true); + + if ($response != null) { + $result = array ( + 'status' => 'OK', + 'longitude' => $response[0]['lon'], + 'latitude' => $response[0]['lat'] + ); + + } else { + $result = null; + } + + return $result; + } + + /** + * Remplace les abbreviation du champs adresse du fichier excel par le mot complet + * @param unknown_type $street + */ + public function traitAddress ($street) { + + $street = preg_replace("/\bav\b/", "avenue", $street); + $street = preg_replace("/\br\b/", "rue", $street); + $street = preg_replace("/\brte\b/", "route", $street); + $street = preg_replace("/\bpl\b/", "place", $street); + $street = preg_replace("/\bchem\b/", "chemin", $street); + $street = preg_replace("/\bimp\b/", "impasse", $street); + $street = preg_replace("/\bbd\b/", "boulevard", $street); + $street = preg_replace("/\bqu\b/", "quai", $street); + + if (preg_match("/Ctre Ccial/", $street)) { + $street = preg_replace("/\bCtre\b/", "", $street); + } + + $street = preg_replace("/\bctre\b/", "centre", $street); + $street = preg_replace("/\bCcial\b/", "centre commercial", $street); + $street = preg_replace("/\bcial\b/", "commercial", $street); + $street = preg_replace("/\ball\b/", "allee", $street); + + return $street; + } + + /** + * Enleve les accents et convertit la chaine passée en minuscule + * @param unknown_type $str + * @param unknown_type $charset + */ + public function stripAccents($str, $charset='utf-8'){ + $str = htmlentities($str, ENT_NOQUOTES, $charset); + $str = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $str); + $str = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $str); // pour les ligatures e.g. 'œ' + $str = preg_replace('#&[^;]+;#', '', $str); // supprime les autres caractères + + return strtolower($str); + } + + + public function deleteDoublePlaces ($p_city) { + + $taux_title = 65; + $taux_address = 98; + + $groups = array(); + $to_ignore = array();//liste des places sans similaires + +// $places = $this->em->getRepository("CTRVPlaceBundle:Place")->getLocalizedPlacesByCity($p_city); + + //1 7 + $placeType = $this->em->getRepository("CTRVPlaceBundle:PlaceType")->find(1); + $places = $this->em->getRepository("CTRVPlaceBundle:Place")->getLocalizedPlacesByCityAndPlaceType($p_city,$placeType); + $places = array_slice($places, 1501,2000); + $places2 = $this->em->getRepository("CTRVPlaceBundle:Place")->getLocalizedPlacesByCityAndPlaceType($p_city,$placeType); + + $cpt = 0; + foreach ($places as $place) { + +// if ($cpt == 100) +// break; + + $address = $this->stripAccents($place->getStreet()); + $title = $this->stripAccents($place->getTitle()); + $found = false; + + foreach ($places2 as $place2) { + + $similarity_address = 0; + $similarity_title = 0; + + //on ne traire pas la même place && et la place n'est pas à ignorer () && + if ($place->getPlaceType()==$place2->getPlaceType() && $place->getId() != $place2->getId() && !in_array($place2, $to_ignore) && $place->getTown()==$place2->getTown()) { + + $address2 = $this->stripAccents($place2->getStreet()); + $title2 = $this->stripAccents($place2->getTitle()); + + if ($address==$address2) + $similarity_address = 100; + else + similar_text($address, $address2, $similarity_address); + + if ($title==$title2) + $similarity_title = 100; + else + similar_text($title, $title2, $similarity_title); + + //sont similaire + if ( $similarity_address >= $taux_address && $similarity_title >= $taux_title) { + $cpt++; + + $found = true;//il ya une place similaire + + //si le groupe existe deja + if (isset ($groups[$place2->getId()]) && !in_array($place, $groups[$place2->getId()]) ) { + array_push($groups[$place2->getId()],$place); + if(($key = array_search($place, $places)) !== false) { + unset($places[$key]); + } + + } else { + + if (!isset ($groups[$place->getId()])) { + $groups[$place->getId()] = array(); + array_push($groups[$place->getId()],$place); + if(($key = array_search($place, $places)) !== false) { + unset($places[$key]); + } + } + + array_push($groups[$place->getId()],$place2); + if(($key = array_search($place2, $places)) !== false) { + unset($places[$key]); + } + } + } + } + } + + if (!$found) { //si aucune place ne lui est similaire on arrete de traiter cette place + array_push($to_ignore, $place); + if(($key = array_search($place, $places)) !== false) { + unset($places[$key]); + } + } + } + + //suppression des doublons + + foreach ($groups as $group) { + + $hasSamePlaceType = true; + + //si le groupe comporte des places + if (count($group)>0) { + + $placeType = $group[0]->getPlaceType(); + + //on verifie que tous les éléments sont de même type de place + foreach ($group as $place) { + + if($placeType != $place->getPlaceType()) { + $hasSamePlaceType = false; + break; + + } + } + } + + //si tous les elements sont de même type ==> on en garde un seul et on supprime les autres + if ($hasSamePlaceType) { + + if (count($group)>1) { + + //on garde le premier + unset ($group[0]); + + //on supprime les autres + foreach ($group as $place) { + $this->em->remove($place); + } + } + } + } + + $this->em->flush(); + + return $groups; + } + + +} diff --git a/CTRV/TrackerBundle/CTRVTrackerBundle.php b/CTRV/TrackerBundle/CTRVTrackerBundle.php new file mode 100644 index 0000000..ee4a674 --- /dev/null +++ b/CTRV/TrackerBundle/CTRVTrackerBundle.php @@ -0,0 +1,9 @@ + $name); + } +} diff --git a/CTRV/TrackerBundle/DependencyInjection/CTRVTrackerExtension.php b/CTRV/TrackerBundle/DependencyInjection/CTRVTrackerExtension.php new file mode 100644 index 0000000..a246857 --- /dev/null +++ b/CTRV/TrackerBundle/DependencyInjection/CTRVTrackerExtension.php @@ -0,0 +1,28 @@ +processConfiguration($configuration, $configs); + + $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); + $loader->load('services.yml'); + } +} diff --git a/CTRV/TrackerBundle/DependencyInjection/Configuration.php b/CTRV/TrackerBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..4f2b7da --- /dev/null +++ b/CTRV/TrackerBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root('ctrv_tracker'); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/CTRV/TrackerBundle/Resources/config/services.yml b/CTRV/TrackerBundle/Resources/config/services.yml new file mode 100644 index 0000000..0bf21f8 --- /dev/null +++ b/CTRV/TrackerBundle/Resources/config/services.yml @@ -0,0 +1,4 @@ +services: + tracker_service: + class: CTRV\TrackerBundle\Service\TrackerService + arguments: [@mailer,@doctrine,@service_container,@templating,@translator] \ No newline at end of file diff --git a/CTRV/TrackerBundle/Resources/doc/index.rst b/CTRV/TrackerBundle/Resources/doc/index.rst new file mode 100644 index 0000000..e69de29 diff --git a/CTRV/TrackerBundle/Resources/translations/messages.fr.xlf b/CTRV/TrackerBundle/Resources/translations/messages.fr.xlf new file mode 100644 index 0000000..fd59e6c --- /dev/null +++ b/CTRV/TrackerBundle/Resources/translations/messages.fr.xlf @@ -0,0 +1,11 @@ + + + + + + Symfony2 is great + J'aime Symfony2 + + + + diff --git a/CTRV/TrackerBundle/Resources/views/Default/index.html.twig b/CTRV/TrackerBundle/Resources/views/Default/index.html.twig new file mode 100644 index 0000000..4ce626e --- /dev/null +++ b/CTRV/TrackerBundle/Resources/views/Default/index.html.twig @@ -0,0 +1 @@ +Hello {{ name }}! diff --git a/CTRV/TrackerBundle/Service/TrackerService.php b/CTRV/TrackerBundle/Service/TrackerService.php new file mode 100644 index 0000000..7a7e0df --- /dev/null +++ b/CTRV/TrackerBundle/Service/TrackerService.php @@ -0,0 +1,30 @@ +mailer = $mailer; + $this->doctrine = $doctrine; + $this->em = $doctrine->getEntityManager(); + $this->service_container = $service_container; + $this->templating = $templating; + $this->translator = $translator; + } + +} diff --git a/CTRV/UserBundle/CTRVUserBundle.php b/CTRV/UserBundle/CTRVUserBundle.php new file mode 100644 index 0000000..ead7ad3 --- /dev/null +++ b/CTRV/UserBundle/CTRVUserBundle.php @@ -0,0 +1,12 @@ + + + + + + Symfony2 is great + J'aime Symfony2 + + + + diff --git a/CTRV/UserBundle/Resources/translations/messages.fr.yml b/CTRV/UserBundle/Resources/translations/messages.fr.yml new file mode 100644 index 0000000..3d9b550 --- /dev/null +++ b/CTRV/UserBundle/Resources/translations/messages.fr.yml @@ -0,0 +1,17 @@ +utilisateur: + menu: + afficher: Statistique Utilisateurs + groupe: Groupes + nombresC: Utilisateurs + list: + title: Liste des utilisateurs de + title1: Liste des Users Connectés par Ville + title2: Statistique Utilisateurs + table: + firstName: Noms + lastName: Prénoms + addedDate: Date d'enrégistrements + action: Actions + etat: Désactiver + no_result: Aucun utilisateur trouvé + \ No newline at end of file diff --git a/CTRV/UserBundle/Resources/views/Registration/checkEmail.html.twig b/CTRV/UserBundle/Resources/views/Registration/checkEmail.html.twig new file mode 100644 index 0000000..3cdf259 --- /dev/null +++ b/CTRV/UserBundle/Resources/views/Registration/checkEmail.html.twig @@ -0,0 +1,5 @@ +{% extends "FOSUserBundle::layout.html.twig" %} + +{% block fos_user_content %} +

    {{ 'registration.check_email'|trans({'%email%': user.email}, 'FOSUserBundle') }}

    +{% endblock fos_user_content %} diff --git a/CTRV/UserBundle/Resources/views/Registration/confirmed.html.twig b/CTRV/UserBundle/Resources/views/Registration/confirmed.html.twig new file mode 100644 index 0000000..5497c7c --- /dev/null +++ b/CTRV/UserBundle/Resources/views/Registration/confirmed.html.twig @@ -0,0 +1,9 @@ +{% extends "FOSUserBundle::layout.html.twig" %} + +{% block fos_user_content %} +

    {{ 'registration.confirmed'|trans({'%username%': user.username}, 'FOSUserBundle') }}

    + {% if app.session is not empty %} + {% set targetUrl = app.session.get('_security.' ~ app.security.token.providerKey ~ '.target_path') %} + {% if targetUrl is not empty %}

    {{ 'registration.back'|trans({}, 'FOSUserBundle') }}

    {% endif %} + {% endif %} +{% endblock fos_user_content %} diff --git a/CTRV/UserBundle/Resources/views/Registration/email.txt.twig b/CTRV/UserBundle/Resources/views/Registration/email.txt.twig new file mode 100644 index 0000000..8d66372 --- /dev/null +++ b/CTRV/UserBundle/Resources/views/Registration/email.txt.twig @@ -0,0 +1,11 @@ +{% block subject %} +{% autoescape false %} +{{ 'registration.email.subject'|trans({'%username%': user.username, '%confirmationUrl%': confirmationUrl}, 'FOSUserBundle') }} +{% endautoescape %} +{% endblock %} +{% block body_text %} +{% autoescape false %} +{{ 'registration.email.message'|trans({'%username%': user.username, '%confirmationUrl%': confirmationUrl}, 'FOSUserBundle') }} +{% endautoescape %} +{% endblock %} +{% block body_html %}{% endblock %} diff --git a/CTRV/UserBundle/Resources/views/Registration/register.html.twig b/CTRV/UserBundle/Resources/views/Registration/register.html.twig new file mode 100644 index 0000000..bd81770 --- /dev/null +++ b/CTRV/UserBundle/Resources/views/Registration/register.html.twig @@ -0,0 +1,5 @@ +{% extends "FOSUserBundle::layout.html.twig" %} + +{% block fos_user_content %} +{% include "FOSUserBundle:Registration:register_content.html.twig" %} +{% endblock fos_user_content %} diff --git a/CTRV/UserBundle/Resources/views/Registration/register_content.html.twig b/CTRV/UserBundle/Resources/views/Registration/register_content.html.twig new file mode 100644 index 0000000..bf9664d --- /dev/null +++ b/CTRV/UserBundle/Resources/views/Registration/register_content.html.twig @@ -0,0 +1,6 @@ +
    + {{ form_widget(form) }} +
    + +
    +
    diff --git a/CTRV/UserBundle/Resources/views/menu.html.twig b/CTRV/UserBundle/Resources/views/menu.html.twig new file mode 100644 index 0000000..84c3f49 --- /dev/null +++ b/CTRV/UserBundle/Resources/views/menu.html.twig @@ -0,0 +1,9 @@ + + \ No newline at end of file