This commit is contained in:
Fred Tempez 2024-08-16 15:57:50 +02:00
commit be11a47921
105 changed files with 5774 additions and 0 deletions

308
agenda/agenda.php Normal file
View File

@ -0,0 +1,308 @@
<?php
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
class agenda extends common
{
const VERSION = '0.1';
const REALNAME = 'Agenda';
const DATA_DIRECTORY = self::DATA_DIR . 'agenda/';
const SORT_ASC = 'SORT_ASC';
const SORT_DSC = 'SORT_DSC';
const SORT_HAND = 'SORT_HAND';
public static $agendas = [];
public static $classes = ['' => ''];
public static $actions = [
'config' => self::GROUP_EDITOR,
'delete' => self::GROUP_EDITOR,
'dirs' => self::GROUP_EDITOR,
'add' => self::GROUP_EDITOR,
'edit' => self::GROUP_EDITOR,
'index' => self::GROUP_VISITOR
];
/**
* Mise à jour du module
* Appelée par les fonctions index et config
*/
private function update()
{
//$versionData = $this->getData(['module', $this->getUrl(0), 'config', 'versionData']);
}
/**
* Configuration
*/
public function config()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true
) {
$agendas = $this->getData(['module', $this->getUrl(0), 'content']);
if (is_null($agendas)) {
$this->setData(['module', $this->getUrl(0), 'content', []]);
} elseif (!empty($agendas)) {
foreach ($agendas as $agendaId => $agendaData) {
self::$agendas[] = [
$agendaData['eventName'],
helper::dateUTF8('%d %m %Y', $agendaData['date'], self::$i18nUI),
empty($agendaData['time']) ? '' : helper::dateUTF8('%H:%M', $agendaData['time'], self::$i18nUI),
template::button('agendaConfigEdit' . $agendaId, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $agendaId,
'value' => template::ico('pencil'),
'help' => 'Configuration'
]),
template::button('galleryConfigDelete' . $agendaId, [
'class' => 'galleryConfigDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $agendaId,
'value' => template::ico('trash'),
'help' => 'Supprimer'
])
];
}
}
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'title' => helper::translate('Configuration'),
'view' => 'config'
]);
}
/**
* Ajout d'une événement
*/
public function add()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$this->setData([
'module',
$this->getUrl(0),
'content',
uniqid(),
[
'eventName' => $this->getInput('agendaAddEventName', null, true),
'date' => $this->getInput('agendaAddDate', helper::FILTER_DATETIME, true),
'time' => $this->getInput('agendaAddAllDay', helper::FILTER_BOOLEAN) === false ? $this->getInput('agendaAddTime', helper::FILTER_DATETIME) : '',
'className' => $this->getInput('agendaAddDateClassName', null),
'dateColor' => $this->getInput('agendaAddDateColor', null),
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Modifications enregistrées'),
'state' => true
]);
}
// Liste des classes disponibles
$classes = $this->getData(['page', $this->getUrl(0), 'css']);
preg_match_all('/\.(\w+)/', $classes, $matches);
if (isset($matches[1])) {
// Créer un tableau associatif avec les clés égales aux valeurs
$associativeClasses = array_combine($matches[1], $matches[1]);
// Fusionner ce tableau avec le tableau self::$classes
self::$classes = array_merge(self::$classes, $associativeClasses);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Nouvel événement'),
'view' => 'add',
'vendor' => [
'tinycolorpicker'
],
]);
}
/**
* Ajout d'une événement
*/
public function edit()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$this->setData([
'module',
$this->getUrl(0),
'content',
$this->getUrl(2),
[
'eventName' => $this->getInput('agendaEditEventName', null, true),
'date' => $this->getInput('agendaEditDate', helper::FILTER_DATETIME, true),
'time' => $this->getInput('agendaEditAllDay', helper::FILTER_BOOLEAN) === false ? $this->getInput('agendaEditTime', helper::FILTER_DATETIME) : '',
'className' => $this->getInput('agendaEditDateClassName', null),
'dateColor' => $this->getInput('agendaEditDateColor', null),
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Modifications enregistrées'),
'state' => true
]);
}
// Liste des classes disponibles
$classes = $this->getData(['page', $this->getUrl(0), 'css']);
preg_match_all('/\.(\w+)/', $classes, $matches);
if (isset($matches[1])) {
// Créer un tableau associatif avec les clés égales aux valeurs
$associativeClasses = array_combine($matches[1], $matches[1]);
// Fusionner ce tableau avec le tableau self::$classes
self::$classes = array_merge(self::$classes, $associativeClasses);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Edition'),
'view' => 'edit',
'vendor' => [
'tinycolorpicker'
],
]);
}
/**
* Suppression
*/
public function delete()
{
// La galerie n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]) === null
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Suppression
else {
$this->deleteData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Evenement effacé'),
'state' => true
]);
}
}
/**
* Accueil (deux affichages en un pour éviter une url à rallonge)
*/
public function index()
{
// Mise à jour des données de module
$this->update();
$agendas = $this->getData(['module', $this->getUrl(0), 'content']);
// Initialise la feuille de style
if (empty($this->getData(['page', $this->getUrl(0), 'css']))) {
$this->initCss();
}
// Affichage du template si les données sont disponibles
if (is_null($agendas)) {
$this->setData(['module', $this->getUrl(0), 'content', []]);
} elseif (!empty($agendas)) {
// Lecture des données
foreach ($agendas as $agendasId => $data) {
// Convertion du timestamp en ISO
$data['date'] = helper::dateUTF8('%Y-%m-%d', $data['date']);
// Ajouter l'horaire
if (!empty($data['time'])) {
$data['time'] = helper::dateUTF8('%H:%M', $data['time']);
$data['date'] = $data['date'] . 'T' . $data['time'];
}
self::$agendas[] = $data;
}
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'showPageContent' => true,
'view' => 'index',
'vendor' => [
'animated-calendar'
],
]);
}
// Page de module vide
private function initCss()
{
// Feuille de styles
$cssContent =
'.textRed {
padding: 2px;
border-radius: 5px;
color: red;
background-color: lightgrey;
font-size: 18px;
}
.textGreen {
border-radius: 5px;
padding: 2px;
color: lightgreen;
background-color: darkgrey;
font-size: 18px;
}
.textOrange {
padding: 2px;
border-radius: 5px;
color: orange;
background-color: green;
font-size: 18px;
}';
$this->setData(['page', $this->getUrl(0), 'css', $cssContent]);
}
}

2
agenda/changes.md Normal file
View File

@ -0,0 +1,2 @@
# Version 0.1
- GeoGallery est basé sur le module gallery 4.1

1
agenda/enum.json Normal file
View File

@ -0,0 +1 @@
{"name":"geolocation","realName":"Géolocalisation","version":"0.5","update":"0.0","delete":true,"dataDirectory":"site\/data\/geolocation\/"}

44
agenda/i18n/de.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Zeigen Sie den Inhalt der Seite mit der Galerie an",
"Alignement du bouton de retour": "Return -Taste -Ausrichtung",
"Alphabétique ": "Alphabetisch",
"Alphabétique inverse": "Alphabetik umgekehrt",
"Au-dessus": "Über",
"Aucune galerie": "Keine Galerie",
"Bordure": "Bordüre",
"Configuration de la galerie %s ": "Galeriekonfiguration %s",
"Configuration des galeries": "Die Konfiguration der Galer",
"Couleur de la bordure": "Randfarbe",
"Couverture": "Decke",
"Discrète": "Diskret",
"Distribué avec marges": "Verteilt",
"Distribué sans marge": "Ohne Rand verteilt",
"Dossier cible": "Zieldatei",
"En dessous": "Unter",
"Epaisse": "Dick",
"Fine": "Bußgeld",
"Forte": "Stärke",
"Galerie ajoutée": "Galerie hinzugefügt",
"Galerie effacée": "Gelobte Galerie",
"Légende": "Legende",
"Légendes": "Legenden",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Maske",
"Mode plein écran automatique": "Automatischer Vollmodus",
"Opacité au survol": "Opazität im Überflug",
"Options de configuration": "Optionen de Konfiguration",
"Proportionnelle": "Proportional",
"Supprimer cette galerie ?": "Diese Galerie entfernen?",
"Tri des images": "Bilder sortieren",
"Très Discrète": "Sehr diskret",
"Très fine": "Sehr gut",
"Très forte": "Sehr stark",
"Très épaisse": "Sehr dick",
"Vignettes": "Vignetten",
"Ajouter une galerie": "Eine Galerie hinzufügen",
"Éditer une galerie": "Eine Galerie bearbeiten",
"Effacer une galerie": "Eine Galerie löschen",
"Options des galeries": "Galerieoptionen",
"Thème des galeries": "Galeriethemen"
}

44
agenda/i18n/en_EN.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Show the content of the page with the gallery",
"Alignement du bouton de retour": "Return button alignment",
"Alphabétique ": "Alphabetical",
"Alphabétique inverse": "Reverse alphabetics",
"Au-dessus": "Above",
"Aucune galerie": "No gallery",
"Bordure": "Border",
"Configuration de la galerie %s ": "Gallery settings %s ",
"Configuration des galeries": "Galleries's settings",
"Couleur de la bordure": "Border color",
"Couverture": "Cover",
"Discrète": "Discreet",
"Distribué avec marges": "Distributed with margins",
"Distribué sans marge": "Distributed without margin",
"Dossier cible": "Target file",
"En dessous": "Below",
"Epaisse": "Thick",
"Fine": "Fine",
"Forte": "Forte",
"Galerie ajoutée": "Gallery added",
"Galerie effacée": "Erased gallery",
"Légende": "Caption",
"Légendes": "Legends",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Mask",
"Mode plein écran automatique": "Automatic full mode",
"Opacité au survol": "Opacity in overflight",
"Options de configuration": "Configuration options",
"Proportionnelle": "Proportional",
"Supprimer cette galerie ?": "Remove this gallery?",
"Tri des images": "Sorting images",
"Très Discrète": "Very discreet",
"Très fine": "Very fine",
"Très forte": "Very strong",
"Très épaisse": "Very thick",
"Vignettes": "Vignettes",
"Ajouter une galerie": "Add a gallery",
"Éditer une galerie": "Edit a gallery",
"Effacer une galerie": "Delete a gallery",
"Options des galeries": "Gallery options",
"Thème des galeries": "Gallery themes"
}

44
agenda/i18n/es.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostrar contenido de página con galería",
"Alignement du bouton de retour": "Alineación del botón Atrás",
"Alphabétique ": "Alfabético",
"Alphabétique inverse": "Alfabético inverso",
"Au-dessus": "Encima",
"Aucune galerie": "Sin galería",
"Bordure": "Bordillo",
"Configuration de la galerie %s ": "Configuración de la galería %s ",
"Configuration des galeries": "Configuración de la galería",
"Couleur de la bordure": "Color del bordillo",
"Couverture": "Portada ",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuido con márgenes",
"Distribué sans marge": "Distribuido sin margen",
"Dossier cible": "Carpeta de destino",
"En dessous": "Debajo",
"Epaisse": "grueso",
"Fine": "Fino",
"Forte": "Fuerte",
"Galerie ajoutée": "Galería añadida",
"Galerie effacée": "Galería eliminada",
"Légende": "Pie",
"Légendes": "Leyendas",
"Manuel": "Manual",
"Marge": "Margen",
"Masqué": "Máscara",
"Mode plein écran automatique": "Modo automático de pantalla completa",
"Opacité au survol": "Opacidad de desplazamiento",
"Options de configuration": "Opciones de configuración",
"Proportionnelle": "Proporcional",
"Supprimer cette galerie ?": "¿Borrar esta galería?",
"Tri des images": "Ordenar imágenes",
"Très Discrète": "Muy discreto",
"Très fine": "Muy fino",
"Très forte": "Muy fuerte",
"Très épaisse": "Muy grueso",
"Vignettes": "Viñetas",
"Ajouter une galerie": "Agregar una galería",
"Éditer une galerie": "Editar una galería",
"Effacer une galerie": "Borrar una galería",
"Options des galeries": "Opciones de galerías",
"Thème des galeries": "Temas de galerías"
}

44
agenda/i18n/fr_FR.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "",
"Alignement du bouton de retour": "",
"Alphabétique ": "",
"Alphabétique inverse": "",
"Au-dessus": "",
"Aucune galerie": "",
"Bordure": "",
"Configuration de la galerie %s ": "",
"Configuration des galeries": "",
"Couleur de la bordure": "",
"Couverture": "",
"Discrète": "",
"Distribué avec marges": "",
"Distribué sans marge": "",
"Dossier cible": "",
"En dessous": "",
"Epaisse": "",
"Fine": "",
"Forte": "",
"Galerie ajoutée": "",
"Galerie effacée": "",
"Légende": "",
"Légendes": "",
"Manuel": "",
"Marge": "",
"Masqué": "",
"Mode plein écran automatique": "",
"Opacité au survol": "",
"Options de configuration": "",
"Proportionnelle": "",
"Supprimer cette galerie ?": "",
"Tri des images": "",
"Très Discrète": "",
"Très fine": "",
"Très forte": "",
"Très épaisse": "",
"Vignettes": "",
"Ajouter une galerie": "",
"Éditer une galerie": "",
"Effacer une galerie": "",
"Options des galeries": "",
"Thème des galeries": ""
}

44
agenda/i18n/gr_GR.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Εμφάνιση περιεχομένου σελίδας με γκαλερί",
"Alignement du bouton de retour": "Ευθυγράμμιση κουμπιού πίσω",
"Alphabétique ": "Αλφαβητική Ταξινόμηση",
"Alphabétique inverse": "Αντίστροφη αλφαβητική",
"Au-dessus": "Πάνω",
"Aucune galerie": "Δεν υπάρχει συλλογή εικόνων",
"Bordure": "κάδρο γύρω",
"Configuration de la galerie %s ": "Διαμόρφωση της γκαλερί %s ",
"Configuration des galeries": "Διαμόρφωση γκαλερί",
"Couleur de la bordure": "Χρώμα γραμμής",
"Couverture": "Κάλυψη ",
"Discrète": "διακριτικό",
"Distribué avec marges": "Διανομή με περιθώρια",
"Distribué sans marge": "Διανομή χωρίς περιθώριο",
"Dossier cible": "Φάκελος στόχος",
"En dessous": "Κάτω",
"Epaisse": "Παχιά γραμμή",
"Fine": "Λεπτή γραμμή ",
"Forte": "Ισχυρή αδιαφάνεια",
"Galerie ajoutée": "Προστέθηκε γκαλερί",
"Galerie effacée": "Γκαλερί διαγράφηκε",
"Légende": "Λεζάντα εικόνας",
"Légendes": "",
"Manuel": "Χειροκίνητη ",
"Marge": "Περιθώριο",
"Masqué": "κρυμμένο",
"Mode plein écran automatique": "Αυτόματη λειτουργία πλήρους οθόνης",
"Opacité au survol": "Αδιαφάνεια στο mouse-over",
"Options de configuration": "Επιλογές διαμόρφωσης",
"Proportionnelle": "Αναλογική",
"Supprimer cette galerie ?": "",
"Tri des images": "Ταξινόμηση εικόνων",
"Très Discrète": "Πολύ διακριτικό",
"Très fine": "Πολύ λεπτή γραμμή ",
"Très forte": "Πολύ Ισχυρή αδιαφάνεια",
"Très épaisse": "πολύ παχιά γραμμή",
"Vignettes": "",
"Ajouter une galerie": "Προσθήκη συλλογής",
"Éditer une galerie": "Επεξεργασία συλλογής",
"Effacer une galerie": "Διαγραφή συλλογής",
"Options des galeries": "Επιλογές συλλογών",
"Thème des galeries": "Θέματα συλλογών"
}

