From f6953fcb7eba1c3257524ed8857fe836c5eef964 Mon Sep 17 00:00:00 2001 From: A564406 Date: Fri, 11 Mar 2016 15:16:11 +0100 Subject: [PATCH 001/129] Ajout de la gestion d'une synchronisation de calendrier. --- .../api/controllers/CalendarController.php | 18 ++ application/modules/api/services/Calendar.php | 244 ++++++++++++++++++ 2 files changed, 262 insertions(+) create mode 100755 application/modules/api/controllers/CalendarController.php create mode 100755 application/modules/api/services/Calendar.php diff --git a/application/modules/api/controllers/CalendarController.php b/application/modules/api/controllers/CalendarController.php new file mode 100755 index 00000000..a0396486 --- /dev/null +++ b/application/modules/api/controllers/CalendarController.php @@ -0,0 +1,18 @@ +view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + $server = new SDIS62_Rest_Server; + $server->setClass("Api_Service_Calendar"); + $server->handle($this->_request->getParams()); + } +} \ No newline at end of file diff --git a/application/modules/api/services/Calendar.php b/application/modules/api/services/Calendar.php new file mode 100755 index 00000000..c5776c15 --- /dev/null +++ b/application/modules/api/services/Calendar.php @@ -0,0 +1,244 @@ +createRequestForWebcalEvent($userid, + $commission); + + $dbDateCommission = new Model_DbTable_DateCommission; + + $calendar = new VObject\Component\VCalendar(array( + "NAME" => "Calendrier Prévarisc", + "X-WR-CALNAME" => "Calendrier Prévarisc", + "REFRESH-INTERVAL;VALUE=DURATION" => "PT5M", + "X-PUBLISHED-TTL" => "PT5M" + )); + + $vtimezone = $this->getVTimezoneComponent($calendar); + $calendar->add($vtimezone); + + + foreach ($dbDateCommission->getEventInCommission($request) as $commissionEvent) { + $event = $this->createICSEvent($commissionEvent); + if ($event) { + $calendar->add("VEVENT", $event); + } + } + + echo $calendar->serialize(); + } + + private function getVTimezoneComponent($calendar) + { + $vtimezone = new VObject\Component\VTimeZone($calendar, "VTIMEZONE"); + $daylight = new VObject\Component($calendar, "DAYLIGHT", [ + "DTSTART" => new DateTime("16010325T020000"), + "RRULE" => "FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3", + "TZOFFSETFROM" => "+0100", + "TZOFFSETTO" => "+0200" + ]); + $standard = new VObject\Component($calendar, "STANDARD", [ + "DTSTART" => new DateTime("16011028T030000"), + "RRULE" => "FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10", + "TZOFFSETFROM" => "+0200", + "TZOFFSETTO" => "+0100" + ]); + $vtimezone->TZID = date_default_timezone_get(); + $vtimezone->add($standard); + $vtimezone->add($daylight); + + return $vtimezone; + } + + /** + * [createRequestForWebcalEvent description] + * @return string La requête générée + */ + private function createRequestForWebcalEvent($userid, $commission) + { + $request = "ID_UTILISATEUR = " . $userid; + + // Gestion des commissions concernés + if ($commission) { + $request .= " AND COMMISSION_CONCERNE = " . $commission; + } + + // Gestion de la date (un an avant l'année actuelle) + $today = new \DateTime(); + $yearBefore = $today->modify("-1 year")->format("Y"); + $request .= " AND YEAR(DATE_COMMISSION) >= '" . $yearBefore . "'"; + + return $request; + } + + + private function createICSEvent($commissionEvent) + { + $event = null; + + if (is_array($commissionEvent)) { + $etsService = new Service_Etablissement; + $ets = $etsService->get($commissionEvent["ID_ETABLISSEMENT"]); + // Cas d'une commission en salle + if ($commissionEvent["ID_COMMISSIONTYPEEVENEMENT"] === 1) { + $summary = sprintf("%s %s - %s", + $commissionEvent["LIBELLE_DOSSIERTYPE"], + $commissionEvent["LIBELLE_DOSSIERNATURE"], + $commissionEvent["OBJET_DOSSIER"]); + $geo = $commissionEvent["LIBELLE_COMMISSION"]; + // Cas d'une visite d'une commission ou d'un groupe de visite + } else { + $adresse = count($ets["adresses"]) > 0 ? $ets["adresses"][0] : null; + $summary = $commissionEvent["LIBELLE_DATECOMMISSION"]; + $geo = $ets["informations"]["LIBELLE_ETABLISSEMENTINFORMATIONS"]; + if ($adresse) { + $geo .= sprintf(" %s %s %s %s %s", + $adresse["NUMERO_ADRESSE"], + $adresse["LIBELLE_RUETYPE"], + $adresse["LIBELLE_RUE"], + $adresse["CODEPOSTAL_COMMUNE"], + $adresse["LIBELLE_COMMUNE"] + ); + } + } + $dateStartHour = $commissionEvent["HEURE_DEB_AFFECT"] ? + "HEURE_DEB_AFFECT" : "HEUREDEB_COMMISSION"; + $dateEndHour = $commissionEvent["HEURE_FIN_AFFECT"] ? + "HEURE_FIN_AFFECT" : "HEUREFIN_COMMISSION"; + $dtStart = new \DateTime(sprintf("%s %s", + $commissionEvent["DATE_COMMISSION"], + $commissionEvent[$dateStartHour]), + new DateTimeZone(date_default_timezone_get())); + + $dtEnd = new \DateTime(sprintf("%s %s", + $commissionEvent["DATE_COMMISSION"], + $commissionEvent[$dateEndHour]), + new DateTimeZone(date_default_timezone_get())); + + $event = array( + "SUMMARY" => $summary, + "LOCATION" => $geo, + "DESCRIPTION" => $this->getEventCorps($commissionEvent, $ets), + "DTSTART" => $dtStart, + "DTEND" => $dtEnd + ); + + } + + return $event; + } + + private function getAvisEtablissement($event, $ets) + { + $servEtab = new Service_Etablissement; + $avisDoss = $servEtab->getAvisEtablissement( + $ets['general']['ID_ETABLISSEMENT'], + $ets['general']['ID_DOSSIER_DONNANT_AVIS'] + ); + if ($ets['presence_avis_differe'] && $avisDoss === "avisDiff") { + $avis = "Dossier avec avis differé"; + } elseif ($ets['avis'] === 1) { + $avis = "Favorable"; + if ($ets['informations']["ID_GENRE"] === 3) { + $avis .= " à l'exploitation"; + } + } elseif ($ets['avis'] === 2) { + $avis = "Défavorable"; + if ($ets['informations']["ID_GENRE"] === 3) { + $avis .= " à l'exploitation"; + } + } else { + $avis = "Avis d'exploitation indisponible"; + } + + return $avis; + } + + + private function getEventCorps($commissionEvent, $ets) + { + $corpus = "Coordonnées des participants :\r\n"; + + $dossierService = new Service_Dossier; + $contacts = $dossierService->getAllContacts( + $commissionEvent["ID_DOSSIER"]); + foreach ($contacts as $contact) { + $corpus .= $this->formatUtilisateurInformations($contact); + } + $corpus .= "\n"; + + $adresseService = new Service_Adresse; + $maire = $adresseService->getMaire($commissionEvent["NUMINSEE_COMMUNE"]); + $corpus .= sprintf("Coordonnées de la mairie :\r\n%s\r\n\r\n", + $this->formatUtilisateurInformations($maire)); + + if ($commissionEvent["ID_DOSSIERTYPE"] === 1) { + if ($commissionEvent["TYPESERVINSTRUC_DOSSIER"] === "servInstCommune") { + $serviceInstruct = $maire; + } else { + $dbGroupement = new Model_DbTable_Groupement; + $serviceInstruct = $dbGroupement->getByLibelle( + $commissionEvent["SERVICEINSTRUC_DOSSIER"]); + $serviceInstruct = count($serviceInstruct) > 0 ? + $serviceInstruct[0] : null; + } + $corpus .= sprintf("Coordonnées du service instructeur :\n%s\n\n", + $this->formatUtilisateurInformations($serviceInstruct)); + } + + $corpus .= sprintf("Date de la dernière visite périodique : %s\n\n", + $ets["last_visite"]); + + $corpus .= sprintf("Avis d'exploitation de l'établissement : %s\n\n", + $this->getAvisEtablissement($commissionEvent, $ets)); + + return $corpus; + } + + private function formatUtilisateurInformations($user) + { + $str = ""; + if ($user && is_array($user)) { + if ($user["NOM_UTILISATEURINFORMATIONS"] + && $user["PRENOM_UTILISATEURINFORMATIONS"]) { + $str .= sprintf("- %s %s, ", + $user["NOM_UTILISATEURINFORMATIONS"], + $user["PRENOM_UTILISATEURINFORMATIONS"]); + if ($user["NUMEROADRESSE_UTILISATEURINFORMATIONS"] + && $user["RUEADRESSE_UTILISATEURINFORMATIONS"] + && $user["NUMEROADRESSE_UTILISATEURINFORMATIONS"] + && $user["CPADRESSE_UTILISATEURINFORMATIONS"] + && $user["VILLEADRESSE_UTILISATEURINFORMATIONS"]) { + $str .= sprintf("%s %s %s %s, ", + $user["NUMEROADRESSE_UTILISATEURINFORMATIONS"], + $user["RUEADRESSE_UTILISATEURINFORMATIONS"], + $user["CPADRESSE_UTILISATEURINFORMATIONS"], + $user["VILLEADRESSE_UTILISATEURINFORMATIONS"] + ); + } + if ($user["TELFIXE_UTILISATEURINFORMATIONS"]) { + $str .= sprintf("%s, ", + $user["TELFIXE_UTILISATEURINFORMATIONS"]); + } + if ($user["TELFAX_UTILISATEURINFORMATIONS"]) { + $str .= sprintf("%s, ", + $user["TELFAX_UTILISATEURINFORMATIONS"]); + } + if ($user["MAIL_UTILISATEURINFORMATIONS"]) { + $str .= sprintf("%s, ", + $user["MAIL_UTILISATEURINFORMATIONS"]); + } + $str .= "\n"; + } + } + + return $str; + + } +} \ No newline at end of file From cd8d99f36a5d00eda688756d5c4fb5ffe10ce744 Mon Sep 17 00:00:00 2001 From: A564406 Date: Tue, 15 Mar 2016 14:41:57 +0100 Subject: [PATCH 002/129] Ajout des fichiers manquants. --- .../CalendrierDesCommissionsController.php | 38 +++++++++++---- .../calendrier-des-commissions/index.phtml | 46 +++++++++++++++++-- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/application/controllers/CalendrierDesCommissionsController.php b/application/controllers/CalendrierDesCommissionsController.php index 7b281010..733055f0 100755 --- a/application/controllers/CalendrierDesCommissionsController.php +++ b/application/controllers/CalendrierDesCommissionsController.php @@ -38,13 +38,13 @@ public function indexAction() $array_results = $model_commission->fetchAll("ID_COMMISSIONTYPE = " . $row_typeDeCommission->ID_COMMISSIONTYPE )->toArray(); $array_results2 = array(); foreach($array_results as $item) { - $array_results2[] = array( - "ID_COMMISSION" => $item["ID_COMMISSION"], - "LIBELLE_COMMISSION" => $item["LIBELLE_COMMISSION"], - "DOCUMENT_CR" => $item["DOCUMENT_CR"], - "ID_COMMISSIONTYPE" => $item["ID_COMMISSIONTYPE"], - "LIBELLE_COMMISSIONTYPE" => $row_typeDeCommission->LIBELLE_COMMISSIONTYPE - ); + $array_results2[] = array( + "ID_COMMISSION" => $item["ID_COMMISSION"], + "LIBELLE_COMMISSION" => $item["LIBELLE_COMMISSION"], + "DOCUMENT_CR" => $item["DOCUMENT_CR"], + "ID_COMMISSIONTYPE" => $item["ID_COMMISSIONTYPE"], + "LIBELLE_COMMISSIONTYPE" => $row_typeDeCommission->LIBELLE_COMMISSIONTYPE + ); } $array_commissions[$row_typeDeCommission->ID_COMMISSIONTYPE] = array( "LIBELLE" => $row_typeDeCommission->LIBELLE_COMMISSIONTYPE, @@ -64,7 +64,7 @@ public function recupdatelieeAction() $infosDateComm = $dbDateComm->find($this->_getParam('idDate'))->current(); //Une fois les infos de la date récupérées on peux aller chercher les date liées à cette commission pour les afficher - if (!$infosDateComm['DATECOMMISSION_LIEES']) { + if ( ! $infosDateComm['DATECOMMISSION_LIEES']) { $commPrincipale = $this->_getParam('idDate'); } else { $commPrincipale = $infosDateComm['DATECOMMISSION_LIEES']; @@ -1188,9 +1188,9 @@ public function generationcompterenduAction() $model_adresseCommune = new Model_DbTable_AdresseCommune; $model_utilisateurInfo = new Model_DbTable_UtilisateurInformations; - if($commissionInfo['GESTION_HEURES'] == 1){ + if ($commissionInfo['GESTION_HEURES'] == 1){ $listeDossiers = $dbDateCommPj->TESTRECUPDOSSHEURE($dateCommId); - }else{ + } else { $listeDossiers = $dbDateCommPj->TESTRECUPDOSS($dateCommId); } @@ -1380,5 +1380,23 @@ public function exportoutlookmoisAction() { echo $ics; } + public function synccalendarAction() + { + $this->view->layout()->disableLayout(); + $this->_helper->viewRenderer->setNoRender(true); + + $userId = Zend_Auth::getInstance()->getIdentity()['ID_UTILISATEUR']; + + $url = sprintf("/api/1.0/calendar?userid=%s&key=%s", + $userId, + getenv('PREVARISC_SECURITY_KEY')); + + if ($this->_getParam("idComm")) { + $url .= sprintf("&commission=%s", $this->_getParam("idComm")); + } + + echo 'webcal://' . $_SERVER["HTTP_HOST"] . $url; + } + } diff --git a/application/views/scripts/calendrier-des-commissions/index.phtml b/application/views/scripts/calendrier-des-commissions/index.phtml index 3aeaf749..de976242 100755 --- a/application/views/scripts/calendrier-des-commissions/index.phtml +++ b/application/views/scripts/calendrier-des-commissions/index.phtml @@ -1,12 +1,22 @@ placeholder('lateral_navigation')->captureStart(); // Capture du 'lateral_navigation' ?> placeholder('lateral_navigation')->captureEnd(); ?> diff --git a/application/models/DbTable/Changement.php b/application/models/DbTable/Changement.php new file mode 100644 index 00000000..883ba564 --- /dev/null +++ b/application/models/DbTable/Changement.php @@ -0,0 +1,21 @@ +select() + ->setIntegrityCheck(false) + ->from("changement"); + + return $this->fetchAll($select)->toArray(); + } +} diff --git a/application/models/DbTable/Etablissement.php b/application/models/DbTable/Etablissement.php index 88d253a9..6ed4d650 100755 --- a/application/models/DbTable/Etablissement.php +++ b/application/models/DbTable/Etablissement.php @@ -330,7 +330,4 @@ public function listeErpOuvertsSansProchainesVisitePeriodiques($idsCommission) } - - - } diff --git a/application/models/DbTable/Utilisateur.php b/application/models/DbTable/Utilisateur.php index b90a02e9..d2f3af4b 100755 --- a/application/models/DbTable/Utilisateur.php +++ b/application/models/DbTable/Utilisateur.php @@ -244,4 +244,77 @@ public function getGroupPrivileges($user) return $privileges; } + + + /** + * Retourne une liste d'utilisateur ayant les droits + * de recevoir les type d'alerte (changement de statut, avis, catégorie) + * et étant concerné par la commune ou le groupement de commune de l'établissement + * + * @param int $idChangement L'id du type de changement + * @param array $ets L'établissement concerné par le changement + * @return array Liste d'utilisateur + */ + public function findUtilisateursForAlerte($idChangement, $ets) + { + switch($idChangement) { + case "1": + $privilege = "alerte_statut"; + break; + case "2": + $privilege = "alerte_avis"; + break; + case "3": + $privilege = "alerte_classement"; + break; + default: + $privilege = "alerte_statut"; + } + + $numinsee = ""; + if (count($ets['adresses']) > 0) { + $numinsee = $ets['adresses'][0]['NUMINSEE_COMMUNE']; + } + + $selectPrivilegeQuery = $this->select()->setIntegrityCheck(false) + ->from(array('p' => 'privileges'), array('p.id_privilege')) + ->where('name = ?', $privilege) + ->limit(1); + + $selectCommune = $this->select()->setIntegrityCheck(false) + ->from(array('u' => 'utilisateur'), array('ID_UTILISATEUR')) + ->join(array('ui' => 'utilisateurinformations'), + 'ui.ID_UTILISATEURINFORMATIONS = u.ID_UTILISATEURINFORMATIONS', + array('ui.NOM_UTILISATEURINFORMATIONS', 'ui.PRENOM_UTILISATEURINFORMATIONS', + 'ui.MAIL_UTILISATEURINFORMATIONS')) + ->join(array('g' => 'groupe'), 'g.ID_GROUPE = u.ID_GROUPE', null) + ->join(array('gp' => 'groupe-privileges'), 'gp.ID_GROUPE = g.ID_GROUPE', null) + ->where('ui.MAIL_UTILISATEURINFORMATIONS IS NOT NULL') + ->where('ui.MAIL_UTILISATEURINFORMATIONS <> ?', '') + ->where('gp.id_privilege = (' . $selectPrivilegeQuery . ')') + ->where('u.NUMINSEE_COMMUNE = ?', $numinsee) + ->group('u.ID_UTILISATEUR'); + + $selectGroupement = $this->select()->setIntegrityCheck(false) + ->from(array('u' => 'utilisateur'), array('ID_UTILISATEUR')) + ->join(array('ui' => 'utilisateurinformations'), + 'ui.ID_UTILISATEURINFORMATIONS = u.ID_UTILISATEURINFORMATIONS', + array('ui.NOM_UTILISATEURINFORMATIONS', 'ui.PRENOM_UTILISATEURINFORMATIONS', + 'ui.MAIL_UTILISATEURINFORMATIONS')) + ->join(array('g' => 'groupe'), 'g.ID_GROUPE = u.ID_GROUPE', null) + ->join(array('gp' => 'groupe-privileges'), 'gp.ID_GROUPE = g.ID_GROUPE', null) + ->join(array('ug' => 'utilisateurgroupement'), 'ug.ID_UTILISATEUR = u.ID_UTILISATEUR', null) + ->join(array('gc' => 'groupementcommune'), 'gc.ID_GROUPEMENT = ug.ID_GROUPEMENT', null) + ->where('ui.MAIL_UTILISATEURINFORMATIONS IS NOT NULL') + ->where('ui.MAIL_UTILISATEURINFORMATIONS <> ?', '') + ->where('gp.id_privilege = (' . $selectPrivilegeQuery . ')') + ->where('gc.NUMINSEE_COMMUNE = ?', $numinsee) + ->group('u.ID_UTILISATEUR'); + + $selectUnion = $this->select() + ->union(array($selectCommune, $selectGroupement)); + + + return $this->fetchAll($selectUnion)->toArray(); + } } diff --git a/application/navigation.xml b/application/navigation.xml index c3908430..98716a1c 100755 --- a/application/navigation.xml +++ b/application/navigation.xml @@ -518,6 +518,15 @@ + + + changement + index + alerte_email + alerte_statut + alerte_avis + alerte_classement + diff --git a/application/services/Alerte.php b/application/services/Alerte.php new file mode 100644 index 00000000..9d3361d7 --- /dev/null +++ b/application/services/Alerte.php @@ -0,0 +1,16 @@ +Alerter'; + + public function getLink($idTypeChangement, $idEtablissement = null) + { + $etabData = ""; + if ($idEtablissement) { + $etabData = sprintf(' data-ets="%s"', $idEtablissement); + } + + return sprintf(self::ALERTE_LINK, $idTypeChangement, $etabData); + } +} \ No newline at end of file diff --git a/application/services/Changement.php b/application/services/Changement.php new file mode 100644 index 00000000..87a92cd4 --- /dev/null +++ b/application/services/Changement.php @@ -0,0 +1,200 @@ + array( + "description" => "L'activité principale de l'établissement", + "model" => "informations", + "champ" => "LIBELLE_TYPEACTIVITE_PRINCIPAL" + ), + "{categorieEtablissement}" => array( + "description" => "La catégorie de l'etablissement", + "model" => "informations", + "champ" => "LIBELLE_CATEGORIE" + ), + "{etablissementAvis}" => array( + "description" => "L'avis de l'établissement", + "model" => "avis", + "champ" => "" + ), + "{etablissementLibelle}" => array( + "description" => "Le libelle de l'établissement", + "model" => "informations", + "champ" => "LIBELLE_ETABLISSEMENTINFORMATIONS" + ), + "{etablissementNumeroId}" => array( + "description" => "Le numéro Id de l'établissement", + "model" => "general", + "champ" => "NUMEROID_ETABLISSEMENT" + ), + "{etablissementStatut}" => array( + "description" => "Le statut (Ouvert ou Fermé) de l'établissement", + "model" => "informations", + "champ" => "LIBELLE_STATUT" + ), + "{typePrincipalEtablissement}" => array( + "description" => "Le type principal de l'établissement", + "model" => "informations", + "champ" => "LIBELLE_TYPE_PRINCIPAL" + ) + + ); + + /** + * Retourne tous les enregistrement contenus dans la table changement + * + * @return array Le résultat + */ + public function getAll() + { + $dbChangement = new Model_DbTable_Changement; + + return $dbChangement->findAll(); + } + + /** + * Retourne un changement via son Id précisé en argument + * + * @param int $idChangement L'id du changement à retourner + * @return array Le résultat + */ + public function get($idChangement) + { + $dbChangement = new Model_DbTable_Changement; + + return $dbChangement->find($idChangement)->current(); + } + + /** + * Sauvegarde les modifications apportées aux messages d'alerte + * par défaut + * + * @param array $data Les données envoyés en post + * @return void + */ + public function save($data) + { + if (is_array($data)) { + foreach ($data as $key => $message) { + $idChangement = explode('_', $key)[0]; + $changement = $this->get($idChangement); + $changement->MESSAGE_CHANGEMENT = $message; + $changement->save(); + } + } + } + + /** + * Retourne le tableau de balises + * + * @return array Les balises définies dans cette classe + */ + public function getBalises() + { + return self::BALISES; + } + + /** + * Retourne l'objet du mail de changement formaté + * + * @param int $idChangement Id du changement + * @param array $ets Etablissement concerné + * @return string L'objet formaté + */ + public function getObjet($idChangement, $ets) + { + switch($idChangement) { + case "1": + $objet = sprintf("Passage au statut \"%s\"", + $ets['informations']['LIBELLE_STATUT']); + break; + case "2": + $objet = sprintf("Passage en avis \"%s\"", + $this->getAvis($ets)); + break; + case "3": + $objet = sprintf("Changement de classement \"%s - %s %s\"", + $ets['informations']['LIBELLE_CATEGORIE'], + $ets['informations']['LIBELLE_TYPE_PRINCIPAL'], + $ets['informations']['LIBELLE_TYPEACTIVITE_PRINCIPAL'] + ); + break; + default: + $objet = ""; + } + + $commune = ""; + if (count($ets['adresses']) > 0) { + $commune = $ets['adresses'][0]['LIBELLE_COMMUNE']; + } + + $libelleInfos = $ets['informations']['LIBELLE_ETABLISSEMENTINFORMATIONS']; + if (count($ets['parents']) > 0) { + $libelleInfos = sprintf("%s %s", + $ets['parents'][0]['LIBELLE_ETABLISSEMENTINFORMATIONS'], + $libelleInfos + ); + } + + return sprintf("%s (%s) - %s", + $libelleInfos, + $commune, + $objet); + } + + /** + * Convertit les balises dans le message avec les bonnes valeurs + * + * @param string $message Le message a envoyer avec des balises + * @return string Le message convertit + */ + public function convertMessage($message, $ets) + { + $params = array(); + foreach(self::BALISES as $balise => $content) { + $replacementstr = ""; + if ($content['model'] === "avis") { + $replacementstr = $this->getAvis($ets); + } elseif (array_key_exists($content['model'], $ets) + && array_key_exists($content['champ'], $ets[$content['model']])) { + $replacementstr = $ets[$content['model']][$content['champ']]; + } + $params[$balise] = $replacementstr; + } + + return strtr($message, $params); + } + + /** + * Retourne l'avis d'un établissement formaté + * + * @param array $ets L'établissement + * @return string L'avis de l'établissement + */ + public function getAvis($ets) + { + $avis = ''; + $serviceEts = new Service_Etablissement; + $avisType = $serviceEts->getAvisEtablissement( + $ets['general']['ID_ETABLISSEMENT'], $ets['general']['ID_DOSSIER_DONNANT_AVIS']); + + if ($ets['presence_avis_differe'] == true && $avisType == "avisDiff") { + $avis = "Présence d'un dossier avec avis differé"; + } elseif ($ets['avis'] != null) { + if($ets['avis'] == 1 && $avisType == "avisDoss") { + $avis = "Favorable" . ($ets['informations']['ID_GENRE'] == 3 ? '' : " à l'exploitation"); + } elseif ($ets['avis'] == 2 && $avisType == "avisDoss") { + $avis = "Défavorable" . ($ets['informations']['ID_GENRE'] == 3 ? '' : " à l'exploitation"); + } + } else { + $avis = "Avis d'exploitation indisponible"; + } + + return $avis; + } +} \ No newline at end of file diff --git a/application/services/Etablissement.php b/application/services/Etablissement.php index 833c82bb..d2470bfd 100755 --- a/application/services/Etablissement.php +++ b/application/services/Etablissement.php @@ -2,6 +2,8 @@ class Service_Etablissement implements Service_Interface_Etablissement { + const STATUT_CHANGE = 1; + const CLASSEMENT_CHANGE = 3; /** * Récupération d'un établissement * @@ -604,6 +606,47 @@ public function ficheExiste($id_etablissement, $date) return (null != ($row = $DB_information->fetchRow("ID_ETABLISSEMENT = '" . $id_etablissement . "' AND DATE_ETABLISSEMENTINFORMATIONS = '" . $date . "'"))) ? true : false; } + + public function checkAlerte($ets, $postData) + { + $alerte = false; + + if ($ets && $postData) { + + if ($ets["informations"]["ID_STATUT"] != $postData["ID_STATUT"]) { + $alerte = self::STATUT_CHANGE; + } + + + if ($ets["informations"]["ID_CATEGORIE"] != $postData["ID_CATEGORIE"] + || $ets["informations"]["ID_TYPE"] != $postData["ID_TYPE"] + || $ets["informations"]["ID_TYPEACTIVITE"] != $postData["ID_TYPEACTIVITE"] + || $this->compareActivitesSecondaires($ets, $postData)) { + $alerte = self::CLASSEMENT_CHANGE; + } + + } + + return $alerte; + } + + private function compareActivitesSecondaires($ets, $postData) + { + $result = false; + + foreach($ets['types_activites_secondaires'] as $typesASecondaires) { + if ( ! array_key_exists($typesASecondaires[ + 'ID_ETABLISSEMENTINFORMATIONSTYPESACTIVITESSECONDAIRES'], + $postData['TYPES_ACTIVITES_SECONDAIRES'])) { + $result = true; + break; + } + } + + return $result; + } + + /** * Sauvegarde d'un établissement * diff --git a/application/services/Mail.php b/application/services/Mail.php new file mode 100644 index 00000000..5e4e880f --- /dev/null +++ b/application/services/Mail.php @@ -0,0 +1,104 @@ +sendMail($message, $objet, null, $destinataires); + } + + + public function sendMail($message, $objet = null, $to = null, $bcc = null) + { + $sent = true; + + $mail = new Zend_Mail('utf-8'); + + $mail->setBodyText($message); + + if ($objet) { + $mail->setSubject($objet); + } + + if ($to) { + if (is_array($to)) { + foreach ($to as $dest) { + $mail->addTo($dest); + } + } else { + $mail->addTo($to); + } + } + + if ($bcc) { + if (is_array($bcc)) { + foreach($bcc as $cc) { + $mail->addBcc($cc); + } + } else { + $mail->addBcc($bcc); + } + } + + try { + $mail = $mail->send(); + } catch (Zend_Mail_Transport_Exception $zmte) { + $sent = $zmte; + } catch (Zend_Mail_Protocol_Exception $zmpe) { + $sent = $zmpe; + } + + return $sent; + } + + +} + +?> \ No newline at end of file diff --git a/application/services/User.php b/application/services/User.php index 985875b5..5f39408f 100755 --- a/application/services/User.php +++ b/application/services/User.php @@ -343,4 +343,18 @@ public function getGroupPrivileges($user) $privileges = $model_user->getGroupPrivileges($user); return $privileges; } + + /** + * Récupération des utilisateurs pour les alertes + * + * @param int $idChangement L'id du type changement + * @param array $etablissement L'établissement concerné par le changement + * @return array La liste des utilisateurs + */ + public function getUtilisateursForAlterte($idChangement, $etablissement) + { + $dbUtilisateur = new Model_DbTable_Utilisateur; + + return $dbUtilisateur->findUtilisateursForAlerte($idChangement, $etablissement); + } } diff --git a/application/views/scripts/changement/alerteform.phtml b/application/views/scripts/changement/alerteform.phtml new file mode 100644 index 00000000..634bbcd9 --- /dev/null +++ b/application/views/scripts/changement/alerteform.phtml @@ -0,0 +1,73 @@ +
+
+ A : + tos; ?> + +
+
+
+ Objet : + +
+
+
+ Message : +
+ +
+
+
+

+ Aucun destinataire pour l'envoi par mail de l'alerte. +

+

+ Pour y remédier, vérifier que les utilisateurs concernés ont les droits concernant les alertes par emails +

+

+ Si tous les destinataires ont été retiré, fermer cette popup, et recliquer sur "Alerter". +

+
+ \ No newline at end of file diff --git a/application/views/scripts/changement/balises.phtml b/application/views/scripts/changement/balises.phtml new file mode 100644 index 00000000..b989a05d --- /dev/null +++ b/application/views/scripts/changement/balises.phtml @@ -0,0 +1,20 @@ + + + + + + balises as $balise => $content) : ?> + + + + + +
+ Balise + + Description +
+ + + +
\ No newline at end of file diff --git a/application/views/scripts/changement/index.phtml b/application/views/scripts/changement/index.phtml new file mode 100644 index 00000000..c630d860 --- /dev/null +++ b/application/views/scripts/changement/index.phtml @@ -0,0 +1,72 @@ + +
+
+ + +
+ changements as $changement) : ?> +