44
agenda/i18n/it.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostra il contenuto della pagina con la galleria",
"Alignement du bouton de retour": "Allineamento del pulsante di ritorno",
"Alphabétique ": "Alfabetico",
"Alphabétique inverse": "Alfabetico inverso",
"Au-dessus": "Al di sopra",
"Aucune galerie": "Nessuna galleria",
"Bordure": "Bordo",
"Configuration de la galerie %s ": "Configurazione della galleria %s ",
"Configuration des galeries": "Configurazione di Galler",
"Couleur de la bordure": "Colore del bordo",
"Couverture": "Copertina",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuito con margini",
"Distribué sans marge": "Distribuito senza margine",
"Dossier cible": "File di destinazione",
"En dessous": "Qui di seguito",
"Epaisse": "Spesso",
"Fine": "Bene",
"Forte": "Forte",
"Galerie ajoutée": "Galleria aggiunta",
"Galerie effacée": "Galleria cancellata",
"Légende": "Didascalia",
"Légendes": "Leggende",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Maschera",
"Mode plein écran automatique": "Modalità completa automatica",
"Opacité au survol": "Opacità in luce eccessiva",
"Options de configuration": "Opzioni di configurazione",
"Proportionnelle": "Proporzionale",
"Supprimer cette galerie ?": "Rimuovere questa galleria?",
"Tri des images": "Ordinamento delle immagini",
"Très Discrète": "Molto discreto",
"Très fine": "Molto bene",
"Très forte": "Molto forte",
"Très épaisse": "Molto spesso",
"Vignettes": "Vignette",
"Ajouter une galerie": "Aggiungi una galleria",
"Éditer une galerie": "Modifica una galleria",
"Effacer une galerie": "Cancella una galleria",
"Options des galeries": "Opzioni delle gallerie",
"Thème des galeries": "Temi delle gallerie"
}

44
agenda/i18n/pt_PT.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostre o conteúdo da página com a galeria",
"Alignement du bouton de retour": "Retornar alinhamento do botão",
"Alphabétique ": "Alfabético",
"Alphabétique inverse": "Alfabético reverso",
"Au-dessus": "Acima de",
"Aucune galerie": "Sem galeria",
"Bordure": "Fronteira",
"Configuration de la galerie %s ": "Configuração da galeria %s ",
"Configuration des galeries": "Configuração de Galler",
"Couleur de la bordure": "Cor da borda",
"Couverture": "Capa",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuído com margens",
"Distribué sans marge": "Distribuído sem margem",
"Dossier cible": "Arquivo de destino",
"En dessous": "Abaixo de",
"Epaisse": "Espesso",
"Fine": "Multar",
"Forte": "Forte",
"Galerie ajoutée": "Galeria adicionada",
"Galerie effacée": "Galeria apagada",
"Légende": "Legenda",
"Légendes": "Legendas",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "mascarar",
"Mode plein écran automatique": "Modo completo automático",
"Opacité au survol": "Opacidade em Overflight",
"Options de configuration": "",
"Proportionnelle": "Proporcional",
"Supprimer cette galerie ?": "Remover esta galeria?",
"Tri des images": "Classificando imagens",
"Très Discrète": "Muito discreto",
"Très fine": "Muito bem",
"Très forte": "Muito forte",
"Très épaisse": "Muito espesso",
"Vignettes": "Vinhetas",
"Ajouter une galerie": "Adicionar uma galeria",
"Éditer une galerie": "Editar uma galeria",
"Effacer une galerie": "Apagar uma galeria",
"Options des galeries": "Opções de galerias",
"Thème des galeries": "Temas de galerias"
}

44
agenda/i18n/tr_TR.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Sayfa içeriğini galeri ile görüntüle",
"Alignement du bouton de retour": "Geri düğmesi hizalaması",
"Alphabétique ": "Alfabetik",
"Alphabétique inverse": "Ters alfabetik",
"Au-dessus": "Üstünde",
"Aucune galerie": "Galeri Yok",
"Bordure": "Çerçeve",
"Configuration de la galerie %s ": "%s galeri yapılandırması",
"Configuration des galeries": "Galerilerin yapılandırması",
"Couleur de la bordure": "Çerçeve rengi",
"Couverture": "Kapak",
"Discrète": "Silik",
"Distribué avec marges": "Kenar boşluklarıyla dağıtıldı",
"Distribué sans marge": "Marjsız dağıtıldı",
"Dossier cible": "Hedef klasör",
"En dessous": "Altında",
"Epaisse": "Kalın",
"Fine": "İnce",
"Forte": "Güçlü",
"Galerie ajoutée": "Galeri eklendi",
"Galerie effacée": "Galeri silindi",
"Légende": "Başlık",
"Légendes": "Başlıklar",
"Manuel": "Manuel",
"Marge": "Kenar boşluğu",
"Masqué": "Gizli",
"Mode plein écran automatique": "Otomatik tam ekran modu",
"Opacité au survol": "Hover opaklığı",
"Options de configuration": "Yapılandırma seçenekleri",
"Proportionnelle": "Orantılı",
"Supprimer cette galerie ?": "Bu galeri silinsin mi?",
"Tri des images": "Resimleri sıralama",
"Très Discrète": "Çok silik",
"Très fine": "Çok ince",
"Très forte": "Çok güçlü",
"Très épaisse": "Çok kalın",
"Vignettes": "Küçük resim",
"Ajouter une galerie": "Galeri Ekle",
"Éditer une galerie": "Galeri Düzenle",
"Effacer une galerie": "Galeri Sil",
"Options des galeries": "Galeri Seçenekleri",
"Thème des galeries": "Galeri Temaları"
}

View File

@ -0,0 +1,12 @@
<?php $moduleData['gallery'] = [
'add' => $this->getInput('profilAddGalleryAdd', helper::FILTER_BOOLEAN),
'edit' => $this->getInput('profilAddGalleryEdit', helper::FILTER_BOOLEAN),
'delete' => $this->getInput('profilAddGalleryDelete', helper::FILTER_BOOLEAN),
'option' => $this->getInput('profilAddGalleryOption', helper::FILTER_BOOLEAN),
'theme' => $this->getInput('profilAddGalleryTheme', helper::FILTER_BOOLEAN),
'config' => $this->getInput('profilAddGalleryAdd', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryEdit', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryDelete', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryOption', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryTheme', helper::FILTER_BOOLEAN)
];

View File

@ -0,0 +1,12 @@
<?php $moduleData['gallery'] = [
'add' => $this->getInput('profilEditGalleryAdd', helper::FILTER_BOOLEAN),
'edit' => $this->getInput('profilEditGalleryEdit', helper::FILTER_BOOLEAN),
'delete' => $this->getInput('profilEditGalleryDelete', helper::FILTER_BOOLEAN),
'option' => $this->getInput('profilEditGalleryOption', helper::FILTER_BOOLEAN),
'theme' => $this->getInput('profilEditGalleryTheme', helper::FILTER_BOOLEAN),
'config' => $this->getInput('profilEditGalleryAdd', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryEdit', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryDelete', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryOption', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryTheme', helper::FILTER_BOOLEAN)
];

View File

@ -0,0 +1,28 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo sprintf('%s %s', helper::translate('Permissions'), helper::translate('Galerie')); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('profilAddGalleryAdd', true, 'Ajouter une galerie'); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilAddGalleryEdit', true, 'Éditer une galerie'); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilAddGalleryDelete', true, 'Effacer une galerie'); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('profilAddGalleryOption', true, 'Options des galeries'); ?>
</div>
<div class="col6">
<?php echo template::checkbox('profilAddGalleryTheme', true, 'Thème des galeries'); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,38 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo sprintf('%s %s', helper::translate('Permissions'), helper::translate('Galerie')); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('profilEditGalleryAdd', true, 'Ajouter une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'add'])
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilEditGalleryEdit', true, 'Éditer une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'edit'])
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilEditGalleryDelete', true, 'Effacer une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'delete'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('profilEditGalleryOption', true, 'Options des galeries', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'option'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('profilEditGalleryTheme', true, 'Thème des galeries', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'theme'])
]); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,25 @@
<?php
class theme extends gallery {
public static $defaultTheme = [
'thumbAlign' => 'center',
'thumbWidth' => '18em',
'thumbHeight' => '15em',
'thumbMargin' => '.5em',
'thumbBorder' => '.1em',
'thumbOpacity' => '.7',
'thumbBorderColor' => 'rgba(221, 221, 221, 1)',
'thumbRadius' => '.3em',
'thumbShadows' => '1px 1px 10px',
'thumbShadowsColor' => 'rgba(125, 125, 125, 1)',
'legendHeight' => '.375em',
'legendAlign' => 'center',
'legendTextColor' => 'rgba(255, 255, 255, 1)',
'legendBgColor' => 'rgba(0, 0, 0, .6)'
];
public static $defaultData = [
"showUniqueGallery" => false,
"backPosition" => "top",
"backAlign" => "center",
'versionData' => '3.0'
];
}

View File

@ -0,0 +1,52 @@
.galleryPicture,
.galleryGalleryPicture {
display: block;
border: var(--thumbBorder) solid var(--thumbBorderColor);
height: var(--thumbHeight);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
position: relative;
-webkit-transition: opacity .3s ease-out;
transition: opacity .3s ease-out;
border-radius: var(--thumbRadius);
box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
-webkit-box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
-moz-box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
}
.galleryPicture:hover,
.galleryGalleryPicture:hover {
opacity: var(--thumbOpacity);
}
.galleryName,
.galleryGalleryName {
position: absolute;
left: 0;
right: 0;
bottom: 0;
border-radius: 0 0 calc(var(--thumbRadius)/2) calc(var(--thumbRadius)/2);
padding: var(--legendHeight);
background: var(--legendBgColor);
color: var(--legendTextColor);
text-align: var(--legendAlign);
}
.galleryRow {
display: flex;
flex-wrap: wrap;
justify-content: var(--thumbAlign);
}
.colPicture {
width : var(--thumbWidth);
max-width: 50%;
padding: var(--thumbMargin);
}
@media (max-width: 432px) {
.colPicture {
width: 90%;
max-width: 90%;
margin: 0.5em;
}
}

View File

@ -0,0 +1,27 @@
.galleryRow {
--thumbAlign: #thumbAlign#;
}
.colPicture {
--thumbWidth: #thumbWidth#;
--thumbMargin: #thumbMargin#;
}
.galleryPicture,
.galleryGalleryPicture {
--thumbHeight: #thumbHeight#;
--thumbBorder: #thumbBorder#;
--thumbBorderColor: #thumbBorderColor#;
--thumbRadius: #thumbRadius#;
--thumbShadows: #thumbShadows#;
--thumbShadowsColor: #thumbShadowsColor#;
}
.galleryName,
.galleryGalleryName {
--legendHeight: #legendHeight#;
--legendAlign: #legendAlign#;
--legendTextColor: #legendTextColor#;
--legendBgColor: #legendBgColor#;
}
.galleryPicture:hover,
.galleryGalleryPicture:hover {
--thumbOpacity: #thumbOpacity#;
}

View File

@ -0,0 +1,287 @@
@import url(https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap);
.gc-calendar-wrapper {
transform: scale(0.75);
transform-origin: top left;
width: 133.33%; /* Ajuste la largeur du conteneur pour compenser le redimensionnement */
height: auto; /* Ajuste la hauteur automatiquement */
}
.gc-calendar {
font-family: Inter, sans-serif;
background-color: #fff;
padding: 1rem;
}
.gc-calendar .gc-calendar-header {
background-color: #fff;
padding: 2px;
height: max-content;
display: flex;
align-items: center;
margin-bottom: 40px;
}
.gc-calendar .gc-calendar-header button.next,
.gc-calendar .gc-calendar-header button.prev {
height: 36px;
left: 0;
top: 0;
border-radius: 100px;
background: #fff;
border-radius: 100px;
position: relative;
display: inline-block;
border: 0;
padding: 4px 15px;
font-size: 24px;
box-shadow: inset 0 -1px 0 #edf2f7;
cursor: pointer;
color: #7a7a9d;
font-weight: 700;
margin-right: 10px;
width: inherit;
}
.gc-calendar .gc-calendar-header button.next:hover,
.gc-calendar .gc-calendar-header button.prev:hover {
box-shadow: 0 3px 6px rgba(0, 0, 0, .08), 0 7px 14px rgba(50, 50, 93, .1);
}
.gc-calendar .gc-calendar-header button.next:focus,
.gc-calendar .gc-calendar-header button.prev:focus {
box-shadow: 0 3px 6px rgba(0, 0, 0, .08), 0 7px 14px rgba(50, 50, 93, .1);
outline: 0;
border: 0;
}
.gc-calendar .gc-calendar-header button.prev {
margin-left: 20px;
}
.gc-calendar .gc-calendar-header .gc-calendar-month-year {
font-style: normal;
font-weight: 600;
font-size: 28px;
color: #38385c;
line-height: 136.02%;
min-width: 220px;
}
.gc-calendar table.calendar {
width: 100%;
}
.gc-calendar table.calendar th {
text-align: start;
font-weight: 600;
font-size: 14px;
line-height: 136.02%;
padding: 2px;
text-transform: uppercase;
color: #7a7a9d;
position: relative;
padding-bottom: 12px;
}
.gc-calendar table.calendar td {
height: 150px;
position: relative;
padding-top: 3px;
vertical-align: top;
width: calc(100% / 7);
}
.gc-calendar table.calendar td.next-month .day-number,
.gc-calendar table.calendar td.prev-month .day-number {
color: #b5b5bd;
}
.gc-calendar table.calendar td .day-number {
font-size: 24px;
font-weight: 800;
line-height: 38.09px;
overflow-y: auto;
color: #38385c;
text-decoration: none;
display: block;
}
.gc-calendar table.calendar td .today .day-number {
color: #4c6fff;
}
.gc-calendar table.calendar a {
text-decoration: none;
display: block;
}
.gc-calendar table.calendar a:hover {
background-color: #4c6fff;
width: 90%;
border-radius: 5px;
padding-left: 10px;
transition: .2s;
}
.gc-calendar table.calendar a:hover .day-number {
color: #fff;
}
.gc-calendar table.calendar th::before,
.gc-calendar table.calendar tr:not(:last-child) td::before {
content: "";
display: block;
width: 90%;
height: 2px;
border-radius: 1px;
background-color: #8f8f93;
bottom: 0;
left: 0;
position: absolute;
}
.gc-calendar table.calendar td:hover {
background: linear-gradient(90deg, #e1e8ff 90%, transparent 50%);
padding-left: 10px;
padding-right: 10px;
transition: .3s;
}
.gc-calendar .gc-event {
display: block;
overflow: hidden;
margin-bottom: 10px;
}
.slide-in-left {
-webkit-animation: slide-in-left .5s cubic-bezier(.25, .46, .45, .94) both;
animation: slide-in-left .5s cubic-bezier(.25, .46, .45, .94) both;
}
.slide-in-right {
-webkit-animation: slide-in-right .5s cubic-bezier(.25, .46, .45, .94) both;
animation: slide-in-right .5s cubic-bezier(.25, .46, .45, .94) both;
}
.slide-out-left {
-webkit-animation: slide-out-left .5s cubic-bezier(.55, .085, .68, .53) both;
animation: slide-out-left .5s cubic-bezier(.55, .085, .68, .53) both;
}
.slide-out-right {
-webkit-animation: slide-out-right .5s cubic-bezier(.55, .085, .68, .53) both;
animation: slide-out-right .5s cubic-bezier(.55, .085, .68, .53) both;
}
@-webkit-keyframes slide-in-left {
0% {
-webkit-transform: translateX(-1000px);
transform: translateX(-1000px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
}
@keyframes slide-in-left {
0% {
-webkit-transform: translateX(-1000px);
transform: translateX(-1000px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
}
@-webkit-keyframes slide-in-right {
0% {
-webkit-transform: translateX(1000px);
transform: translateX(1000px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
}
@keyframes slide-in-right {
0% {
-webkit-transform: translateX(1000px);
transform: translateX(1000px);
opacity: 0;
}
100% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
}
@-webkit-keyframes slide-out-left {
0% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(-1000px);
transform: translateX(-1000px);
opacity: 0;
}
}
@keyframes slide-out-left {
0% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(-1000px);
transform: translateX(-1000px);
opacity: 0;
}
}
@-webkit-keyframes slide-out-right {
0% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(1000px);
transform: translateX(1000px);
opacity: 0;
}
}
@keyframes slide-out-right {
0% {
-webkit-transform: translateX(0);
transform: translateX(0);
opacity: 1;
}
100% {
-webkit-transform: translateX(1000px);
transform: translateX(1000px);
opacity: 0;
}
}

View File

@ -0,0 +1,142 @@
var gcObject = {
options: options = {
dayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
dayBegin: 1,
monthNames: [],
onPrevMonth: function (e) {},
onNextMonth: function (e) {},
events: [{
date: null,
eventName: null,
className: null,
onclick: function (e, t) {},
dateColor: "#38385c"
}],
onclickDate: function (e, t) {},
nextIcon: "&gt;",
prevIcon: "&lt;"
},
el: "",
eventAnimate: "none",
pickedDate: new Date,
setDate(e) {
const t = new Date(e);
t != this.pickedDate && (t > this.pickedDate ? this.eventAnimate = "next" : this.eventAnimate = "prev", this.pickedDate = t, this.render())
},
setEvents(e) {
this.options.events = e, this.render()
},
prevMonth() {
this.pickedDate = new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth() - 2, 1), this.options.onPrevMonth(this.pickedDate), this.eventAnimate = "prev", this.render()
},
nextMonth() {
this.pickedDate = new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth(), 1), this.options.onNextMonth(this.pickedDate), this.eventAnimate = "next", this.render()
},
render() {
const e = $(this.el);
e.html("");
const t = $('<div class="gc-calendar"></div>');
e.append(t);
const n = $('<div class="gc-calendar-header"></div>');
n.appendTo(t);
const a = $('<span class="gc-calendar-month-year"></span>');
a.appendTo(n);
$(`<span class='month'>${this.options.monthNames[this.pickedDate.getMonth()]}</span>`).appendTo(a);
$(`<span class='year'> ${this.pickedDate.getFullYear()}</span>`).appendTo(a);
const o = $(`<button type="button" class='prev'>${this.options.prevIcon}</button>`);
o.appendTo(n), o.on("click", (function (e) {
gcObject.prevMonth()
}));
const s = $(`<button type="button" class='next'>${this.options.nextIcon}</button>`);
s.appendTo(n), s.on("click", (function (e) {
gcObject.nextMonth()
}));
const i = $('<table class="calendar"></table>');
i.removeClass("slide-in-left slide-in-right slide-out-left slide-out-right"), "none" == this.eventAnimate ? i.hide().addClass("slide-in-left").show() : "prev" == this.eventAnimate ? i.hide().addClass("slide-out-right").show().delay(200).hide().removeClass("slide-out-right").addClass("slide-in-left").show() : i.hide().addClass("slide-out-left").show().delay(200).hide().removeClass("slide-out-left").addClass("slide-in-right").show(), i.appendTo(t);
const c = $("<thead></thead>");
c.appendTo(i);
const d = $("<tr></tr>");
d.appendTo(c);
const l = this.options.dayNames.length;
for (let e = 0; e < l; e++) {
var h = e + gcObject.options.dayBegin;
h >= l && (h -= l);
const t = gcObject.options.dayNames[h];
$('<th class="dayname">' + t + "</th>").appendTo(d)
}
var r = $("<tbody></tbody>");
r.appendTo(i);
const p = this.getCalendarArray(),
g = new Date;
p.forEach((function (e) {
var t = $("<tr></tr>");
e.forEach((function (e) {
var n = $('<td class="day"></td>');
n.appendTo(t);
var a = $('<a type="button" class="btn-gc-cell"></a>');
n.append(a), a.click((function (t) {
gcObject.options.onclickDate(t, e)
}));
var o = $(`<span class="day-number">${e.date}</span>`);
n.addClass(e.class), o.appendTo(a), g.getFullYear() == e.datejs.getFullYear() && g.getMonth() == e.datejs.getMonth() && g.getDate() == e.datejs.getDate() && a.addClass("today");
var s = "";
gcObject.options.events.forEach((function (t) {
if (t.date.getFullYear() == e.datejs.getFullYear() && t.date.getMonth() == e.datejs.getMonth() && t.date.getDate() == e.datejs.getDate()) {
n.addClass("event");
var a = $(`<div class="gc-event ${t.className}">${t.eventName}</div>`);
s = "color:" + (t.dateColor || "inherit"), a.on("click", (function (e) {
t.onclick(e, t)
})), n.append(a)
}
})), o.attr("style", s)
})), t.appendTo(r)
}))
},
getCalendarArray() {
var e = new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth(), 1).getDay(),
t = new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth() + 1, 0).getDate(),
n = new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth(), 0).getDate(),
a = [],
o = e - gcObject.options.dayBegin;
o < 0 && (o = 7 + o);
for (let e = 0; e < o; e++) a.push({
datejs: new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth() - 1, n),
date: n,
class: "prev-month"
}), n--;
a.reverse();
var s = 1;
for (let e = a.length; e < 7; e++) a.push({
datejs: new Date(this.pickedDate.getFullYear(), this.pickedDate.getMonth(), s),
date: s,
class: "current-month"
}), s++;
var i = [a],
c = !1,
d = this.pickedDate,
l = "current-month";
for (let e = 1; e < 6; e++) {
var h = [];
for (let e = 0; e < 7; e++) h.push({
datejs: new Date(d.getFullYear(), d.getMonth(), s),
date: s,
class: l
}), ++s > t && (s = 1, d.setDate(1), d.setMonth(d.getMonth() + 1), c = !0, l = "next-month");
if (i.push(h), c) break
}
return i
}
};
jQuery.fn.calendarGC = function (e = {
dayNames: dayNames,
dayBegin: dayBegin,
monthNames: monthNames,
onPrevMonth: onPrevMonth,
onNextMonth: onNextMonth,
events: events,
onclickDate: onclickDate,
nextIcon: "&gt;",
prevIcon: "&lt;"
}) {
return gcObject.options.dayNames = e.dayNames || ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], gcObject.options.dayBegin = void 0 === e.dayBegin || null === e.dayBegin ? 1 : e.dayBegin, gcObject.options.monthNames = e.monthNames || ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], gcObject.options.onPrevMonth = e.onPrevMonth || function (e) {}, gcObject.options.onNextMonth = e.onNextMonth || function (e) {}, gcObject.options.events = e.events || [], gcObject.options.onclickDate = e.onclickDate || function (e, t) {}, gcObject.options.nextIcon = e.nextIcon || "&gt;", gcObject.options.prevIcon = e.prevIcon || "&lt;", gcObject.el = this, gcObject.render(), gcObject
};

View File

@ -0,0 +1,4 @@
[
"calendar-gc.min.css",
"calendar-gc.min.js"
]

22
agenda/view/add/add.css Normal file
View File

@ -0,0 +1,22 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.cp-color-picker {
z-index: 100;
}

View File

@ -0,0 +1,11 @@
$(document).ready(function() {
// Ajoute un événement sur le changement de l'état de la checkbox agendaAddAllDay
$('#agendaAddAllDay').on('change', function() {
if ($(this).is(':checked')) {
$('#agendaAddTime').val('');
$('#agendaAddTimeWrapper').slideUp(); // Masque avec un effet de slide
} else {
$('#agendaAddTimeWrapper').slideDown(); // Affiche avec un effet de slide
}
});
});

60
agenda/view/add/add.php Normal file
View File