+ Message de +

+ + +
+ + + diff --git a/application/views/scripts/dossier/index.phtml b/application/views/scripts/dossier/index.phtml index 424dae73..abf4bb09 100755 --- a/application/views/scripts/dossier/index.phtml +++ b/application/views/scripts/dossier/index.phtml @@ -1,6 +1,71 @@ diff --git a/application/views/scripts/etablissement/index.phtml b/application/views/scripts/etablissement/index.phtml index 2507c142..68cce6de 100755 --- a/application/views/scripts/etablissement/index.phtml +++ b/application/views/scripts/etablissement/index.phtml @@ -511,8 +511,74 @@ diff --git a/public/css/main.css b/public/css/main.css index 31d3d391..ca7a491a 100644 --- a/public/css/main.css +++ b/public/css/main.css @@ -1145,4 +1145,50 @@ a.list-group-item-danger.active:focus { #tabPieceJointe .msg{ background: url('../images/msg.png') no-repeat; -} \ No newline at end of file +} + +a.alerte-link:hover { + cursor: pointer; +} + +.alerte-link i { + margin-right: 5px; +} + +.table-balises { + width: 100%; +} + +.table-balises, .table-balises th, .table-balises td { + border: 1px solid #ccc; +} + +.table-balises th, .table-balises td { + padding: 5px 10px; +} + +.td-balise { + color: #666; + font-style: italic; + width: 40%; +} + +.mail-objet-input { + width: 85%; +} + +#formAlerte hr { + margin: 10px 0; +} + +.remove-dst { + font-size: 10px; +} + +#mail-no-bcc { + display: none; +} + +#mail-no-bcc p { + font-style: italic; +} diff --git a/public/index.php b/public/index.php index fa1ce29e..eb0c8bd2 100755 --- a/public/index.php +++ b/public/index.php @@ -70,6 +70,17 @@ 'phpSettings' => array( 'display_startup_errors' => getenv('PREVARISC_DEBUG_ENABLED'), 'display_errors' => getenv('PREVARISC_DEBUG_ENABLED'), + ), + 'mail' => array( + 'enabled' => getenv('PREVARISC_MAIL_ENABLED'), + 'transport' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_TRANSPORT') : '', + 'host' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_HOST') : '', + 'port' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_PORT') : '', + 'authentication' => getenv('PREVARISC_MAIL_ENABLED') && getenv('PREVARISC_MAIL_USERNAME') !== '', + 'username' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_USERNAME') : '', + 'password' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_PASSWORD') : '', + 'sender' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_SENDER') : '', + 'sender_name' => getenv('PREVARISC_MAIL_ENABLED') ? getenv('PREVARISC_MAIL_SENDER_NAME') : '' ) )); diff --git a/public/js/langs/readme.md b/public/js/langs/readme.md new file mode 100644 index 00000000..a52bf03f --- /dev/null +++ b/public/js/langs/readme.md @@ -0,0 +1,3 @@ +This is where language files should be placed. + +Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/public/js/plugins/advlist/plugin.min.js b/public/js/plugins/advlist/plugin.min.js new file mode 100644 index 00000000..1e1c6680 --- /dev/null +++ b/public/js/plugins/advlist/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("advlist",function(a){function b(a,b){var c=[];return tinymce.each(b.split(/[ ,]/),function(a){c.push({text:a.replace(/\-/g," ").replace(/\b\w/g,function(a){return a.toUpperCase()}),data:"default"==a?"":a})}),c}function c(b,c){a.undoManager.transact(function(){var d,e=a.dom,f=a.selection;d=e.getParent(f.getNode(),"ol,ul"),d&&d.nodeName==b&&c!==!1||a.execCommand("UL"==b?"InsertUnorderedList":"InsertOrderedList"),c=c===!1?g[b]:c,g[b]=c,d=e.getParent(f.getNode(),"ol,ul"),d&&(e.setStyle(d,"listStyleType",c?c:null),d.removeAttribute("data-mce-style")),a.focus()})}function d(b){var c=a.dom.getStyle(a.dom.getParent(a.selection.getNode(),"ol,ul"),"listStyleType")||"";b.control.items().each(function(a){a.active(a.settings.data===c)})}var e,f,g={};e=b("OL",a.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman")),f=b("UL",a.getParam("advlist_bullet_styles","default,circle,disc,square")),a.addButton("numlist",{type:"splitbutton",tooltip:"Numbered list",menu:e,onshow:d,onselect:function(a){c("OL",a.control.settings.data)},onclick:function(){c("OL",!1)}}),a.addButton("bullist",{type:"splitbutton",tooltip:"Bullet list",menu:f,onshow:d,onselect:function(a){c("UL",a.control.settings.data)},onclick:function(){c("UL",!1)}})}); \ No newline at end of file diff --git a/public/js/plugins/anchor/plugin.min.js b/public/js/plugins/anchor/plugin.min.js new file mode 100644 index 00000000..0dd4774b --- /dev/null +++ b/public/js/plugins/anchor/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("anchor",function(a){function b(){var b=a.selection.getNode(),c="",d="A"==b.tagName&&""===a.dom.getAttrib(b,"href");d&&(c=b.name||b.id||""),a.windowManager.open({title:"Anchor",body:{type:"textbox",name:"name",size:40,label:"Name",value:c},onsubmit:function(c){var e=c.data.name;d?b.id=e:(a.selection.collapse(!0),a.execCommand("mceInsertContent",!1,a.dom.createHTML("a",{id:e})))}})}a.addCommand("mceAnchor",b),a.addButton("anchor",{icon:"anchor",tooltip:"Anchor",onclick:b,stateSelector:"a:not([href])"}),a.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",onclick:b})}); \ No newline at end of file diff --git a/public/js/plugins/autolink/plugin.min.js b/public/js/plugins/autolink/plugin.min.js new file mode 100644 index 00000000..4972b936 --- /dev/null +++ b/public/js/plugins/autolink/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("autolink",function(a){function b(a){e(a,-1,"(",!0)}function c(a){e(a,0,"",!0)}function d(a){e(a,-1,"",!1)}function e(a,b,c){function d(a,b){if(0>b&&(b=0),3==a.nodeType){var c=a.data.length;b>c&&(b=c)}return b}function e(a,b){1!=a.nodeType||a.hasChildNodes()?h.setStart(a,d(a,b)):h.setStartBefore(a)}function f(a,b){1!=a.nodeType||a.hasChildNodes()?h.setEnd(a,d(a,b)):h.setEndAfter(a)}var h,i,j,k,l,m,n,o,p,q;if("A"!=a.selection.getNode().tagName){if(h=a.selection.getRng(!0).cloneRange(),h.startOffset<5){if(o=h.endContainer.previousSibling,!o){if(!h.endContainer.firstChild||!h.endContainer.firstChild.nextSibling)return;o=h.endContainer.firstChild.nextSibling}if(p=o.length,e(o,p),f(o,p),h.endOffset<5)return;i=h.endOffset,k=o}else{if(k=h.endContainer,3!=k.nodeType&&k.firstChild){for(;3!=k.nodeType&&k.firstChild;)k=k.firstChild;3==k.nodeType&&(e(k,0),f(k,k.nodeValue.length))}i=1==h.endOffset?2:h.endOffset-1-b}j=i;do e(k,i>=2?i-2:0),f(k,i>=1?i-1:0),i-=1,q=h.toString();while(" "!=q&&""!==q&&160!=q.charCodeAt(0)&&i-2>=0&&q!=c);h.toString()==c||160==h.toString().charCodeAt(0)?(e(k,i),f(k,j),i+=1):0===h.startOffset?(e(k,0),f(k,j)):(e(k,i),f(k,j)),m=h.toString(),"."==m.charAt(m.length-1)&&f(k,j-1),m=h.toString(),n=m.match(g),n&&("www."==n[1]?n[1]="http://www.":/@$/.test(n[1])&&!/^mailto:/.test(n[1])&&(n[1]="mailto:"+n[1]),l=a.selection.getBookmark(),a.selection.setRng(h),a.execCommand("createlink",!1,n[1]+n[2]),a.selection.moveToBookmark(l),a.nodeChanged())}}var f,g=/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i;return a.settings.autolink_pattern&&(g=a.settings.autolink_pattern),a.on("keydown",function(b){return 13==b.keyCode?d(a):void 0}),tinymce.Env.ie?void a.on("focus",function(){if(!f){f=!0;try{a.execCommand("AutoUrlDetect",!1,!0)}catch(b){}}}):(a.on("keypress",function(c){return 41==c.keyCode?b(a):void 0}),void a.on("keyup",function(b){return 32==b.keyCode?c(a):void 0}))}); \ No newline at end of file diff --git a/public/js/plugins/autoresize/plugin.min.js b/public/js/plugins/autoresize/plugin.min.js new file mode 100644 index 00000000..a56d0d50 --- /dev/null +++ b/public/js/plugins/autoresize/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("autoresize",function(a){function b(){return a.plugins.fullscreen&&a.plugins.fullscreen.isFullscreen()}function c(d){var g,h,i,j,k,l,m,n,o,p,q,r,s=tinymce.DOM;if(h=a.getDoc()){if(i=h.body,j=h.documentElement,k=e.autoresize_min_height,!i||d&&"setcontent"===d.type&&d.initial||b())return void(i&&j&&(i.style.overflowY="auto",j.style.overflowY="auto"));m=a.dom.getStyle(i,"margin-top",!0),n=a.dom.getStyle(i,"margin-bottom",!0),o=a.dom.getStyle(i,"padding-top",!0),p=a.dom.getStyle(i,"padding-bottom",!0),q=a.dom.getStyle(i,"border-top-width",!0),r=a.dom.getStyle(i,"border-bottom-width",!0),l=i.offsetHeight+parseInt(m,10)+parseInt(n,10)+parseInt(o,10)+parseInt(p,10)+parseInt(q,10)+parseInt(r,10),(isNaN(l)||0>=l)&&(l=tinymce.Env.ie?i.scrollHeight:tinymce.Env.webkit&&0===i.clientHeight?0:i.offsetHeight),l>e.autoresize_min_height&&(k=l),e.autoresize_max_height&&l>e.autoresize_max_height?(k=e.autoresize_max_height,i.style.overflowY="auto",j.style.overflowY="auto"):(i.style.overflowY="hidden",j.style.overflowY="hidden",i.scrollTop=0),k!==f&&(g=k-f,s.setStyle(a.iframeElement,"height",k+"px"),f=k,tinymce.isWebKit&&0>g&&c(d))}}function d(b,e,f){tinymce.util.Delay.setEditorTimeout(a,function(){c({}),b--?d(b,e,f):f&&f()},e)}var e=a.settings,f=0;a.settings.inline||(e.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight),10),e.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0),10),a.on("init",function(){var b,c;b=a.getParam("autoresize_overflow_padding",1),c=a.getParam("autoresize_bottom_margin",50),b!==!1&&a.dom.setStyles(a.getBody(),{paddingLeft:b,paddingRight:b}),c!==!1&&a.dom.setStyles(a.getBody(),{paddingBottom:c})}),a.on("nodechange setcontent keyup FullscreenStateChanged",c),a.getParam("autoresize_on_init",!0)&&a.on("init",function(){d(20,100,function(){d(5,1e3)})}),a.addCommand("mceAutoResize",c))}); \ No newline at end of file diff --git a/public/js/plugins/autosave/plugin.min.js b/public/js/plugins/autosave/plugin.min.js new file mode 100644 index 00000000..11de44d9 --- /dev/null +++ b/public/js/plugins/autosave/plugin.min.js @@ -0,0 +1 @@ +tinymce._beforeUnloadHandler=function(){var a;return tinymce.each(tinymce.editors,function(b){b.plugins.autosave&&b.plugins.autosave.storeDraft(),!a&&b.isDirty()&&b.getParam("autosave_ask_before_unload",!0)&&(a=b.translate("You have unsaved changes are you sure you want to navigate away?"))}),a},tinymce.PluginManager.add("autosave",function(a){function b(a,b){var c={s:1e3,m:6e4};return a=/^(\d+)([ms]?)$/.exec(""+(a||b)),(a[2]?c[a[2]]:1)*parseInt(a,10)}function c(){var a=parseInt(n.getItem(k+"time"),10)||0;return(new Date).getTime()-a>m.autosave_retention?(d(!1),!1):!0}function d(b){n.removeItem(k+"draft"),n.removeItem(k+"time"),b!==!1&&a.fire("RemoveDraft")}function e(){!j()&&a.isDirty()&&(n.setItem(k+"draft",a.getContent({format:"raw",no_events:!0})),n.setItem(k+"time",(new Date).getTime()),a.fire("StoreDraft"))}function f(){c()&&(a.setContent(n.getItem(k+"draft"),{format:"raw"}),a.fire("RestoreDraft"))}function g(){l||(setInterval(function(){a.removed||e()},m.autosave_interval),l=!0)}function h(){var b=this;b.disabled(!c()),a.on("StoreDraft RestoreDraft RemoveDraft",function(){b.disabled(!c())}),g()}function i(){a.undoManager.beforeChange(),f(),d(),a.undoManager.add()}function j(b){var c=a.settings.forced_root_block;return b=tinymce.trim("undefined"==typeof b?a.getBody().innerHTML:b),""===b||new RegExp("^<"+c+"[^>]*>((\xa0| |[ ]|]*>)+?|)|
$","i").test(b)}var k,l,m=a.settings,n=tinymce.util.LocalStorage;k=m.autosave_prefix||"tinymce-autosave-{path}{query}-{id}-",k=k.replace(/\{path\}/g,document.location.pathname),k=k.replace(/\{query\}/g,document.location.search),k=k.replace(/\{id\}/g,a.id),m.autosave_interval=b(m.autosave_interval,"30s"),m.autosave_retention=b(m.autosave_retention,"20m"),a.addButton("restoredraft",{title:"Restore last draft",onclick:i,onPostRender:h}),a.addMenuItem("restoredraft",{text:"Restore last draft",onclick:i,onPostRender:h,context:"file"}),a.settings.autosave_restore_when_empty!==!1&&(a.on("init",function(){c()&&j()&&f()}),a.on("saveContent",function(){d()})),window.onbeforeunload=tinymce._beforeUnloadHandler,this.hasDraft=c,this.storeDraft=e,this.restoreDraft=f,this.removeDraft=d,this.isEmpty=j}); \ No newline at end of file diff --git a/public/js/plugins/bbcode/plugin.min.js b/public/js/plugins/bbcode/plugin.min.js new file mode 100644 index 00000000..4548e5e6 --- /dev/null +++ b/public/js/plugins/bbcode/plugin.min.js @@ -0,0 +1 @@ +!function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a){var b=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.on("beforeSetContent",function(a){a.content=b["_"+c+"_bbcode2html"](a.content)}),a.on("postProcess",function(a){a.set&&(a.content=b["_"+c+"_bbcode2html"](a.content)),a.get&&(a.content=b["_"+c+"_html2bbcode"](a.content))})},getInfo:function(){return{longname:"BBCode Plugin",author:"Ephox Corp",authorurl:"http://www.tinymce.com",infourl:"http://www.tinymce.com/wiki.php/Plugin:bbcode"}},_punbb_html2bbcode:function(a){function b(b,c){a=a.replace(b,c)}return a=tinymce.trim(a),b(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),b(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),b(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),b(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),b(/(.*?)<\/font>/gi,"$1"),b(//gi,"[img]$1[/img]"),b(/(.*?)<\/span>/gi,"[code]$1[/code]"),b(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),b(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),b(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),b(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),b(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),b(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),b(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),b(/<\/(strong|b)>/gi,"[/b]"),b(/<(strong|b)>/gi,"[b]"),b(/<\/(em|i)>/gi,"[/i]"),b(/<(em|i)>/gi,"[i]"),b(/<\/u>/gi,"[/u]"),b(/(.*?)<\/span>/gi,"[u]$1[/u]"),b(//gi,"[u]"),b(/]*>/gi,"[quote]"),b(/<\/blockquote>/gi,"[/quote]"),b(/
/gi,"\n"),b(//gi,"\n"),b(/
/gi,"\n"),b(/

/gi,""),b(/<\/p>/gi,"\n"),b(/ |\u00a0/gi," "),b(/"/gi,'"'),b(/</gi,"<"),b(/>/gi,">"),b(/&/gi,"&"),a},_punbb_bbcode2html:function(a){function b(b,c){a=a.replace(b,c)}return a=tinymce.trim(a),b(/\n/gi,"
"),b(/\[b\]/gi,""),b(/\[\/b\]/gi,""),b(/\[i\]/gi,""),b(/\[\/i\]/gi,""),b(/\[u\]/gi,""),b(/\[\/u\]/gi,""),b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),b(/\[url\](.*?)\[\/url\]/gi,'$1'),b(/\[img\](.*?)\[\/img\]/gi,''),b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),b(/\[code\](.*?)\[\/code\]/gi,'$1 '),b(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),a}}),tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)}(); \ No newline at end of file diff --git a/public/js/plugins/charmap/plugin.min.js b/public/js/plugins/charmap/plugin.min.js new file mode 100644 index 00000000..9fd639ef --- /dev/null +++ b/public/js/plugins/charmap/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("charmap",function(a){function b(){return[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["221","Y - acute"],["376","Y - diaeresis"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["913","Alpha"],["914","Beta"],["915","Gamma"],["916","Delta"],["917","Epsilon"],["918","Zeta"],["919","Eta"],["920","Theta"],["921","Iota"],["922","Kappa"],["923","Lambda"],["924","Mu"],["925","Nu"],["926","Xi"],["927","Omicron"],["928","Pi"],["929","Rho"],["931","Sigma"],["932","Tau"],["933","Upsilon"],["934","Phi"],["935","Chi"],["936","Psi"],["937","Omega"],["945","alpha"],["946","beta"],["947","gamma"],["948","delta"],["949","epsilon"],["950","zeta"],["951","eta"],["952","theta"],["953","iota"],["954","kappa"],["955","lambda"],["956","mu"],["957","nu"],["958","xi"],["959","omicron"],["960","pi"],["961","rho"],["962","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]]}function c(a){return tinymce.util.Tools.grep(a,function(a){return i(a)&&2==a.length})}function d(a){return i(a)?[].concat(c(a)):"function"==typeof a?a():[]}function e(b){var c=a.settings;return c.charmap&&(b=d(c.charmap)),c.charmap_append?[].concat(b).concat(d(c.charmap_append)):b}function f(){return e(b())}function g(b){a.fire("insertCustomChar",{chr:b}).chr,a.execCommand("mceInsertContent",!1,b)}function h(){function b(a){for(;a;){if("TD"==a.nodeName)return a;a=a.parentNode}}var c,d,e,h;c='';var i=f(),j=Math.min(i.length,25),k=Math.ceil(i.length/j);for(e=0;k>e;e++){for(c+="",d=0;j>d;d++){var l=e*j+d;if(l
'+(m?String.fromCharCode(parseInt(m[0],10)):" ")+"
"}else c+="
"}c+="";var n={type:"container",html:c,onclick:function(a){var c=a.target;/^(TD|DIV)$/.test(c.nodeName)&&b(c).firstChild&&(g(tinymce.trim(c.innerText||c.textContent)),a.ctrlKey||h.close())},onmouseover:function(a){var c=b(a.target);c&&c.firstChild?(h.find("#preview").text(c.firstChild.firstChild.data),h.find("#previewTitle").text(c.title)):(h.find("#preview").text(" "),h.find("#previewTitle").text(" "))}};h=a.windowManager.open({title:"Special character",spacing:10,padding:10,items:[n,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"label",name:"previewTitle",text:" ",style:"text-align: center",border:1,minWidth:140,minHeight:80}]}],buttons:[{text:"Close",onclick:function(){h.close()}}]})}var i=tinymce.util.Tools.isArray;return a.addCommand("mceShowCharmap",h),a.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),a.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"}),{getCharMap:f,insertChar:g}}); \ No newline at end of file diff --git a/public/js/plugins/code/plugin.min.js b/public/js/plugins/code/plugin.min.js new file mode 100644 index 00000000..d6331f87 --- /dev/null +++ b/public/js/plugins/code/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("code",function(a){function b(){var b=a.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:a.getParam("code_dialog_width",600),minHeight:a.getParam("code_dialog_height",Math.min(tinymce.DOM.getViewPort().h-200,500)),spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(b){a.focus(),a.undoManager.transact(function(){a.setContent(b.data.code)}),a.selection.setCursorLocation(),a.nodeChanged()}});b.find("#code").value(a.getContent({source_view:!0}))}a.addCommand("mceCodeEditor",b),a.addButton("code",{icon:"code",tooltip:"Source code",onclick:b}),a.addMenuItem("code",{icon:"code",text:"Source code",context:"tools",onclick:b})}); \ No newline at end of file diff --git a/public/js/plugins/codesample/css/prism.css b/public/js/plugins/codesample/css/prism.css new file mode 100644 index 00000000..28622b52 --- /dev/null +++ b/public/js/plugins/codesample/css/prism.css @@ -0,0 +1,138 @@ +/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ + +code[class*="language-"], +pre[class*="language-"] { + color: black; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + direction: ltr; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #a67f59; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + diff --git a/public/js/plugins/codesample/plugin.min.js b/public/js/plugins/codesample/plugin.min.js new file mode 100644 index 00000000..574fe6b9 --- /dev/null +++ b/public/js/plugins/codesample/plugin.min.js @@ -0,0 +1 @@ +!function(a,b){"use strict";function c(a,b){for(var c,d=[],f=0;fa.length)break a;if(!(q instanceof e)){k.lastIndex=0;var r=k.exec(q);if(r){m&&(n=r[1].length);var s=r.index-1+n,r=r[0].slice(n),t=r.length,u=s+t,v=q.slice(0,s+1),w=q.slice(u+1),x=[p,1];v&&x.push(v);var y=new e(h,l?c.tokenize(r,l):r,o);x.push(y),w&&x.push(w),Array.prototype.splice.apply(f,x)}}}}}return f},hooks:{all:{},add:function(a,b){var d=c.hooks.all;d[a]=d[a]||[],d[a].push(b)},run:function(a,b){var d=c.hooks.all[a];if(d&&d.length)for(var e,f=0;e=d[f++];)e(b)}}},d=c.Token=function(a,b,c){this.type=a,this.content=b,this.alias=c};return d.stringify=function(a,b,e){if("string"==typeof a)return a;if("Array"===c.util.type(a))return a.map(function(c){return d.stringify(c,b,a)}).join("");var f={type:a.type,content:d.stringify(a.content,b,e),tag:"span",classes:["token",a.type],attributes:{},language:b,parent:e};if("comment"==f.type&&(f.attributes.spellcheck="true"),a.alias){var g="Array"===c.util.type(a.alias)?a.alias:[a.alias];Array.prototype.push.apply(f.classes,g)}c.hooks.run("wrap",f);var h="";for(var i in f.attributes)h+=(h?" ":"")+i+'="'+(f.attributes[i]||"")+'"';return"<"+f.tag+' class="'+f.classes.join(" ")+'" '+h+">"+f.content+""},b.document?void 0:b.addEventListener?(b.addEventListener("message",function(a){var d=JSON.parse(a.data),e=d.language,f=d.code,g=d.immediateClose;b.postMessage(c.highlight(f,c.languages[e],e)),g&&b.close()},!1),b.Prism):b.Prism}();return"undefined"!=typeof module&&module.exports&&(module.exports=c),"undefined"!=typeof global&&(global.Prism=c),c.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},c.hooks.add("wrap",function(a){"entity"===a.type&&(a.attributes.title=a.content.replace(/&/,"&"))}),c.languages.xml=c.languages.markup,c.languages.html=c.languages.markup,c.languages.mathml=c.languages.markup,c.languages.svg=c.languages.markup,c.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},c.languages.css.atrule.inside.rest=c.util.clone(c.languages.css),c.languages.markup&&(c.languages.insertBefore("markup","tag",{style:{pattern:/[\w\W]*?<\/style>/i,inside:{tag:{pattern:/|<\/style>/i,inside:c.languages.markup.tag.inside},rest:c.languages.css},alias:"language-css"}}),c.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:c.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:c.languages.css}},alias:"language-css"}},c.languages.markup.tag)),c.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},c.languages.javascript=c.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),c.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),c.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:c.languages.javascript}},string:/[\s\S]+/}}}),c.languages.markup&&c.languages.insertBefore("markup","tag",{script:{pattern:/[\w\W]*?<\/script>/i,inside:{tag:{pattern:/|<\/script>/i,inside:c.languages.markup.tag.inside},rest:c.languages.javascript},alias:"language-javascript"}}),c.languages.js=c.languages.javascript,c.languages.c=c.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),c.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete c.languages.c["class-name"],delete c.languages.c["boolean"],c.languages.csharp=c.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),c.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),c.languages.cpp=c.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),c.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),c.languages.java=c.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),c.languages.php=c.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),c.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),c.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),c.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),c.languages.markup&&(c.hooks.add("before-highlight",function(a){"php"===a.language&&(a.tokenStack=[],a.backupCode=a.code,a.code=a.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(b){return a.tokenStack.push(b),"{{{PHP"+a.tokenStack.length+"}}}"}))}),c.hooks.add("before-insert",function(a){"php"===a.language&&(a.code=a.backupCode,delete a.backupCode)}),c.hooks.add("after-highlight",function(a){if("php"===a.language){for(var b,d=0;b=a.tokenStack[d];d++)a.highlightedCode=a.highlightedCode.replace("{{{PHP"+(d+1)+"}}}",c.highlight(b,a.grammar,"php").replace(/\$/g,"$$$$"));a.element.innerHTML=a.highlightedCode}}),c.hooks.add("wrap",function(a){"php"===a.language&&"markup"===a.type&&(a.content=a.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'$1'))}),c.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:c.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),c.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(a){a.languages.ruby=a.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var b={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:a.util.clone(a.languages.ruby)}};a.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:b}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:b}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),a.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),a.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:b}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:b}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:b}}]}(c),c}),d("tinymce/codesampleplugin/Utils",[],function(){function a(a){return a&&"PRE"==a.nodeName&&-1!==a.className.indexOf("language-")}function b(a){return function(b,c){return a(c)}}return{isCodeSample:a,trimArg:b}}),d("tinymce/codesampleplugin/Dialog",["tinymce/dom/DOMUtils","tinymce/codesampleplugin/Utils","tinymce/codesampleplugin/Prism"],function(a,b,c){function d(a,b,d){a.undoManager.transact(function(){var f=e(a);d=h.encode(d),f?(a.dom.setAttrib(f,"class","language-"+b),f.innerHTML=d,c.highlightElement(f),a.selection.select(f)):(a.insertContent('

'+d+"
"),a.selection.select(a.$("#__new").removeAttr("id")[0]))})}function e(a){var c=a.selection.getNode();return b.isCodeSample(c)?c:null}function f(a){var b=e(a);return b?b.textContent:""}function g(a){var b,c=e(a);return c?(b=c.className.match(/language-(\w+)/),b?b[1]:""):""}var h=a.DOM,i=[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}];return{open:function(a){a.windowManager.open({title:"Insert/Edit code sample",minWidth:Math.min(h.getViewPort().w,800),minHeight:Math.min(h.getViewPort().h,650),layout:"fit",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:g(a),values:i},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:f(a)}],onSubmit:function(b){d(a,b.data.language,b.data.code)}})}}}),d("tinymce/codesampleplugin/Plugin",["tinymce/Env","tinymce/PluginManager","tinymce/codesampleplugin/Prism","tinymce/codesampleplugin/Dialog","tinymce/codesampleplugin/Utils"],function(a,b,c,d,e){var f,g=e.trimArg;b.add("codesample",function(b,h){function i(){var a;f||(f=!0,a=b.dom.create("link",{rel:"stylesheet",href:h+"/css/prism.css"}),b.getDoc().getElementsByTagName("head")[0].appendChild(a))}var j=b.$;a.ceFalse&&(b.on("PreProcess",function(a){j("pre[contenteditable=false]",a.node).filter(g(e.isCodeSample)).each(function(a,b){var c=j(b),d=b.textContent;c.attr("class",j.trim(c.attr("class"))),c.removeAttr("contentEditable"),c.empty().append(j("").each(function(){this.textContent=d}))})}),b.on("SetContent",function(){var a=j("pre").filter(g(e.isCodeSample)).filter(function(a,b){return"false"!==b.contentEditable});a.length&&b.undoManager.transact(function(){a.each(function(a,d){j(d).find("br").each(function(a,c){c.parentNode.replaceChild(b.getDoc().createTextNode("\n"),c)}),d.contentEditable=!1,d.innerHTML=b.dom.encode(d.textContent),c.highlightElement(d),d.className=j.trim(d.className)})})}),b.addCommand("codesample",function(){d.open(b)}),b.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),b.on("init",i))})}),f(["tinymce/codesampleplugin/Prism","tinymce/codesampleplugin/Utils","tinymce/codesampleplugin/Dialog","tinymce/codesampleplugin/Plugin"])}(this); \ No newline at end of file diff --git a/public/js/plugins/colorpicker/plugin.min.js b/public/js/plugins/colorpicker/plugin.min.js new file mode 100644 index 00000000..66ea69c2 --- /dev/null +++ b/public/js/plugins/colorpicker/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("colorpicker",function(a){function b(b,c){function d(a){var b=new tinymce.util.Color(a),c=b.toRgb();f.fromJSON({r:c.r,g:c.g,b:c.b,hex:b.toHex().substr(1)}),e(b.toHex())}function e(a){f.find("#preview")[0].getEl().style.background=a}var f=a.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:c,onchange:function(){var a=this.rgb();f&&(f.find("#r").value(a.r),f.find("#g").value(a.g),f.find("#b").value(a.b),f.find("#hex").value(this.value().substr(1)),e(this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var a,b,c=f.find("colorpicker")[0];return a=this.name(),b=this.value(),"hex"==a?(b="#"+b,d(b),void c.value(b)):(b={r:f.find("#r").value(),g:f.find("#g").value(),b:f.find("#b").value()},c.value(b),void d(b))}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){b("#"+this.toJSON().hex)}});d(c)}a.settings.color_picker_callback||(a.settings.color_picker_callback=b)}); \ No newline at end of file diff --git a/public/js/plugins/contextmenu/plugin.min.js b/public/js/plugins/contextmenu/plugin.min.js new file mode 100644 index 00000000..c25e98b2 --- /dev/null +++ b/public/js/plugins/contextmenu/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("contextmenu",function(a){var b,c=a.settings.contextmenu_never_use_native;a.on("contextmenu",function(d){var e,f=a.getDoc();if(!d.ctrlKey||c){if(d.preventDefault(),tinymce.Env.mac&&tinymce.Env.webkit&&2==d.button&&f.caretRangeFromPoint&&a.selection.setRng(f.caretRangeFromPoint(d.x,d.y)),e=a.settings.contextmenu||"link image inserttable | cell row column deletetable",b)b.show();else{var g=[];tinymce.each(e.split(/[ ,]/),function(b){var c=a.menuItems[b];"|"==b&&(c={text:b}),c&&(c.shortcut="",g.push(c))});for(var h=0;hKx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-cry.gif b/public/js/plugins/emoticons/img/smiley-cry.gif new file mode 100644 index 0000000000000000000000000000000000000000..74d897a4f6d22e814e2b054e98b8a75fb464b4be GIT binary patch literal 329 zcmV-P0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<~6+>@EpxfA0YrcPNsSu literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-embarassed.gif b/public/js/plugins/emoticons/img/smiley-embarassed.gif new file mode 100644 index 0000000000000000000000000000000000000000..963a96b8a7593b1d8bcbab073abe5ee4e539dbf6 GIT binary patch literal 331 zcmV-R0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_EU3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$BSR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kdc3IhA?Hvj+tA^8La0018VEC2ui01^Na06+!P;3tYuX_ljS7!u|-O)I}TzP1q%xT4HOFwMJaO;2ml)!00$)141pU08x3594IX?4 o5YuAA8yXz~76K1c;3^jg77WP185Rf^u}23N0sR5^q(T4yJ1sVN5dZ)H literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-frown.gif b/public/js/plugins/emoticons/img/smiley-frown.gif new file mode 100644 index 0000000000000000000000000000000000000000..716f55e161bfebb1c3d34f0b0f40c177fc82c30b GIT binary patch literal 340 zcmV-a0jvH;Nk%w1VG;lm0MroxK_>;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01yyk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-innocent.gif b/public/js/plugins/emoticons/img/smiley-innocent.gif new file mode 100644 index 0000000000000000000000000000000000000000..334d49e0e60f2997c9ba24071764f95d9e08a5cc GIT binary patch literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yos!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DIT=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltkx9~2uL3&z-yb0WJDRY082|tP literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-laughing.gif b/public/js/plugins/emoticons/img/smiley-laughing.gif new file mode 100644 index 0000000000000000000000000000000000000000..82c5b182e61d32bd394acae551eff180f1eebd26 GIT binary patch literal 343 zcmV-d0jT~*Nk%w1VG;lm0Q4UK!lp8=s;1-69HWK?p_PpF=Pd8~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(Ec zG>66zv=rqr;2j)}gKqE$ekcSD?}0=WLB?AWp85)qALd+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyBKJqy*wF8}}lA^8La0018VEC2ui01^Na06+!6;3tYxX_lj?7+U61R3gAaEg8x< zT>%mSfCwURnWQF&g=Q0ZxH1ulW`QtH0>O!5%iT_X0VBy_@EkOngU8?ye~=H!t21{= z9@Uj3a_UbE88~kh5Eq7rh!7QSBn1c?0|Off1&k^`5*QE<4-gmSR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UUC3IeK%0ssI2A^8La0018VEC2ui01^Na06+!R;3tYuX_ljSEE482&%+G^XK%|f zLKbCc4u{4-u|QG~LqamSTo?@JM3OKZAr!|Z2IzP@fY`=CIg$vA3qm46TowfLCt29I z6pDKuvnf~)83+sm9yW#?9s>^(89F=~2?!W44-6Ox2^vNza}fp^9v&G65pp936%Gg+ z6HpTy2o4oGoh+>l3Q)KVQwybl2oo*<4a3D469|nfEii|MH4`}p1_cZp0ssj%2>=2d q41Na?)CpS;4gvxWVpZcR76uLludD?Q1{SnP2NnVU0rZ&)0RTIit8@_n literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-surprised.gif b/public/js/plugins/emoticons/img/smiley-surprised.gif new file mode 100644 index 0000000000000000000000000000000000000000..0cc9bb71cca4cdeafbb248ce7e07c3708c1cbd64 GIT binary patch literal 338 zcmV-Y0j>T=Nk%w1VG;lm0Q4UK`{WwN#>SnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*)c32kA}f=futY?#YE7kxGD|7L}4&OEDw$hkm+~<00QS>F_H?J#bz?uEHnl42f5(9 z5O)`6Q9V2o5;YVLUK)Y`7!Nr+4GMq?85s%^2?`BGDRU798Vn2?1`%>22R{iO0u>bk z9tlA?nk*O<3zHJH6&Mp5qALj)E(mxM!Y&vII4dm@1Ov{`f*8pL3xPEVUI>D>1_uxa kNm?`6VH{N6Di;P13m6<67z+;u7qCYM7XkVK^`jvGJD~P?KL7v# literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-tongue-out.gif b/public/js/plugins/emoticons/img/smiley-tongue-out.gif new file mode 100644 index 0000000000000000000000000000000000000000..2075dc16058f1f17912167675ce5cfb9986fc71d GIT binary patch literal 328 zcmV-O0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);cvj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nbmjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-undecided.gif b/public/js/plugins/emoticons/img/smiley-undecided.gif new file mode 100644 index 0000000000000000000000000000000000000000..bef7e257303f8243c89787e7a7f9955dd1f112e2 GIT binary patch literal 337 zcmV-X0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 literal 0 HcmV?d00001 diff --git a/public/js/plugins/emoticons/img/smiley-wink.gif b/public/js/plugins/emoticons/img/smiley-wink.gif new file mode 100644 index 0000000000000000000000000000000000000000..0631c7616ec8624ddeee02b633326f697ee72f80 GIT binary patch literal 350 zcmV-k0ipg!Nk%w1VG;lm0Q4UK(ZVUl#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfF$4Fdh~IsgCwA^8La0018VEC2ui01^Na06+!X;3tYwX_ljiFp=e23$zWxW@`*G zN?2ty6iUNT!AMdPLn89IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp'}),a+=""}),a+=""}var d=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]];a.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:c,onclick:function(b){var c=a.dom.getParent(b.target,"a");c&&(a.insertContent(''+c.getAttribute('),this.hide())}},tooltip:"Emoticons"})}); \ No newline at end of file diff --git a/public/js/plugins/example/dialog.html b/public/js/plugins/example/dialog.html new file mode 100644 index 00000000..565f06f5 --- /dev/null +++ b/public/js/plugins/example/dialog.html @@ -0,0 +1,8 @@ + + + +

Custom dialog

+ Input some text: + + + \ No newline at end of file diff --git a/public/js/plugins/example/plugin.min.js b/public/js/plugins/example/plugin.min.js new file mode 100644 index 00000000..88687c7d --- /dev/null +++ b/public/js/plugins/example/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("example",function(a,b){a.addButton("example",{text:"My button",icon:!1,onclick:function(){a.windowManager.open({title:"Example plugin",body:[{type:"textbox",name:"title",label:"Title"}],onsubmit:function(b){a.insertContent("Title: "+b.data.title)}})}}),a.addMenuItem("example",{text:"Example plugin",context:"tools",onclick:function(){a.windowManager.open({title:"TinyMCE site",url:b+"/dialog.html",width:600,height:400,buttons:[{text:"Insert",onclick:function(){var b=a.windowManager.getWindows()[0];a.insertContent(b.getContentWindow().document.getElementById("content").value),b.close()}},{text:"Close",onclick:"close"}]})}})}); \ No newline at end of file diff --git a/public/js/plugins/example_dependency/plugin.min.js b/public/js/plugins/example_dependency/plugin.min.js new file mode 100644 index 00000000..e61bf473 --- /dev/null +++ b/public/js/plugins/example_dependency/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("example_dependency",function(){},["example"]); \ No newline at end of file diff --git a/public/js/plugins/fullpage/plugin.min.js b/public/js/plugins/fullpage/plugin.min.js new file mode 100644 index 00000000..1ea5c360 --- /dev/null +++ b/public/js/plugins/fullpage/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("fullpage",function(a){function b(){var b=c();a.windowManager.open({title:"Document properties",data:b,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(a){d(tinymce.extend(b,a.data))}})}function c(){function b(a,b){var c=a.attr(b);return c||""}var c,d,f=e(),g={};return g.fontface=a.getParam("fullpage_default_fontface",""),g.fontsize=a.getParam("fullpage_default_fontsize",""),c=f.firstChild,7==c.type&&(g.xml_pi=!0,d=/encoding="([^"]+)"/.exec(c.value),d&&(g.docencoding=d[1])),c=f.getAll("#doctype")[0],c&&(g.doctype=""),c=f.getAll("title")[0],c&&c.firstChild&&(g.title=c.firstChild.value),k(f.getAll("meta"),function(a){var b,c=a.attr("name"),d=a.attr("http-equiv");c?g[c.toLowerCase()]=a.attr("content"):"Content-Type"==d&&(b=/charset\s*=\s*(.*)\s*/gi.exec(a.attr("content")),b&&(g.docencoding=b[1]))}),c=f.getAll("html")[0],c&&(g.langcode=b(c,"lang")||b(c,"xml:lang")),g.stylesheets=[],tinymce.each(f.getAll("link"),function(a){"stylesheet"==a.attr("rel")&&g.stylesheets.push(a.attr("href"))}),c=f.getAll("body")[0],c&&(g.langdir=b(c,"dir"),g.style=b(c,"style"),g.visited_color=b(c,"vlink"),g.link_color=b(c,"link"),g.active_color=b(c,"alink")),g}function d(b){function c(a,b,c){a.attr(b,c?c:void 0)}function d(a){g.firstChild?g.insert(a,g.firstChild):g.append(a)}var f,g,h,j,m,n=a.dom;f=e(),g=f.getAll("head")[0],g||(j=f.getAll("html")[0],g=new l("head",1),j.firstChild?j.insert(g,j.firstChild,!0):j.append(g)),j=f.firstChild,b.xml_pi?(m='version="1.0"',b.docencoding&&(m+=' encoding="'+b.docencoding+'"'),7!=j.type&&(j=new l("xml",7),f.insert(j,f.firstChild,!0)),j.value=m):j&&7==j.type&&j.remove(),j=f.getAll("#doctype")[0],b.doctype?(j||(j=new l("#doctype",10),b.xml_pi?f.insert(j,f.firstChild):d(j)),j.value=b.doctype.substring(9,b.doctype.length-1)):j&&j.remove(),j=null,k(f.getAll("meta"),function(a){"Content-Type"==a.attr("http-equiv")&&(j=a)}),b.docencoding?(j||(j=new l("meta",1),j.attr("http-equiv","Content-Type"),j.shortEnded=!0,d(j)),j.attr("content","text/html; charset="+b.docencoding)):j&&j.remove(),j=f.getAll("title")[0],b.title?(j?j.empty():(j=new l("title",1),d(j)),j.append(new l("#text",3)).value=b.title):j&&j.remove(),k("keywords,description,author,copyright,robots".split(","),function(a){var c,e,g=f.getAll("meta"),h=b[a];for(c=0;c"))}function e(){return new tinymce.html.DomParser({validate:!1,root_name:"#document"}).parse(i)}function f(b){function c(a){return a.replace(/<\/?[A-Z]+/g,function(a){return a.toLowerCase()})}var d,f,h,l,m=b.content,n="",o=a.dom;if(!b.selection&&!("raw"==b.format&&i||b.source_view&&a.getParam("fullpage_hide_in_source_view"))){0!==m.length||b.source_view||(m=tinymce.trim(i)+"\n"+tinymce.trim(m)+"\n"+tinymce.trim(j)),m=m.replace(/<(\/?)BODY/gi,"<$1body"),d=m.indexOf("",d),i=c(m.substring(0,d+1)),f=m.indexOf("\n"),h=e(),k(h.getAll("style"),function(a){a.firstChild&&(n+=a.firstChild.value)}),l=h.getAll("body")[0],l&&o.setAttribs(a.getBody(),{style:l.attr("style")||"",dir:l.attr("dir")||"",vLink:l.attr("vlink")||"",link:l.attr("link")||"",aLink:l.attr("alink")||""}),o.remove("fullpage_styles");var p=a.getDoc().getElementsByTagName("head")[0];n&&(o.add(p,"style",{id:"fullpage_styles"},n),l=o.get("fullpage_styles"),l.styleSheet&&(l.styleSheet.cssText=n));var q={};tinymce.each(p.getElementsByTagName("link"),function(a){"stylesheet"==a.rel&&a.getAttribute("data-mce-fullpage")&&(q[a.href]=a)}),tinymce.each(h.getAll("link"),function(a){var b=a.attr("href");q[b]||"stylesheet"!=a.attr("rel")||o.add(p,"link",{rel:"stylesheet",text:"text/css",href:b,"data-mce-fullpage":"1"}),delete q[b]}),tinymce.each(q,function(a){a.parentNode.removeChild(a)})}}function g(){var b,c="",d="";return a.getParam("fullpage_default_xml_pi")&&(c+='\n'),c+=a.getParam("fullpage_default_doctype",""),c+="\n\n\n",(b=a.getParam("fullpage_default_title"))&&(c+=""+b+"\n"),(b=a.getParam("fullpage_default_encoding"))&&(c+='\n'),(b=a.getParam("fullpage_default_font_family"))&&(d+="font-family: "+b+";"),(b=a.getParam("fullpage_default_font_size"))&&(d+="font-size: "+b+";"),(b=a.getParam("fullpage_default_text_color"))&&(d+="color: "+b+";"),c+="\n\n"}function h(b){b.selection||b.source_view&&a.getParam("fullpage_hide_in_source_view")||(b.content=tinymce.trim(i)+"\n"+tinymce.trim(b.content)+"\n"+tinymce.trim(j))}var i,j,k=tinymce.each,l=tinymce.html.Node;a.addCommand("mceFullPageProperties",b),a.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),a.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"}),a.on("BeforeSetContent",f),a.on("GetContent",h)}); \ No newline at end of file diff --git a/public/js/plugins/fullscreen/plugin.min.js b/public/js/plugins/fullscreen/plugin.min.js new file mode 100644 index 00000000..841d633f --- /dev/null +++ b/public/js/plugins/fullscreen/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("fullscreen",function(a){function b(){var a,b,c=window,d=document,e=d.body;return e.offsetWidth&&(a=e.offsetWidth,b=e.offsetHeight),c.innerWidth&&c.innerHeight&&(a=c.innerWidth,b=c.innerHeight),{w:a,h:b}}function c(){var a=tinymce.DOM.getViewPort();return{x:a.x,y:a.y}}function d(a){scrollTo(a.x,a.y)}function e(){function e(){m.setStyle(p,"height",b().h-(o.clientHeight-p.clientHeight))}var n,o,p,q,r=document.body,s=document.documentElement;l=!l,o=a.getContainer(),n=o.style,p=a.getContentAreaContainer().firstChild,q=p.style,l?(k=c(),f=q.width,g=q.height,q.width=q.height="100%",i=n.width,j=n.height,n.width=n.height="",m.addClass(r,"mce-fullscreen"),m.addClass(s,"mce-fullscreen"),m.addClass(o,"mce-fullscreen"),m.bind(window,"resize",e),e(),h=e):(q.width=f,q.height=g,i&&(n.width=i),j&&(n.height=j),m.removeClass(r,"mce-fullscreen"),m.removeClass(s,"mce-fullscreen"),m.removeClass(o,"mce-fullscreen"),m.unbind(window,"resize",h),d(k)),a.fire("FullscreenStateChanged",{state:l})}var f,g,h,i,j,k,l=!1,m=tinymce.DOM;return a.settings.inline?void 0:(a.on("init",function(){a.addShortcut("Meta+Alt+F","",e)}),a.on("remove",function(){h&&m.unbind(window,"resize",h)}),a.addCommand("mceFullScreen",e),a.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Meta+Alt+F",selectable:!0,onClick:function(){e(),a.focus()},onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})},context:"view"}),a.addButton("fullscreen",{tooltip:"Fullscreen",shortcut:"Meta+Alt+F",onClick:e,onPostRender:function(){var b=this;a.on("FullscreenStateChanged",function(a){b.active(a.state)})}}),{isFullscreen:function(){return l}})}); \ No newline at end of file diff --git a/public/js/plugins/hr/plugin.min.js b/public/js/plugins/hr/plugin.min.js new file mode 100644 index 00000000..25abb0c1 --- /dev/null +++ b/public/js/plugins/hr/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("hr",function(a){a.addCommand("InsertHorizontalRule",function(){a.execCommand("mceInsertContent",!1,"
")}),a.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),a.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})}); \ No newline at end of file diff --git a/public/js/plugins/image/plugin.min.js b/public/js/plugins/image/plugin.min.js new file mode 100644 index 00000000..90de1a41 --- /dev/null +++ b/public/js/plugins/image/plugin.min.js @@ -0,0 +1 @@ +tinymce.PluginManager.add("image",function(a){function b(a,b){function c(a,c){d.parentNode&&d.parentNode.removeChild(d),b({width:a,height:c})}var d=document.createElement("img");d.onload=function(){c(Math.max(d.width,d.clientWidth),Math.max(d.height,d.clientHeight))},d.onerror=function(){c()};var e=d.style;e.visibility="hidden",e.position="fixed",e.bottom=e.left=0,e.width=e.height="auto",document.body.appendChild(d),d.src=a}function c(a,b,c){function d(a,c){return c=c||[],tinymce.each(a,function(a){var e={text:a.text||a.title};a.menu?e.menu=d(a.menu):(e.value=a.value,b(e)),c.push(e)}),c}return d(a,c||[])}function d(b){return function(){var c=a.settings.image_list;"string"==typeof c?tinymce.util.XHR.send({url:c,success:function(a){b(tinymce.util.JSON.parse(a))}}):"function"==typeof c?c(b):b(c)}}function e(d){function e(){var a,b,c,d;a=l.find("#width")[0],b=l.find("#height")[0],a&&b&&(c=a.value(),d=b.value(),l.find("#constrain")[0].checked()&&o&&p&&c&&d&&(o!=c?(d=Math.round(c/o*d),isNaN(d)||b.value(d)):(c=Math.round(d/p*c),isNaN(c)||a.value(c))),o=c,p=d)}function f(){function b(b){function c(){b.onload=b.onerror=null,a.selection&&(a.selection.select(b),a.nodeChanged())}b.onload=function(){s.width||s.height||!u||t.setAttribs(b,{width:b.clientWidth,height:b.clientHeight}),c()},b.onerror=c}var c,d;j(),e(),s=tinymce.extend(s,l.toJSON()),s.alt||(s.alt=""),s.title||(s.title=""),""===s.width&&(s.width=null),""===s.height&&(s.height=null),s.style||(s.style=null),s={src:s.src,alt:s.alt,title:s.title,width:s.width,height:s.height,style:s.style,caption:s.caption,"class":s["class"]},a.undoManager.transact(function(){function e(b){return a.schema.getTextBlockElements()[b.nodeName]}if(!s.src)return void(m&&(t.remove(m),a.focus(),a.nodeChanged()));if(""===s.title&&(s.title=null),m?t.setAttribs(m,s):(s.id="__mcenew",a.focus(),a.selection.setContent(t.createHTML("img",s)),m=t.get("__mcenew"),t.setAttrib(m,"id",null)),a.editorUpload.uploadImagesAuto(),s.caption===!1&&t.is(m.parentNode,"figure.image")&&(c=m.parentNode,t.insertAfter(m,c),t.remove(c)),s.caption!==!0)b(m);else if(!t.is(m.parentNode,"figure.image")){d=m,m=m.cloneNode(!0),c=t.create("figure",{"class":"image"}),c.appendChild(m),c.appendChild(t.create("figcaption",{contentEditable:!0},"Caption")),c.contentEditable=!1;var f=t.getParent(d,e);f?t.split(f,d,c):t.replace(c,d),a.selection.select(c)}})}function g(a){return a&&(a=a.replace(/px$/,"")),a}function h(c){var d,e,f,g=c.meta||{};q&&q.value(a.convertURL(this.value(),"src")),tinymce.each(g,function(a,b){l.find("#"+b).value(a)}),g.width||g.height||(d=a.convertURL(this.value(),"src"),e=a.settings.image_prepend_url,f=new RegExp("^(?:[a-z]+:)?//","i"),e&&!f.test(d)&&d.substring(0,e.length)!==e&&(d=e+d),this.value(d),b(a.documentBaseURI.toAbsolute(this.value()),function(a){a.width&&a.height&&u&&(o=a.width,p=a.height,l.find("#width").value(o),l.find("#height").value(p))}))}function i(a){if(a.margin){var b=a.margin.split(" ");switch(b.length){case 1:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[0],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[0];break;case 2:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[0],a["margin-left"]=a["margin-left"]||b[1];break;case 3:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[1];break;case 4:a["margin-top"]=a["margin-top"]||b[0],a["margin-right"]=a["margin-right"]||b[1],a["margin-bottom"]=a["margin-bottom"]||b[2],a["margin-left"]=a["margin-left"]||b[3]}delete a.margin}return a}function j(){function b(a){return a.length>0&&/^[0-9]+$/.test(a)&&(a+="px"),a}if(a.settings.image_advtab){var c=l.toJSON(),d=t.parseStyle(c.style);d=i(d),c.vspace&&(d["margin-top"]=d["margin-bottom"]=b(c.vspace)),c.hspace&&(d["margin-left"]=d["margin-right"]=b(c.hspace)),c.border&&(d["border-width"]=b(c.border)),l.find("#style").value(t.serializeStyle(t.parseStyle(t.serializeStyle(d))))}}function k(){if(a.settings.image_advtab){var b=l.toJSON(),c=t.parseStyle(b.style);l.find("#vspace").value(""),l.find("#hspace").value(""),c=i(c),(c["margin-top"]&&c["margin-bottom"]||c["margin-right"]&&c["margin-left"])&&(c["margin-top"]===c["margin-bottom"]?l.find("#vspace").value(g(c["margin-top"])):l.find("#vspace").value(""),c["margin-right"]===c["margin-left"]?l.find("#hspace").value(g(c["margin-right"])):l.find("#hspace").value("")),c["border-width"]&&l.find("#border").value(g(c["border-width"])),l.find("#style").value(t.serializeStyle(t.parseStyle(t.serializeStyle(c))))}}var l,m,n,o,p,q,r,s={},t=a.dom,u=a.settings.image_dimensions!==!1;m=a.selection.getNode(),n=t.getParent(m,"figure.image"),n&&(m=t.select("img",n)[0]),m&&("IMG"!=m.nodeName||m.getAttribute("data-mce-object")||m.getAttribute("data-mce-placeholder"))&&(m=null),m&&(o=t.getAttrib(m,"width"),p=t.getAttrib(m,"height"),s={src:t.getAttrib(m,"src"),alt:t.getAttrib(m,"alt"),title:t.getAttrib(m,"title"),"class":t.getAttrib(m,"class"),width:o,height:p,caption:!!n}),d&&(q={type:"listbox",label:"Image list",values:c(d,function(b){b.value=a.convertURL(b.value||b.url,"src")},[{text:"None",value:""}]),value:s.src&&a.convertURL(s.src,"src"),onselect:function(a){var b=l.find("#alt");(!b.value()||a.lastControl&&b.value()==a.lastControl.text())&&b.value(a.control.text()),l.find("#src").value(a.control.value()).fire("change")},onPostRender:function(){q=this}}),a.settings.image_class_list&&(r={name:"class",type:"listbox",label:"Class",values:c(a.settings.image_class_list,function(b){b.value&&(b.textStyle=function(){return a.formatter.getCssText({inline:"img",classes:[b.value]})})})});var v=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:h},q];a.settings.image_description!==!1&&v.push({name:"alt",type:"textbox",label:"Image description"}),a.settings.image_title&&v.push({name:"title",type:"textbox",label:"Image Title"}),u&&v.push({type:"container",label:"Dimensions",layout:"flex",direction:"row",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:3,onchange:e,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}),v.push(r),a.settings.image_caption&&tinymce.Env.ceFalse&&v.push({name:"caption",type:"checkbox",label:"Caption"}),a.settings.image_advtab?(m&&(m.style.marginLeft&&m.style.marginRight&&m.style.marginLeft===m.style.marginRight&&(s.hspace=g(m.style.marginLeft)),m.style.marginTop&&m.style.marginBottom&&m.style.marginTop===m.style.marginBottom&&(s.vspace=g(m.style.marginTop)),m.style.borderWidth&&(s.border=g(m.style.borderWidth)),s.style=a.dom.serializeStyle(a.dom.parseStyle(a.dom.getAttrib(m,"style")))),l=a.windowManager.open({title:"Insert/edit image",data:s,bodyType:"tabpanel",body:[{title:"General",type:"form",items:v},{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:k},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:j},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]}],onSubmit:f})):l=a.windowManager.open({title:"Insert/edit image",data:s,body:v,onSubmit:f})}a.on("preInit",function(){function b(a){var b=a.attr("class");return b&&/\bimage\b/.test(b)}function c(a){return function(c){function d(b){b.attr("contenteditable",a?"true":null)}for(var e,f=c.length;f--;)e=c[f],b(e)&&(e.attr("contenteditable",a?"false":null),tinymce.each(e.getAll("figcaption"),d))}}a.parser.addNodeFilter("figure",c(!0)),a.serializer.addNodeFilter("figure",c(!1))}),a.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:d(e),stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),a.addMenuItem("image",{icon:"image",text:"Insert/edit image",onclick:d(e),context:"insert",prependToContext:!0}),a.addCommand("mceImage",d(e))}); \ No newline at end of file diff --git a/public/js/plugins/imagetools/plugin.min.js b/public/js/plugins/imagetools/plugin.min.js new file mode 100644 index 00000000..6a29b2aa --- /dev/null +++ b/public/js/plugins/imagetools/plugin.min.js @@ -0,0 +1 @@ +!function(){var a={},b=function(b){for(var c=a[b],e=c.deps,f=c.defn,g=e.length,h=new Array(g),i=0;g>i;++i)h[i]=d(e[i]);var j=f.apply(null,h);if(void 0===j)throw"module ["+b+"] returned undefined";c.instance=j},c=function(b,c,d){if("string"!=typeof b)throw"module id must be a string";if(void 0===c)throw"no dependencies for "+b;if(void 0===d)throw"no definition function for "+b;a[b]={deps:c,defn:d,instance:void 0}},d=function(c){var d=a[c];if(void 0===d)throw"module ["+c+"] was undefined";return void 0===d.instance&&b(c),d.instance},e=function(a,b){for(var c=a.length,e=new Array(c),f=0;c>f;++f)e.push(d(a[f]));b.apply(null,b)},f={};f.bolt={module:{api:{define:c,require:e,demand:d}}};var g=c,h=function(a,b){g(a,[],function(){return b})};h("1",tinymce.PluginManager),h("2",tinymce.Env),h("3",tinymce.util.Promise),h("4",tinymce.util.URI),h("5",tinymce.util.Tools),h("6",tinymce.util.Delay),g("j",[],function(){function a(a,b){return c(document.createElement("canvas"),a,b)}function b(a){return a.getContext("2d")}function c(a,b,c){return a.width=b,a.height=c,a}return{create:a,resize:c,get2dContext:b}}),g("k",[],function(){function a(a){return a.naturalWidth||a.width}function b(a){return a.naturalHeight||a.height}return{getWidth:a,getHeight:b}}),g("l",[],function(){function a(a,b){return function(){a.apply(b,arguments)}}function b(b){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof b)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],h(b,a(d,this),a(e,this))}function c(a){var b=this;return null===this._state?void this._deferreds.push(a):void i(function(){var c=b._state?a.onFulfilled:a.onRejected;if(null===c)return void(b._state?a.resolve:a.reject)(b._value);var d;try{d=c(b._value)}catch(e){return void a.reject(e)}a.resolve(d)})}function d(b){try{if(b===this)throw new TypeError("A promise cannot be resolved with itself.");if(b&&("object"==typeof b||"function"==typeof b)){var c=b.then;if("function"==typeof c)return void h(a(c,b),a(d,this),a(e,this))}this._state=!0,this._value=b,f.call(this)}catch(g){e.call(this,g)}}function e(a){this._state=!1,this._value=a,f.call(this)}function f(){for(var a=0,b=this._deferreds.length;b>a;a++)c.call(this,this._deferreds[a]);this._deferreds=null}function g(a,b,c,d){this.onFulfilled="function"==typeof a?a:null,this.onRejected="function"==typeof b?b:null,this.resolve=c,this.reject=d}function h(a,b,c){var d=!1;try{a(function(a){d||(d=!0,b(a))},function(a){d||(d=!0,c(a))})}catch(e){if(d)return;d=!0,c(e)}}if(window.Promise)return window.Promise;var i=b.immediateFn||"function"==typeof setImmediate&&setImmediate||function(a){setTimeout(a,1)},j=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)};return b.prototype["catch"]=function(a){return this.then(null,a)},b.prototype.then=function(a,d){var e=this;return new b(function(b,f){c.call(e,new g(a,d,b,f))})},b.all=function(){var a=Array.prototype.slice.call(1===arguments.length&&j(arguments[0])?arguments[0]:arguments);return new b(function(b,c){function d(f,g){try{if(g&&("object"==typeof g||"function"==typeof g)){var h=g.then;if("function"==typeof h)return void h.call(g,function(a){d(f,a)},c)}a[f]=g,0===--e&&b(a)}catch(i){c(i)}}if(0===a.length)return b([]);for(var e=a.length,f=0;fd;d++)a[d].then(b,c)})},b}),g("m",[],function(){function a(a){var b=document.createElement("a");return b.href=a,b.pathname}function b(b){var c=a(b).split("."),d=c[c.length-1],e={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"};return d&&(d=d.toLowerCase()),e[d]}return{guessMimeType:b}}),g("c",["l","j","m","k"],function(a,b,c,d){function e(b){return new a(function(a){function c(){b.removeEventListener("load",c),a(b)}b.complete?a(b):b.addEventListener("load",c)})}function f(a){return e(a).then(function(a){var c,e;return e=b.create(d.getWidth(a),d.getHeight(a)),c=b.get2dContext(e),c.drawImage(a,0,0),e})}function g(a){return e(a).then(function(a){var b=a.src;return 0===b.indexOf("blob:")?i(b):0===b.indexOf("data:")?j(b):f(a).then(function(a){return j(a.toDataURL(c.guessMimeType(b)))})})}function h(b){return new a(function(a){function c(){d.removeEventListener("load",c),a(d)}var d=new Image;d.addEventListener("load",c),d.src=URL.createObjectURL(b),d.complete&&c()})}function i(b){return new a(function(a){var c=new XMLHttpRequest;c.open("GET",b,!0),c.responseType="blob",c.onload=function(){200==this.status&&a(this.response)},c.send()})}function j(b){return new a(function(a){var c,d,e,f,g,h;if(b=b.split(","),f=/data:([^;]+)/.exec(b[0]),f&&(g=f[1]),c=atob(b[1]),window.WebKitBlobBuilder){for(h=new WebKitBlobBuilder,d=new ArrayBuffer(c.length),e=0;ec?a=c:b>a&&(a=b),a}function b(){return[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1]}function c(a,b){var c,d,e,f,g=[],h=new Array(10);for(c=0;5>c;c++){for(d=0;5>d;d++)g[d]=b[d+5*c];for(d=0;5>d;d++){for(f=0,e=0;5>e;e++)f+=a[d+5*e]*g[e];h[d+5*c]=f}}return h}function d(b,c){return c=a(c,0,1),b.map(function(b,d){return d%6===0?b=1-(1-b)*c:b*=c,a(b,0,1)})}function e(b,d){var e;return d=a(d,-1,1),d*=100,0>d?e=127+d/100*127:(e=d%1,e=0===e?l[d]:l[Math.floor(d)]*(1-e)+l[Math.floor(d)+1]*e,e=127*e+127),c(b,[e/127,0,0,0,.5*(127-e),0,e/127,0,0,.5*(127-e),0,0,e/127,0,.5*(127-e),0,0,0,1,0,0,0,0,0,1])}function f(b,d){var e,f,g,h;return d=a(d,-1,1),e=1+(d>0?3*d:d),f=.3086,g=.6094,h=.082,c(b,[f*(1-e)+e,g*(1-e),h*(1-e),0,0,f*(1-e),g*(1-e)+e,h*(1-e),0,0,f*(1-e),g*(1-e),h*(1-e)+e,0,0,0,0,0,1,0,0,0,0,0,1])}function g(b,d){var e,f,g,h,i;return d=a(d,-180,180)/180*Math.PI,e=Math.cos(d),f=Math.sin(d),g=.213,h=.715,i=.072,c(b,[g+e*(1-g)+f*-g,h+e*-h+f*-h,i+e*-i+f*(1-i),0,0,g+e*-g+.143*f,h+e*(1-h)+.14*f,i+e*-i+f*-.283,0,0,g+e*-g+f*-(1-g),h+e*-h+f*h,i+e*(1-i)+f*i,0,0,0,0,0,1,0,0,0,0,0,1])}function h(b,d){return d=a(255*d,-255,255),c(b,[1,0,0,0,d,0,1,0,0,d,0,0,1,0,d,0,0,0,1,0,0,0,0,0,1])}function i(b,d,e,f){return d=a(d,0,2),e=a(e,0,2),f=a(f,0,2),c(b,[d,0,0,0,0,0,e,0,0,0,0,0,f,0,0,0,0,0,1,0,0,0,0,0,1])}function j(b,e){return e=a(e,0,1),c(b,d([.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0,0,0,0,0,1],e))}function k(b,e){return e=a(e,0,1),c(b,d([.33,.34,.33,0,0,.33,.34,.33,0,0,.33,.34,.33,0,0,0,0,0,1,0,0,0,0,0,1],e))}var l=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10];return{identity:b,adjust:d,multiply:c,adjustContrast:e,adjustBrightness:h,adjustSaturation:f,adjustHue:g,adjustColors:i,adjustSepia:j,adjustGrayscale:k}}),g("a",["j","k","c","n"],function(a,b,c,d){function e(d,e){return c.blobToImage(d).then(function(d){function f(a,b){var c,d,e,f,g,h=a.data,i=b[0],j=b[1],k=b[2],l=b[3],m=b[4],n=b[5],o=b[6],p=b[7],q=b[8],r=b[9],s=b[10],t=b[11],u=b[12],v=b[13],w=b[14],x=b[15],y=b[16],z=b[17],A=b[18],B=b[19];for(g=0;gc?a=c:b>a&&(a=b),a}var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;for(g=Math.round(Math.sqrt(c.length)),h=Math.floor(g/2),e=a.data,f=b.data,t=a.width,u=a.height,j=0;u>j;j++)for(i=0;t>i;i++){for(k=l=m=0,o=0;g>o;o++)for(n=0;g>n;n++)p=d(i+n-h,0,t-1),q=d(j+o-h,0,u-1),r=4*(q*t+p),s=c[o*g+n],k+=e[r]*s,l+=e[r+1]*s,m+=e[r+2]*s;r=4*(j*t+i),f[r]=d(k,0,255),f[r+1]=d(l,0,255),f[r+2]=d(m,0,255)}return b}var g,h,i=a.create(b.getWidth(d),b.getHeight(d)),j=a.get2dContext(i);return j.drawImage(d,0,0),k(d),g=j.getImageData(0,0,i.width,i.height),h=j.getImageData(0,0,i.width,i.height),h=f(g,h,e),j.putImageData(h,0,0),c.canvasToBlob(i)})}function g(d){return function(e,f){return c.blobToImage(e).then(function(e){function g(a,b){var c,d=a.data;for(c=0;ce?360+e:e,90!=e&&270!=e||b.resize(g,g.height,g.width),90!=e&&180!=e||(j=g.width),270!=e&&180!=e||(k=g.height),i.translate(j,k),i.rotate(e*Math.PI/180),i.drawImage(f,0,0),h(f),a.canvasToBlob(g,d.type)})}function e(d,e){return a.blobToImage(d).then(function(d){var f=b.create(c.getWidth(d),c.getHeight(d)),g=b.get2dContext(f);return"v"==e?(g.scale(1,-1),g.drawImage(d,0,-f.height)):(g.scale(-1,1),g.drawImage(d,-f.width,0)),h(d),a.canvasToBlob(f)})}function f(c,d,e,f,g){return a.blobToImage(c).then(function(c){var i=b.create(f,g),j=b.get2dContext(i);return j.drawImage(c,-d,-e),h(c),a.canvasToBlob(i)})}function g(c,d,e){return a.blobToImage(c).then(function(f){var g=b.create(d,e),i=b.get2dContext(g);return i.drawImage(f,0,0,d,e),h(f),a.canvasToBlob(g,c.type)})}var h=a.revokeImageUrl;return{rotate:d,flip:e,crop:f,resize:g}}),g("7",["a","b"],function(a,b){var c=function(b){return a.invert(b)},d=function(b){return a.sharpen(b)},e=function(b){return a.emboss(b)},f=function(b,c){return a.gamma(b,c)},g=function(b,c){return a.exposure(b,c)},h=function(b,c,d,e){return a.colorize(b,c,d,e)},i=function(b,c){return a.brightness(b,c)},j=function(b,c){return a.hue(b,c)},k=function(b,c){return a.saturate(b,c)},l=function(b,c){return a.contrast(b,c)},m=function(b,c){return a.grayscale(b,c)},n=function(b,c){return a.sepia(b,c)},o=function(a,c){return b.flip(a,c)},p=function(a,c,d,e,f){return b.crop(a,c,d,e,f)},q=function(a,c,d){return b.resize(a,c,d)},r=function(a,c){return b.rotate(a,c)};return{invert:c,sharpen:d,emboss:e,brightness:i,hue:j,saturate:k,contrast:l,grayscale:m,sepia:n,colorize:h,gamma:f,exposure:g,flip:o,crop:p,resize:q,rotate:r}}),g("8",["c"],function(a){var b=function(b){return a.blobToImage(b)},c=function(b){return a.imageToBlob(b)},d=function(b){return a.blobToDataUri(b)},e=function(b){return a.blobToBase64(b)};return{blobToImage:b,imageToBlob:c,blobToDataUri:d,blobToBase64:e}}),h("d",tinymce.dom.DOMUtils),h("e",tinymce.ui.Factory),h("f",tinymce.ui.Form),h("g",tinymce.ui.Container),h("o",tinymce.ui.Control),h("p",tinymce.ui.DragHelper),h("q",tinymce.geom.Rect),h("s",tinymce.dom.DomQuery),h("t",tinymce.util.Observable),g("r",["s","p","q","5","t"],function(a,b,c,d,e){var f=0;return function(g,h,i,j){function k(a,b){return{x:b.x+a.x,y:b.y+a.y,w:b.w,h:b.h}}function l(a,b){return{x:b.x-a.x,y:b.y-a.y,w:b.w,h:b.h}}function m(){return l(i,g)}function n(){function e(a){var d;return new b(A,{document:j.ownerDocument,handle:A+"-"+a.name,start:function(){d=g},drag:function(b){var e,f,h,j,k;e=d.x,f=d.y,h=d.w,j=d.h,e+=b.deltaX*a.deltaX,f+=b.deltaY*a.deltaY,h+=b.deltaX*a.deltaW,j+=b.deltaY*a.deltaH,20>h&&(h=20),20>j&&(j=20),k=g=c.clamp({x:e,y:f,w:h,h:j},i,"move"==a.name),k=l(i,k),v.fire("updateRect",{rect:k}),s(k)}})}a('
').appendTo(j),d.each(y,function(b){a("#"+A,j).append(''},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r(Wt,[Ae],function(e){function t(e){var t="";if(e)for(var n=0;n'+e[n]+"";return t}return e.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options),t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e=this,n,r="";return n=t(e._options),e.size&&(r=' size = "'+e.size+'"'),'"},bindStates:function(){var e=this;return e.state.on("change:options",function(n){e.getEl().innerHTML=t(n.value)}),e._super()}})}),r(Vt,[Ae,Ce,fe],function(e,t,n){function r(e,t,n){return t>e&&(e=t),e>n&&(e=n),e}function i(e,t){var r,i,o,a,s;"v"==e.settings.orientation?(a="top",o="height",i="h"):(a="left",o="width",i="w"),r=(e.layoutRect()[i]||100)-n.getSize(e.getEl("handle"))[o],s=r*((t-e._minValue)/(e._maxValue-e._minValue))+"px",e.getEl("handle").style[a]=s,e.getEl("handle").style.height=e.layoutRect().h+"px"}return e.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"==e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'
'},reset:function(){this.value(this._initValue).repaint()},postRender:function(){var e=this,i,o,a=0,s,l,c,u,d,f,h,p;l=e._minValue,c=e._maxValue,s=e.value(),"v"==e.settings.orientation?(d="screenY",f="top",h="height",p="h"):(d="screenX",f="left",h="width",p="w"),e._super(),e._dragHelper=new t(e._id,{handle:e._id+"-handle",start:function(t){i=t[d],o=parseInt(e.getEl("handle").style[f],10),u=(e.layoutRect()[p]||100)-n.getSize(e.getEl("handle"))[h],e.fire("dragstart",{value:s})},drag:function(t){var n=t[d]-i,h=e.getEl("handle");a=r(o+n,0,u),h.style[f]=a+"px",s=l+a/u*(c-l),e.value(s),e.tooltip().text(""+e.settings.previewFilter(s)).show().moveRel(h,"bc tc"),e.fire("drag",{value:s})},stop:function(){e.tooltip().hide(),e.fire("dragend",{value:s})}})},repaint:function(){this._super(),i(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){i(e,t.value)}),e._super()}})}),r(Ut,[Ae],function(e){return e.extend({renderHtml:function(){var e=this;return e.classes.add("spacer"),e.canFocus=!1,'
'}})}),r($t,[Mt,fe,g],function(e,t,n){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e=this,r=e.getEl(),i=e.layoutRect(),o,a;return e._super(),o=r.firstChild,a=r.lastChild,n(o).css({width:i.w-t.getSize(a).width,height:i.h-2}),n(a).css({height:i.h-2}),e},activeMenu:function(e){var t=this;n(t.getEl().lastChild).toggleClass(t.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r,i=e.state.get("icon"),o=e.state.get("text"),a="";return r=e.settings.image,r?(i="none","string"!=typeof r&&(r=window.getSelection?r[0]:r[1]),r=" style=\"background-image: url('"+r+"')\""):r="",i=e.settings.icon?n+"ico "+n+"i-"+i:"",o&&(e.classes.add("btn-has-text"),a=''+e.encode(o)+""),'
'},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if(e.aria&&"down"!=e.aria.key||"BUTTON"==n.nodeName&&-1==n.className.indexOf("open"))return e.stopImmediatePropagation(),void(t&&t.call(this,e));n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(qt,[St],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),r(jt,[we,g,fe],function(e,t,n){return e.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var n;this.activeTabId&&(n=this.getEl(this.activeTabId),t(n).removeClass(this.classPrefix+"active"),n.setAttribute("aria-selected","false")),this.activeTabId="t"+e,n=this.getEl("t"+e),n.setAttribute("aria-selected","true"),t(n).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!=n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){var o=e._id+"-t"+i;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='"}),'
'+n+'
'+t.renderHtml(e)+"
"},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(t.target.parentNode.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,t,r,i;r=n.getSize(e.getEl("head")).width,r=0>r?0:r,i=0,e.items().each(function(e){r=Math.max(r,e.layoutRect().minW),i=Math.max(i,e.layoutRect().minH)}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=n.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,t=e._super(),t.deltaH+=o,t.innerH=t.h-t.deltaH,t}})}),r(Yt,[Ae],function(e){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){return e.toJSON?(n=e,!1):void 0}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e=this,t,n,r,i,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e.borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.encode(e.state.get("value"),!1),i="";return"spellcheck"in n&&(i+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(i+=' maxlength="'+n.maxLength+'"'),n.size&&(i+=' size="'+n.size+'"'),n.subtype&&(i+=' type="'+n.subtype+'"'),e.disabled()&&(i+=' disabled="disabled"'),n.multiline?'":'"},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e._super(),e.$el.on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!=t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}})}),r(Xt,[],function(){var e=this||window,t=function(){return e.tinymce};return"function"==typeof e.define&&(e.define.amd||e.define("ephox/tinymce",[],t)),{}}),a([l,c,u,d,f,h,m,g,v,y,C,w,E,N,T,A,B,D,L,M,P,H,I,F,j,Y,J,Q,re,ie,oe,ae,le,ue,de,me,ge,ve,ye,be,Ce,xe,we,Ee,Ne,_e,Se,ke,Te,Re,Ae,Be,De,Le,He,Ie,Ge,Je,Qe,Ze,tt,nt,rt,it,ot,at,st,lt,ct,ut,dt,ft,ht,pt,mt,gt,vt,yt,bt,Ct,xt,wt,Et,Nt,_t,St,kt,Tt,Rt,At,Bt,Dt,Lt,Mt,Pt,Ht,Ot,It,Ft,zt,Wt,Vt,Ut,$t,qt,jt,Yt])}(this); \ No newline at end of file diff --git a/sql/init/prevarisc.sql b/sql/init/prevarisc.sql index e35cb6fc..526e3dea 100644 --- a/sql/init/prevarisc.sql +++ b/sql/init/prevarisc.sql @@ -2899,3 +2899,23 @@ CREATE TABLE `cache` ( `EXPIRE_CACHE` int, PRIMARY KEY (`ID_CACHE`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +-- ----------------------------------------------------- +-- Table`changement` +-- ----------------------------------------------------- + +DROP TABLE IF EXISTS `changement`; + +CREATE TABLE `changement` ( + `ID_CHANGEMENT` int(11) unsigned NOT NULL AUTO_INCREMENT, + `LIBELLE_CHANGEMENT` varchar(255) DEFAULT NULL, + `MESSAGE_CHANGEMENT` text, + PRIMARY KEY (`ID_CHANGEMENT`) +) +ENGINE=InnoDB DEFAULT CHARSET=utf8; + +LOCK TABLES `changement` WRITE; +INSERT INTO `changement` VALUES (1,'Changement de statut','

Bonjour,

\r\n

L\'établissement {etablissementNumeroId} {etablissementLibelle} est passé au statut {etablissementStatut}.

\r\n

Bonne journée,

\r\n

Prévarisc.

'),(2,'Changement d\'avis','

Bonjour,

\r\n

L\'établissement {etablissementNumeroId} {etablissementLibelle} est maintenant sous avis {etablissementAvis}.

\r\n

Bonne journée,

\r\n

Prévarisc.

'),(3,'Changement de classement','

Bonjour,

\r\n

L\'établissement {etablissementNumeroId} {etablissementLibelle} est maintenant de catégorie {categorieEtablissement}, de type {typePrincipalEtablissement} - {activitePrincipaleEtablissement}.

\r\n

Bonne journée,

\r\n

Prévarisc.

'); +UNLOCK TABLES; + diff --git a/sql/migrations/2.5-32-changement.sql b/sql/migrations/2.5-32-changement.sql new file mode 100644 index 00000000..143b92ac --- /dev/null +++ b/sql/migrations/2.5-32-changement.sql @@ -0,0 +1,14 @@ +set names 'utf8'; + +DROP TABLE IF EXISTS `changement`; + +CREATE TABLE `changement` ( + `ID_CHANGEMENT` int(11) unsigned NOT NULL AUTO_INCREMENT, + `LIBELLE_CHANGEMENT` varchar(255) DEFAULT NULL, + `MESSAGE_CHANGEMENT` text, + PRIMARY KEY (`ID_CHANGEMENT`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + + +INSERT INTO `changement` VALUES (1,'Changement de statut','

Bonjour,

\r\n

L\'établissement {etablissementNumeroId} {etablissementLibelle} est passé au statut {etablissementStatut}.

\r\n

Bonne journée,

\r\n

Prévarisc.

'),(2,'Changement d\'avis','

Bonjour,

\r\n

L\'établissement {etablissementNumeroId} {etablissementLibelle} est maintenant sous avis {etablissementAvis}.

\r\n

Bonne journée,

\r\n

Prévarisc.

'),(3,'Changement de classement','

Bonjour,

\r\n

L\'établissement {etablissementNumeroId} {etablissementLibelle} est maintenant de catégorie {categorieEtablissement}, de type {typePrincipalEtablissement} - {activitePrincipaleEtablissement}.

\r\n

Bonne journée,

\r\n

Prévarisc.

'); From 45abf8f6501420c60734e2d83056c5343534e182 Mon Sep 17 00:00:00 2001 From: A564406 Date: Fri, 18 Mar 2016 11:54:31 +0100 Subject: [PATCH 007/129] Changement du changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cd8a4e2..166f68a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.5 Evolutions : +* Ajout du système d'alerte lors de la modification d'un établissement * Ajout de la prise en charge du cache filesystem * Ajout des champs de fusion du maire dans la génération de documents * Ajout de la périodicité calculée pour les sites From 9d55c25f0beb585f86ef4265ee8906b9784b289c Mon Sep 17 00:00:00 2001 From: A564406 Date: Fri, 18 Mar 2016 11:58:06 +0100 Subject: [PATCH 008/129] Modification du Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7cd8a4e2..994338c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 2.5 Evolutions : +* Ajout de la synchronisation du calendrier Prévarisc * Ajout de la prise en charge du cache filesystem * Ajout des champs de fusion du maire dans la génération de documents * Ajout de la périodicité calculée pour les sites From 32e0dd4eecf48c2aa55c204e456acee7ab2db4a0 Mon Sep 17 00:00:00 2001 From: A564406 Date: Fri, 18 Mar 2016 12:08:38 +0100 Subject: [PATCH 009/129] Envoi de mail en HTML --- application/services/Mail.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/application/services/Mail.php b/application/services/Mail.php index 5e4e880f..032ac323 100644 --- a/application/services/Mail.php +++ b/application/services/Mail.php @@ -51,17 +51,21 @@ public function __construct() public function sendAlerteMail($objet, $message, $destinataires) { - return $this->sendMail($message, $objet, null, $destinataires); + return $this->sendMail($message, $objet, null, $destinataires, true); } - public function sendMail($message, $objet = null, $to = null, $bcc = null) + public function sendMail($message, $objet = null, $to = null, $bcc = null, $isHTML = false) { $sent = true; $mail = new Zend_Mail('utf-8'); - $mail->setBodyText($message); + if ($isHTML) { + $mail->setBodyHtml($message); + } else { + $mail->setBodyText($message); + } if ($objet) { $mail->setSubject($objet); From c5e1d05b3bd32c0e26b42456b413d0caec1633fe Mon Sep 17 00:00:00 2001 From: A564406 Date: Tue, 22 Mar 2016 19:14:48 +0100 Subject: [PATCH 010/129] Correction des anomalies constate sur le developpement de la synchro Outlook --- .../CalendrierDesCommissionsController.php | 37 +++-- application/models/DbTable/DateCommission.php | 49 +++---- .../api/controllers/CalendarController.php | 10 +- application/modules/api/services/Calendar.php | 127 ++++++++++++------ .../calendrier-des-commissions/index.phtml | 57 +++----- 5 files changed, 156 insertions(+), 124 deletions(-) diff --git a/application/controllers/CalendrierDesCommissionsController.php b/application/controllers/CalendrierDesCommissionsController.php index 733055f0..6ef3e5c7 100755 --- a/application/controllers/CalendrierDesCommissionsController.php +++ b/application/controllers/CalendrierDesCommissionsController.php @@ -51,6 +51,23 @@ public function indexAction() "ARRAY" => $array_results2 ); } + + $userId = Zend_Auth::getInstance()->getIdentity()['ID_UTILISATEUR']; + + $url = sprintf("/api/1.0/calendar?userid=%s&key=%s", + $userId, + getenv('PREVARISC_SECURITY_KEY')); + + if ($this->_getParam("idComm")) { + $url .= sprintf("&commission=%s", $this->_getParam("idComm")); + } + + $protocol = ( ! empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'webcals': 'webcal'; + + //$this->_helper->getHelper('Redirector')->gotoUrl($protocol . '://' . $_SERVER["HTTP_HOST"] . $url); + // + $this->view->url_webcal = $protocol . '://' . $_SERVER["HTTP_HOST"] . $url; + $this->view->array_commissions = $array_commissions; $cache = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('cache'); @@ -1379,24 +1396,4 @@ public function exportoutlookmoisAction() { } echo $ics; } - - public function synccalendarAction() - { - $this->view->layout()->disableLayout(); - $this->_helper->viewRenderer->setNoRender(true); - - $userId = Zend_Auth::getInstance()->getIdentity()['ID_UTILISATEUR']; - - $url = sprintf("/api/1.0/calendar?userid=%s&key=%s", - $userId, - getenv('PREVARISC_SECURITY_KEY')); - - if ($this->_getParam("idComm")) { - $url .= sprintf("&commission=%s", $this->_getParam("idComm")); - } - - echo 'webcal://' . $_SERVER["HTTP_HOST"] . $url; - } - - } diff --git a/application/models/DbTable/DateCommission.php b/application/models/DbTable/DateCommission.php index 4fb19a98..a07c740e 100755 --- a/application/models/DbTable/DateCommission.php +++ b/application/models/DbTable/DateCommission.php @@ -185,30 +185,33 @@ public function updateDependingDossierDates($datecommission) } } - public function getEventInCommission($whereClause) + public function getEventInCommission($idUtilisateur = null, $idCommission = null, $start = null, $end = null) { - $select = "SELECT * " - . "FROM dossier AS doss " - . "INNER JOIN dossieraffectation AS dossAffect " - . "ON dossAffect.ID_DOSSIER_AFFECT = doss.ID_DOSSIER " - . "INNER JOIN datecommission AS dateComm " - . "ON dateComm.ID_DATECOMMISSION = dossAffect.ID_DATECOMMISSION_AFFECT " - . "INNER JOIN commission AS comm " - . "ON comm.ID_COMMISSION = dateComm.COMMISSION_CONCERNE " - . "INNER JOIN etablissementdossier AS etabDoss " - . "ON etabDoss.ID_DOSSIER = doss.ID_DOSSIER " - . "INNER JOIN dossiernature AS dossNat " - . "ON dossNat.ID_DOSSIER = doss.ID_DOSSIER " - . "INNER JOIN dossiernatureliste AS dossNatListe " - . "ON dossNatListe.ID_DOSSIERNATURE = dossNat.ID_NATURE " - . "INNER JOIN dossiertype AS dossType " - . "ON dossType.ID_DOSSIERTYPE = doss.TYPE_DOSSIER " - . "INNER JOIN dossierpreventionniste AS dossPre " - . "ON dossPre.ID_DOSSIER = doss.ID_DOSSIER " - . "INNER JOIN utilisateur AS user " - . "ON user.ID_UTILISATEUR = dossPre.ID_PREVENTIONNISTE " - . "WHERE " . $whereClause; - + $select = $this->select() + ->setIntegrityCheck(false) + ->from(array('d' => 'dossier')) + ->join(array('da' => 'dossieraffectation'), 'da.ID_DOSSIER_AFFECT = d.ID_DOSSIER') + ->join(array('dc' => 'datecommission'), 'dc.ID_DATECOMMISSION = da.ID_DATECOMMISSION_AFFECT') + ->join(array('c' => 'commission'), 'c.ID_COMMISSION = dc.COMMISSION_CONCERNE') + ->join(array('ed' => 'etablissementdossier'), 'ed.ID_DOSSIER = d.ID_DOSSIER') + ->join(array('dn' => 'dossiernature'), 'dn.ID_DOSSIER = d.ID_DOSSIER') + ->join(array('dnl' => 'dossiernatureliste'), 'dnl.ID_DOSSIERNATURE = dn.ID_NATURE') + ->join(array('dt' => 'dossiertype'), 'dt.ID_DOSSIERTYPE = d.TYPE_DOSSIER') + ->join(array('dp' => 'dossierpreventionniste'), 'dp.ID_DOSSIER = d.ID_DOSSIER') + ->join(array('u' => 'utilisateur'), 'u.ID_UTILISATEUR = dp.ID_PREVENTIONNISTE'); + if ($idUtilisateur !== null) { + $select->where('u.ID_UTILISATEUR = ?', $idUtilisateur); + } + if ($idCommission !== null) { + $select->where('dc.COMMISSION_CONCERNE = ?', $idCommission); + } + if ($start !== null) { + $select->where('YEAR(dc.DATE_COMMISSION) >= ?', $start); + } + if ($end !== null) { + $select->where('YEAR(dc.DATE_COMMISSION) <= ?', $end); + } + return $this->getAdapter()->fetchAll($select); } diff --git a/application/modules/api/controllers/CalendarController.php b/application/modules/api/controllers/CalendarController.php index a0396486..1eec6d40 100755 --- a/application/modules/api/controllers/CalendarController.php +++ b/application/modules/api/controllers/CalendarController.php @@ -5,14 +5,18 @@ class Api_CalendarController extends Zend_Controller_Action public function indexAction() { - header("Content-Type: text/Calendar"); - header("Content-Disposition: inline; filename=calendar.ics"); + $idCommission = 0; + if ($this->_getParam('commission')) { + $idCommission = $this->_getParam('commission'); + } + $headers = array("Content-Type: text/Calendar; charset=utf-8", + "Content-Disposition: inline; filename=Prevarisc_calendrier_" . $idCommission . ".ics"); $this->view->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); $server = new SDIS62_Rest_Server; $server->setClass("Api_Service_Calendar"); - $server->handle($this->_request->getParams()); + $server->handle($this->_request->getParams(), $headers, false); } } \ No newline at end of file diff --git a/application/modules/api/services/Calendar.php b/application/modules/api/services/Calendar.php index c5776c15..63213145 100755 --- a/application/modules/api/services/Calendar.php +++ b/application/modules/api/services/Calendar.php @@ -8,23 +8,34 @@ class Api_Service_Calendar public function sync($userid, $commission = null) { - $request = $this->createRequestForWebcalEvent($userid, - $commission); + $dossierEvent = $this->createRequestForWebcalEvent($userid, + $commission); - $dbDateCommission = new Model_DbTable_DateCommission; + $calendrierNom = "Prévarisc"; + if ($commission) { + $dbCommission = new Model_DbTable_Commission; + $resultLibelle = $dbCommission->getLibelleCommissions($commission); + if (count($resultLibelle) > 0) { + $calendrierNom .= " " . $resultLibelle[0]['LIBELLE_COMMISSION']; + } + } + + // Le refresh est par défaut à 5 minutes + $refreshTime = (getenv('PREVARISC_CALENDAR_REFRESH_TIME') + && getenv('PREVARISC_CALENDAR_REFRESH_TIME') !== '') ? + getenv('PREVARISC_CALENDAR_REFRESH_TIME') : 'PT5M'; $calendar = new VObject\Component\VCalendar(array( - "NAME" => "Calendrier Prévarisc", - "X-WR-CALNAME" => "Calendrier Prévarisc", - "REFRESH-INTERVAL;VALUE=DURATION" => "PT5M", - "X-PUBLISHED-TTL" => "PT5M" + "NAME" => $calendrierNom, + "X-WR-CALNAME" => $calendrierNom, + "REFRESH-INTERVAL;VALUE=DURATION" => $refreshTime, + "X-PUBLISHED-TTL" => $refreshTime )); $vtimezone = $this->getVTimezoneComponent($calendar); $calendar->add($vtimezone); - - foreach ($dbDateCommission->getEventInCommission($request) as $commissionEvent) { + foreach ($dossierEvent as $commissionEvent) { $event = $this->createICSEvent($commissionEvent); if ($event) { $calendar->add("VEVENT", $event); @@ -62,19 +73,12 @@ private function getVTimezoneComponent($calendar) */ private function createRequestForWebcalEvent($userid, $commission) { - $request = "ID_UTILISATEUR = " . $userid; - - // Gestion des commissions concernés - if ($commission) { - $request .= " AND COMMISSION_CONCERNE = " . $commission; - } - - // Gestion de la date (un an avant l'année actuelle) $today = new \DateTime(); $yearBefore = $today->modify("-1 year")->format("Y"); - $request .= " AND YEAR(DATE_COMMISSION) >= '" . $yearBefore . "'"; - return $request; + $dbDateCommission = new Model_DbTable_DateCommission; + + return $dbDateCommission->getEventInCommission($userid, $commission, $yearBefore); } @@ -85,26 +89,46 @@ private function createICSEvent($commissionEvent) if (is_array($commissionEvent)) { $etsService = new Service_Etablissement; $ets = $etsService->get($commissionEvent["ID_ETABLISSEMENT"]); + + foreach($ets['parents'] as $parent) { + $parentsLibelle[] = $parent['LIBELLE_ETABLISSEMENTINFORMATIONS']; + } + + if (count($parentsLibelle) > 0) { + $parentsStr = implode(" ", $parentsLibelle); + } else { + $parentsStr = ''; + } + if ($parentsStr !== '') { + $parentsStr .= ' - '; + } // Cas d'une commission en salle if ($commissionEvent["ID_COMMISSIONTYPEEVENEMENT"] === 1) { - $summary = sprintf("%s %s - %s", + if ($commissionEvent["TYPE_DOSSIER"] === 3) { + $libelleSum = $commissionEvent["LIBELLE_DATECOMMISSION"]; + } else { + $libelleSum = $commissionEvent["OBJET_DOSSIER"]; + } + $summary = sprintf("%s%s %s - %s", + $parentsStr, $commissionEvent["LIBELLE_DOSSIERTYPE"], $commissionEvent["LIBELLE_DOSSIERNATURE"], - $commissionEvent["OBJET_DOSSIER"]); - $geo = $commissionEvent["LIBELLE_COMMISSION"]; + $libelleSum); + $geo = sprintf("Commission en salle de %s", $commissionEvent["LIBELLE_COMMISSION"]); // Cas d'une visite d'une commission ou d'un groupe de visite } else { + $summary = sprintf('%s%s', $parentsStr, $commissionEvent["LIBELLE_DATECOMMISSION"]); $adresse = count($ets["adresses"]) > 0 ? $ets["adresses"][0] : null; - $summary = $commissionEvent["LIBELLE_DATECOMMISSION"]; - $geo = $ets["informations"]["LIBELLE_ETABLISSEMENTINFORMATIONS"]; if ($adresse) { - $geo .= sprintf(" %s %s %s %s %s", + $geo = sprintf("%s %s %s, %s %s", $adresse["NUMERO_ADRESSE"], $adresse["LIBELLE_RUETYPE"], $adresse["LIBELLE_RUE"], $adresse["CODEPOSTAL_COMMUNE"], $adresse["LIBELLE_COMMUNE"] ); + } else { + $geo = ''; } } $dateStartHour = $commissionEvent["HEURE_DEB_AFFECT"] ? @@ -166,17 +190,29 @@ private function getEventCorps($commissionEvent, $ets) $corpus = "Coordonnées des participants :\r\n"; $dossierService = new Service_Dossier; - $contacts = $dossierService->getAllContacts( + $servEtab = new Service_Etablissement; + $contactsDossier = $dossierService->getAllContacts( $commissionEvent["ID_DOSSIER"]); - foreach ($contacts as $contact) { - $corpus .= $this->formatUtilisateurInformations($contact); + $contactsEts = $servEtab->getAllContacts($ets['general']['ID_ETABLISSEMENT']); + $contacts = array_merge($contactsDossier, $contactsEts); + if (count($contacts) > 0) { + foreach ($contacts as $contact) { + $corpus .= $this->formatUtilisateurInformations($contact); + } + } else { + $corpus .= 'Aucun contact.'; } - $corpus .= "\n"; + + $corpus .= "\r\n\r\n"; $adresseService = new Service_Adresse; $maire = $adresseService->getMaire($commissionEvent["NUMINSEE_COMMUNE"]); - $corpus .= sprintf("Coordonnées de la mairie :\r\n%s\r\n\r\n", + if ($maire && count($maire) > 0) { + $corpus .= sprintf("Coordonnées de la mairie :\r\n%s\r\n\r\n", $this->formatUtilisateurInformations($maire)); + } else { + $corpus .= 'Aucune coordonées pour la mairie.'; + } if ($commissionEvent["ID_DOSSIERTYPE"] === 1) { if ($commissionEvent["TYPESERVINSTRUC_DOSSIER"] === "servInstCommune") { @@ -188,14 +224,24 @@ private function getEventCorps($commissionEvent, $ets) $serviceInstruct = count($serviceInstruct) > 0 ? $serviceInstruct[0] : null; } - $corpus .= sprintf("Coordonnées du service instructeur :\n%s\n\n", + if ($maire && count($maire) > 0) { + $corpus .= sprintf("Coordonnées du service instructeur :\n%s\n\n", $this->formatUtilisateurInformations($serviceInstruct)); + } else { + $corpus .= 'Aucune coordonées pour le service instructeur.'; + } } - $corpus .= sprintf("Date de la dernière visite périodique : %s\n\n", - $ets["last_visite"]); + $lastVisite = new DateTime($ets["last_visite"]); + if ($lastVisite) { + $lastVisitestr = $lastVisite->format('d/m/Y'); + } else { + $lastVisitestr = 'Aucune date.'; + } + $corpus .= sprintf("Date de la dernière visite périodique : %s\r\n\r\n", + $lastVisitestr); - $corpus .= sprintf("Avis d'exploitation de l'établissement : %s\n\n", + $corpus .= sprintf("Avis d'exploitation de l'établissement : %s", $this->getAvisEtablissement($commissionEvent, $ets)); return $corpus; @@ -205,9 +251,8 @@ private function formatUtilisateurInformations($user) { $str = ""; if ($user && is_array($user)) { - if ($user["NOM_UTILISATEURINFORMATIONS"] - && $user["PRENOM_UTILISATEURINFORMATIONS"]) { - $str .= sprintf("- %s %s, ", + if ($user["NOM_UTILISATEURINFORMATIONS"]) { + $str .= sprintf("- %s %s", $user["NOM_UTILISATEURINFORMATIONS"], $user["PRENOM_UTILISATEURINFORMATIONS"]); if ($user["NUMEROADRESSE_UTILISATEURINFORMATIONS"] @@ -215,7 +260,7 @@ private function formatUtilisateurInformations($user) && $user["NUMEROADRESSE_UTILISATEURINFORMATIONS"] && $user["CPADRESSE_UTILISATEURINFORMATIONS"] && $user["VILLEADRESSE_UTILISATEURINFORMATIONS"]) { - $str .= sprintf("%s %s %s %s, ", + $str .= sprintf(", %s %s, %s %s", $user["NUMEROADRESSE_UTILISATEURINFORMATIONS"], $user["RUEADRESSE_UTILISATEURINFORMATIONS"], $user["CPADRESSE_UTILISATEURINFORMATIONS"], @@ -223,15 +268,15 @@ private function formatUtilisateurInformations($user) ); } if ($user["TELFIXE_UTILISATEURINFORMATIONS"]) { - $str .= sprintf("%s, ", + $str .= sprintf(", %s", $user["TELFIXE_UTILISATEURINFORMATIONS"]); } if ($user["TELFAX_UTILISATEURINFORMATIONS"]) { - $str .= sprintf("%s, ", + $str .= sprintf(", %s", $user["TELFAX_UTILISATEURINFORMATIONS"]); } if ($user["MAIL_UTILISATEURINFORMATIONS"]) { - $str .= sprintf("%s, ", + $str .= sprintf(", %s", $user["MAIL_UTILISATEURINFORMATIONS"]); } $str .= "\n"; diff --git a/application/views/scripts/calendrier-des-commissions/index.phtml b/application/views/scripts/calendrier-des-commissions/index.phtml index de976242..4211aa53 100755 --- a/application/views/scripts/calendrier-des-commissions/index.phtml +++ b/application/views/scripts/calendrier-des-commissions/index.phtml @@ -1,27 +1,31 @@ placeholder('lateral_navigation')->captureStart(); // Capture du 'lateral_navigation' ?>