@ -0,0 +1,60 @@
<?php echo template::formOpen('agendaAddForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('agendaAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('agendaAddSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres'); ?></h4>
<div class="row">
<div class="col4">
<?php echo template::text('agendaAddEventName', [
'label' => 'Titre',
]); ?>
</div>
<div class="col4">
<?php echo template::date('agendaAddDate', [
'label' => 'Date',
'type' => 'date',
]); ?>
</div>
<div class="col4">
<?php echo template::text('agendaAddDateColor', [
'class' => 'colorPicker',
'help' => 'A ne paramétrer que sur un seul événement du jour. Le curseur horizontal règle le niveau de transparence.',
'label' => 'Couleur de la date du jour',
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('agendaAddAllDay', true, 'Toute la journée', [
'checked' => false
]); ?>
</div>
<div class="col4">
<?php echo template::date('agendaAddTime', [
'label' => 'Horaire',
'type' => 'time',
'help' => 'Ne pas indiquer d\'horaire quand l\'événement est sur la journée entière.',
]); ?>
</div>
<div class="col4">
<?php echo template::select('agendaAddDateClassName', $module::$classes, [
'label' => 'Classe CSS',
'help' => 'La feuille de style de la page contient ces classes.',
]); ?>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,24 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.galleryConfigError {
color: #F3674A;
font-weight: bold;
}

View File

@ -0,0 +1,31 @@
<?php echo template::formOpen('agendaConfigForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('agendaConfigBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),
'value' => template::ico('left')
]); ?>
</div>
-->
<div class="col1 offset10">
<?php echo template::button('agendaAdd', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/add/',
'value' => template::ico('plus'),
'class' => 'buttonGreen'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>
<div class="row">
<div class="col12">
<?php if ($module::$agendas): ?>
<?php echo template::table([6, 3, 3, 1, 1], $module::$agendas, ['Titre', 'Date', 'Horaire', '', '']); ?>
<?php else: ?>
<?php echo template::speech('Aucun événement'); ?>
<?php endif; ?>
</div>
<div class="moduleVersion">Version
<?php echo $module::VERSION; ?>
</div>
</div>

18
agenda/view/edit/edit.css Normal file
View File

@ -0,0 +1,18 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,37 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready(function() {
// Vérifie si la variable PHP $time est vide ou non
var time = '<?php echo $this->getData(["module", $this->getUrl(0), "content", $this->getUrl(2), "time"]); ?>';
// Initialisation de l'affichage au chargement de la page
if (time === '') {
$('#agendaEditAllDay').prop('checked', true);
$('#agendaEditTimeWrapper').slideUp(); // Masque immédiatement sans animation
} else {
$('#agendaEditAllDay').prop('checked', false);
$('#agendaEditTimeWrapper').slideDown(); // Affiche immédiatement sans animation
}
// Ajoute un événement sur le changement de l'état de la checkbox agendaEditAllDay
$('#agendaEditAllDay').on('change', function() {
if ($(this).is(':checked')) {
$('#agendaEditTime').val('');
$('#agendaEditTimeWrapper').slideUp(); // Masque avec un effet de slide
} else {
$('#agendaEditTimeWrapper').slideDown(); // Affiche avec un effet de slide
}
});
});

65
agenda/view/edit/edit.php Normal file
View File

@ -0,0 +1,65 @@
<?php echo template::formOpen('agendaEditForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('agendaEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('agendaEditSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres'); ?></h4>
<div class="row">
<div class="col4">
<?php echo template::text('agendaEditEventName', [
'label' => 'Titre',
'value' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'eventName'])
]); ?>
</div>
<div class="col4">
<?php echo template::date('agendaEditDate', [
'label' => 'Date',
'type' => 'date',
'value' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'date'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('agendaEditDateColor', [
'class' => 'colorPicker',
'help' => 'A ne paramétrer que sur un seul événement du jour. Le curseur horizontal règle le niveau de transparence.',
'label' => 'Couleur de la date du jour',
'value' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'dateColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('agendaEditAllDay', true, 'Toute la journée', [
'checked' => false
]); ?>
</div>
<div class="col4">
<?php echo template::date('agendaEditTime', [
'label' => 'Horaire',
'type' => 'time',
'help' => 'Ne pas indiquer d\'horaire quand l\'événement est sur la journée entière.',
'value' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'time'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('agendaEditDateClassName', $module::$classes, [
'label' => 'Classe CSS',
'help' => 'La feuille de style de la page contient ces classes.',
'selected' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'className'])
]); ?>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,45 @@
.popup-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 9999;
font-family: 'Inter', sans-serif; /* Utilisation de la police Inter */
font-size: 18px; /* Taille de police de 24px */
}
.popup-content, .popup-listcontent{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: white;
padding: 20px;
border-radius: 5px;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
width: 300px;
text-align: center;
font-family: 'Inter', sans-serif; /* Assurer la police Inter dans la popup */
}
.popup-content {
text-align: center;
}
.popup-listcontent {
text-align: left;
}
.close-btn {
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
font-size: 12px; /* Taille de la croix de fermeture */
}
.gc-calendar-month-year {
cursor: pointer;
}

View File

@ -0,0 +1,194 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
const jsonOptions = '<?php echo json_encode($module::$agendas); ?>';
const objOptions = JSON.parse(jsonOptions);
//console.log(objOptions);
const events = generateEvents(objOptions);
// https://www.jqueryscript.net/time-clock/animated-calendar-event-gc.html
$(function (e) {
var calendar = $("#calendar").calendarGC({
dayBegin: 0,
dayNames: ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'],
monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
prevIcon: '&#x3c;',
homeIcon: 'H',
nextIcon: '&#x3e;',
onPrevMonth: function (e) {
console.log("prev");
//console.log(e);
},
onNextMonth: function (e) {
console.log("next");
//console.log(e);
},
events: events,
onclickDate: function (e, data) {
// Extraire la date cliquée au format YYYY-MM-DD
var targetDate = formatDate(data.datejs);
console.log(data);
// Filtrer les événements pour la date cliquée
var filteredEvents = $.grep(events, function (event) {
//console.log("Comparaison avec : " + formatDate(event.date));
return formatDate(event.date) === targetDate;
});
// Vérifier le nombre d'événements trouvés
//console.log("Nombre d'événements trouvés : " + filteredEvents.length);
// Construire le contenu de la popup avec les événements du jour
if (filteredEvents.length > 0) {
// Si des événements sont trouvés, les afficher
eventListHtml = '<ul>';
$.each(filteredEvents, function (index, event) {
// Vérifier si une heure est spécifiée et formater correctement
console.log(event);
var eventTime = event.eventTime ? event.eventTime : 'toute la journée';
eventListHtml += '<li><strong>' + event.eventName + '</strong><br>' + eventTime + '</li>';
});
// Titre de la popup
eventListHtml += '</ul>';
$('#popupDate').html('Événements du ' + formatDateToDMY(targetDate));
} else {
// Sinon, afficher "Aucun événement"
eventListHtml = '';
$('#popupDate').html('Aucun événement le ' + formatDateToDMY(targetDate));
}
// Injecter le contenu dans la popup
$('#eventList').html(eventListHtml);
// Afficher la popup
$('#eventListPopup').fadeIn();
// Fermer la popup lorsqu'on clique sur le bouton de fermeture
$('.close-btn').on('click', function () {
$('#eventListPopup').fadeOut();
});
// Fermer la popup lorsqu'on clique en dehors du contenu
$('#eventListPopup').on('click', function (e) {
if ($(e.target).is('.popup-overlay')) {
$(this).fadeOut();
}
});
}
});
// Ajoute un écouteur d'événement pour le clic sur l'élément avec la classe gc-calendar-month-year
$(document).on('click', '.gc-calendar-month-year', function() {
// Obtient la date courante
var currentDate = new Date();
// Formate la date au format "YYYY-MM-DD"
var formattedDate = currentDate.toISOString().split('T')[0];
// Définit la date du calendrier sur la date courante
calendar.setDate(formattedDate);
});
});
function showPopup(data) {
var eventName = data.eventName;
// Extraire la date et l'heure
var eventDate = data.date.toLocaleDateString(); // Format : 18/08/2024
// Vérifier si l'heure est définie et extraire l'heure si disponible
var eventTime = data.eventTime === "" || data.date.getMinutes() ?
data.date.toLocaleTimeString([], {
hour: '2-digit',
minute: '2-digit'
}) :
''; // Format : 12:00
// Injecter les informations dans la popup
$('#eventName').text(eventName);
$('#eventDate').text(eventDate);
console.log(eventTime);
if (eventTime === '') {
$('.eventTime').empty();
$('.eventTime').append('<span id="eventTime">Toute la journée</span>');
} else {
$('#eventTime').text(eventTime);
}
// Afficher la popup
$('#eventPopup').fadeIn();
// Fermer la popup lorsqu'on clique sur le bouton de fermeture
$('.close-btn').on('click', function () {
$('#eventPopup').fadeOut();
});
// Fermer la popup lorsqu'on clique en dehors du contenu
$('#eventPopup').on('click', function (e) {
if ($(e.target).is('.popup-overlay')) {
$(this).fadeOut();
}
});
}
function generateEvents(objOptions) {
return objOptions.map(function (item) {
return {
date: new Date(item.date), // Convertir la chaîne de date en objet Date
eventTime: item.time,
eventName: item.eventName,
className: item.className || '', // Ajouter une classe CSS si disponible
dateColor: item.dateColor || '', // Ajouter une couleur de date si disponible
onclick: function (e, data) { // Ajouter une fonction onclick
showPopup(data);
}
};
});
}
function formatDate(datejs) {
var year = datejs.getFullYear();
var month = ('0' + (datejs.getMonth() + 1)).slice(-2); // Ajouter un zéro devant si nécessaire
var day = ('0' + datejs.getDate()).slice(-2); // Ajouter un zéro devant si nécessaire
return year + '-' + month + '-' + day;
}
function formatDateToDMY(dateString) {
// Convertir la chaîne de caractères en objet Date
var datejs = new Date(dateString);
// Créer un tableau des noms de mois
var monthNames = ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet',
'août', 'septembre', 'octobre', 'novembre', 'décembre'
];
// Obtenir le jour, le mois et l'année
var day = datejs.getDate();
var month = monthNames[datejs.getMonth()];
var year = datejs.getFullYear();
// Retourner la date au format "jour mois année"
return day + ' ' + month + ' ' + year;
}

View File

@ -0,0 +1,20 @@
<?php if ($module::$agendas): ?>
<div id="calendar" class="gc-calendar-wrapper"></div>
<div id="eventPopup" class="popup-overlay">
<div class="popup-content">
<span class="close-btn">&times;</span>
<p><strong> <span id="eventName"></strong></span></p>
<p>Le <span id="eventDate"></span>
<p class="eventTime">à <span id="eventTime"></span></p>
</div>
</div>
<div id="eventListPopup" class="popup-overlay">
<div class="popup-listcontent">
<span class="close-btn">&times;</span>
<p><span id="popupDate"></span></p>
<div id="eventList"></div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Rien à afficher'); ?>
<?php endif; ?>

2
geogallery/changes.md Normal file
View File

@ -0,0 +1,2 @@
# Version 0.1
- GeoGallery est basé sur le module gallery 4.1

1
geogallery/enum.json Normal file
View File

@ -0,0 +1 @@
{"name":"geogallery","realName":"GéoGalerie","version":"0.9","update":"0.0","delete":true,"dataDirectory":"site\/data\/geogallery\/"}

542
geogallery/geogallery.php Normal file
View File

@ -0,0 +1,542 @@
<?php
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
class geogallery extends common
{
const VERSION = '0.9';
const REALNAME = 'GéoGalerie';
const DATADIRECTORY = self::DATA_DIR . 'geogallery/';
const SORT_ASC = 'SORT_ASC';
const SORT_DSC = 'SORT_DSC';
const SORT_HAND = 'SORT_HAND';
public static $galleries = [];
public static $galleriesId = [];
public static $pictures = [];
public static $picturesId = [];
public static $galleriesCenter = [];
public static $actions = [
'config' => self::GROUP_EDITOR,
'delete' => self::GROUP_EDITOR,
'dirs' => self::GROUP_EDITOR,
'edit' => self::GROUP_EDITOR,
'add' => self::GROUP_EDITOR,
'index' => self::GROUP_VISITOR
];
/**
* Mise à jour du module
* Appelée par les fonctions index et config
*/
private function update()
{
//$versionData = $this->getData(['module', $this->getUrl(0), 'config', 'versionData']);
}
/**
* Configuration
*/
public function config()
{
// Mise à jour des données de module
$this->update();
//Affichage de la galerie triée
$galleries = $this->getData(['module', $this->getUrl(0), 'content']);
// Traitement de l'affichage
if ($galleries) {
foreach ($galleries as $galleryId => $gallery) {
// Erreur dossier vide
if (is_dir($gallery['config']['directory'])) {
if (count(scandir($gallery['config']['directory'])) === 2) {
$gallery['config']['directory'] = '<span class="galleryConfigError">' . $gallery['config']['directory'] . ' (dossier vide)</span>';
}
}
// Erreur dossier supprimé
else {
$gallery['config']['directory'] = '<span class="galleryConfigError">' . $gallery['config']['directory'] . ' (dossier introuvable)</span>';
}
// Met en forme le tableau
self::$galleries[] = [
$gallery['config']['name'],
$gallery['config']['directory'],
template::button('galleryConfigEdit' . $galleryId, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $galleryId,
'value' => template::ico('pencil'),
'help' => 'Configuration'
]),
template::button('galleryConfigDelete' . $galleryId, [
'class' => 'galleryConfigDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $galleryId,
'value' => template::ico('trash'),
'help' => 'Supprimer'
])
];
// Tableau des id des galleries pour le drag and drop
self::$galleriesId[] = $galleryId;
}
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Configuration'),
'view' => 'config'
]);
}
/**
* Ajout d'une galerie
*/
public function add()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$galleryId = $this->getInput('galleryAddName', null, true);
$success = false;
if ($galleryId) {
$galleryId = helper::increment($this->getInput('galleryAddName', helper::FILTER_ID, true), (array) $this->getData(['module', $this->getUrl(0), 'content']));
// définir une vignette par défaut
$directory = $this->getInput('galleryAddDirectory', helper::FILTER_STRING_SHORT, true);
$iterator = new DirectoryIterator($directory);
$i = 0;
foreach ($iterator as $fileInfos) {
if ($fileInfos->isDot() === false and $fileInfos->isFile() and @getimagesize($fileInfos->getPathname())) {
$i += 1;
// Créer la miniature si manquante
if (!file_exists(str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . self::THUMBS_SEPARATOR . strtolower($fileInfos->getFilename()))) {
$this->makeThumb(
$fileInfos->getPathname(),
str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . self::THUMBS_SEPARATOR . strtolower($fileInfos->getFilename()),
self::THUMBS_WIDTH
);
}
break;
}
}
// Le dossier de la galerie est vide
if ($i > 0) {
$this->setData([
'module',
$this->getUrl(0),
'content',
$galleryId,
[
'config' => [
'name' => $this->getInput('galleryAddName'),
'directory' => $this->getInput('galleryAddDirectory', helper::FILTER_STRING_SHORT, true),
],
'legend' => [],
'position' => []
]
]);
$success = true;
} else {
self::$inputNotices['galleryAddDirectory'] = "Le dossier sélectionné ne contient aucune image";
$success = false;
}
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Modifications enregistrées'),
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Nouvelle galerie'),
'view' => 'add'
]);
}
/**
* Suppression
*/
public function delete()
{
// La galerie n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]) === null
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Suppression
else {
$this->deleteData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Galerie effacée'),
'state' => true
]);
}
}
/**
* Liste des dossiers
*/
public function dirs()
{
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => geogalleriesHelper::scanDir(self::FILE_DIR . 'source')
]);
}
/**
* Édition
*/
public function edit()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
// légendes
$legend = (array) $this->getInput('legend', null);
foreach ($legend as $file => $data) {
$legends[str_replace('.', '', $file)] = empty($data) ? $file : helper::filter($data, helper::FILTER_STRING_SHORT);
}
// Données géographique
foreach ($legend as $file => $data) {
$geo[str_replace('.', '', $file)] = [
'long' => $this->getInput('gpslong[' . $file . ']', helper::FILTER_FLOAT),
'lat' => $this->getInput('gpslat[' . $file . ']', helper::FILTER_FLOAT)
];
}
// Sauvegarder
$this->setData([
'module',
$this->getUrl(0),
'content',
$this->getUrl(2),
[
'config' => [
// Données mises à jour par les options
'name' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'config', 'name']),
'directory' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'config', 'directory']),
],
'legend' => $legends,
//'geo' => $geo,
'position' => $geo
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Modifications enregistrées'),
'state' => true
]);
}
// La galerie n'existe pas
if ($this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// La galerie existe
else {
// Met en forme le tableau
$directory = $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'config', 'directory']);
if (is_dir($directory)) {
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileInfos) {
if ($fileInfos->isDot() === false and $fileInfos->isFile() and @getimagesize($fileInfos->getPathname())) {
// Créer la miniature RFM si manquante
if (!file_exists(str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . strtolower($fileInfos->getFilename()))) {
$this->makeThumb(
$fileInfos->getPathname(),
str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . strtolower($fileInfos->getFilename()),
122
);
}
// Obtenir les métadonnées EXIF de l'image
$exif = exif_read_data($fileInfos->getPath() . '/' . $fileInfos->getFilename());
$latitude = 'Donnée absente';
$longitude = 'Donnée absente';
// Vérifier si les données EXIF contiennent des informations de géolocalisation
if (!empty($exif['GPSLatitude']) && !empty($exif['GPSLongitude'])) {
// Coordonnées de latitude
$latitude = $this->gps_decimal($exif['GPSLatitude'], $exif['GPSLatitudeRef']);
// Coordonnées de longitude
$longitude = $this->gps_decimal($exif['GPSLongitude'], $exif['GPSLongitudeRef']);
}
self::$pictures[str_replace('.', '', $fileInfos->getFilename())] = [
//$this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'position', str_replace('.', '', $fileInfos->getFilename())]) + 1,
$fileInfos->getFilename(),
template::text('legend[' . $fileInfos->getFilename() . ']', [
'value' => $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'legend', str_replace('.', '', $fileInfos->getFilename())])
]),
'Lat: ' . round($latitude, 5) . ' - Long:' . round($longitude, 5),
'<a href="https://www.google.com/maps?q=' . $latitude . ',' . $longitude . '" data-lity><img src="module/geogallery/vendor/leaflet/images/marker-icon.png" class="marker"></a> ',
//'<a href="https://www.openstreetmap.org/?mlat=' . $latitude . '&mlon=' . $longitude . '#map=8/' . $latitude . '/longitude" target="_blank"><img src="module/geogallery/vendor/leaflet/images/marker-icon.png" class="marker"></a> ',
'<a href="' . str_replace('source', 'thumb', $directory) . '/' . self::THUMBS_SEPARATOR . $fileInfos->getFilename() . '" rel="data-lity" data-lity=""><img src="' . str_replace('source', 'thumb', $directory) . '/' . $fileInfos->getFilename() . '"></a>',
];
self::$picturesId[] = str_replace('.', '', $fileInfos->getFilename());
}
}
}
}
// Valeurs en sortie
$this->addOutput([
'title' => sprintf(helper::translate('Galerie %s '), $this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2), 'config', 'name'])),
'view' => 'edit'
]);
}
/**
* Accueil (deux affichages en un pour éviter une url à rallonge)
*/
public function index()
{
// Mise à jour des données de module
$this->update();
// Initialise la feuille de style
if (empty($this->getData(['page', $this->getUrl(0), 'css']))) {
$this->initCss();
}
// Liste des galeries
$locations = $this->getData(['module', $this->getUrl(0), 'content']);
if (is_null($locations)) {
// initialisation de la BDD
$this->setData(['module', $this->getUrl(0), 'content', []]);
// Construit les données pour le js
} elseif (!empty($locations)) {
$galleries = array_keys($this->getData(['module', $this->getUrl(0), 'content']));
foreach ($galleries as $key => $gallery) {
$directory = $this->getData(['module', $this->getUrl(0), 'content', $gallery, 'config', 'directory']);
if (is_dir($directory)) {
$iterator = new DirectoryIterator($directory);
foreach ($iterator as $fileInfos) {
if ($fileInfos->isDot() === false and $fileInfos->isFile() and @getimagesize($fileInfos->getPathname())) {
// Créer la miniature si manquante
if (!file_exists(str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . self::THUMBS_SEPARATOR . strtolower($fileInfos->getFilename()))) {
$this->makeThumb(
$fileInfos->getPathname(),
str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . self::THUMBS_SEPARATOR . strtolower($fileInfos->getFilename()),
self::THUMBS_WIDTH
);
}
$exif = exif_read_data($fileInfos->getPath() . '/' . $fileInfos->getFilename());
// Vérifier si les données EXIF contiennent des informations de géolocalisation
if (!empty($exif['GPSLatitude']) || !empty($exif['GPSLongitude'])) {
// Coordonnées
self::$galleries[] = [
'lat' => $this->gps_decimal($exif['GPSLatitude'], $exif['GPSLatitudeRef']),
'long' => $this->gps_decimal($exif['GPSLongitude'], $exif['GPSLatitudeRef']),
'img' => $fileInfos->getPath() . '/' . strtolower($fileInfos->getFilename()),
'thumb' => str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . self::THUMBS_SEPARATOR . strtolower($fileInfos->getFilename()),
'label' => $this->getData(['module', $this->getUrl(0), 'content', $gallery, 'legend', str_replace('.', '', $fileInfos->getFilename())])
];
} else {
self::$galleries[] = [
'lat' => $this->getData(['module', $this->getUrl(0), 'content', $gallery, 'position', 'directory', str_replace('.', '', $fileInfos->getFilename())]),
'long' => $this->getData(['module', $this->getUrl(0), 'content', $gallery, 'position', 'directory', str_replace('.', '', $fileInfos->getFilename())]),
'img' => $fileInfos->getPath() . '/' . strtolower($fileInfos->getFilename()),
'thumb' => str_replace('source', 'thumb', $fileInfos->getPath()) . '/' . self::THUMBS_SEPARATOR . strtolower($fileInfos->getFilename()),
'label' => $this->getData(['module', $this->getUrl(0), 'content', $gallery, 'legend', str_replace('.', '', $fileInfos->getFilename())])
];
}
}
}
}
}
// Calcul du point central
// Calculer le centre géographique
$totalLat = 0;
$totalLong = 0;
$count = count(self::$galleries);
foreach (self::$galleries as $coordinate) {
$totalLat += $coordinate["lat"];
$totalLong += $coordinate["long"];
}
$centerLat = $totalLat / $count;
$centerLong = $totalLong / $count;
// Calculer la distance maximale au centre pour déterminer le niveau de zoom
$maxDistance = 0;
foreach (self::$galleries as $coordinate) {
if (
is_numeric($centerLat)
&& is_numeric($centerLong)
&& $coordinate["lat"]
&& $coordinate["long"]
) {
$distance = $this->haversineGreatCircleDistance($centerLat, $centerLong, $coordinate["lat"], $coordinate["long"]);
if ($distance > $maxDistance) {
$maxDistance = $distance;
}
}
}
$zoomLevel = $this->getZoomLevel($maxDistance);
self::$galleriesCenter = array(
'lat' => $centerLat,
'long' => $centerLong,
'zoom' => $zoomLevel
);
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'showPageContent' => true,
'view' => 'index',
'vendor' => [
'leaflet'
],
]);
}
// Fonction pour convertir les coordonnées GPS au format décimal
private function gps_decimal($coordinate, $hemisphere)
{
// Extrait les degrés, minutes et secondes
$degrees = count($coordinate) > 0 ? $this->gps2Num($coordinate[0]) : 0;
$minutes = count($coordinate) > 1 ? $this->gps2Num($coordinate[1]) : 0;
$seconds = count($coordinate) > 2 ? $this->gps2Num($coordinate[2]) : 0;
// Convertit les degrés, minutes et secondes en décimal
$decimal = $degrees + ($minutes / 60) + ($seconds / 3600);
// Si l'hémisphère est au Sud ou à l'Ouest, les coordonnées sont négatives
$decimal *= ($hemisphere == 'S' || $hemisphere == 'W') ? -1 : 1;
return $decimal;
}
// Fonction pour convertir les coordonnées GPS en nombre
private function gps2Num($coordPart)
{
$parts = explode('/', $coordPart);
if (count($parts) <= 0)
return 0;
if (count($parts) == 1)
return $parts[0];
return floatval($parts[0]) / floatval($parts[1]);
}
// Fonction pour calculer la distance entre deux points géographiques
private function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371)
{
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
// Déterminer le niveau de zoom
// Cette fonction est une approximation pour le calcul du zoom
private function getZoomLevel($maxDistance)
{
$maxZoom = 21; // Le zoom maximal pour Leaflet
$earthCircumference = 40075; // La circonférence de la Terre en km
for ($zoom = $maxZoom; $zoom >= 0; $zoom--) {
if ($maxDistance < ($earthCircumference / pow(2, $zoom))) {
return $zoom;
}
}
return 0;
}
// Page de module vide
private function initCss()
{
// Feuille de styles
$cssContent =
'#map {
height: 500px;
width: auto;
}
.leaflet-popup-content {
text-align: center;
}';
$this->setData(['page', $this->getUrl(0), 'css', $cssContent]);
}
}
class geogalleriesHelper extends helper
{
/**
* Scan le contenu d'un dossier et de ses sous-dossiers
* @param string $dir Dossier à scanner
* @return array
*/
public static function scanDir($dir)
{
$dirContent = [];
$iterator = new DirectoryIterator($dir);
foreach ($iterator as $fileInfos) {
if ($fileInfos->isDot() === false and $fileInfos->isDir()) {
$dirContent[] = $dir . '/' . $fileInfos->getBasename();
$dirContent = array_merge($dirContent, self::scanDir($dir . '/' . $fileInfos->getBasename()));
}
}
return $dirContent;
}
}

44
geogallery/i18n/de.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Zeigen Sie den Inhalt der Seite mit der Galerie an",
"Alignement du bouton de retour": "Return -Taste -Ausrichtung",
"Alphabétique ": "Alphabetisch",
"Alphabétique inverse": "Alphabetik umgekehrt",
"Au-dessus": "Über",
"Aucune galerie": "Keine Galerie",
"Bordure": "Bordüre",
"Configuration de la galerie %s ": "Galeriekonfiguration %s",
"Configuration des galeries": "Die Konfiguration der Galer",
"Couleur de la bordure": "Randfarbe",
"Couverture": "Decke",
"Discrète": "Diskret",
"Distribué avec marges": "Verteilt",
"Distribué sans marge": "Ohne Rand verteilt",
"Dossier cible": "Zieldatei",
"En dessous": "Unter",
"Epaisse": "Dick",
"Fine": "Bußgeld",
"Forte": "Stärke",
"Galerie ajoutée": "Galerie hinzugefügt",
"Galerie effacée": "Gelobte Galerie",
"Légende": "Legende",
"Légendes": "Legenden",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Maske",
"Mode plein écran automatique": "Automatischer Vollmodus",
"Opacité au survol": "Opazität im Überflug",
"Options de configuration": "Optionen de Konfiguration",
"Proportionnelle": "Proportional",
"Supprimer cette galerie ?": "Diese Galerie entfernen?",
"Tri des images": "Bilder sortieren",
"Très Discrète": "Sehr diskret",
"Très fine": "Sehr gut",
"Très forte": "Sehr stark",
"Très épaisse": "Sehr dick",
"Vignettes": "Vignetten",
"Ajouter une galerie": "Eine Galerie hinzufügen",
"Éditer une galerie": "Eine Galerie bearbeiten",
"Effacer une galerie": "Eine Galerie löschen",
"Options des galeries": "Galerieoptionen",
"Thème des galeries": "Galeriethemen"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Show the content of the page with the gallery",
"Alignement du bouton de retour": "Return button alignment",
"Alphabétique ": "Alphabetical",
"Alphabétique inverse": "Reverse alphabetics",
"Au-dessus": "Above",
"Aucune galerie": "No gallery",
"Bordure": "Border",
"Configuration de la galerie %s ": "Gallery settings %s ",
"Configuration des galeries": "Galleries's settings",
"Couleur de la bordure": "Border color",
"Couverture": "Cover",
"Discrète": "Discreet",
"Distribué avec marges": "Distributed with margins",
"Distribué sans marge": "Distributed without margin",
"Dossier cible": "Target file",
"En dessous": "Below",
"Epaisse": "Thick",
"Fine": "Fine",
"Forte": "Forte",
"Galerie ajoutée": "Gallery added",
"Galerie effacée": "Erased gallery",
"Légende": "Caption",
"Légendes": "Legends",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Mask",
"Mode plein écran automatique": "Automatic full mode",
"Opacité au survol": "Opacity in overflight",
"Options de configuration": "Configuration options",
"Proportionnelle": "Proportional",
"Supprimer cette galerie ?": "Remove this gallery?",
"Tri des images": "Sorting images",
"Très Discrète": "Very discreet",
"Très fine": "Very fine",
"Très forte": "Very strong",
"Très épaisse": "Very thick",
"Vignettes": "Vignettes",
"Ajouter une galerie": "Add a gallery",
"Éditer une galerie": "Edit a gallery",
"Effacer une galerie": "Delete a gallery",
"Options des galeries": "Gallery options",
"Thème des galeries": "Gallery themes"
}

44
geogallery/i18n/es.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostrar contenido de página con galería",
"Alignement du bouton de retour": "Alineación del botón Atrás",
"Alphabétique ": "Alfabético",
"Alphabétique inverse": "Alfabético inverso",
"Au-dessus": "Encima",
"Aucune galerie": "Sin galería",
"Bordure": "Bordillo",
"Configuration de la galerie %s ": "Configuración de la galería %s ",
"Configuration des galeries": "Configuración de la galería",
"Couleur de la bordure": "Color del bordillo",
"Couverture": "Portada ",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuido con márgenes",
"Distribué sans marge": "Distribuido sin margen",
"Dossier cible": "Carpeta de destino",
"En dessous": "Debajo",
"Epaisse": "grueso",
"Fine": "Fino",
"Forte": "Fuerte",
"Galerie ajoutée": "Galería añadida",
"Galerie effacée": "Galería eliminada",
"Légende": "Pie",
"Légendes": "Leyendas",
"Manuel": "Manual",
"Marge": "Margen",
"Masqué": "Máscara",
"Mode plein écran automatique": "Modo automático de pantalla completa",
"Opacité au survol": "Opacidad de desplazamiento",
"Options de configuration": "Opciones de configuración",
"Proportionnelle": "Proporcional",
"Supprimer cette galerie ?": "¿Borrar esta galería?",
"Tri des images": "Ordenar imágenes",
"Très Discrète": "Muy discreto",
"Très fine": "Muy fino",
"Très forte": "Muy fuerte",
"Très épaisse": "Muy grueso",
"Vignettes": "Viñetas",
"Ajouter une galerie": "Agregar una galería",
"Éditer une galerie": "Editar una galería",
"Effacer une galerie": "Borrar una galería",
"Options des galeries": "Opciones de galerías",
"Thème des galeries": "Temas de galerías"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "",
"Alignement du bouton de retour": "",
"Alphabétique ": "",
"Alphabétique inverse": "",
"Au-dessus": "",
"Aucune galerie": "",
"Bordure": "",
"Configuration de la galerie %s ": "",
"Configuration des galeries": "",
"Couleur de la bordure": "",
"Couverture": "",
"Discrète": "",
"Distribué avec marges": "",
"Distribué sans marge": "",
"Dossier cible": "",
"En dessous": "",
"Epaisse": "",
"Fine": "",
"Forte": "",
"Galerie ajoutée": "",
"Galerie effacée": "",
"Légende": "",
"Légendes": "",
"Manuel": "",
"Marge": "",
"Masqué": "",
"Mode plein écran automatique": "",
"Opacité au survol": "",
"Options de configuration": "",
"Proportionnelle": "",
"Supprimer cette galerie ?": "",
"Tri des images": "",
"Très Discrète": "",
"Très fine": "",
"Très forte": "",
"Très épaisse": "",
"Vignettes": "",
"Ajouter une galerie": "",
"Éditer une galerie": "",
"Effacer une galerie": "",
"Options des galeries": "",
"Thème des galeries": ""
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Εμφάνιση περιεχομένου σελίδας με γκαλερί",
"Alignement du bouton de retour": "Ευθυγράμμιση κουμπιού πίσω",
"Alphabétique ": "Αλφαβητική Ταξινόμηση",
"Alphabétique inverse": "Αντίστροφη αλφαβητική",
"Au-dessus": "Πάνω",
"Aucune galerie": "Δεν υπάρχει συλλογή εικόνων",
"Bordure": "κάδρο γύρω",
"Configuration de la galerie %s ": "Διαμόρφωση της γκαλερί %s ",
"Configuration des galeries": "Διαμόρφωση γκαλερί",
"Couleur de la bordure": "Χρώμα γραμμής",
"Couverture": "Κάλυψη ",
"Discrète": "διακριτικό",
"Distribué avec marges": "Διανομή με περιθώρια",
"Distribué sans marge": "Διανομή χωρίς περιθώριο",
"Dossier cible": "Φάκελος στόχος",
"En dessous": "Κάτω",
"Epaisse": "Παχιά γραμμή",
"Fine": "Λεπτή γραμμή ",
"Forte": "Ισχυρή αδιαφάνεια",
"Galerie ajoutée": "Προστέθηκε γκαλερί",
"Galerie effacée": "Γκαλερί διαγράφηκε",
"Légende": "Λεζάντα εικόνας",
"Légendes": "",
"Manuel": "Χειροκίνητη ",
"Marge": "Περιθώριο",
"Masqué": "κρυμμένο",
"Mode plein écran automatique": "Αυτόματη λειτουργία πλήρους οθόνης",
"Opacité au survol": "Αδιαφάνεια στο mouse-over",
"Options de configuration": "Επιλογές διαμόρφωσης",
"Proportionnelle": "Αναλογική",
"Supprimer cette galerie ?": "",
"Tri des images": "Ταξινόμηση εικόνων",
"Très Discrète": "Πολύ διακριτικό",
"Très fine": "Πολύ λεπτή γραμμή ",
"Très forte": "Πολύ Ισχυρή αδιαφάνεια",
"Très épaisse": "πολύ παχιά γραμμή",
"Vignettes": "",
"Ajouter une galerie": "Προσθήκη συλλογής",
"Éditer une galerie": "Επεξεργασία συλλογής",
"Effacer une galerie": "Διαγραφή συλλογής",
"Options des galeries": "Επιλογές συλλογών",
"Thème des galeries": "Θέματα συλλογών"
}

44
geogallery/i18n/it.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostra il contenuto della pagina con la galleria",
"Alignement du bouton de retour": "Allineamento del pulsante di ritorno",
"Alphabétique ": "Alfabetico",
"Alphabétique inverse": "Alfabetico inverso",
"Au-dessus": "Al di sopra",
"Aucune galerie": "Nessuna galleria",
"Bordure": "Bordo",
"Configuration de la galerie %s ": "Configurazione della galleria %s ",
"Configuration des galeries": "Configurazione di Galler",
"Couleur de la bordure": "Colore del bordo",
"Couverture": "Copertina",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuito con margini",
"Distribué sans marge": "Distribuito senza margine",
"Dossier cible": "File di destinazione",
"En dessous": "Qui di seguito",
"Epaisse": "Spesso",
"Fine": "Bene",
"Forte": "Forte",
"Galerie ajoutée": "Galleria aggiunta",
"Galerie effacée": "Galleria cancellata",
"Légende": "Didascalia",
"Légendes": "Leggende",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Maschera",
"Mode plein écran automatique": "Modalità completa automatica",
"Opacité au survol": "Opacità in luce eccessiva",
"Options de configuration": "Opzioni di configurazione",
"Proportionnelle": "Proporzionale",
"Supprimer cette galerie ?": "Rimuovere questa galleria?",
"Tri des images": "Ordinamento delle immagini",
"Très Discrète": "Molto discreto",
"Très fine": "Molto bene",
"Très forte": "Molto forte",
"Très épaisse": "Molto spesso",
"Vignettes": "Vignette",
"Ajouter une galerie": "Aggiungi una galleria",
"Éditer une galerie": "Modifica una galleria",
"Effacer une galerie": "Cancella una galleria",
"Options des galeries": "Opzioni delle gallerie",
"Thème des galeries": "Temi delle gallerie"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostre o conteúdo da página com a galeria",
"Alignement du bouton de retour": "Retornar alinhamento do botão",
"Alphabétique ": "Alfabético",
"Alphabétique inverse": "Alfabético reverso",
"Au-dessus": "Acima de",
"Aucune galerie": "Sem galeria",
"Bordure": "Fronteira",
"Configuration de la galerie %s ": "Configuração da galeria %s ",
"Configuration des galeries": "Configuração de Galler",
"Couleur de la bordure": "Cor da borda",
"Couverture": "Capa",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuído com margens",
"Distribué sans marge": "Distribuído sem margem",
"Dossier cible": "Arquivo de destino",
"En dessous": "Abaixo de",
"Epaisse": "Espesso",
"Fine": "Multar",
"Forte": "Forte",
"Galerie ajoutée": "Galeria adicionada",
"Galerie effacée": "Galeria apagada",
"Légende": "Legenda",
"Légendes": "Legendas",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "mascarar",
"Mode plein écran automatique": "Modo completo automático",
"Opacité au survol": "Opacidade em Overflight",
"Options de configuration": "",
"Proportionnelle": "Proporcional",
"Supprimer cette galerie ?": "Remover esta galeria?",
"Tri des images": "Classificando imagens",
"Très Discrète": "Muito discreto",
"Très fine": "Muito bem",
"Très forte": "Muito forte",
"Très épaisse": "Muito espesso",
"Vignettes": "Vinhetas",
"Ajouter une galerie": "Adicionar uma galeria",
"Éditer une galerie": "Editar uma galeria",
"Effacer une galerie": "Apagar uma galeria",
"Options des galeries": "Opções de galerias",
"Thème des galeries": "Temas de galerias"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Sayfa içeriğini galeri ile görüntüle",
"Alignement du bouton de retour": "Geri düğmesi hizalaması",
"Alphabétique ": "Alfabetik",
"Alphabétique inverse": "Ters alfabetik",
"Au-dessus": "Üstünde",
"Aucune galerie": "Galeri Yok",
"Bordure": "Çerçeve",
"Configuration de la galerie %s ": "%s galeri yapılandırması",
"Configuration des galeries": "Galerilerin yapılandırması",
"Couleur de la bordure": "Çerçeve rengi",
"Couverture": "Kapak",
"Discrète": "Silik",
"Distribué avec marges": "Kenar boşluklarıyla dağıtıldı",
"Distribué sans marge": "Marjsız dağıtıldı",
"Dossier cible": "Hedef klasör",
"En dessous": "Altında",
"Epaisse": "Kalın",
"Fine": "İnce",
"Forte": "Güçlü",
"Galerie ajoutée": "Galeri eklendi",
"Galerie effacée": "Galeri silindi",
"Légende": "Başlık",
"Légendes": "Başlıklar",
"Manuel": "Manuel",
"Marge": "Kenar boşluğu",
"Masqué": "Gizli",
"Mode plein écran automatique": "Otomatik tam ekran modu",
"Opacité au survol": "Hover opaklığı",
"Options de configuration": "Yapılandırma seçenekleri",
"Proportionnelle": "Orantılı",
"Supprimer cette galerie ?": "Bu galeri silinsin mi?",
"Tri des images": "Resimleri sıralama",
"Très Discrète": "Çok silik",
"Très fine": "Çok ince",
"Très forte": "Çok güçlü",
"Très épaisse": "Çok kalın",
"Vignettes": "Küçük resim",
"Ajouter une galerie": "Galeri Ekle",
"Éditer une galerie": "Galeri Düzenle",
"Effacer une galerie": "Galeri Sil",
"Options des galeries": "Galeri Seçenekleri",
"Thème des galeries": "Galeri Temaları"
}

View File

@ -0,0 +1,12 @@
<?php $moduleData['gallery'] = [
'add' => $this->getInput('profilAddGalleryAdd', helper::FILTER_BOOLEAN),
'edit' => $this->getInput('profilAddGalleryEdit', helper::FILTER_BOOLEAN),
'delete' => $this->getInput('profilAddGalleryDelete', helper::FILTER_BOOLEAN),
'option' => $this->getInput('profilAddGalleryOption', helper::FILTER_BOOLEAN),
'theme' => $this->getInput('profilAddGalleryTheme', helper::FILTER_BOOLEAN),
'config' => $this->getInput('profilAddGalleryAdd', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryEdit', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryDelete', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryOption', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryTheme', helper::FILTER_BOOLEAN)
];

View File

@ -0,0 +1,12 @@
<?php $moduleData['gallery'] = [
'add' => $this->getInput('profilEditGalleryAdd', helper::FILTER_BOOLEAN),
'edit' => $this->getInput('profilEditGalleryEdit', helper::FILTER_BOOLEAN),
'delete' => $this->getInput('profilEditGalleryDelete', helper::FILTER_BOOLEAN),
'option' => $this->getInput('profilEditGalleryOption', helper::FILTER_BOOLEAN),
'theme' => $this->getInput('profilEditGalleryTheme', helper::FILTER_BOOLEAN),
'config' => $this->getInput('profilEditGalleryAdd', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryEdit', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryDelete', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryOption', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryTheme', helper::FILTER_BOOLEAN)
];

View File

@ -0,0 +1,28 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo sprintf('%s %s', helper::translate('Permissions'), helper::translate('Galerie')); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('profilAddGalleryAdd', true, 'Ajouter une galerie'); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilAddGalleryEdit', true, 'Éditer une galerie'); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilAddGalleryDelete', true, 'Effacer une galerie'); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('profilAddGalleryOption', true, 'Options des galeries'); ?>
</div>
<div class="col6">
<?php echo template::checkbox('profilAddGalleryTheme', true, 'Thème des galeries'); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,38 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo sprintf('%s %s', helper::translate('Permissions'), helper::translate('Galerie')); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('profilEditGalleryAdd', true, 'Ajouter une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'add'])
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilEditGalleryEdit', true, 'Éditer une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'edit'])
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilEditGalleryDelete', true, 'Effacer une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'delete'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('profilEditGalleryOption', true, 'Options des galeries', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'option'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('profilEditGalleryTheme', true, 'Thème des galeries', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'theme'])
]); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,25 @@
<?php
class theme extends gallery {
public static $defaultTheme = [
'thumbAlign' => 'center',
'thumbWidth' => '18em',
'thumbHeight' => '15em',
'thumbMargin' => '.5em',
'thumbBorder' => '.1em',
'thumbOpacity' => '.7',
'thumbBorderColor' => 'rgba(221, 221, 221, 1)',
'thumbRadius' => '.3em',
'thumbShadows' => '1px 1px 10px',
'thumbShadowsColor' => 'rgba(125, 125, 125, 1)',
'legendHeight' => '.375em',
'legendAlign' => 'center',
'legendTextColor' => 'rgba(255, 255, 255, 1)',
'legendBgColor' => 'rgba(0, 0, 0, .6)'
];
public static $defaultData = [
"showUniqueGallery" => false,
"backPosition" => "top",
"backAlign" => "center",
'versionData' => '3.0'
];
}

View File

@ -0,0 +1,52 @@
.galleryPicture,
.galleryGalleryPicture {
display: block;
border: var(--thumbBorder) solid var(--thumbBorderColor);
height: var(--thumbHeight);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
position: relative;
-webkit-transition: opacity .3s ease-out;
transition: opacity .3s ease-out;
border-radius: var(--thumbRadius);
box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
-webkit-box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
-moz-box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
}
.galleryPicture:hover,
.galleryGalleryPicture:hover {
opacity: var(--thumbOpacity);
}
.galleryName,
.galleryGalleryName {
position: absolute;
left: 0;
right: 0;
bottom: 0;
border-radius: 0 0 calc(var(--thumbRadius)/2) calc(var(--thumbRadius)/2);
padding: var(--legendHeight);
background: var(--legendBgColor);
color: var(--legendTextColor);
text-align: var(--legendAlign);
}
.galleryRow {
display: flex;
flex-wrap: wrap;
justify-content: var(--thumbAlign);
}
.colPicture {
width : var(--thumbWidth);
max-width: 50%;
padding: var(--thumbMargin);
}
@media (max-width: 432px) {
.colPicture {
width: 90%;
max-width: 90%;
margin: 0.5em;
}
}

View File

@ -0,0 +1,27 @@
.galleryRow {
--thumbAlign: #thumbAlign#;
}
.colPicture {
--thumbWidth: #thumbWidth#;
--thumbMargin: #thumbMargin#;
}
.galleryPicture,
.galleryGalleryPicture {
--thumbHeight: #thumbHeight#;
--thumbBorder: #thumbBorder#;
--thumbBorderColor: #thumbBorderColor#;
--thumbRadius: #thumbRadius#;
--thumbShadows: #thumbShadows#;
--thumbShadowsColor: #thumbShadowsColor#;
}
.galleryName,
.galleryGalleryName {
--legendHeight: #legendHeight#;
--legendAlign: #legendAlign#;
--legendTextColor: #legendTextColor#;
--legendBgColor: #legendBgColor#;
}
.galleryPicture:hover,
.galleryGalleryPicture:hover {
--thumbOpacity: #thumbOpacity#;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

4
geogallery/vendor/leaflet/inc.json vendored Normal file
View File

@ -0,0 +1,4 @@
[
"leaflet.js",
"leaflet.css"
]

661
geogallery/vendor/leaflet/leaflet.css vendored Normal file
View File

@ -0,0 +1,661 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg {
max-width: none !important;
max-height: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
width: auto;
padding: 0;
}
.leaflet-container img.leaflet-tile {
/* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
mix-blend-mode: plus-lighter;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline-offset: 1px;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
font-size: 12px;
font-size: 0.75rem;
line-height: 1.5;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(images/layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
font-size: 13px;
font-size: 1.08333em;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
background-image: url(images/marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.8);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
line-height: 1.4;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
text-decoration: underline;
}
.leaflet-attribution-flag {
display: inline !important;
vertical-align: baseline !important;
width: 1em;
height: 0.6669em;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
white-space: nowrap;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: rgba(255, 255, 255, 0.8);
text-shadow: 1px 1px #fff;
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 24px 13px 20px;
line-height: 1.3;
font-size: 13px;
font-size: 1.08333em;
min-height: 1px;
}
.leaflet-popup-content p {
margin: 17px 0;
margin: 1.3em 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-top: -1px;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
pointer-events: auto;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
border: none;
text-align: center;
width: 24px;
height: 24px;
font: 16px/24px Tahoma, Verdana, sans-serif;
color: #757575;
text-decoration: none;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
color: #585858;
}
.leaflet-popup-scrolled {
overflow: auto;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
-ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-interactive {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}
/* Printing */
@media print {
/* Prevent printers from removing background-images of controls. */
.leaflet-control {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}

6
geogallery/vendor/leaflet/leaflet.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,19 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,53 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/**
* Liste des dossiers
*/
var oldResult = [];
var directoryDOM = $("#galleryAddDirectory");
var directoryOldDOM = $("#galleryAddDirectoryOld");
function dirs() {
$.ajax({
type: "POST",
url: "<?php echo helper::baseUrl() . $this->getUrl(0); ?>/dirs",
success: function(result) {
if($(result).not(oldResult).length !== 0 || $(oldResult).not(result).length !== 0) {
directoryDOM.empty();
for(var i = 0; i < result.length; i++) {
directoryDOM.append(function(i) {
var option = $("<option>").val(result[i]).text(result[i]);
if(directoryOldDOM.val() === result[i]) {
option.prop("selected", true);
}
return option;
}(i))
}
oldResult = result;
}
}
});
}
dirs();
// Actualise la liste des dossiers toutes les trois secondes
setInterval(function() {
dirs();
}, 3000);
/**
* Stock le dossier choisi pour le re-sélectionner en cas d'actualisation ajax de la liste des dossiers
*/
directoryDOM.on("change", function() {
directoryOldDOM.val($(this).val());
});

View File

@ -0,0 +1,39 @@
<?php echo template::formOpen('galleryAddForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('galleryAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config' ,
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('galleryAddSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres');?></h4>
<div class="row">
<div class="col6">
<?php echo template::text('galleryAddName', [
'label' => 'Nom'
]); ?>
</div>
<div class="col6">
<div class="displayNone">
<?php echo template::hidden('galleryAddDirectoryOld', [
'noDirty' => true // Désactivé à cause des modifications en ajax
]); ?>
</div>
<?php echo template::select('galleryAddDirectory', [], [
'label' => 'Dossier cible',
'noDirty' => true // Désactivé à cause des modifications en ajax
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,24 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.galleryConfigError {
color: #F3674A;
font-weight: bold;
}

View File

@ -0,0 +1,40 @@
<?php echo template::formOpen('galleryConfigForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('galleryConfigBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),
'value' => template::ico('left')
]); ?>
</div>
<!--
<div class="col1 offset10">
<?php /* echo template::button('galleryConfigTheme', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/theme/',
'value' => template::ico('brush')
]); */?>
</div>
-->
<div class="col1 offset10">
<?php echo template::button('galleryAdd', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/add/',
'value' => template::ico('plus'),
'class' => 'buttonGreen'
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>
<div class="row">
<div class="col12">
<?php if($module::$galleries): ?>
<?php echo template::table([5, 5, 1, 1], $module::$galleries, ['Nom', 'Dossier cible', '', ''], ['id' => 'galleryTable'],$module::$galleriesId); ?>
<?php echo template::hidden('galleryConfigFilterResponse'); ?>
<?php else: ?>
<?php echo template::speech('Aucune galerie'); ?>
<?php endif; ?>
</div>
<div class="moduleVersion">Version
<?php echo $module::VERSION; ?>
</div>
</div>

View File

@ -0,0 +1,21 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.marker {
width: 15px;
}

View File

@ -0,0 +1,25 @@
<?php echo template::formOpen('galleryEditForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('galleryEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('galleryEditSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php if ($module::$pictures): ?>
<?php echo template::table([3, 4, 3, 1, 1], $module::$pictures, ['Image', 'Légende', 'Coordonnées', 'Position', 'Miniature'], ['id' => 'galleryTable'], $module::$picturesId); ?>
<?php else: ?>
<?php echo template::speech('Aucune image.'); ?>
<?php endif; ?>
</div>
<?php echo template::formClose(); ?>
<div class="moduleVersion">Version
<?php echo $module::VERSION; ?>
</div>

View File

@ -0,0 +1,47 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready(function () {
// Centrage de la carte et niveau de zoom
const jsonOptions = '<?php echo json_encode($module::$galleriesCenter); ?>';
const objOptions = JSON.parse(jsonOptions);
// Initialisation de la carte
var map = L.map('map').setView([objOptions.lat, objOptions.long], objOptions.zoom - 1);
// Ajouter une couche de tuiles OpenStreetMap
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
// Les données PHP converties en JSON pour JavaScript
const json = '<?php echo json_encode($module::$galleries); ?>';
const obj = JSON.parse(json);
// Ajouter les marqueurs à la carte
obj.forEach(function (location) {
var marker = L.marker([location.lat, location.long], {
title: location.label
});
marker.addTo(map);
marker.bindPopup('<p>' + location.label + '</p><a href="' + location.img + '" data-lity><img src="' + location.thumb + '" alt="Thumbnail" class="thumbnail"></a>', {
minWidth: 150,
maxWidth: 150,
minHeight: 150
});
});
});

View File

@ -0,0 +1,5 @@
<?php if ($module::$galleries): ?>
<div id="map"></div>
<?php else: ?>
<?php echo template::speech('Rien à afficher'); ?>
<?php endif; ?>

View File

@ -0,0 +1,18 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,21 @@
<?php echo template::formOpen('galleryThemeForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('galleryThemeBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('galleryThemeBack'); ?>
</div>
</div>
<?php echo template::formClose(); ?>
<div class="row">
<div class="col12">
<div class="moduleVersion">Version
<?php echo $module::VERSION; ?>
</div>
</div>
</div>

2
geolocation/changes.md Normal file
View File

@ -0,0 +1,2 @@
# Version 0.1
- GeoGallery est basé sur le module gallery 4.1

1
geolocation/enum.json Normal file
View File

@ -0,0 +1 @@
{"name":"geolocation","realName":"Géolocalisation","version":"0.8","update":"0.0","delete":true,"dataDirectory":"site\/data\/geolocation\/"}

399
geolocation/geolocation.php Normal file
View File

@ -0,0 +1,399 @@
<?php
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
class geolocation extends common
{
const VERSION = '0.8';
const REALNAME = 'Géolocalisation';
const DATADIRECTORY = self::DATA_DIR . 'geolocation/';
const SORT_ASC = 'SORT_ASC';
const SORT_DSC = 'SORT_DSC';
const SORT_HAND = 'SORT_HAND';
public static $locations = [];
public static $locationsId = [];
public static $locationsCenter = [];
public static $actions = [
'config' => self::GROUP_EDITOR,
'delete' => self::GROUP_EDITOR,
'dirs' => self::GROUP_EDITOR,
'add' => self::GROUP_EDITOR,
'edit' => self::GROUP_EDITOR,
'index' => self::GROUP_VISITOR
];
/**
* Mise à jour du module
* Appelée par les fonctions index et config
*/
private function update()
{
//$versionData = $this->getData(['module', $this->getUrl(0), 'config', 'versionData']);
}
/**
* Configuration
*/
public function config()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true
) {
$locations = $this->getData(['module', $this->getUrl(0), 'content']);
if (is_null($locations)) {
$this->setData(['module', $this->getUrl(0), 'content', []]);
} elseif (!empty($locations)) {
foreach ($locations as $locationId => $locationData) {
self::$locations[] = [
$locationData['name'],
$locationData['lat'],
$locationData['long'],
template::button('locationConfigEdit' . $locationId, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $locationId,
'value' => template::ico('pencil'),
'help' => 'Configuration'
]),
template::button('galleryConfigDelete' . $locationId, [
'class' => 'galleryConfigDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $locationId,
'value' => template::ico('trash'),
'help' => 'Supprimer'
])
];
}
}
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'title' => helper::translate('Configuration'),
'view' => 'config'
]);
}
/**
* Ajout d'une localisation
*/
public function add()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
if ($this->getInput('locationAddName', null, true)) {
$locationId = helper::increment($this->getInput('locationAddName', helper::FILTER_ID, true), (array) $this->getData(['module', $this->getUrl(0), 'content']));
// Description
$description = $this->getInput('locationAddDescription', helper::FILTER_STRING_SHORT, true);
// Protége les slashs pour la génération du JSON
$description = addslashes($description);
// Supprime les caractères de contrôle
$description = preg_replace('/[\x00-\x1F\x7F]/u', '', $description);
// Coordonnées
// makeFloat assure la compatibilité avec les versions de Zwii dont le helper n'a pas été actualisé
$lat = $this->makeFloat($this->getInput('locationAddLat', null, true));
$long = $this->makeFloat($this->getInput('locationAddLong', null, true));
// Enregistrement
$this->setData([
'module',
$this->getUrl(0),
'content',
$locationId,
[
'name' => $this->getInput('locationAddName', null, true),
'description' => $description,
'lat' => $lat,
'long' => $long,
]
]);
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Modifications enregistrées'),
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Nouvelle localisation'),
'view' => 'add',
'vendor' => [
'tinymce'
],
]);
}
/**
* Ajout d'une localisation
*/
public function edit()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
// Description
$description = $this->getInput('locationEditDescription', helper::FILTER_STRING_SHORT, true);
// Protége les slashs pour la génération du JSON
$description = addslashes($description);
// Supprime les caractères de contrôle
$description = preg_replace('/[\x00-\x1F\x7F]/u', '', $description);
// Coordonnées
//makeFloat assure la compatibilité avec les versions de Zwii dont le helper n'a pas été actualisé
$lat = $this->makeFloat($this->getInput('locationEditLat', null, true));
$long = $this->makeFloat($this->getInput('locationEditLong', null, true));
$this->setData([
'module',
$this->getUrl(0),
'content',
$this->getUrl(2),
[
'name' => $this->getInput('locationEditName', null, true),
'description' => $description,
'lat' => $lat,
'long' => $long,
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Nouvel localisation créé'),
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Edition'),
'view' => 'edit',
'vendor' => [
'tinymce'
],
]);
}
/**
* Suppression
*/
public function delete()
{
// La galerie n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]) === null
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Suppression
else {
$this->deleteData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Evenement effacé'),
'state' => true
]);
}
}
/**
* Accueil (deux affichages en un pour éviter une url à rallonge)
*/
public function index()
{
// Mise à jour des données de module
$this->update();
$locations = $this->getData(['module', $this->getUrl(0), 'content']);
// Initialise la feuille de style
if (empty($this->getData(['page', $this->getUrl(0), 'css']))) {
$this->initCss();
}
// Affichage du template si les données sont disponibles
if (is_null($locations)) {
$this->setData(['module', $this->getUrl(0), 'content', []]);
// Initialise la feuille de style
} elseif (!empty($locations)) {
// Lecture des données
foreach ($locations as $locationsId => $datas) {
self::$locations[] = $datas;
}
// Calcul du point central
// Calculer le centre géographique
$totalLat = 0;
$totalLong = 0;
$count = count(self::$locations);
foreach (self::$locations as $coordinate) {
$totalLat += $coordinate["lat"];
$totalLong += $coordinate["long"];
}
$centerLat = $totalLat / $count;
$centerLong = $totalLong / $count;
// Calculer la distance maximale au centre pour déterminer le niveau de zoom
$maxDistance = 0;
foreach (self::$locations as $coordinate) {
if (
is_numeric($centerLat)
&& is_numeric($centerLong)
&& $coordinate["lat"]
&& $coordinate["long"]
) {
$distance = $this->haversineGreatCircleDistance($centerLat, $centerLong, $coordinate["lat"], $coordinate["long"]);
if ($distance > $maxDistance) {
$maxDistance = $distance;
}
}
$zoomLevel = $this->getZoomLevel($maxDistance);
self::$locationsCenter = array(
'lat' => $centerLat,
'long' => $centerLong,
'zoom' => $zoomLevel
);
}
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'showPageContent' => true,
'view' => 'index',
'vendor' => [
'leaflet'
],
]);
}
// compatibilité avec les versio de Zwii < 13.3.05 dont le filtre FLOAT ne fonctionne pas
private function makeFloat($coordinate)
{
$coordinate = str_replace(',', '.', $coordinate); // Remplacer les virgules par des points
$coordinate = filter_var($coordinate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$coordinate = (float) $coordinate;
return $coordinate;
}
// Fonction pour convertir les coordonnées GPS au format décimal
private function gps_decimal($coordinate, $hemisphere)
{
// Extrait les degrés, minutes et secondes
$degrees = count($coordinate) > 0 ? $this->gps2Num($coordinate[0]) : 0;
$minutes = count($coordinate) > 1 ? $this->gps2Num($coordinate[1]) : 0;
$seconds = count($coordinate) > 2 ? $this->gps2Num($coordinate[2]) : 0;
// Convertit les degrés, minutes et secondes en décimal
$decimal = $degrees + ($minutes / 60) + ($seconds / 3600);
// Si l'hémisphère est au Sud ou à l'Ouest, les coordonnées sont négatives
$decimal *= ($hemisphere == 'S' || $hemisphere == 'W') ? -1 : 1;
return $decimal;
}
// Fonction pour convertir les coordonnées GPS en nombre
private function gps2Num($coordPart)
{
$parts = explode('/', $coordPart);
if (count($parts) <= 0)
return 0;
if (count($parts) == 1)
return $parts[0];
return floatval($parts[0]) / floatval($parts[1]);
}
// Fonction pour calculer la distance entre deux points géographiques
private function haversineGreatCircleDistance($latitudeFrom, $longitudeFrom, $latitudeTo, $longitudeTo, $earthRadius = 6371)
{
$latFrom = deg2rad($latitudeFrom);
$lonFrom = deg2rad($longitudeFrom);
$latTo = deg2rad($latitudeTo);
$lonTo = deg2rad($longitudeTo);
$latDelta = $latTo - $latFrom;
$lonDelta = $lonTo - $lonFrom;
$angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));
return $angle * $earthRadius;
}
// Déterminer le niveau de zoom
// Cette fonction est une approximation pour le calcul du zoom
private function getZoomLevel($maxDistance)
{
$maxZoom = 21; // Le zoom maximal pour Leaflet
$earthCircumference = 40075; // La circonférence de la Terre en km
for ($zoom = $maxZoom; $zoom >= 0; $zoom--) {
if ($maxDistance < ($earthCircumference / pow(2, $zoom))) {
return $zoom;
}
}
return 0;
}
// Page de module vide
private function initCss()
{
// Feuille de styles
$cssContent =
'#map {
height: 500px;
width: auto;
}
.leaflet-popup-content {
text-align: center;
}';
$this->setData(['page', $this->getUrl(0), 'css', $cssContent]);
}
}

44
geolocation/i18n/de.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Zeigen Sie den Inhalt der Seite mit der Galerie an",
"Alignement du bouton de retour": "Return -Taste -Ausrichtung",
"Alphabétique ": "Alphabetisch",
"Alphabétique inverse": "Alphabetik umgekehrt",
"Au-dessus": "Über",
"Aucune galerie": "Keine Galerie",
"Bordure": "Bordüre",
"Configuration de la galerie %s ": "Galeriekonfiguration %s",
"Configuration des galeries": "Die Konfiguration der Galer",
"Couleur de la bordure": "Randfarbe",
"Couverture": "Decke",
"Discrète": "Diskret",
"Distribué avec marges": "Verteilt",
"Distribué sans marge": "Ohne Rand verteilt",
"Dossier cible": "Zieldatei",
"En dessous": "Unter",
"Epaisse": "Dick",
"Fine": "Bußgeld",
"Forte": "Stärke",
"Galerie ajoutée": "Galerie hinzugefügt",
"Galerie effacée": "Gelobte Galerie",
"Légende": "Legende",
"Légendes": "Legenden",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Maske",
"Mode plein écran automatique": "Automatischer Vollmodus",
"Opacité au survol": "Opazität im Überflug",
"Options de configuration": "Optionen de Konfiguration",
"Proportionnelle": "Proportional",
"Supprimer cette galerie ?": "Diese Galerie entfernen?",
"Tri des images": "Bilder sortieren",
"Très Discrète": "Sehr diskret",
"Très fine": "Sehr gut",
"Très forte": "Sehr stark",
"Très épaisse": "Sehr dick",
"Vignettes": "Vignetten",
"Ajouter une galerie": "Eine Galerie hinzufügen",
"Éditer une galerie": "Eine Galerie bearbeiten",
"Effacer une galerie": "Eine Galerie löschen",
"Options des galeries": "Galerieoptionen",
"Thème des galeries": "Galeriethemen"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Show the content of the page with the gallery",
"Alignement du bouton de retour": "Return button alignment",
"Alphabétique ": "Alphabetical",
"Alphabétique inverse": "Reverse alphabetics",
"Au-dessus": "Above",
"Aucune galerie": "No gallery",
"Bordure": "Border",
"Configuration de la galerie %s ": "Gallery settings %s ",
"Configuration des galeries": "Galleries's settings",
"Couleur de la bordure": "Border color",
"Couverture": "Cover",
"Discrète": "Discreet",
"Distribué avec marges": "Distributed with margins",
"Distribué sans marge": "Distributed without margin",
"Dossier cible": "Target file",
"En dessous": "Below",
"Epaisse": "Thick",
"Fine": "Fine",
"Forte": "Forte",
"Galerie ajoutée": "Gallery added",
"Galerie effacée": "Erased gallery",
"Légende": "Caption",
"Légendes": "Legends",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Mask",
"Mode plein écran automatique": "Automatic full mode",
"Opacité au survol": "Opacity in overflight",
"Options de configuration": "Configuration options",
"Proportionnelle": "Proportional",
"Supprimer cette galerie ?": "Remove this gallery?",
"Tri des images": "Sorting images",
"Très Discrète": "Very discreet",
"Très fine": "Very fine",
"Très forte": "Very strong",
"Très épaisse": "Very thick",
"Vignettes": "Vignettes",
"Ajouter une galerie": "Add a gallery",
"Éditer une galerie": "Edit a gallery",
"Effacer une galerie": "Delete a gallery",
"Options des galeries": "Gallery options",
"Thème des galeries": "Gallery themes"
}

44
geolocation/i18n/es.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostrar contenido de página con galería",
"Alignement du bouton de retour": "Alineación del botón Atrás",
"Alphabétique ": "Alfabético",
"Alphabétique inverse": "Alfabético inverso",
"Au-dessus": "Encima",
"Aucune galerie": "Sin galería",
"Bordure": "Bordillo",
"Configuration de la galerie %s ": "Configuración de la galería %s ",
"Configuration des galeries": "Configuración de la galería",
"Couleur de la bordure": "Color del bordillo",
"Couverture": "Portada ",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuido con márgenes",
"Distribué sans marge": "Distribuido sin margen",
"Dossier cible": "Carpeta de destino",
"En dessous": "Debajo",
"Epaisse": "grueso",
"Fine": "Fino",
"Forte": "Fuerte",
"Galerie ajoutée": "Galería añadida",
"Galerie effacée": "Galería eliminada",
"Légende": "Pie",
"Légendes": "Leyendas",
"Manuel": "Manual",
"Marge": "Margen",
"Masqué": "Máscara",
"Mode plein écran automatique": "Modo automático de pantalla completa",
"Opacité au survol": "Opacidad de desplazamiento",
"Options de configuration": "Opciones de configuración",
"Proportionnelle": "Proporcional",
"Supprimer cette galerie ?": "¿Borrar esta galería?",
"Tri des images": "Ordenar imágenes",
"Très Discrète": "Muy discreto",
"Très fine": "Muy fino",
"Très forte": "Muy fuerte",
"Très épaisse": "Muy grueso",
"Vignettes": "Viñetas",
"Ajouter une galerie": "Agregar una galería",
"Éditer une galerie": "Editar una galería",
"Effacer une galerie": "Borrar una galería",
"Options des galeries": "Opciones de galerías",
"Thème des galeries": "Temas de galerías"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "",
"Alignement du bouton de retour": "",
"Alphabétique ": "",
"Alphabétique inverse": "",
"Au-dessus": "",
"Aucune galerie": "",
"Bordure": "",
"Configuration de la galerie %s ": "",
"Configuration des galeries": "",
"Couleur de la bordure": "",
"Couverture": "",
"Discrète": "",
"Distribué avec marges": "",
"Distribué sans marge": "",
"Dossier cible": "",
"En dessous": "",
"Epaisse": "",
"Fine": "",
"Forte": "",
"Galerie ajoutée": "",
"Galerie effacée": "",
"Légende": "",
"Légendes": "",
"Manuel": "",
"Marge": "",
"Masqué": "",
"Mode plein écran automatique": "",
"Opacité au survol": "",
"Options de configuration": "",
"Proportionnelle": "",
"Supprimer cette galerie ?": "",
"Tri des images": "",
"Très Discrète": "",
"Très fine": "",
"Très forte": "",
"Très épaisse": "",
"Vignettes": "",
"Ajouter une galerie": "",
"Éditer une galerie": "",
"Effacer une galerie": "",
"Options des galeries": "",
"Thème des galeries": ""
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Εμφάνιση περιεχομένου σελίδας με γκαλερί",
"Alignement du bouton de retour": "Ευθυγράμμιση κουμπιού πίσω",
"Alphabétique ": "Αλφαβητική Ταξινόμηση",
"Alphabétique inverse": "Αντίστροφη αλφαβητική",
"Au-dessus": "Πάνω",
"Aucune galerie": "Δεν υπάρχει συλλογή εικόνων",
"Bordure": "κάδρο γύρω",
"Configuration de la galerie %s ": "Διαμόρφωση της γκαλερί %s ",
"Configuration des galeries": "Διαμόρφωση γκαλερί",
"Couleur de la bordure": "Χρώμα γραμμής",
"Couverture": "Κάλυψη ",
"Discrète": "διακριτικό",
"Distribué avec marges": "Διανομή με περιθώρια",
"Distribué sans marge": "Διανομή χωρίς περιθώριο",
"Dossier cible": "Φάκελος στόχος",
"En dessous": "Κάτω",
"Epaisse": "Παχιά γραμμή",
"Fine": "Λεπτή γραμμή ",
"Forte": "Ισχυρή αδιαφάνεια",
"Galerie ajoutée": "Προστέθηκε γκαλερί",
"Galerie effacée": "Γκαλερί διαγράφηκε",
"Légende": "Λεζάντα εικόνας",
"Légendes": "",
"Manuel": "Χειροκίνητη ",
"Marge": "Περιθώριο",
"Masqué": "κρυμμένο",
"Mode plein écran automatique": "Αυτόματη λειτουργία πλήρους οθόνης",
"Opacité au survol": "Αδιαφάνεια στο mouse-over",
"Options de configuration": "Επιλογές διαμόρφωσης",
"Proportionnelle": "Αναλογική",
"Supprimer cette galerie ?": "",
"Tri des images": "Ταξινόμηση εικόνων",
"Très Discrète": "Πολύ διακριτικό",
"Très fine": "Πολύ λεπτή γραμμή ",
"Très forte": "Πολύ Ισχυρή αδιαφάνεια",
"Très épaisse": "πολύ παχιά γραμμή",
"Vignettes": "",
"Ajouter une galerie": "Προσθήκη συλλογής",
"Éditer une galerie": "Επεξεργασία συλλογής",
"Effacer une galerie": "Διαγραφή συλλογής",
"Options des galeries": "Επιλογές συλλογών",
"Thème des galeries": "Θέματα συλλογών"
}

44
geolocation/i18n/it.json Normal file
View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostra il contenuto della pagina con la galleria",
"Alignement du bouton de retour": "Allineamento del pulsante di ritorno",
"Alphabétique ": "Alfabetico",
"Alphabétique inverse": "Alfabetico inverso",
"Au-dessus": "Al di sopra",
"Aucune galerie": "Nessuna galleria",
"Bordure": "Bordo",
"Configuration de la galerie %s ": "Configurazione della galleria %s ",
"Configuration des galeries": "Configurazione di Galler",
"Couleur de la bordure": "Colore del bordo",
"Couverture": "Copertina",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuito con margini",
"Distribué sans marge": "Distribuito senza margine",
"Dossier cible": "File di destinazione",
"En dessous": "Qui di seguito",
"Epaisse": "Spesso",
"Fine": "Bene",
"Forte": "Forte",
"Galerie ajoutée": "Galleria aggiunta",
"Galerie effacée": "Galleria cancellata",
"Légende": "Didascalia",
"Légendes": "Leggende",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "Maschera",
"Mode plein écran automatique": "Modalità completa automatica",
"Opacité au survol": "Opacità in luce eccessiva",
"Options de configuration": "Opzioni di configurazione",
"Proportionnelle": "Proporzionale",
"Supprimer cette galerie ?": "Rimuovere questa galleria?",
"Tri des images": "Ordinamento delle immagini",
"Très Discrète": "Molto discreto",
"Très fine": "Molto bene",
"Très forte": "Molto forte",
"Très épaisse": "Molto spesso",
"Vignettes": "Vignette",
"Ajouter une galerie": "Aggiungi una galleria",
"Éditer une galerie": "Modifica una galleria",
"Effacer une galerie": "Cancella una galleria",
"Options des galeries": "Opzioni delle gallerie",
"Thème des galeries": "Temi delle gallerie"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Mostre o conteúdo da página com a galeria",
"Alignement du bouton de retour": "Retornar alinhamento do botão",
"Alphabétique ": "Alfabético",
"Alphabétique inverse": "Alfabético reverso",
"Au-dessus": "Acima de",
"Aucune galerie": "Sem galeria",
"Bordure": "Fronteira",
"Configuration de la galerie %s ": "Configuração da galeria %s ",
"Configuration des galeries": "Configuração de Galler",
"Couleur de la bordure": "Cor da borda",
"Couverture": "Capa",
"Discrète": "Discreto",
"Distribué avec marges": "Distribuído com margens",
"Distribué sans marge": "Distribuído sem margem",
"Dossier cible": "Arquivo de destino",
"En dessous": "Abaixo de",
"Epaisse": "Espesso",
"Fine": "Multar",
"Forte": "Forte",
"Galerie ajoutée": "Galeria adicionada",
"Galerie effacée": "Galeria apagada",
"Légende": "Legenda",
"Légendes": "Legendas",
"Manuel": "Manuel",
"Marge": "Marge",
"Masqué": "mascarar",
"Mode plein écran automatique": "Modo completo automático",
"Opacité au survol": "Opacidade em Overflight",
"Options de configuration": "",
"Proportionnelle": "Proporcional",
"Supprimer cette galerie ?": "Remover esta galeria?",
"Tri des images": "Classificando imagens",
"Très Discrète": "Muito discreto",
"Très fine": "Muito bem",
"Très forte": "Muito forte",
"Très épaisse": "Muito espesso",
"Vignettes": "Vinhetas",
"Ajouter une galerie": "Adicionar uma galeria",
"Éditer une galerie": "Editar uma galeria",
"Effacer une galerie": "Apagar uma galeria",
"Options des galeries": "Opções de galerias",
"Thème des galeries": "Temas de galerias"
}

View File

@ -0,0 +1,44 @@
{
"Afficher le contenu de la page avec la galerie": "Sayfa içeriğini galeri ile görüntüle",
"Alignement du bouton de retour": "Geri düğmesi hizalaması",
"Alphabétique ": "Alfabetik",
"Alphabétique inverse": "Ters alfabetik",
"Au-dessus": "Üstünde",
"Aucune galerie": "Galeri Yok",
"Bordure": "Çerçeve",
"Configuration de la galerie %s ": "%s galeri yapılandırması",
"Configuration des galeries": "Galerilerin yapılandırması",
"Couleur de la bordure": "Çerçeve rengi",
"Couverture": "Kapak",
"Discrète": "Silik",
"Distribué avec marges": "Kenar boşluklarıyla dağıtıldı",
"Distribué sans marge": "Marjsız dağıtıldı",
"Dossier cible": "Hedef klasör",
"En dessous": "Altında",
"Epaisse": "Kalın",
"Fine": "İnce",
"Forte": "Güçlü",
"Galerie ajoutée": "Galeri eklendi",
"Galerie effacée": "Galeri silindi",
"Légende": "Başlık",
"Légendes": "Başlıklar",
"Manuel": "Manuel",
"Marge": "Kenar boşluğu",
"Masqué": "Gizli",
"Mode plein écran automatique": "Otomatik tam ekran modu",
"Opacité au survol": "Hover opaklığı",
"Options de configuration": "Yapılandırma seçenekleri",
"Proportionnelle": "Orantılı",
"Supprimer cette galerie ?": "Bu galeri silinsin mi?",
"Tri des images": "Resimleri sıralama",
"Très Discrète": "Çok silik",
"Très fine": "Çok ince",
"Très forte": "Çok güçlü",
"Très épaisse": "Çok kalın",
"Vignettes": "Küçük resim",
"Ajouter une galerie": "Galeri Ekle",
"Éditer une galerie": "Galeri Düzenle",
"Effacer une galerie": "Galeri Sil",
"Options des galeries": "Galeri Seçenekleri",
"Thème des galeries": "Galeri Temaları"
}

View File

@ -0,0 +1,12 @@
<?php $moduleData['gallery'] = [
'add' => $this->getInput('profilAddGalleryAdd', helper::FILTER_BOOLEAN),
'edit' => $this->getInput('profilAddGalleryEdit', helper::FILTER_BOOLEAN),
'delete' => $this->getInput('profilAddGalleryDelete', helper::FILTER_BOOLEAN),
'option' => $this->getInput('profilAddGalleryOption', helper::FILTER_BOOLEAN),
'theme' => $this->getInput('profilAddGalleryTheme', helper::FILTER_BOOLEAN),
'config' => $this->getInput('profilAddGalleryAdd', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryEdit', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryDelete', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryOption', helper::FILTER_BOOLEAN) ||
$this->getInput('profilAddGalleryTheme', helper::FILTER_BOOLEAN)
];

View File

@ -0,0 +1,12 @@
<?php $moduleData['gallery'] = [
'add' => $this->getInput('profilEditGalleryAdd', helper::FILTER_BOOLEAN),
'edit' => $this->getInput('profilEditGalleryEdit', helper::FILTER_BOOLEAN),
'delete' => $this->getInput('profilEditGalleryDelete', helper::FILTER_BOOLEAN),
'option' => $this->getInput('profilEditGalleryOption', helper::FILTER_BOOLEAN),
'theme' => $this->getInput('profilEditGalleryTheme', helper::FILTER_BOOLEAN),
'config' => $this->getInput('profilEditGalleryAdd', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryEdit', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryDelete', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryOption', helper::FILTER_BOOLEAN) ||
$this->getInput('profilEditGalleryTheme', helper::FILTER_BOOLEAN)
];

View File

@ -0,0 +1,28 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo sprintf('%s %s', helper::translate('Permissions'), helper::translate('Galerie')); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('profilAddGalleryAdd', true, 'Ajouter une galerie'); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilAddGalleryEdit', true, 'Éditer une galerie'); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilAddGalleryDelete', true, 'Effacer une galerie'); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('profilAddGalleryOption', true, 'Options des galeries'); ?>
</div>
<div class="col6">
<?php echo template::checkbox('profilAddGalleryTheme', true, 'Thème des galeries'); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,38 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo sprintf('%s %s', helper::translate('Permissions'), helper::translate('Galerie')); ?>
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('profilEditGalleryAdd', true, 'Ajouter une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'add'])
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilEditGalleryEdit', true, 'Éditer une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'edit'])
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('profilEditGalleryDelete', true, 'Effacer une galerie', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'delete'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('profilEditGalleryOption', true, 'Options des galeries', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'option'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('profilEditGalleryTheme', true, 'Thème des galeries', [
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'gallery', 'theme'])
]); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,25 @@
<?php
class theme extends gallery {
public static $defaultTheme = [
'thumbAlign' => 'center',
'thumbWidth' => '18em',
'thumbHeight' => '15em',
'thumbMargin' => '.5em',
'thumbBorder' => '.1em',
'thumbOpacity' => '.7',
'thumbBorderColor' => 'rgba(221, 221, 221, 1)',
'thumbRadius' => '.3em',
'thumbShadows' => '1px 1px 10px',
'thumbShadowsColor' => 'rgba(125, 125, 125, 1)',
'legendHeight' => '.375em',
'legendAlign' => 'center',
'legendTextColor' => 'rgba(255, 255, 255, 1)',
'legendBgColor' => 'rgba(0, 0, 0, .6)'
];
public static $defaultData = [
"showUniqueGallery" => false,
"backPosition" => "top",
"backAlign" => "center",
'versionData' => '3.0'
];
}

View File

@ -0,0 +1,52 @@
.galleryPicture,
.galleryGalleryPicture {
display: block;
border: var(--thumbBorder) solid var(--thumbBorderColor);
height: var(--thumbHeight);
background-size: cover;
background-repeat: no-repeat;
background-position: center;
position: relative;
-webkit-transition: opacity .3s ease-out;
transition: opacity .3s ease-out;
border-radius: var(--thumbRadius);
box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
-webkit-box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
-moz-box-shadow: var(--thumbShadows) var(--thumbShadowsColor);
}
.galleryPicture:hover,
.galleryGalleryPicture:hover {
opacity: var(--thumbOpacity);
}
.galleryName,
.galleryGalleryName {
position: absolute;
left: 0;
right: 0;
bottom: 0;
border-radius: 0 0 calc(var(--thumbRadius)/2) calc(var(--thumbRadius)/2);
padding: var(--legendHeight);
background: var(--legendBgColor);
color: var(--legendTextColor);
text-align: var(--legendAlign);
}
.galleryRow {
display: flex;
flex-wrap: wrap;
justify-content: var(--thumbAlign);
}
.colPicture {
width : var(--thumbWidth);
max-width: 50%;
padding: var(--thumbMargin);
}
@media (max-width: 432px) {
.colPicture {
width: 90%;
max-width: 90%;
margin: 0.5em;
}
}

View File

@ -0,0 +1,27 @@
.galleryRow {
--thumbAlign: #thumbAlign#;
}
.colPicture {
--thumbWidth: #thumbWidth#;
--thumbMargin: #thumbMargin#;
}
.galleryPicture,
.galleryGalleryPicture {
--thumbHeight: #thumbHeight#;
--thumbBorder: #thumbBorder#;
--thumbBorderColor: #thumbBorderColor#;
--thumbRadius: #thumbRadius#;
--thumbShadows: #thumbShadows#;
--thumbShadowsColor: #thumbShadowsColor#;
}
.galleryName,
.galleryGalleryName {
--legendHeight: #legendHeight#;
--legendAlign: #legendAlign#;
--legendTextColor: #legendTextColor#;
--legendBgColor: #legendBgColor#;
}
.galleryPicture:hover,
.galleryGalleryPicture:hover {
--thumbOpacity: #thumbOpacity#;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

4
geolocation/vendor/leaflet/inc.json vendored Normal file
View File

@ -0,0 +1,4 @@
[
"leaflet.js",
"leaflet.css"
]

661
geolocation/vendor/leaflet/leaflet.css vendored Normal file
View File

@ -0,0 +1,661 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg {
max-width: none !important;
max-height: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
width: auto;
padding: 0;
}
.leaflet-container img.leaflet-tile {
/* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
mix-blend-mode: plus-lighter;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline-offset: 1px;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
font-size: 12px;
font-size: 0.75rem;
line-height: 1.5;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(images/layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
font-size: 13px;
font-size: 1.08333em;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
background-image: url(images/marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.8);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
line-height: 1.4;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
text-decoration: underline;
}
.leaflet-attribution-flag {
display: inline !important;
vertical-align: baseline !important;
width: 1em;
height: 0.6669em;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
white-space: nowrap;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: rgba(255, 255, 255, 0.8);
text-shadow: 1px 1px #fff;
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 24px 13px 20px;
line-height: 1.3;
font-size: 13px;
font-size: 1.08333em;
min-height: 1px;
}
.leaflet-popup-content p {
margin: 17px 0;
margin: 1.3em 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-top: -1px;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
pointer-events: auto;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
border: none;
text-align: center;
width: 24px;
height: 24px;
font: 16px/24px Tahoma, Verdana, sans-serif;
color: #757575;
text-decoration: none;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
color: #585858;
}
.leaflet-popup-scrolled {
overflow: auto;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
-ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-interactive {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}
/* Printing */
@media print {
/* Prevent printers from removing background-images of controls. */
.leaflet-control {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}

6
geolocation/vendor/leaflet/leaflet.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,19 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,51 @@
<?php echo template::formOpen('locationAddForm'); ?>
<div class="row">
<div class="col1">
<?php echo template::button('locationAddBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left')
]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('locationAddSubmit'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres'); ?></h4>
<div class="row">
<div class="col12">
<?php echo template::text('locationAddName', [
'label' => 'Nom'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('locationAddLat', [
'label' => 'Latitude',
'help' => 'Coordonnée décimale'
]); ?>
</div>
<div class="col6">
<?php echo template::text('locationAddLong', [
'label' => 'Longitude',
'help' => 'Coordonnée décimale'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('locationAddDescription', [
'label' => 'Description',
'class' => 'editorWysiwyg'
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,24 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.galleryConfigError {
color: #F3674A;
font-weight: bold;
}

Some files were not shown because too many files have changed in this diff Show More