First
@ -1,2 +1,5 @@
|
||||
# schedule
|
||||
|
||||
DokuWiki Extensions : https://www.dokuwiki.org/plugin:schedule
|
||||
|
||||
Event management for multi-organization.
|
||||
|
29
action.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
*/
|
||||
|
||||
if (!defined ('DOKU_INC'))
|
||||
die ();
|
||||
if (!defined ('DOKU_PLUGIN'))
|
||||
define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
|
||||
require_once (DOKU_PLUGIN.'action.php');
|
||||
|
||||
class action_plugin_schedule extends DokuWiki_Action_Plugin {
|
||||
|
||||
// ============================================================
|
||||
function register (Doku_Event_Handler $controller) {
|
||||
$controller->register_hook ('DOKUWIKI_STARTED', 'AFTER', $this, '_defconf');
|
||||
}
|
||||
function _defconf (&$event, $param) {
|
||||
global $JSINFO;
|
||||
$JSINFO ['schedule']['useMap'] = $this->getConf ('useMap');
|
||||
$JSINFO ['schedule']['defaultCenter'] = json_decode ($this->getConf ('defaultCenter'), true);
|
||||
$JSINFO ['schedule']['defaultZoom'] = json_decode ($this->getConf ('defaultZoom'), true);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
}
|
57
ajax.php
Normal file
@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
|
||||
$df_ : 31/12/2000
|
||||
$ds_ : 20001231
|
||||
$dn_ : 978217200
|
||||
$dt_ : array ("Y" => 2000, "m" => 12, "d" => "31)
|
||||
*/
|
||||
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/');
|
||||
global $conf;
|
||||
require_once (DOKU_INC.'inc/init.php');
|
||||
if (!$conf['lang'])
|
||||
$conf['lang'] = 'fr';
|
||||
require_once (DOKU_INC.'inc/common.php');
|
||||
require_once (DOKU_INC.'inc/auth.php');
|
||||
|
||||
// ============================================================
|
||||
if (isset ($_SERVER['REMOTE_USER']))
|
||||
$INFO['userinfo'] = $auth->getUserData ($auth->cleanUser ($_SERVER['REMOTE_USER']));
|
||||
$schdplug =& plugin_load ('syntax', 'schedule_block');
|
||||
$scheduleRoot = new scheduleRoot ($schdplug);
|
||||
ob_start ();
|
||||
switch ($_REQUEST ['schd']['action']) {
|
||||
// schedule Table
|
||||
case 'changeDate':
|
||||
global $conf;
|
||||
$dn_showDay = mktime (0, 0, 0, date ("n"), date ("j"), date("Y"));
|
||||
$ds_showDay = trim ($scheduleRoot->df2ds ($_REQUEST['schd']['date']));
|
||||
if (preg_match ("#(?<Y>[0-9][0-9][0-9][0-9])(?<m>[0-9][0-9])(?<d>[0-9][0-9])#", $ds_showDay, $dt_showDay))
|
||||
$dn_showDay = mktime (0, 0, 0, $dt_showDay["m"], $dt_showDay["d"], $dt_showDay["Y"]);
|
||||
$schedules = new schedules ($scheduleRoot, $_REQUEST['schd']['ns']);
|
||||
$schedules->load ();
|
||||
$schedules->printScheduleCalendar ($_REQUEST['schd']['mapId'], $dn_showDay);
|
||||
break;
|
||||
|
||||
// schedule Root Admin
|
||||
case 'moveSchedules':
|
||||
$scheduleRoot->manageAction ($_REQUEST['schd']);
|
||||
$scheduleRoot->printForm ();
|
||||
break;
|
||||
|
||||
default :
|
||||
ptnl ('No Ajax Function !');
|
||||
}
|
||||
$text = ob_get_contents ();
|
||||
ob_end_clean ();
|
||||
foreach ($scheduleRoot->message as $type => $msg)
|
||||
$text = '<div class="'.$type.'">'.$msg.'</div>'.$text;
|
||||
ptln ($text);
|
||||
|
||||
// ============================================================
|
32
ajaxClearCache.php
Normal file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
|
||||
*/
|
||||
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/');
|
||||
require_once (DOKU_INC.'inc/init.php');
|
||||
require_once (DOKU_INC.'inc/common.php');
|
||||
require_once (DOKU_INC.'inc/auth.php');
|
||||
|
||||
// ============================================================
|
||||
if (isset ($_SERVER['REMOTE_USER']))
|
||||
$INFO['userinfo'] = $auth->getUserData ($auth->cleanUser ($_SERVER['REMOTE_USER']));
|
||||
$schdplug =& plugin_load ('syntax', 'schedule_block');
|
||||
$scheduleRoot = new scheduleRoot ($schdplug);
|
||||
|
||||
switch ($_REQUEST ['schedule']['action']) {
|
||||
case 'clear':
|
||||
$schedules = new schedules ($scheduleRoot, $_REQUEST ['schedule']['ns']);
|
||||
$schedules->clearCache ();
|
||||
break;
|
||||
case 'clearAll':
|
||||
$scheduleRoot->clearCache ();
|
||||
break;
|
||||
}
|
||||
|
||||
// ============================================================
|
45
ajaxPOI.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
|
||||
*/
|
||||
|
||||
// faire un XML
|
||||
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/');
|
||||
require_once (DOKU_INC.'inc/init.php');
|
||||
require_once (DOKU_INC.'inc/common.php');
|
||||
require_once (DOKU_INC.'inc/auth.php');
|
||||
require_once (realpath (dirname (__FILE__)).'/poiDB.class.php');
|
||||
|
||||
// ============================================================
|
||||
if (isset ($_SERVER['REMOTE_USER']))
|
||||
$INFO['userinfo'] = $auth->getUserData ($auth->cleanUser ($_SERVER['REMOTE_USER']));
|
||||
$schdplug =& plugin_load ('syntax', 'schedule_block');
|
||||
$isAdmin =
|
||||
isset ($INFO ['userinfo']) &&
|
||||
isset ($INFO ['userinfo']['grps']) &&
|
||||
in_array (trim ($schdplug->getConf ('adminGroup')), $INFO ['userinfo']['grps']);
|
||||
|
||||
$poiDB = new poiDB ($schdplug);
|
||||
if ('list' == $_REQUEST ['action'])
|
||||
echo json_encode ($poiDB->getInsee ($_REQUEST['insee']));
|
||||
elseif ($isAdmin) {
|
||||
switch ($_REQUEST ['action']) {
|
||||
case 'add':
|
||||
$poiDB->addLine ($_REQUEST ['line']);
|
||||
break;
|
||||
case 'remove':
|
||||
$poiDB->removeLine ($_REQUEST ['line']);
|
||||
break;
|
||||
default:
|
||||
die ('No Ajax Function !');
|
||||
}
|
||||
} else
|
||||
die ("No Ajax Function !");
|
||||
|
||||
// ============================================================
|
27
conf/default.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Options for the Schedule Plugin
|
||||
*/
|
||||
$conf['scheduleGroup'] = 'schedule';
|
||||
$conf['adminGroup'] = 'admin';
|
||||
$conf['dataDir'] = 'schedule';
|
||||
$conf['groupsDir'] = 'membres';
|
||||
$conf['noSchedule'] = '2010';
|
||||
$conf['scheduleDir'] = 'agenda';
|
||||
$conf['sharedDir'] = 'commun';
|
||||
$conf['scheduleWhat'] = 'A:Manifestation, Vote, Pétition, Action|B:Echange, Forum, Débat, Conférence, Projection, Exposition, Spectacle, Radio, TV, Pique-Nique|C:Assemblée Générale, Réunion, Mensuelle, Hebdomadaire';
|
||||
$conf['scheduleAudience'] = 'Ouvert à tous, Membres, Commission, Bureau';
|
||||
$conf['iconName'] = 'logo.png';
|
||||
$conf['iconWidth'] = 30;
|
||||
$conf['repeatPosition'] = 'isolated';
|
||||
$conf['bubblePosition'] = 'right';
|
||||
|
||||
$conf['useMap'] = 1;
|
||||
$conf['defaultCenter'] = "[47.95583, -2.54833]";
|
||||
$conf['defaultZoom'] = 14;
|
||||
$conf['migrate'] = 0;
|
||||
$conf['showOldValues'] = 0;
|
||||
?>
|
28
conf/metadata.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Metadata for configuration manager plugin
|
||||
* Additions for the schedule plugin
|
||||
*/
|
||||
$meta['scheduleGroup'] = array('string'); // who can use form
|
||||
$meta['adminGroup'] = array('string'); // who can admin data
|
||||
$meta['dataDir'] = array('string'); // root dir for XML files
|
||||
$meta['groupsDir'] = array('string'); // dir group in wiki pages to find group names
|
||||
$meta['noSchedule'] = array('string'); // forbiden name for group (ex skip annual archive dir)
|
||||
$meta['scheduleDir'] = array('string'); // dir in wiki pages for events (contains subdir for group name or the shared dir)
|
||||
$meta['sharedDir'] = array('string'); // dir for shared event in wiki pages
|
||||
$meta['scheduleWhat'] = array('string'); // type event list
|
||||
$meta['scheduleAudience'] = array('string'); // type audience list
|
||||
$meta['iconName'] = array('string'); // file name containing logo in group dir
|
||||
$meta['iconWidth'] = array('numeric'); // default logo width size
|
||||
$meta['repeatPosition'] = array('multichoice', '_choices' => array('grouped', 'isolated')); // does the repeated events are group on top of form
|
||||
$meta['bubblePosition'] = array('multichoice', '_choices' => array('left', 'right')); // tooltips position
|
||||
|
||||
$meta['useMap'] = array('onoff');
|
||||
$meta['defaultCenter'] = array('string');
|
||||
$meta['defaultZoom'] = array('numeric');
|
||||
$meta['migrate'] = array('onoff'); // XXX to remove ?
|
||||
$meta['showOldValues'] = array('onoff'); // XXX to remove ?
|
||||
?>
|
BIN
images/bul_a.png
Normal file
After Width: | Height: | Size: 1014 B |
BIN
images/bul_b.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
images/bul_c.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
images/calendar.png
Normal file
After Width: | Height: | Size: 549 B |
BIN
images/cat_a.png
Normal file
After Width: | Height: | Size: 159 B |
BIN
images/cat_ab.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
images/cat_abc.png
Normal file
After Width: | Height: | Size: 181 B |
BIN
images/cat_ac.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
images/cat_b.png
Normal file
After Width: | Height: | Size: 159 B |
BIN
images/cat_bc.png
Normal file
After Width: | Height: | Size: 169 B |
BIN
images/cat_c.png
Normal file
After Width: | Height: | Size: 159 B |
BIN
images/edit.png
Normal file
After Width: | Height: | Size: 668 B |
BIN
images/empty.png
Normal file
After Width: | Height: | Size: 166 B |
BIN
images/orange.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
images/poi.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
images/poiRed.png
Normal file
After Width: | Height: | Size: 6.3 KiB |
BIN
images/red.png
Normal file
After Width: | Height: | Size: 1014 B |
BIN
images/repeat.png
Normal file
After Width: | Height: | Size: 1003 B |
BIN
images/warning.png
Normal file
After Width: | Height: | Size: 514 B |
BIN
images/wizard.png
Normal file
After Width: | Height: | Size: 797 B |
121
lang/en/lang.php
Normal file
@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* English language file
|
||||
*/
|
||||
|
||||
// javascript
|
||||
$lang['js'] =
|
||||
array ('pleaseWait' => 'Connection to the server in progress ...');
|
||||
|
||||
// commands
|
||||
$lang['Valid'] = 'Valid';
|
||||
$lang['add'] = 'Add';
|
||||
$lang['clear'] = 'Clear cache';
|
||||
$lang['clearAll'] = 'Clear all cache';
|
||||
$lang['clearCache'] = 'Clear cache'; // XXX
|
||||
$lang['created'] = 'Created';
|
||||
$lang['modify'] = 'Modify';
|
||||
$lang['modifyAll'] = 'Modify All';
|
||||
$lang['prop'] = 'Suggest';
|
||||
$lang['remove'] = 'Remove';
|
||||
$lang['selected'] = 'Selected';
|
||||
$lang['show'] = 'Show';
|
||||
$lang['test'] = 'Test';
|
||||
|
||||
$lang['repeatType'] = array ('day' => 'days', 'week' => 'weeks', 'dayMonth' => 'months', 'dateMonth' => 'months', 'year' => 'years');
|
||||
|
||||
// placeholder
|
||||
$lang['titlePH'] = 'event title';
|
||||
$lang['leadPH'] = 'Lead paragraph / organisation team / context / ... (optional)';
|
||||
$lang['posterPH'] = 'http://... (optional)';
|
||||
$lang['paperPH'] = 'http://... (optional)';
|
||||
$lang['remarkPH'] = 'explanation / comments / remarks / ... (optional)';
|
||||
$lang['ratePH'] = 'x € / y € (optional)';
|
||||
$lang['cityPH'] = 'city (or INSEE code) +!!enter!!';
|
||||
$lang['addrPH'] = '1, rue de la Tannerie ~br~ 56 000 +!!enter!!';
|
||||
$lang['datePH'] = 'mm/dd/aa';
|
||||
$lang['hourPH'] = '--h-- (ex: 09h30-15h)';
|
||||
$lang['rootMoveDatePH'] = 'mm/dd/aa (move until this date)';
|
||||
|
||||
// messages
|
||||
$lang['days'] = array ('sunday' => 'S', 'monday' => 'M', 'tuesday' => 'T', 'wednesday' => 'W', 'friday' => 'F', 'thursday' => 'T', 'saturday' => 'S');
|
||||
$lang['enterTip'] = 'Press \'enter\' to update this field!';
|
||||
|
||||
$lang['who'] = 'Who';
|
||||
$lang['audience'] = 'Audience';
|
||||
$lang['shared'] = array ('', 'Shared');
|
||||
$lang['proposedBy'] = 'Proposed by';
|
||||
$lang['what'] = 'What';
|
||||
$lang['title'] = 'Title';
|
||||
$lang['lead'] = 'Lead paragraph';
|
||||
$lang['posterURL'] = 'Poster';
|
||||
$lang['paperURL'] = 'Paper';
|
||||
$lang['remark'] = 'Topic';
|
||||
$lang['rate'] = 'Rate';
|
||||
$lang['where'] = 'Where';
|
||||
$lang['city'] = 'Commune';
|
||||
$lang['addresse'] = 'Addresse';
|
||||
$lang['when'] = 'When';
|
||||
$lang['allDates'] = 'All dates';
|
||||
$lang['inverted'] = 'Inverted';
|
||||
$lang['noEvent'] = 'No event';
|
||||
$lang['validation'] = 'Validation';
|
||||
$lang['proposition'] = 'Proposition';
|
||||
$lang['reactiveMap'] = 'Interactive map!';
|
||||
$lang['toComplet'] = 'To complete';
|
||||
|
||||
$lang['audienceChoice'] = 'For whom ?';
|
||||
$lang['memberChoice'] = 'Proposed by ?';
|
||||
$lang['eventTypeChoice'] = 'What kind of event ?';
|
||||
|
||||
$lang['from'] = 'from';
|
||||
$lang['to'] = 'to';
|
||||
$lang['fromHour'] = 'from';
|
||||
$lang['toHour'] = 'to';
|
||||
$lang['at'] = 'at';
|
||||
$lang['all'] = 'all';
|
||||
$lang['each'] = 'each';
|
||||
|
||||
$lang['startError'] = "Validation couldn't be performed because:";
|
||||
$lang['noAudienceError'] = 'audience miss';
|
||||
$lang['noMemberError'] = 'member miss';
|
||||
$lang['noTypeError'] = 'event type miss';
|
||||
$lang['noWhereError'] = 'place miss';
|
||||
$lang['noTitleError'] = 'title miss';
|
||||
$lang['mktimeError'] = 'unsupported date (OVH server limitation is : 13 decembre 1901 < YYYY-mm-dd < 20 janvier 2038)';
|
||||
$lang['pastError'] = 'date out of bounds';
|
||||
$lang['pastToError'] = 'end date before start :-D';
|
||||
$lang['badDateError'] = 'inappropriate date';
|
||||
$lang['notMemberError'] = 'not member';
|
||||
|
||||
$lang['addEvent'] = 'Add an event';
|
||||
$lang['proposedEvent'] = 'Suggest an event';
|
||||
|
||||
$lang['propSuccess'] = "Votre proposition est enregistrée. Nous allons vérifier qu'elle est conforme à l'esprit du FSL avant de la mettre en ligne. Merci de votre contributon.";
|
||||
|
||||
$lang['notifySubject'] = '[Schedule] New proposal !';
|
||||
$lang['notifyContent'] = "A new proposal is done.\n\n";
|
||||
|
||||
// toolTip
|
||||
$lang['tipPrevM'] = 'Previous mounth';
|
||||
$lang['tipNextM'] = 'Next mounth';
|
||||
|
||||
// format
|
||||
$lang['dateFormat'] = 'mdY';
|
||||
// $lang['orderedFormat'] = function ($num) { // XXX pb OVH
|
||||
// if ($num < 1)
|
||||
// return $num;
|
||||
// switch ($num) {
|
||||
// case 1:
|
||||
// return '1st';
|
||||
// default:
|
||||
// return "{$num}th";
|
||||
// }
|
||||
// };
|
||||
|
||||
$lang['orderedFormat'] = array (1 => '1st', 2 => '2th', 3 => '3th', 4 => '4th', 5 => '5th', 6 => '6th', 7 => '7th', 8 => '8th', 9 => '9th', 10 => '10th', 11 => '11th', 12 => '12th', 13 => '13th', 14 => '14th', 15 => '15th', 16 => '16th', 17 => '17th', 18 => '18th', 19 => '19th', 20 => '20th', 21 => '21th', 22 => '22th', 23 => '23th', 24 => '24th', 25 => '25th', 26 => '26th', 27 => '27th', 28 => '28th', 29 => '29th', 30 => '30th', 31 => '31th');
|
||||
|
||||
?>
|
29
lang/en/settings.php
Normal file
@ -0,0 +1,29 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* English language file
|
||||
*/
|
||||
|
||||
// for the configuration manager
|
||||
$lang['scheduleGroup'] = 'in this group one can add event';
|
||||
$lang['adminGroup'] = 'admin group with all rights on events';
|
||||
$lang['dataDir'] = 'directory contains XML file per group';
|
||||
$lang['groupsDir'] = 'directory where group names could be find';
|
||||
$lang['noSchedule'] = 'forbiden group names';
|
||||
$lang['scheduleDir'] = 'wiki page for schedule (contains one dir per group)';
|
||||
$lang['sharedDir'] = 'directory for shared events';
|
||||
$lang['scheduleWhat'] = 'type of events per categrory (c1:w1,w2|c2:w3,w4|c3:w5,w6,w7)';
|
||||
$lang['scheduleAudience'] = 'type of public';
|
||||
$lang['iconName'] = 'logo name of the group which define an event (a1,a2,a3)';
|
||||
$lang['iconWidth'] = 'logo width of the group which define an event';
|
||||
$lang['repeatPosition'] = 'Repeat event position (grouped on top or isolated)';
|
||||
$lang['bubblePosition'] = 'tooltips position of calendar';
|
||||
|
||||
$lang['useMap'] = 'Display map';
|
||||
$lang['defaultCenter'] = "Empty map default localization (lat, lon)";
|
||||
$lang['defaultZoom'] = "Default zoom";
|
||||
$lang['migrate'] = 'Performe data migration';
|
||||
$lang['showOldValues'] = 'Highlight non migrate data';
|
||||
?>
|
121
lang/fr/lang.php
Normal file
@ -0,0 +1,121 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* French language file
|
||||
*/
|
||||
|
||||
// javascript
|
||||
$lang['js'] =
|
||||
array ('pleaseWait' => 'Connexion avec le serveur en cours ...');
|
||||
|
||||
// commands
|
||||
$lang['add'] = 'Ajouter';
|
||||
$lang['clear'] = 'Effacer le cache';
|
||||
$lang['clearAll'] = 'Effacer tout les caches';
|
||||
$lang['clearCache'] = 'Effacer le cache'; // XXX
|
||||
$lang['created'] = 'Créer';
|
||||
$lang['modify'] = 'Modifier';
|
||||
$lang['modifyAll'] = 'Modifier Tout';
|
||||
$lang['prop'] = 'Proposer';
|
||||
$lang['remove'] = 'Supprimer';
|
||||
$lang['selected'] = 'Selectionner';
|
||||
$lang['show'] = 'Montrer';
|
||||
$lang['test'] = 'Tester';
|
||||
$lang['valid'] = 'Valider';
|
||||
|
||||
$lang['repeatType'] = array ('day' => 'jour', 'week' => 'semaine', 'dayMonth' => 'mois', 'dateMonth' => 'mois', 'year' => 'ans');
|
||||
|
||||
// placeholder
|
||||
$lang['titlePH'] = "titre de l'évènement";
|
||||
$lang['leadPH'] = 'Chapeau éditorial / organisateur / contexte / ... (facultatif)';
|
||||
$lang['posterPH'] = 'http://... (facultatif)';
|
||||
$lang['paperPH'] = 'http://... (facultatif)';
|
||||
$lang['remarkPH'] = 'texte explicatif / commentaires / remarques / ... (facultatif)';
|
||||
$lang['ratePH'] = 'x € / y € (facultatif)';
|
||||
$lang['cityPH'] = 'commune (ou code INSEE) +!!entrée!!';
|
||||
$lang['addrPH'] = '1, rue de la Tannerie ~br~ 56 000 +!!entrée!!';
|
||||
$lang['datePH'] = 'jj/mm/aa';
|
||||
$lang['hourPH'] = '--h-- (ex: 09h30-15h)';
|
||||
$lang['rootMoveDatePH'] = "jj/mm/aa (déplace jusqu'à cette date)";
|
||||
|
||||
// messages
|
||||
$lang['days'] = array ('dimanche' => 'D', 'lundi' => 'L', 'mardi' => 'M', 'mercredi' => 'M', 'jeudi' => 'J', 'vendredi' => 'V', 'samedi' => 'S');
|
||||
$lang['enterTip'] = 'Appuyez sur \'entrée\' pour mettre à jour ce champ !';
|
||||
|
||||
$lang['who'] = 'Qui';
|
||||
$lang['audience'] = 'Auditoire';
|
||||
$lang['shared'] = array ('', 'Partagé');
|
||||
$lang['proposedBy'] = 'Proposé par';
|
||||
$lang['what'] = 'Quoi';
|
||||
$lang['title'] = 'Titre ';
|
||||
$lang['lead'] = 'Chapeau éditorial ';
|
||||
$lang['posterURL'] = 'Affiche ';
|
||||
$lang['paperURL'] = 'Article ';
|
||||
$lang['remark'] = 'Sujet ';
|
||||
$lang['rate'] = 'Tarif ';
|
||||
$lang['where'] = 'Où ';
|
||||
$lang['city'] = 'Commune ';
|
||||
$lang['addresse'] = 'Adresse ';
|
||||
$lang['when'] = 'Quand ';
|
||||
$lang['allDates'] = 'Toutes dates';
|
||||
$lang['inverted'] = 'Inverser';
|
||||
$lang['noEvent'] = "Pas d'évènement";
|
||||
$lang['validation'] = 'Validation';
|
||||
$lang['proposition'] = 'Proposition';
|
||||
$lang['reactiveMap'] = 'Carte interactive !';
|
||||
$lang['toComplet'] = 'À compléter';
|
||||
|
||||
$lang['audienceChoice'] = 'Quelle audience ?';
|
||||
$lang['memberChoice'] = 'Proposé par ?';
|
||||
$lang['eventTypeChoice'] = "Quelle nature d'évènement ?";
|
||||
|
||||
$lang['from'] = 'du';
|
||||
$lang['to'] = 'au';
|
||||
$lang['fromHour'] = 'de';
|
||||
$lang['toHour'] = 'à';
|
||||
$lang['at'] = 'à';
|
||||
$lang['all'] = 'chaque';
|
||||
$lang['each'] = 'chaque';
|
||||
|
||||
$lang['startError'] = 'Certaines informations ne permettent pas la validation :';
|
||||
$lang['noAudienceError'] = "manque d'auditoire";
|
||||
$lang['noMemberError'] = 'manque de membre';
|
||||
$lang['noTypeError'] = "manque de nature d'évènement";
|
||||
$lang['noWhereError'] = 'manque de lieu';
|
||||
$lang['noTitleError'] = 'manque de titre';
|
||||
$lang['mktimeError'] = 'date non gérée (pour OVH : 13 decembre 1901 < YYYY-mm-dd < 20 janvier 2038)';
|
||||
$lang['pastError'] = 'début en dehors des limites indiquées';
|
||||
$lang['pastToError'] = 'date de fin avant le début :-D';
|
||||
$lang['badDateError'] = 'date incorrecte';
|
||||
$lang['notMemberError'] = 'non membre';
|
||||
|
||||
$lang['addEvent'] = 'Ajouter un évènement';
|
||||
$lang['proposedEvent'] = 'Proposer un évènement';
|
||||
|
||||
$lang['propSuccess'] = "Votre proposition est enregistrée. Nous allons vérifier qu'elle est conforme à l'esprit du FSL avant de la mettre en ligne. Merci de votre contributon.";
|
||||
|
||||
$lang['notifySubject'] = '[Agenda] Nouvelle proposition !';
|
||||
$lang['notifyContent'] = "Une nouvelle proposition a été faite.\n\n";
|
||||
|
||||
// toolTip
|
||||
$lang['tipPrevM'] = 'Mois précédent';
|
||||
$lang['tipNextM'] = 'Mois suivant';
|
||||
|
||||
// format
|
||||
$lang['dateFormat'] = 'dmY';
|
||||
// $lang['orderedFormat'] = function ($num) { // XXX pb OVH
|
||||
// if ($num < 1)
|
||||
// return $num;
|
||||
// switch ($num) {
|
||||
// case 1:
|
||||
// return '1er';
|
||||
// default:
|
||||
// return "{$num}e";
|
||||
// }
|
||||
// };
|
||||
|
||||
$lang['orderedFormat'] = array (1 => '1er', 2 => '2e', 3 => '3e', 4 => '4e', 5 => '5e', 6 => '6e', 7 => '7e', 8 => '8e', 9 => '9e', 10 => '10e', 11 => '11e', 12 => '12e', 13 => '13e', 14 => '14e', 15 => '15e', 16 => '16e', 17 => '17e', 18 => '18e', 19 => '19e', 20 => '20e', 21 => '21e', 22 => '22e', 23 => '23e', 24 => '24e', 25 => '25e', 26 => '26e', 27 => '27e', 28 => '28e', 29 => '29e', 30 => '30e', 31 => '31e');
|
||||
|
||||
?>
|
33
lang/fr/settings.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* French language file
|
||||
*/
|
||||
|
||||
// for the configuration manager
|
||||
$lang['scheduleGroup'] = 'en appartenant à ce groupe, on a accès au formulaire pour ajouter des évènements';
|
||||
$lang['adminGroup'] = 'le groupe qui à tous les droits sur les évènements';
|
||||
$lang['dataDir'] = 'répertoire où sont placés les fichiers XML des évènements par entité';
|
||||
$lang['groupsDir'] = 'répertoire où se trouve les entités dans le wiki';
|
||||
$lang['noSchedule'] = 'liste des entité (séparé par ",") ne devant pas créer des évènements';
|
||||
$lang['scheduleDir'] = 'page wiki de gestion de l\'agenda (contient un répertoire par entité)';
|
||||
$lang['sharedDir'] = 'répertoire regroupant les évènements partagés par tous les groupes';
|
||||
$lang['scheduleWhat'] = 'liste des types d\'évènement par catégorie (c1:t1,t2|c2:t3,t4|c3:t5,t6,t7)';
|
||||
$lang['scheduleAudience'] = 'les différents auditoires attendus pour les évènement (a1,a2,a3)';
|
||||
$lang['iconName'] = 'nom du logo du groupe qui à créé l\'évènement';
|
||||
$lang['iconWidth'] = 'largeur logo du groupe qui à créé l\'évènement';
|
||||
$lang['repeatPosition'] = 'Position des évènements répétés (groupé en haut ou séparé)';
|
||||
$lang['repeatPosition_o_grouped'] = 'groupé';
|
||||
$lang['repeatPosition_o_isolated'] = 'séparé';
|
||||
$lang['bubblePosition'] = 'Position des info-bulles du calendrier';
|
||||
$lang['bubblePosition_o_left'] = 'gauche';
|
||||
$lang['bubblePosition_o_right'] = 'droite';
|
||||
|
||||
$lang['useMap'] = 'Affiche une carte de localisation';
|
||||
$lang['defaultCenter'] = "Position par défaut d'une carte vide (lat, lon)";
|
||||
$lang['defaultZoom'] = "Zoom par défaut";
|
||||
$lang['migrate'] = 'Effectue une migration des données';
|
||||
$lang['showOldValues'] = 'Souligne les données non migrées';
|
||||
?>
|
600
lib/scheduleCitiesMap.js
Normal file
@ -0,0 +1,600 @@
|
||||
/*
|
||||
All scheduleMap behaviors managed by schedule plugin
|
||||
|
||||
scheduleMapList: Map of
|
||||
mapId => scheduleMap
|
||||
|
||||
scheduleMap
|
||||
mapId: div map ID
|
||||
map: map
|
||||
poi: Point Of Interest
|
||||
poiSize: # of number
|
||||
clusterLayer: clusterLayer
|
||||
*/
|
||||
var scheduleMapList = {};
|
||||
|
||||
var scheduleUseMap = JSINFO['schedule']['useMap'];
|
||||
var scheduleZoom = JSINFO['schedule']['defaultZoom'];
|
||||
var scheduleCenter = JSINFO['schedule']['defaultCenter'];
|
||||
var schedulePoiUri = DOKU_BASE+'lib/plugins/schedule/images/poi.png';
|
||||
var scheduleSelectedPoiUri = DOKU_BASE+'lib/plugins/schedule/images/poiRed.png';
|
||||
var scheduleEmptyUri = DOKU_BASE+'lib/plugins/schedule/images/empty.png';
|
||||
var scheduleIconCalendarUri = DOKU_BASE+'lib/plugins/schedule/images/calendar.png';
|
||||
var scheduleAjaxPoiUri = DOKU_BASE+"lib/plugins/schedule/ajaxPOI.php";
|
||||
var schedulePrecision = 5;
|
||||
|
||||
var locationFormatRE = new RegExp ("^\\s*\\(\\s*([\\-0-9.]+)\\s*\\|\\s*([\\-0-9.]+)\\s*\\)\\s*(.*)$");
|
||||
|
||||
var iconStyle;
|
||||
var iconSelectedStyle;
|
||||
|
||||
/* selected LI on city UL */
|
||||
var scheduleSelectedCity = null;
|
||||
|
||||
// ========================================
|
||||
/* format location */
|
||||
function scheduleGetLocation (lat, lon) {
|
||||
return "("+
|
||||
parseFloat (parseFloat (lat).toFixed (schedulePrecision))+"|"+
|
||||
parseFloat (parseFloat (lon).toFixed (schedulePrecision))+")";
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* convert and reverse location */
|
||||
function scheduleGetCoordFromLocation (latLonArray) {
|
||||
return ol.proj.transform ([latLonArray [1], latLonArray [0]], 'EPSG:4326', 'EPSG:3857');
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* convert and reverse location */
|
||||
function scheduleGetLocationFromCoord (coord) {
|
||||
var lonLat = ol.proj.transform (coord, 'EPSG:3857', 'EPSG:4326');
|
||||
return [parseFloat (lonLat[1]).toFixed (schedulePrecision), parseFloat (lonLat [0]).toFixed (schedulePrecision)];
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* center scheduleMap according POI markers */
|
||||
function scheduleCenterMap (scheduleMap) {
|
||||
if (!scheduleUseMap)
|
||||
return;
|
||||
if (scheduleMap.poiSize) {
|
||||
scheduleMap.map.getView ().fit (scheduleMap.poi.getExtent (), scheduleMap.map.getSize ());
|
||||
scheduleMap.map.getView ().setZoom (Math.min (scheduleMap.map.getView ().getZoom ()*.9,
|
||||
scheduleZoom));
|
||||
return;
|
||||
}
|
||||
scheduleMap.map.getView ().setCenter (scheduleGetCoordFromLocation (scheduleCenter));
|
||||
scheduleMap.map.getView ().setZoom (6); //scheduleZoom);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* remove all POI markers */
|
||||
function scheduleClearMarkers (scheduleMap) {
|
||||
if (!scheduleUseMap)
|
||||
return;
|
||||
scheduleMap.poiSize = 0;
|
||||
if (scheduleMap.poi !== undefined)
|
||||
scheduleMap.poi.clear ();
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* add a wellknown city marker */
|
||||
function scheduleAddCityMarker (scheduleMap, cityCode) {
|
||||
if (! cityCode)
|
||||
return;
|
||||
var inseeLocation = inseeCityNameLatLon[cityCode];
|
||||
if (!style) {
|
||||
// XXX not found
|
||||
return;
|
||||
}
|
||||
scheduleAddLatLonCityMarker (scheduleMap, cityCode,
|
||||
inseeCityNameLatLon[cityCode][1],
|
||||
inseeCityNameLatLon[cityCode][2]);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* add a positioned city marker */
|
||||
function scheduleAddLatLonCityMarker (scheduleMap, cityCode, lat, lon) {
|
||||
if (!scheduleUseMap)
|
||||
return;
|
||||
scheduleMap.poiSize++;
|
||||
if (scheduleMap.poi === undefined)
|
||||
return;
|
||||
scheduleMap.poi.addFeature (new ol.Feature({
|
||||
geometry: new ol.geom.Point (scheduleGetCoordFromLocation ([lat, lon])),
|
||||
cityCode: cityCode,
|
||||
location: scheduleGetLocation (lat, lon),
|
||||
lat: lat,
|
||||
lon: lon,
|
||||
selected: false
|
||||
}));
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* highlight all cities on the list of adress */
|
||||
function scheduleHighlightAddress (locations) {
|
||||
if (!locations) {
|
||||
jQuery ('div.scheduleAddresse').removeClass("poiAdrLight");
|
||||
return;
|
||||
}
|
||||
jQuery ('div.scheduleAddresse').each (function () {
|
||||
var adrBlock = jQuery (this);
|
||||
var location = adrBlock.attr ('location');
|
||||
if (location && (','+locations).indexOf (location) >= 0)
|
||||
adrBlock.addClass("poiAdrLight");
|
||||
else
|
||||
adrBlock.removeClass("poiAdrLight");
|
||||
});
|
||||
}
|
||||
|
||||
function scheduleHighlightLocation (location) {
|
||||
scheduleHighlightAddress (location);
|
||||
scheduleHighlightPOI (location);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* display cities from a UL */
|
||||
function scheduleAddAllCityFromUl (scheduleMap, ul) {
|
||||
scheduleClearMarkers (scheduleMap);
|
||||
ul.find ('li').each (function (index) {
|
||||
var li = jQuery (this);
|
||||
scheduleAddLatLonCityMarker (scheduleMap, li.attr ('insee'),
|
||||
li.attr ('lat'), li.attr ('lon'));
|
||||
});
|
||||
if (!scheduleUseMap)
|
||||
return;
|
||||
if (scheduleMap.poi !== undefined){
|
||||
scheduleMap.poi.changed ();
|
||||
scheduleMap.map.render ();
|
||||
}
|
||||
}
|
||||
|
||||
// ========================================
|
||||
function scheduleAddCityToUl (ul, cityName) {
|
||||
var cityCode = /[0-9AB]{5,}/.exec (cityName);
|
||||
var lat = "";
|
||||
var lon = "";
|
||||
if (cityCode != null)
|
||||
cityCode = cityCode[0];
|
||||
if (!cityCode)
|
||||
cityCode = inseeCityNameInsee [cityName.toLowerCase ()];
|
||||
if (!cityCode)
|
||||
cityName = cityCode = cityName.replace(/[^A-ZÀÂÆÇÉÈÊËÎÏÑÔŒÙÛÜÿ a-zàâæçéèêëîïñôœùûüÿ'\-]/gi,'');
|
||||
else {
|
||||
cityName = inseeCityNameLatLon[cityCode][0];
|
||||
lat = inseeCityNameLatLon[cityCode][1];
|
||||
lon = inseeCityNameLatLon[cityCode][2];
|
||||
}
|
||||
var recorded = false;
|
||||
ul.find ('li[insee="'+cityCode+'"][lat="'+lat+'"][lon="'+lon+'"]').each (function (index) {
|
||||
recorded = true;
|
||||
scheduleSetSelectCity (jQuery (this));
|
||||
});
|
||||
if (recorded)
|
||||
return;
|
||||
var lonLat =
|
||||
(lat && lon) ?
|
||||
' lat="'+lat+'" lon="'+lon+'"' :
|
||||
' class="unknown"';
|
||||
ul.append ('<li insee="'+cityCode+'"'+lonLat+' onclick="scheduleSelectCity (this)">'+
|
||||
'<img class="checked" src="'+scheduleEmptyUri+'" width="10" height="16" onclick="scheduleRemoveCity (this)"/>'+
|
||||
' <span class="addresse"></span> '+
|
||||
'<span class="city">'+cityName+'</span></li>');
|
||||
scheduleSetSelectCity (ul.find ("li").last ());
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* Sort UL by city name (XXX what about addresse ?) */
|
||||
function scheduleSortUlCities (ul) {
|
||||
ul.children ('li').sort (function (a, b) {
|
||||
var upa = jQuery (a).find ('span.city').text ().toUpperCase ();
|
||||
var upb = jQuery (b).find ('span.city').text ().toUpperCase ();
|
||||
return (upa < upb) ? -1 : (upa > upb) ? 1 : 0;
|
||||
}).appendTo (ul[0]);
|
||||
}
|
||||
|
||||
function scheduleAjaxPOILine (action) {
|
||||
if (!scheduleSelectedCity)
|
||||
// XXX dire quelque chose
|
||||
return;
|
||||
var insee = scheduleSelectedCity.attr ('insee');
|
||||
var lat = scheduleSelectedCity.attr ('lat');
|
||||
var lon = scheduleSelectedCity.attr ('lon');
|
||||
var addr = scheduleSelectedCity.find ('span.addresse').html ().replace (/<br>/gi, '~br~');
|
||||
line = new Array ();
|
||||
line.push (insee);
|
||||
line.push (lat);
|
||||
line.push (lon);
|
||||
line.push (addr);
|
||||
jQuery.ajax ({
|
||||
type: "POST",
|
||||
url: scheduleAjaxPoiUri,
|
||||
cache: true,
|
||||
async: true,
|
||||
data: { action: action, line: line.join ('|') },
|
||||
success: function (response) { alert (response); }
|
||||
});
|
||||
}
|
||||
|
||||
function scheduleAddInsee () {
|
||||
scheduleAjaxPOILine ("add");
|
||||
}
|
||||
function scheduleRemoveInsee () {
|
||||
scheduleAjaxPOILine ("remove");
|
||||
}
|
||||
function scheduleTestInsee () {
|
||||
}
|
||||
|
||||
function scheduleSetSelectCity (li) {
|
||||
scheduleSelectedCity = li;
|
||||
// change autocomplete
|
||||
var cityCode = scheduleSelectedCity.attr ('insee');
|
||||
var form = scheduleSelectedCity.closest ('.scheduleCitiesForm');
|
||||
var input = form.find ('input[name="addr"]');
|
||||
input. val (scheduleSelectedCity.find ('span.addresse').html ().replace (/<br>/gi, '~br~'));
|
||||
jQuery.ajax ({
|
||||
type: "POST",
|
||||
url: scheduleAjaxPoiUri,
|
||||
cache: true,
|
||||
async: true,
|
||||
data: { action: "list", insee: cityCode },
|
||||
success: function (response) {
|
||||
var db = jQuery.parseJSON (response);
|
||||
source = new Array ();
|
||||
for (var i = 0; i < db.length; i++) {
|
||||
var vals = db[i].split ("|");
|
||||
source.push ("("+vals[0]+"|"+vals[1]+") "+vals[2]);
|
||||
}
|
||||
input.autocomplete ({ source: source });
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function scheduleFocusCity () {
|
||||
if (!scheduleUseMap)
|
||||
return;
|
||||
var form = scheduleSelectedCity.closest ('.scheduleCitiesForm');
|
||||
// focus on map
|
||||
form.find ('.scheduleMap').each (function () {
|
||||
var scheduleMap = scheduleMapList [jQuery (this).attr ('id')];
|
||||
scheduleMap.map.getView ().setCenter (scheduleGetCoordFromLocation ([scheduleSelectedCity.attr ('lat'), scheduleSelectedCity.attr ('lon')]));
|
||||
scheduleMap.map.getView ().setZoom (Math.min (scheduleMap.map.getView ().getZoom (), scheduleZoom));
|
||||
});
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* User LI selection and focus on map */
|
||||
function scheduleSelectCity (item) {
|
||||
scheduleSetSelectCity (jQuery (item).closest ('li'));
|
||||
scheduleFocusCity ();
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* User remove LI */
|
||||
function scheduleRemoveCity (item) {
|
||||
var li = jQuery (item).closest ('li');
|
||||
var ul = li.closest ('ul');
|
||||
li.remove ();
|
||||
scheduleUpdateUlCity (ul);
|
||||
}
|
||||
|
||||
function scheduleUpdateUlCity (ul) {
|
||||
ul.closest ('.scheduleCitiesForm'). find ('.scheduleMap').each (function () {
|
||||
var scheduleMap = scheduleMapList [jQuery (this).attr ('id')];
|
||||
scheduleAddAllCityFromUl (scheduleMap, ul);
|
||||
scheduleCenterMap (scheduleMap);
|
||||
});
|
||||
scheduleCheckInputs ();
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* Find all initial values */
|
||||
function scheduleInitPOI () {
|
||||
jQuery ('.schedulePOI').each (function () {
|
||||
var poiDiv = jQuery (this);
|
||||
var scheduleMap = scheduleMapList [poiDiv.find ('.scheduleMap').attr ('id')];
|
||||
scheduleClearMarkers (scheduleMap);
|
||||
poiDiv.find ('span.poiLocations').each (function () {
|
||||
var poiLocations = jQuery (this).text ().split (',');
|
||||
for (var i = 0; i < poiLocations.length; i++) {
|
||||
var latLon = poiLocations[i];
|
||||
var match = latLon.match (locationFormatRE);
|
||||
if (match) {
|
||||
var lat = parseFloat (match [1]).toFixed (schedulePrecision);
|
||||
var lon = parseFloat (match [2]).toFixed (schedulePrecision);
|
||||
scheduleAddLatLonCityMarker (scheduleMap, "", lat, lon);
|
||||
} else
|
||||
// cityCode = latLon
|
||||
scheduleAddCityMarker (scheduleMap, latLon);
|
||||
}
|
||||
scheduleCenterMap (scheduleMap);
|
||||
});
|
||||
poiDiv.find ('ul.poiLatLon').each (function () {
|
||||
jQuery (this).find ('li').each (function (index) {
|
||||
var li = jQuery (this);
|
||||
scheduleAddLatLonCityMarker (scheduleMap, li.text (),
|
||||
li.attr ('lat'), li.attr ('lon'));
|
||||
});
|
||||
scheduleCenterMap (scheduleMap);
|
||||
});
|
||||
});
|
||||
jQuery ('.scheduleCitiesForm').each (function () {
|
||||
var scheduleCitiesForm = jQuery (this);
|
||||
var scheduleMapDiv = scheduleCitiesForm.find ('.scheduleMap');
|
||||
if (scheduleMapDiv[0] === undefined)
|
||||
return;
|
||||
var scheduleMap = scheduleMapList [scheduleMapDiv.attr ('id')];
|
||||
scheduleAddAllCityFromUl (scheduleMap, jQuery (this).find ('.cities'));
|
||||
scheduleCenterMap (scheduleMap);
|
||||
});
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* Find all maps */
|
||||
function scheduleInitMaps () {
|
||||
if (!scheduleUseMap)
|
||||
return;
|
||||
|
||||
jQuery ('.scheduleMap').each (function () {
|
||||
var mapDiv = jQuery (this).find ('div');
|
||||
if (mapDiv !== undefined && mapDiv && mapDiv.length)
|
||||
return;
|
||||
var mapId = jQuery (this).attr ('id');
|
||||
var osm = new ol.layer.Tile ({
|
||||
source: new ol.source.OSM ()
|
||||
});
|
||||
var poi = new ol.source.Vector ({
|
||||
features: []
|
||||
});
|
||||
iconStyle = new ol.style.Style ({
|
||||
image: new ol.style.Icon (/** @type {olx.style.IconOptions} */ ({
|
||||
anchor: [.5, 1],
|
||||
anchorXUnits: 'fraction',
|
||||
anchorYUnits: 'fraction',
|
||||
opacity: 0.75,
|
||||
src: schedulePoiUri
|
||||
}))
|
||||
});
|
||||
iconSelectedStyle = new ol.style.Style ({
|
||||
image: new ol.style.Icon (/** @type {olx.style.IconOptions} */ ({
|
||||
anchor: [.5, 1],
|
||||
anchorXUnits: 'fraction',
|
||||
anchorYUnits: 'fraction',
|
||||
opacity: 0.75,
|
||||
src: scheduleSelectedPoiUri
|
||||
}))
|
||||
});
|
||||
var clusters = new ol.source.Cluster({
|
||||
distance: 10,
|
||||
source: poi,
|
||||
});
|
||||
var styleCache = {false: {}, true: {}};
|
||||
var clusterLayer = new ol.layer.Vector({
|
||||
source: clusters,
|
||||
style: function (feature) {
|
||||
var features = feature.get ('features');
|
||||
var size = features.length;
|
||||
if (size < 2)
|
||||
return features [0].get ('selected') ? iconSelectedStyle : iconStyle;
|
||||
var selected = false;
|
||||
features.forEach (function (item) {
|
||||
if (item.get ('selected'))
|
||||
selected = true;
|
||||
});
|
||||
|
||||
var style = styleCache[selected][size];
|
||||
if (!style) {
|
||||
style = [new ol.style.Style({
|
||||
image: new ol.style.Icon (/** @type {olx.style.IconOptions} */ ({
|
||||
anchor: [.5, 1],
|
||||
anchorXUnits: 'fraction',
|
||||
anchorYUnits: 'fraction',
|
||||
opacity: 0.75,
|
||||
src: selected ? scheduleSelectedPoiUri : schedulePoiUri
|
||||
})),
|
||||
text: new ol.style.Text({
|
||||
text: size.toString (),
|
||||
offsetY: -24 // XXX textpos conf ?
|
||||
})
|
||||
})];
|
||||
styleCache[selected][size] = style;
|
||||
}
|
||||
return style;
|
||||
}
|
||||
});
|
||||
var map = new ol.Map ({
|
||||
target: mapId,
|
||||
layers: [osm, clusterLayer],
|
||||
//logo: false,
|
||||
controls: ol.control.defaults ({
|
||||
zoom: true,
|
||||
attribution: false,
|
||||
rotate: false
|
||||
}),
|
||||
view: new ol.View ({
|
||||
center: ol.proj.fromLonLat (scheduleCenter),
|
||||
zoom: scheduleZoom
|
||||
})
|
||||
});
|
||||
if (jQuery (this).hasClass ("scheduleMapDisplay"))
|
||||
map.set ("mapType", "display");
|
||||
if (jQuery (this).hasClass ("scheduleMapForm"))
|
||||
map.set ("mapType", "form");
|
||||
if (jQuery (this).hasClass ("scheduleMapCalendar"))
|
||||
map.set ("mapType", "calendar");
|
||||
|
||||
map.on ("singleclick", function (evt) {
|
||||
var f;
|
||||
map.forEachFeatureAtPixel (evt.pixel, function (feature) {
|
||||
f = feature;
|
||||
return true;
|
||||
});
|
||||
switch (map.get ("mapType")) {
|
||||
case "display":
|
||||
if (f) {
|
||||
if (f.get ('features').length)
|
||||
f = f.get ('features')[0];
|
||||
window.open ("https://www.openstreetmap.org/?mlat="+f.get ('lat')+"&mlon="+f.get ('lon')+"&zoom="+scheduleZoom, "_self");
|
||||
}
|
||||
break;
|
||||
case "form":
|
||||
var location = scheduleGetLocationFromCoord (evt.coordinate);
|
||||
scheduleSelectedCity.attr ('lat', location[0]);
|
||||
scheduleSelectedCity.attr ('lon', location[1]);
|
||||
scheduleAddAllCityFromUl (scheduleMap, scheduleSelectedCity.closest ('ul'));
|
||||
break;
|
||||
}
|
||||
});
|
||||
map.on ("pointermove", function (evt) {
|
||||
var locations = new Set ();
|
||||
map.forEachFeatureAtPixel (evt.pixel, function (feature) {
|
||||
feature.get ('features').forEach (function (item) {
|
||||
locations.add (item.get ('location'));
|
||||
});
|
||||
});
|
||||
locations = Array.from (locations);
|
||||
scheduleHighlightDays (locations);
|
||||
scheduleHighlightLocation (locations.join (','));
|
||||
});
|
||||
var scheduleMap = {
|
||||
mapId: mapId,
|
||||
map: map,
|
||||
poiSize: 0,
|
||||
poi: poi,
|
||||
clusterLayer: clusterLayer
|
||||
};
|
||||
|
||||
scheduleMapList[mapId] = scheduleMap;
|
||||
scheduleCenterMap (scheduleMap);
|
||||
});
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* Initialisation and attach function */
|
||||
jQuery (function () {
|
||||
jQuery (function () {
|
||||
// create tabs before OpenLayers stuff (important !)
|
||||
jQuery (".scheduleTabForm").tabs ({
|
||||
active: 0
|
||||
});
|
||||
jQuery ("#scheduleHelp").accordion ({
|
||||
collapsible: true,
|
||||
animated: false,
|
||||
active: false
|
||||
});
|
||||
jQuery.datepicker.setDefaults ({
|
||||
showOn: "both",
|
||||
buttonImageOnly: true,
|
||||
buttonImage: scheduleIconCalendarUri,
|
||||
buttonText: "",
|
||||
firstDay: 0
|
||||
});
|
||||
jQuery.datepicker.formatDate ("yy-mm-dd");
|
||||
jQuery (".scheduleTabForm .date").datepicker ();
|
||||
|
||||
divError = jQuery ("div.schedule").prev ("div.error");
|
||||
if (divError !== undefined && divError && divError.length)
|
||||
// XXX a tester (avant divError.size ())
|
||||
scheduleForceCheckInputs ();
|
||||
});
|
||||
|
||||
// check and format form request
|
||||
jQuery ('.scheduleFinalForm').submit (function () {
|
||||
var scheduleFinalForm = jQuery (this);
|
||||
if (!scheduleForceCheckInputs ())
|
||||
return false;
|
||||
var scheduleForm = scheduleFinalForm.closest ('.scheduleTabForm');
|
||||
var scheduleCitiesForm = scheduleForm.find ('.scheduleCitiesForm');
|
||||
var cities = new Array ();
|
||||
var lats = new Array ();
|
||||
var lons = new Array ();
|
||||
var addrs = new Array ();
|
||||
scheduleCitiesForm.find ('li').each (function (index) {
|
||||
var li = jQuery (this);
|
||||
cities.push (li.attr ('insee'));
|
||||
lats.push (li.attr ('lat'));
|
||||
lons.push (li.attr ('lon'));
|
||||
addrs.push (li.find ('span.addresse').html ());
|
||||
});
|
||||
scheduleFinalForm.append ('<input type="hidden" name="schd[where]" value="'+cities.join (",")+'"/>');
|
||||
scheduleFinalForm.append ('<input type="hidden" name="schd[lat]" value="'+lats.join (",")+'"/>');
|
||||
scheduleFinalForm.append ('<input type="hidden" name="schd[lon]" value="'+lons.join (",")+'"/>');
|
||||
scheduleFinalForm.append ('<input type="hidden" name="schd[addr]" value="'+addrs.join ("|").replace (/<br>/gi, '~br~')+'"/>');
|
||||
|
||||
var scheduleMiscForm = scheduleForm.find ('.scheduleMiscForm');
|
||||
scheduleMiscForm.find ('input[type="text"]').each (function (index) {
|
||||
if (this.value)
|
||||
scheduleFinalForm.append ('<input type="hidden" name="'+this.name+'" value="'+this.value.replace(/"/gi, "''")+'"/>');
|
||||
});
|
||||
scheduleMiscForm.find ('select:not([class="members"])').each (function (index) {
|
||||
scheduleFinalForm.append ('<input type="hidden" name="'+this.name+'" value="'+this.value+'"/>');
|
||||
});
|
||||
var members = new Array ();
|
||||
scheduleMiscForm.find ('select[class="members"]').each (function (index) {
|
||||
jQuery (this).find ('option:selected').each (function (index) {
|
||||
members.push (jQuery (this).val ());
|
||||
});
|
||||
});
|
||||
if (members.length > 0)
|
||||
scheduleFinalForm.append ('<input type="hidden" name="schd[member]" value="'+members.join (",")+'"/>');
|
||||
scheduleMiscForm.find ('textarea').each (function (index) {
|
||||
var val = jQuery (this).val ().replace(/"/gi, "''");
|
||||
var name = jQuery (this).attr ('name');
|
||||
scheduleFinalForm.append ('<input type="hidden" name="'+name+'" value="'+val+'"/>');
|
||||
});
|
||||
return true;
|
||||
});
|
||||
|
||||
// city validation
|
||||
jQuery ('.scheduleCitiesForm input[name="city"]').keypress (function (e) {
|
||||
if (e.which != 13)
|
||||
return;
|
||||
var input = jQuery (this);
|
||||
var form = input.closest ('.scheduleCitiesForm');
|
||||
var cityName = input.val ();
|
||||
if (!cityName)
|
||||
return false;
|
||||
input.val ("");
|
||||
form.find ('input[name="addr"]').val ("");
|
||||
var ul = form.find ('ul');
|
||||
scheduleAddCityToUl (ul, cityName);
|
||||
scheduleSortUlCities (ul);
|
||||
scheduleUpdateUlCity (ul);
|
||||
return false;
|
||||
});
|
||||
|
||||
// full adress validation
|
||||
jQuery ('.scheduleCitiesForm input[name="addr"]').keypress (function (e) {
|
||||
if (e.which != 13)
|
||||
return;
|
||||
if (!scheduleSelectedCity)
|
||||
return;
|
||||
var input = jQuery (this);
|
||||
var form = input.closest ('.scheduleCitiesForm');
|
||||
var addr = input.val ();
|
||||
var match = addr.match (locationFormatRE);
|
||||
if (match) {
|
||||
addr = match [3];
|
||||
scheduleSelectedCity.attr ('lat', parseFloat (match [1]).toFixed (schedulePrecision));
|
||||
scheduleSelectedCity.attr ('lon', parseFloat (match [2]).toFixed (schedulePrecision));
|
||||
var scheduleMap = scheduleMapList [form.find ('.scheduleMap').attr ('id')];
|
||||
scheduleAddAllCityFromUl (scheduleMap, scheduleSelectedCity.closest ('ul'));
|
||||
scheduleFocusCity ();
|
||||
}
|
||||
input.val (addr);
|
||||
scheduleSelectedCity.find ('span.addresse').html (addr.replace (/~br~/gi, '<br/>'));
|
||||
});
|
||||
|
||||
// default form validation for each text field
|
||||
jQuery ('.scheduleMiscForm input').keypress (function (e) {
|
||||
if (e.which != 13)
|
||||
return;
|
||||
jQuery (this).closest ('.scheduleTabForm').find ('input[type="submit"]').first ().trigger ('click');
|
||||
});
|
||||
|
||||
// init maps
|
||||
scheduleInitMaps ();
|
||||
scheduleInitPOI ();
|
||||
});
|
||||
|
||||
// ========================================
|
145
lib/scheduleForm.js
Normal file
@ -0,0 +1,145 @@
|
||||
// ========================================
|
||||
|
||||
var scheduleDoCkeck = false;
|
||||
|
||||
function scheduleForceCheckInputs () {
|
||||
scheduleDoCkeck = true;
|
||||
return scheduleCheckInputs ();
|
||||
}
|
||||
|
||||
function scheduleCheckSelect (select) {
|
||||
var warning = select.find ('option:selected').val () == "";
|
||||
select.prev (".warningPlace").toggleClass ("warning", warning);
|
||||
return warning;
|
||||
}
|
||||
function scheduleCheckInput (input) {
|
||||
var warning = input.val () == "";
|
||||
input.toggleClass ("warning", warning);
|
||||
return warning;
|
||||
}
|
||||
function scheduleCheckUL (ul) {
|
||||
var warning = ul.children ().length == 0;
|
||||
ul.toggleClass ("warning", warning);
|
||||
return warning;
|
||||
}
|
||||
/*
|
||||
* highlight missing input fields
|
||||
*/
|
||||
function scheduleCheckInputs () {
|
||||
if (!scheduleDoCkeck)
|
||||
return false;
|
||||
var tab = jQuery (".scheduleTabForm");
|
||||
var tabs = tab.find ("li a.warningPlace");
|
||||
var checked = true;
|
||||
var warning = false;
|
||||
warning = scheduleCheckSelect (tab.find ('select[name="schd[audience]"]'));
|
||||
warning = scheduleCheckSelect (tab.find ('select.members')) || warning;
|
||||
tabs.slice (0,1).toggleClass ("warning", warning);
|
||||
if (warning)
|
||||
checked = false;
|
||||
warning = scheduleCheckSelect (tab.find ('select[name="schd[what]"]'));
|
||||
warning = scheduleCheckInput (tab.find ('input[name="schd[title]"]')) || warning;
|
||||
tabs.slice (1,2).toggleClass ("warning", warning);
|
||||
if (warning)
|
||||
checked = false;
|
||||
warning = scheduleCheckUL (tab.find ('ul.cities'));
|
||||
tabs.slice (2,3).toggleClass ("warning", warning);
|
||||
if (warning)
|
||||
checked = false;
|
||||
warning = scheduleCheckInput (tab.find ('input[name="schd[from]"]'));
|
||||
tabs.slice (3,4).toggleClass ("warning", warning);
|
||||
if (warning)
|
||||
checked = false;
|
||||
warning = scheduleCheckInput (tab.find ('input.edit'));
|
||||
tabs.slice (4,5).toggleClass ("warning", warning);
|
||||
if (warning)
|
||||
checked = false;
|
||||
return checked;
|
||||
}
|
||||
|
||||
/**
|
||||
* switch all selected events for delete.
|
||||
*/
|
||||
function scheduleSwitchSelection (form) {
|
||||
for (var i = 0; i < form.elements.length; i++)
|
||||
form.elements[i].checked = !form.elements[i].checked;
|
||||
}
|
||||
|
||||
/*
|
||||
* change member selection mode according share status
|
||||
*/
|
||||
function scheduleSharedEvent (form) {
|
||||
var form = jQuery (form);
|
||||
var shared = null;
|
||||
|
||||
form.find ('select[name="schd[shared]"]').each (function () {
|
||||
if (this.options [this.selectedIndex].text != "")
|
||||
shared = "true";
|
||||
});
|
||||
form.find ('select[name="schd[member]"]').each (function () {
|
||||
this.multiple = shared;
|
||||
this.size = shared ? 9 : 1;
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
* display repeat input according selection
|
||||
*/
|
||||
function scheduleUpdateRepeatType (repeatSelection) {
|
||||
var selectedValue = repeatSelection.options [repeatSelection.selectedIndex].value;
|
||||
var inputs = repeatSelection.form.elements;
|
||||
var disabledWeek = (selectedValue != "week");
|
||||
var disabledDay = (selectedValue != "dayMonth");
|
||||
var disabledDate = (selectedValue != "dateMonth");
|
||||
var checkedDay = 0;
|
||||
// XXX jquery ?
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
var name = inputs[i].name;
|
||||
if (name == "schd[weekDays][]") {
|
||||
inputs[i].disabled = disabledWeek;
|
||||
if (inputs[i].checked)
|
||||
checkedDay++;
|
||||
} else if (name == "schd[weekRank]")
|
||||
inputs[i].disabled = disabledDay;
|
||||
else if (name == "schd[dayInWeek]")
|
||||
inputs[i].disabled = disabledDay;
|
||||
else if (name == "schd[dayRank]")
|
||||
inputs[i].disabled = disabledDate;
|
||||
}
|
||||
if (!disabledWeek && checkedDay == 0)
|
||||
scheduleForceDay (inputs);
|
||||
// XXX forcer le Ie jour du mois
|
||||
}
|
||||
|
||||
/*
|
||||
* display repeat input according selection
|
||||
*/
|
||||
function scheduleUpdateWeekDays (DaySelection) {
|
||||
var inputs = DaySelection.form.elements;
|
||||
var checkedDay = 0;
|
||||
// XXX jquery
|
||||
for (var i = 0; i < inputs.length; i++) {
|
||||
if (inputs[i].name == "schd[weekDays][]")
|
||||
if (inputs[i].checked)
|
||||
checkedDay++;
|
||||
}
|
||||
if (checkedDay == 0)
|
||||
scheduleForceDay (inputs);
|
||||
}
|
||||
|
||||
function scheduleForceDay (inputs) {
|
||||
var date = document.getElementById ("scheduleFrom").value;
|
||||
if (!date)
|
||||
date = new Date ();
|
||||
else {
|
||||
date = date.split ('/'); // XXX bug format FR seulement
|
||||
date [1] = parseInt (date [1]) - 1;
|
||||
if (date[2] < 100)
|
||||
date [2] = parseInt (date [2]) + 2000;
|
||||
date = new Date (date[2], date [1], date [0]);
|
||||
}
|
||||
var rankDay = date.getDay();
|
||||
for (var i = 0; i < inputs.length; i++)
|
||||
if (inputs[i].name == "schd[weekDays][]" && inputs[i].value == rankDay)
|
||||
inputs[i].checked = true;
|
||||
}
|
93
lib/scheduleTable.js
Normal file
@ -0,0 +1,93 @@
|
||||
// ========================================
|
||||
/* highlight day and cities in table according the event under the mouse */
|
||||
function scheduleHighlightEvent (day, locations) {
|
||||
jQuery ('div.cityBubble div.bubble').each (function () {
|
||||
jQuery (this).hide ();
|
||||
});
|
||||
scheduleHighlightPOI (locations);
|
||||
jQuery ('div.schedule table.short div.mapSelect').each (function () {
|
||||
var showDay = jQuery (this);
|
||||
var today = showDay.attr ('day');
|
||||
if (day && today == day)
|
||||
showDay.show ();
|
||||
else
|
||||
showDay.hide ();
|
||||
});
|
||||
}
|
||||
|
||||
// ========================================
|
||||
/* highlight all days in table according the city under the mouse */
|
||||
function scheduleHighlightDays (targetLocations) {
|
||||
jQuery ('div.cityBubble div.bubble').each (function () {
|
||||
jQuery (this).hide ();
|
||||
});
|
||||
if (!targetLocations || !targetLocations.length) {
|
||||
jQuery ('div.schedule table.short div.mapSelect').hide ();
|
||||
return;
|
||||
}
|
||||
targetLocations.forEach (function (location) {
|
||||
jQuery ('div.cityBubble[location="'+location+'"] div.bubble').each (function () {
|
||||
jQuery (this).show ();
|
||||
});
|
||||
});
|
||||
jQuery ('div.schedule table.short div.mapSelect').each (function () {
|
||||
var showDay = jQuery (this);
|
||||
var eventLocations = showDay.attr ('locations');
|
||||
if (!eventLocations) {
|
||||
showDay.hide ();
|
||||
return;
|
||||
}
|
||||
var doShow = false;
|
||||
targetLocations.forEach (function (location) {
|
||||
if ((','+eventLocations+',').indexOf (location) >= 0) {
|
||||
doShow = true;
|
||||
return;
|
||||
}
|
||||
});
|
||||
if (doShow)
|
||||
showDay.show ();
|
||||
else
|
||||
showDay.hide ();
|
||||
});
|
||||
}
|
||||
|
||||
var scheduleMapList;
|
||||
|
||||
// ========================================
|
||||
/* highlight all cities on the map according the day under the mouse */
|
||||
function scheduleHighlightPOI (locations) {
|
||||
if (!locations) {
|
||||
jQuery ('div.schedule table.short div.mapSelect').hide ();
|
||||
jQuery.each (scheduleMapList, function (mapId, scheduleMap) {
|
||||
scheduleMap.poi.forEachFeature (function (item) {
|
||||
item.set ('selected', false);
|
||||
});
|
||||
scheduleMap.poi.changed ();
|
||||
scheduleMap.map.render ();
|
||||
});
|
||||
return;
|
||||
}
|
||||
jQuery.each (scheduleMapList, function (mapId, scheduleMap) {
|
||||
var changed = false;
|
||||
scheduleMap.poi.forEachFeature (function (item) {
|
||||
var location = item.get ('location');
|
||||
item.set ('selected', (location && (','+locations).indexOf (location) >= 0));
|
||||
});
|
||||
scheduleMap.poi.changed ();
|
||||
scheduleMap.map.render ();
|
||||
});
|
||||
}
|
||||
// ========================================
|
||||
function scheduleChangeDate (obj, ns, mapId, date) {
|
||||
var table = jQuery (obj).closest ("table")[0];
|
||||
scheduleSend (table,
|
||||
DOKU_BASE+"lib/plugins/schedule/ajax.php",
|
||||
"schd[ns]="+ns+"&schd[mapId]="+mapId+"&schd[action]=changeDate&schd[date]="+date);
|
||||
}
|
||||
|
||||
// ========================================
|
||||
function scheduleSelectDate (date) {
|
||||
jQuery ("#scheduleFrom").val (date);
|
||||
}
|
||||
|
||||
// ========================================
|
7
plugin.info.txt
Normal file
@ -0,0 +1,7 @@
|
||||
base schedule
|
||||
author Francois Merciol
|
||||
email dokuplugin@merciol.fr
|
||||
date 2021-03-31
|
||||
name Schedule Plugin
|
||||
desc Includes and manage shcedule into a page (V4)
|
||||
url http://www.dokuwiki.org/plugin:schedule
|
113
poiDB.class.php
Normal file
@ -0,0 +1,113 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
|
||||
*/
|
||||
|
||||
// ============================================================
|
||||
class poiDB {
|
||||
var $modify = false;
|
||||
var $dbFileName;
|
||||
var $dbByInsee;
|
||||
var $allLines;
|
||||
|
||||
// ============================================================
|
||||
function __construct ($plugin) {
|
||||
global $conf;
|
||||
$this->dbFileName =
|
||||
((!$conf['savedir'] || strpos ($conf['savedir'], '.') === 0) ? DOKU_INC : "").
|
||||
$conf['savedir'].'/'.trim ($plugin->getConf ('dataDir').'/poiDB.txt');
|
||||
$this->read ();
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function getInsee ($insee) {
|
||||
if (!isset ($this->dbByInsee [$insee]))
|
||||
return array ();
|
||||
return $this->dbByInsee [$insee];
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function addLine ($line) {
|
||||
$this->cleanDB ();
|
||||
$line = $this->cleanLine ($line);
|
||||
if (!$this->allLines || !in_array ($line, $this->allLines)) {
|
||||
$this->allLines [] = $line;
|
||||
sort ($this->allLines);
|
||||
$this->modify = true;
|
||||
}
|
||||
$this->write ();
|
||||
echo "record".NL;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function removeLine ($line) {
|
||||
$this->cleanDB ();
|
||||
$line = $this->cleanLine ($line);
|
||||
|
||||
if (($key = array_search ($line, $this->allLines)) !== false) {
|
||||
unset ($this->allLines [$key]);
|
||||
$this->modify = true;
|
||||
}
|
||||
$this->write ();
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function cleanLine ($line) {
|
||||
// XXX vérifier nombre
|
||||
$data = explode ("|", $line);
|
||||
foreach ($data as $key => $val)
|
||||
$data[$key] = trim ($val);
|
||||
$data [1] = number_format ((float)$data[1], 4);
|
||||
$data [2] = number_format ((float)$data[2], 4);
|
||||
return implode ("|", $data);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function cleanDB () {
|
||||
if ($this->allLines)
|
||||
foreach ($this->allLines as $key => $line) {
|
||||
$lineCleaned = $this->cleanLine ($line);
|
||||
if ($lineCleaned != $line)
|
||||
$this->modify = true;
|
||||
$this->allLines [$key] = $lineCleaned;
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function read () {
|
||||
$this->dbByInsee = array ();
|
||||
$handle = @fopen ($this->dbFileName, "r");
|
||||
if ($handle) {
|
||||
while (($line = fgets ($handle)) !== false) {
|
||||
$line = trim (preg_replace ("/#.*$/", "", str_replace ('\\\\', '~br~', $line)));
|
||||
if (!$line)
|
||||
continue;
|
||||
$this->allLines [] = $line;
|
||||
list ($insee, $end) = explode ('|', $line, 2);
|
||||
$this->dbByInsee [$insee][] = $end;
|
||||
}
|
||||
fclose ($handle);
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function write () {
|
||||
if (!$this->modify) {
|
||||
echo "POI DB unchanged !".NL;
|
||||
return;
|
||||
}
|
||||
$handle = @fopen ($this->dbFileName, "w");
|
||||
if ($handle == false)
|
||||
die("unable to create file: ".$this->dbFileName); // XXX
|
||||
foreach ($this->allLines as $line)
|
||||
fputs ($handle, $line.NL);
|
||||
fclose ($handle);
|
||||
echo "POI DB updated !".NL;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
}
|
64
schedule.class.php
Normal file
@ -0,0 +1,64 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
*/
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/');
|
||||
if (!defined ('DOKU_PLUGIN'))
|
||||
define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
|
||||
|
||||
// ============================================================
|
||||
// event class
|
||||
class schedule {
|
||||
var $id; // event id
|
||||
var $member; // event owner
|
||||
var $from; // event begining date
|
||||
var $to; // event ending date
|
||||
var $at; // event begining hour
|
||||
var $what; // event type
|
||||
var $where; // event place insee code or city name
|
||||
var $lon; // event place latitude
|
||||
var $lat; // event place longitude
|
||||
var $addr; // event place addresse
|
||||
var $audience; // event expected audience
|
||||
var $shared; // shared event
|
||||
var $title; // event page title
|
||||
var $lead; // event lead
|
||||
var $posterURL; // event poster URL
|
||||
var $paperURL; // event paper URL
|
||||
var $remark; // event remark
|
||||
var $rate; // event rate
|
||||
|
||||
var $repeatFlag; // event repeat or not
|
||||
var $repeat; // event step of repeat
|
||||
var $repeatType; // event type of repeat
|
||||
var $repeatGrouped; // repeat event grouped on top
|
||||
var $weekDays; // event array days concern by the repeating week
|
||||
var $weekRank; // event week concern by the repeating month
|
||||
var $dayInWeek; // event day in the week concern by the repeating month
|
||||
var $dayRank; // event day in the month concern by the repeating month
|
||||
|
||||
var $requestMembers; // all members proposed during the request
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// sort event by event date, then creation date
|
||||
function cmpSchedule ($a, $b) {
|
||||
if ($a->from == $b->from) {
|
||||
if ($a->at == $b->at)
|
||||
return ($a->id < $b->id) ? -1 : 1;
|
||||
return ($a->at < $b->at) ? -1 : 1;
|
||||
}
|
||||
return ($a->from < $b->from) ? -1 : 1;
|
||||
}
|
||||
// sort info bubbles by date
|
||||
function cmpScheduleInDay ($a, $b) {
|
||||
if ($a['at'] == $b['at'])
|
||||
return ($a['id'] < $b['id']) ? -1 : 1;
|
||||
return ($a['at'] < $b['at']) ? -1 : 1;
|
||||
}
|
||||
|
||||
// ============================================================
|
2830
scheduleInseeCities.php
Normal file
465
scheduleRoot.class.php
Normal file
@ -0,0 +1,465 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
*
|
||||
* $df_ : 31/12/2000
|
||||
* $ds_ : 20001231
|
||||
* $dn_ : 978217200
|
||||
* $dt_ : array ("Y" => 2000, "m" => 12, "d" => "31)
|
||||
*/
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (dirname (__FILE__).'/../../../').'/');
|
||||
if (!defined ('DOKU_PLUGIN'))
|
||||
define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
|
||||
|
||||
function cmpScheduleConfig ($a, $b) {
|
||||
return ($a['nameSpace'] < $b['nameSpace']) ? -1 : 1;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// admin class
|
||||
class scheduleRoot {
|
||||
|
||||
// ============================================================
|
||||
// Config attributs
|
||||
// ============================================================
|
||||
var $cacheRootDir; // root cache directory
|
||||
var $dataRootDir; // root data directory
|
||||
|
||||
var $scheduleGroup; // group who can display and fill form
|
||||
var $groupsDir; // pages groups directories
|
||||
var $scheduleDir; // schedule pages groups directories
|
||||
var $sharedDir; // schedule directory for shared events
|
||||
var $scheduleWhat = array (); // set of legal "what"
|
||||
var $scheduleAudience = array (); // set of legal "audience"
|
||||
var $iconName; // group icon name
|
||||
var $iconWidth; // group icon width
|
||||
// lang
|
||||
var $scheduleShared = array (); // notshared/shared
|
||||
var $currentDateFormat;
|
||||
|
||||
// ============================================================
|
||||
// Constant attributs $this->scheduleRoot->
|
||||
// ============================================================
|
||||
//var $imagesUrlDir = '/lib/plugins/schedule/images/'; // DOKU_REL
|
||||
var $wizardIconUrl = '/lib/plugins/schedule/images/wizard.png'; // $this->imagesUrlDir
|
||||
var $editIconUrl = '/lib/plugins/schedule/images/edit.png';
|
||||
var $repeatIconUrl = '/lib/plugins/schedule/images/repeat.png';
|
||||
var $emptyIconUrl = '/lib/plugins/schedule/images/empty.png';
|
||||
|
||||
var $oldConfigFile = "config.xml"; // old file config name
|
||||
var $configFile = "cfg.xml"; // file config name
|
||||
var $mbrPrefix = "mbr-"; // member prefix file name
|
||||
var $propFile = "prop.xml"; // member prefix file name
|
||||
var $configAttributsName = array ("nameSpace", "lastNotification", "lastNotificationReset");
|
||||
// scheduleDir == NS ?
|
||||
var $dateFormat = array ("dmY" => array ("shortScan" => "(?<d>[0-9]{1,2})[ /-](?<m>[0-9]{1,2})[ /-](?<Y>[0-9]{1,2})",
|
||||
"longScan" => "(?<d>[0-9]{1,2})[ /-](?<m>[0-9]{1,2})[ /-](?<Y>[0-9]{4})",
|
||||
"fieldName" => array ("d", "m", "Y"),
|
||||
"prettyPrint" => "d/m/Y",
|
||||
"dayMonth" => "d/m"),
|
||||
|
||||
"mdY" => array ("shortScan" => "(?<m>[0-9]{1,2})[ /-](?<d>[0-9]{1,2})[ /-](?<Y>[0-9]{1,2})",
|
||||
"longScan" => "(?<m>[0-9]{1,2})[ /-](?<d>[0-9]{1,2})[ /-](?<Y>[0-9]{4})",
|
||||
"fieldName" => array ("m", "d", "Y"),
|
||||
"prettyPrint" => "m/d/Y",
|
||||
"dayMonth" => "m/d"));
|
||||
var $oddEvenValues = array ("odd", "even");
|
||||
var $scheduleRequestAttributsName = array ("id", "audience", "shared",
|
||||
"what", "title", "lead", "posterURL", "paperURL", "remark", "rate",
|
||||
"where", "lon", "lat", "addr",
|
||||
"from", "to", "at",
|
||||
"repeat", "repeatType", "weekRank", "dayInWeek", "dayRank",
|
||||
"user");
|
||||
var $scheduleSaveAttributsName;
|
||||
var $filterNames = array ("noMember" => "member",
|
||||
"noWhat" => "what",
|
||||
"NoAudience" => "audience");
|
||||
|
||||
|
||||
// ============================================================
|
||||
// Transcient attributs
|
||||
// ============================================================
|
||||
var $message = array (); // messages to display : "notify" =>, "info" =>, "success" =>, "error" =>
|
||||
var $plugin; // link to wiki plugin inforation (conf, lang, ...)
|
||||
var $isAdmin; // if user member of schedule adminGroup
|
||||
var $oddEven = 0; // background color for table lines
|
||||
|
||||
// ============================================================
|
||||
// Util
|
||||
// ============================================================
|
||||
/* messages container to be display before plugin */
|
||||
function message ($type, $text) {
|
||||
if (isset ($this->message[$type]))
|
||||
$this->message[$type] .= '<br/>'.NL;
|
||||
$this->message[$type] .= $text;
|
||||
}
|
||||
function startMessage ($type, $text) {
|
||||
if (isset ($this->message[$type]))
|
||||
$this->message[$type] = '<br/>'.NL.$this->message[$type];
|
||||
$this->message[$type] = $text.$this->message[$type];
|
||||
}
|
||||
/* debug messages for admin only */
|
||||
function debug ($text) {
|
||||
global $INFO;
|
||||
// XXX
|
||||
if (isset ($INFO['userinfo'] ['grps']) && in_array ('admin', $INFO ['userinfo'] ['grps']))
|
||||
$this->message ('notify', '<pre>'.$text.'</pre>');
|
||||
}
|
||||
/* Change date format from array to number */
|
||||
function dt2dn ($dt_date) {
|
||||
$dn_date = mktime (0, 0, 0, $dt_date["m"], $dt_date["d"], $dt_date["Y"]);
|
||||
if (!$dn_date)
|
||||
$this->message ('error', $dt_date["Y"]."-".$dt_date["d"]."-".$dt_date["m"]." : ".$this->plugin->getLang ('mktimeError').'<br/>'.NL);
|
||||
return $dn_date;
|
||||
}
|
||||
/* Check date format 31/12/2000 */
|
||||
function checkDS ($ds_date) {
|
||||
return
|
||||
preg_match ("#([0-9]{8})#", $ds_date, $dumy);
|
||||
}
|
||||
/* Change date format from MM/DD/AAAA to number */
|
||||
function df2ds ($df_date) {
|
||||
$df_date = trim ($df_date);
|
||||
if (!$df_date)
|
||||
return;
|
||||
if ("!" == $df_date)
|
||||
$ds_date = date ("Ymd");
|
||||
elseif (preg_match ("#\+(?<delta>[0-9]+)#", $df_date, $matches))
|
||||
$ds_date = sprintf ("%08d", date ("Ymd", mktime (0, 0, 0, date ("n"), date ("j")+$matches["delta"], date ("Y"))));
|
||||
elseif (preg_match ("#\-(?<delta>[0-9]+)#", $df_date, $matches))
|
||||
$ds_date = sprintf ("%08d", date ("Ymd", mktime (0, 0, 0, date ("n"), date ("j")-$matches["delta"], date ("Y"))));
|
||||
elseif (preg_match ("#".$this->currentDateFormat ["longScan"]."#", $df_date, $dt_date))
|
||||
$ds_date = sprintf ("%04d%02d%02d", $dt_date["Y"], $dt_date["m"], $dt_date["d"]);
|
||||
elseif (preg_match ("#".$this->currentDateFormat ["shortScan"]."#", $df_date, $dt_date))
|
||||
$ds_date = sprintf ("20%02d%02d%02d", $dt_date["Y"], $dt_date["m"], $dt_date["d"]);
|
||||
else
|
||||
$ds_date = "{$df_date}";
|
||||
return $ds_date;
|
||||
}
|
||||
/* Change date format from number to MM/DD/AAAA */
|
||||
function ds2df ($ds_date) {
|
||||
$ds_date = trim ($ds_date);
|
||||
if (preg_match ("#(?<Y>[0-9][0-9][0-9][0-9])(?<m>[0-9][0-9])(?<d>[0-9][0-9])#", $ds_date, $dt_date))
|
||||
return sprintf ("%02d/%02d/%04d",
|
||||
$dt_date[$this->currentDateFormat["fieldName"][0]],
|
||||
$dt_date[$this->currentDateFormat["fieldName"][1]],
|
||||
$dt_date[$this->currentDateFormat["fieldName"][2]]);
|
||||
else
|
||||
return "{$ds_date}";
|
||||
}
|
||||
function ds2ln ($ds_date, $bold = false) {
|
||||
$ds_date = trim ($ds_date);
|
||||
if (preg_match ("#(?<Y>[0-9][0-9][0-9][0-9])(?<m>[0-9][0-9])(?<d>[0-9][0-9])#", $ds_date, $dt_date)) {
|
||||
// XXX prévoir le format anglais
|
||||
setlocale (LC_TIME, 'fr_FR.utf8','fra');
|
||||
return strftime (($bold ? "**%A %e %B** %Y" : "%A %e %B %Y"),
|
||||
mktime (0, 0, 0,
|
||||
$dt_date[$this->currentDateFormat["fieldName"][1]],
|
||||
$dt_date[$this->currentDateFormat["fieldName"][0]],
|
||||
$dt_date[$this->currentDateFormat["fieldName"][2]]));
|
||||
} else
|
||||
return "{$ds_date}";
|
||||
}
|
||||
|
||||
/* Convert array on string (words seperated bay '|') */
|
||||
static function array2string ($array) {
|
||||
if (!$array)
|
||||
return "";
|
||||
$array = array_unique ($array);
|
||||
if (in_array ("", $array))
|
||||
$array = array_diff ("", $array);
|
||||
if (count ($array) < 1)
|
||||
return "";
|
||||
return implode ("|", $array);
|
||||
}
|
||||
/* Convert array on string (words seperated bay '|') */
|
||||
function assocImplode ($array, $vSep = '|', $kSep = ':') {
|
||||
$result = "";
|
||||
foreach ($array as $k => $v) {
|
||||
$result .= $vSepNeeded.$k.$kSep.$v;
|
||||
$vSepNeeded = $vSep;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/* Convert array on string (words seperated bay '|') */
|
||||
function assocExplode ($string, $vSep = '|', $kSep = ':') {
|
||||
$result = array ();
|
||||
foreach (explode ($vSep, $string) as $kv) {
|
||||
$data = explode ($kSep, $kv);
|
||||
$result [$data[0]] = $data[1];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/* Convert array on string (words seperated bay '|') */
|
||||
// $ find data/[mp]*/membres/*/agenda/*/* data/[mp]*/commun/agenda/*/* -type f -print > dumy
|
||||
// $ emacs dumy
|
||||
// C-x ( mv ' ' C-k C-y ' ' C-y C-f C-x )
|
||||
// M-1000 C-x e
|
||||
// C-M-%
|
||||
// ^\([^ ]* [^ ]* [^ ]*agenda/[^/ ]*_\)/ => \1
|
||||
// C-M-%
|
||||
// ^\([^ ]* [^ ]* [^ ]*agenda/[^/ ]*_\)/ => \1
|
||||
// C-M-%
|
||||
// ^\([^ ]* [^ ]* [^ ]*agenda/[^/ ]*\)/ => \1_
|
||||
// $ find data/[mp]*/membres/*/agenda/* -type d -exec rmdir {} \; -print
|
||||
function removeSep ($titleId) {
|
||||
return strtr ($titleId, ':/;', ' ');
|
||||
}
|
||||
|
||||
function getPageId ($schedule) {
|
||||
return ":".
|
||||
$this->scheduleDir.":".
|
||||
($schedule->shared ? $this->sharedDir : $schedule->member).":".
|
||||
$this->removeSep ($schedule->title);
|
||||
}
|
||||
|
||||
function resetOddEven () {
|
||||
$this->oddEven = 0;
|
||||
}
|
||||
function switchOddEven () {
|
||||
$this->oddEven = 1 - $this->oddEven;
|
||||
}
|
||||
|
||||
function getOddEven () {
|
||||
return $this->oddEvenValues [$this->oddEven];
|
||||
}
|
||||
|
||||
static function createDirIsNeeded ($dir) {
|
||||
if (is_dir ($dir))
|
||||
return;
|
||||
@mkdir ($dir);
|
||||
@chmod ($dir, 0775);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function __construct ($plugin) {
|
||||
$this->plugin = $plugin;
|
||||
$this->scheduleSaveAttributsName = array_merge ($this->scheduleRequestAttributsName, array ("weekDays"));
|
||||
global $conf;
|
||||
$savedir = ((!$conf['savedir'] || strpos ($conf['savedir'], '.') === 0) ? DOKU_INC : "").$conf['savedir']."/";
|
||||
$this->cacheRootDir = $savedir."cache/schedule/";
|
||||
$this->dataRootDir = $savedir.trim ($this->plugin->getConf ('dataDir').'/');
|
||||
scheduleRoot::createDirIsNeeded ($this->cacheRootDir);
|
||||
scheduleRoot::createDirIsNeeded ($this->dataRootDir);
|
||||
$this->scheduleGroup = trim ($this->plugin->getConf ('scheduleGroup'));
|
||||
$this->groupsDir = trim ($this->plugin->getConf ('groupsDir'));
|
||||
$this->scheduleDir = trim ($this->plugin->getConf ('scheduleDir'));
|
||||
$this->sharedDir = trim ($this->plugin->getConf ('sharedDir'));
|
||||
|
||||
foreach (explode ('|', $this->plugin->getConf ('scheduleWhat')) as $tmpCatDef) {
|
||||
$tmpCatExp = explode (':', trim ($tmpCatDef));
|
||||
$tmpCat = trim ($tmpCatExp[0]);
|
||||
foreach (explode (',', $tmpCatExp[1]) as $tmpWhat) {
|
||||
$tmpWhat = trim ($tmpWhat);
|
||||
$this->scheduleWhat[$tmpWhat] = $tmpCat;
|
||||
}
|
||||
}
|
||||
$this->scheduleAudience [""] = $this->plugin->getLang ('audienceChoice');
|
||||
foreach (explode (',', $this->plugin->getConf ('scheduleAudience')) as $tmpAudience)
|
||||
$this->scheduleAudience[trim ($tmpAudience)] = trim ($tmpAudience);
|
||||
$this->iconName = $this->plugin->getConf ('iconName');
|
||||
$this->iconWidth = $this->plugin->getConf ('iconWidth');
|
||||
foreach (array (false, true) as $sharedVal) {
|
||||
$tmp = $this->plugin->getLang ('shared');
|
||||
$this->scheduleShared[] = trim ($tmp[$sharedVal]);
|
||||
}
|
||||
$this->currentDateFormat = $this->dateFormat [$this->plugin->getLang ('dateFormat')];
|
||||
|
||||
global $INFO;
|
||||
$this->isAdmin =
|
||||
isset ($INFO ['userinfo']) &&
|
||||
isset ($INFO ['userinfo']['grps']) &&
|
||||
in_array (trim ($this->plugin->getConf ('adminGroup')), $INFO ['userinfo']['grps']);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Manage XML file
|
||||
// ============================================================
|
||||
/* read lodging config */
|
||||
function readConfig ($dir) {
|
||||
$oldFileName = $dir.$this->oldConfigFile;
|
||||
$fileName = $dir.$this->configFile;
|
||||
|
||||
// rename old fashion membre file name
|
||||
if (file_exists ($oldFileName)) {
|
||||
// XXX migration
|
||||
rename ($oldFileName, $fileName);
|
||||
$exclude = ".|..|".$this->scheduleRoot->configFile;
|
||||
$exclude_array = explode("|", $exclude);
|
||||
$pathDir = rtrim ($dir, "/") . "/";
|
||||
if (is_dir($pathDir)) {
|
||||
$pathDirObj = opendir ($pathDir);
|
||||
while (false !== ($file = readdir ($pathDirObj))) {
|
||||
if (in_array (strtolower ($file), $exclude_array))
|
||||
continue;
|
||||
$pathFile = $pathDir.$file;
|
||||
if (is_file ($pathFile) && preg_match ('#.*\.xml$#i', $file, $b))
|
||||
rename ($pathFile, $pathDir.$this->mbrPrefix.$file);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!file_exists ($fileName))
|
||||
return false;
|
||||
$result = array ();
|
||||
// if (! class_exists ('DOMDocument'))
|
||||
// return $result;
|
||||
$xml = new DOMDocument ("1.0", "utf8");
|
||||
$xml->load ($fileName);
|
||||
$root = $xml->documentElement;
|
||||
foreach ($this->configAttributsName as $field) {
|
||||
$element = $root->getElementsByTagName ($field);
|
||||
if ($element)
|
||||
$result [$field] = $element->item (0)->nodeValue;
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
/* write lodging config */
|
||||
function writeConfig ($schedules) {
|
||||
$fileName = $schedules->dataDir.$this->configFile;
|
||||
scheduleRoot::createDirIsNeeded ($schedules->dataDir);
|
||||
// if (! class_exists ('DOMDocument'))
|
||||
// return;
|
||||
$xml = new DOMDocument ("1.0", "utf8");
|
||||
$root = $xml->createElement ("schedule");
|
||||
$xml->appendChild ($root);
|
||||
foreach ($this->configAttributsName as $field)
|
||||
$root->appendChild ($xml->createElement ($field, htmlspecialchars ($schedules->$field)));
|
||||
$xml->formatOutput = true;
|
||||
$xml->save ($fileName);
|
||||
chmod ($fileName, 0664);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function manageAction ($request) {
|
||||
if (!$this->isAdmin)
|
||||
return;
|
||||
$md5 = $request['md5'];
|
||||
if (!$md5)
|
||||
return;
|
||||
$schedules = new schedules ($this, $request[$md5]['ns']);
|
||||
switch ($request["action"]) {
|
||||
|
||||
case 'moveSchedules':
|
||||
$md5 = $request['md5'];
|
||||
$date = $this->df2ds ($request[$md5]['date']);
|
||||
$md5bis = $request[$md5]['toNs'];
|
||||
if (!$date)
|
||||
return;
|
||||
$src = new schedules ($this, $request[$md5]['ns']);
|
||||
$src->load ();
|
||||
$dst = new schedules ($this, $request[$md5bis]['ns']);
|
||||
$dst->load ();
|
||||
$filter = array ();
|
||||
foreach ($src->allSchedules as $id => $schedule)
|
||||
if (($schedule->to ? $schedule->to : $schedule->from) < $date)
|
||||
$filter [$id] = $schedule;
|
||||
foreach ($filter as $id => $schedule) {
|
||||
$dst->addSchedule ($schedule);
|
||||
$src->removeSchedule ($id);
|
||||
}
|
||||
$dst->writeSchedules ();
|
||||
$src->writeSchedules ();
|
||||
|
||||
unset ($_REQUEST['schd']);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function printForm () {
|
||||
if (!$this->isAdmin)
|
||||
return;
|
||||
$list = $this->readAllSchedules ();
|
||||
echo
|
||||
'<form method="POST" action="" onSubmit="return false;" >'.NL.
|
||||
' <table class="admin" >'.NL.
|
||||
' <thead>'.NL.
|
||||
// XXX getLang ()
|
||||
' <tr><th>Description</th><th>Valeurs</th></tr>'.NL.
|
||||
' </thead>'.NL.
|
||||
' <tbody>'.NL;
|
||||
$this->resetOddEven ();
|
||||
foreach ($list as $md5 => $item) {
|
||||
$nameSpace = $item ["nameSpace"];
|
||||
$schedules = $item ["schedules"];
|
||||
echo
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">NameSpace</td>'.NL.
|
||||
' <td class="value"><input type="hidden" name="schd['.$md5.'][ns]" value="'.$nameSpace.'"/>'.$nameSpace.'</td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">MD5</td>'.NL.
|
||||
' <td class="value">'.$md5.'</td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">Members</td>'.NL.
|
||||
' <td class="value">'.count ($schedules->memberSchedules).'</td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">Events</td>'.NL.
|
||||
' <td class="value">'.count ($schedules->datedSchedules).'</td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">Repeated</td>'.NL.
|
||||
' <td class="value">'.count ($schedules->repeatedSchedules).'</td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">Date</td>'.NL.
|
||||
' <td><input type="text" name="schd['.$md5.'][date]" value="'.'" placeholder="'.$this->plugin->getLang ('rootMoveDatePH').'"/></td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">Vers</td>'.NL.
|
||||
' <td><select name="schd['.$md5.'][toNs]"/>'.NL;
|
||||
foreach ($list as $md5bis => $itemBis)
|
||||
if ($md5bis != $md5)
|
||||
echo
|
||||
' <option value="'.$md5bis.'">'.$itemBis["nameSpace"].'</option>'.NL;
|
||||
echo
|
||||
' </select></td>'.NL.
|
||||
' </tr>'.NL.
|
||||
' <tr class="'.$this->getOddEven ().'">'.NL.
|
||||
' <td class="name">Action</td>'.NL.
|
||||
' <td><input type="submit" name="action" value="moveSchedules" onClick="scheduleAjax(this.form,\'moveSchedules\',\''.$md5.'\')" /></td>'.NL.
|
||||
' </tr>'.NL;
|
||||
$this->switchOddEven ();
|
||||
}
|
||||
echo
|
||||
' </tbody>'.NL.
|
||||
' </table>'.NL.
|
||||
'</form>'.NL;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function readAllSchedules () {
|
||||
$exclude_array = explode ("|", ".|..");
|
||||
if (!is_dir($this->dataRootDir))
|
||||
return;
|
||||
$pathDirObj = opendir ($this->dataRootDir);
|
||||
while (false !== ($file = readdir ($pathDirObj))) {
|
||||
$subDir = $this->dataRootDir.$file.'/';
|
||||
if (in_array (strtolower ($file), $exclude_array) || !is_dir ($subDir))
|
||||
continue;
|
||||
$list [$file] = $this->readConfig ($subDir);
|
||||
$list [$file]["schedules"] = new schedules ($this, $list [$file]["nameSpace"]);
|
||||
$list [$file]["schedules"]->load ();
|
||||
}
|
||||
uasort ($list, "cmpScheduleConfig");
|
||||
return $list;
|
||||
}
|
||||
|
||||
function clearCache () {
|
||||
$list = $this->readAllSchedules ();
|
||||
foreach ($list as $md5 => $item) {
|
||||
$schedules = $item ["schedules"];
|
||||
$schedules->clearCache ();
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
}
|
1663
schedules.class.php
Normal file
79
script.js
Normal file
@ -0,0 +1,79 @@
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Javascript functionality for the include plugin
|
||||
*/
|
||||
|
||||
/* DOKUWIKI:include_once lib/scheduleForm.js */
|
||||
/* DOKUWIKI:include_once lib/scheduleTable.js */
|
||||
/* DOKUWIKI:include_once ../ol3/script.js */
|
||||
/* DOKUWIKI:include_once lib/scheduleCitiesMap.js */
|
||||
|
||||
// ========================================
|
||||
// Ajax function
|
||||
// ========================================
|
||||
/* Clear popup message */
|
||||
function scheduleClearMsgJ (item) {
|
||||
item.closest ("div").find ("div.popup").each (function () {
|
||||
jQuery (this).remove ();
|
||||
});
|
||||
}
|
||||
|
||||
function scheduleClearCache (action, ns) {
|
||||
jQuery.ajax ({
|
||||
type: "POST",
|
||||
url: DOKU_BASE+"lib/plugins/schedule/ajaxClearCache.php",
|
||||
//success: function (response) { alert (response); },
|
||||
cache: true,
|
||||
async: true,
|
||||
data: "schedule[action]="+action+"&schedule[ns]="+ns
|
||||
});
|
||||
}
|
||||
|
||||
/* performe ajax request to swap month */
|
||||
function scheduleAjax (form, action, md5) {
|
||||
var params = "";
|
||||
// XXX jquery
|
||||
for (var idx = 0; idx < form.elements.length; idx++) {
|
||||
var elem = form.elements[idx];
|
||||
if (elem.type == "checkbox") {
|
||||
if (elem.checked)
|
||||
params += "&"+elem.name+"="+elem.value;
|
||||
} else if (elem.type == "select" || elem.type == "select-multiple") {
|
||||
while (elem.options.selectedIndex >= 0) {
|
||||
opt = elem.options [elem.options.selectedIndex];
|
||||
params += "&"+elem.name+"="+opt.text;
|
||||
elem.options [elem.options.selectedIndex] = null;
|
||||
}
|
||||
} else
|
||||
params += "&"+elem.name+"="+elem.value;
|
||||
}
|
||||
params += "&schd[action]="+action+"&schd[md5]="+md5;
|
||||
|
||||
scheduleSend (form,
|
||||
DOKU_BASE+"lib/plugins/schedule/ajax.php",
|
||||
params);
|
||||
return false;
|
||||
}
|
||||
|
||||
function scheduleSend (sender, uri, params) {
|
||||
var jDiv = jQuery (sender).closest ("div");
|
||||
scheduleClearMsgJ (jDiv);
|
||||
jQuery ('<div class="popup">'+LANG["plugins"]["schedule"]["pleaseWait"]+'</div>').
|
||||
insertBefore (jDiv.children ().first ());
|
||||
jQuery.ajax ({
|
||||
type: "POST",
|
||||
url: uri,
|
||||
cache: false,
|
||||
async: true,
|
||||
data: params,
|
||||
success: function (response) {
|
||||
jDiv.html (response);
|
||||
scheduleInitMaps ();
|
||||
scheduleInitPOI ();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ========================================
|
528
style.css
Normal file
@ -0,0 +1,528 @@
|
||||
/*
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois <dokuplugin@merciol.fr>
|
||||
*/
|
||||
|
||||
div.schedule {
|
||||
margin: 1em;
|
||||
}
|
||||
|
||||
div.schedule table {
|
||||
border: 0 none;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
div.schedule table th, div.schedule table th {
|
||||
border: 0 none;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
div.schedule table.admin {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
div.schedule table.admin tr {
|
||||
border: 0 none;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
margin: 0 4px;
|
||||
padding: 0 4px;
|
||||
}
|
||||
div.schedule table.admin tr.even {
|
||||
background-color: #DDD;
|
||||
}
|
||||
div.schedule table.admin tr td.name {
|
||||
text-align: right;
|
||||
}
|
||||
div.schedule table.admin tr td.value {
|
||||
text-align: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
div.schedule table.admin tr td input {
|
||||
width: 100%;
|
||||
}
|
||||
div.schedule table.admin select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
div.schedule table.long {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
div.schedule table.long tr.odd {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
div.schedule table.long tr.even {
|
||||
vertical-align: middle;
|
||||
background-color: #DDD;
|
||||
}
|
||||
|
||||
div.schedule table.long tr th,
|
||||
div.schedule table.long tr td {
|
||||
border: 0 none;
|
||||
text-align: center;
|
||||
margin: 0 4px;
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
* Depend on "scheduleWhat" configuration
|
||||
* ======================================== */
|
||||
|
||||
div.schedule table.long tr.cat_a td.what {
|
||||
padding-left: 20px;
|
||||
background-image: url("images/bul_a.png");
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
div.schedule table.long tr.cat_b td.what {
|
||||
padding-left: 20px;
|
||||
background-image: url("images/bul_b.png");
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
div.schedule table.long tr.cat_c td.what {
|
||||
padding-left: 20px;
|
||||
background-image: url("images/bul_c.png");
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
div.schedule table.short {
|
||||
margin: auto;
|
||||
border: 0 none;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
div.schedule table.short th, div.schedule table.short td {
|
||||
border: 0 none;
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
div.schedule table.short td a {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.schedule table.short td.week {
|
||||
margin: 2px 0;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
div.schedule table.short td.empty {
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
div.schedule table.short td.weekend {
|
||||
background-color: #CCC;
|
||||
}
|
||||
div.schedule table.short td.outofscope {
|
||||
text-decoration: overline line-through underline;
|
||||
background-color: #888;
|
||||
color: #666;
|
||||
}
|
||||
div.schedule table.short td.free {
|
||||
background-color: white;
|
||||
}
|
||||
|
||||
div.schedule table.short caption {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
div.schedule table.short caption.scheduleShow {
|
||||
border: 2px solid orange;
|
||||
}
|
||||
div.schedule table.short caption.scheduleToday {
|
||||
border: 2px solid red;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
* Depend on "scheduleWhat" configuration
|
||||
* ======================================== */
|
||||
|
||||
div.schedule table.short td.cat_a {
|
||||
font-weight: bold;
|
||||
background: url("images/cat_a.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.cat_b {
|
||||
background: url("images/cat_b.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.cat_c {
|
||||
background: url("images/cat_c.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.cat_ab {
|
||||
background: url("images/cat_ab.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.cat_ac {
|
||||
background: url("images/cat_ac.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.cat_bc {
|
||||
background: url("images/cat_bc.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.cat_abc {
|
||||
background: url("images/cat_abc.png") repeat;
|
||||
}
|
||||
|
||||
div.schedule table.short td.op_1 {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
div.schedule table.short td.op_2 {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
div.schedule table.short td.op_3 {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
*
|
||||
* ======================================== */
|
||||
div.schedule .popup {
|
||||
position: absolute;
|
||||
top: auto;
|
||||
left: auto;
|
||||
width: auto;
|
||||
height: auto;
|
||||
margin: 1em;
|
||||
padding: 1em;
|
||||
overflow: visible;
|
||||
z-index: 1000;
|
||||
opacity: 0.7;
|
||||
background: #EDDB31;
|
||||
color: black;
|
||||
border: 1px solid #AE090D;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.bubble img {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
div.bubble a,
|
||||
div.bubble a:visited,
|
||||
div.bubble a:hover,
|
||||
div.bubble a:active,
|
||||
div.bubble a:link {
|
||||
/*cursor: pointer;*/
|
||||
display: block;
|
||||
text-decoration: none ! important;
|
||||
font-weight: bold;
|
||||
color: #AE090D ! important;
|
||||
}
|
||||
|
||||
div.bubble div.date {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
div.bubble div.odd {
|
||||
background-color: #FDD ! important;
|
||||
padding: 0 4px;
|
||||
}
|
||||
div.bubble div.even {
|
||||
background-color: #FE5 ! important;
|
||||
padding: 0 4px;
|
||||
}
|
||||
|
||||
div.schedule table.short caption div div.bubble,
|
||||
div.schedule table.short td div.bubble {
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
opacity: 0.8;
|
||||
background: #EDDB31; /* Définition du fond, sinon on a le même que notre lien */
|
||||
color: black;
|
||||
border: 1px solid #AE090D; /* Définition des bordures */
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
padding: 0;
|
||||
font-size: 75%;
|
||||
top: auto;
|
||||
overflow: visible;
|
||||
width: 16em;
|
||||
height: auto;
|
||||
margin-top: 1em;
|
||||
|
||||
display: none;
|
||||
}
|
||||
|
||||
div.schedule table.short div.leftBubble {
|
||||
left: -13em;
|
||||
}
|
||||
|
||||
div.schedule table.short div.rightBubble {
|
||||
left: 18em;
|
||||
}
|
||||
|
||||
/* Rend visible tout notre bloc bubble et lui attribue une taille */
|
||||
div.schedule .showBubbleOnFocus:hover div.bubble,
|
||||
div.schedule .showBubbleOnFocus:focus div.bubble,
|
||||
div.schedule .showBubbleOnFocus:active div.bubble {
|
||||
display: block;
|
||||
}
|
||||
div.schedule table.short td div.bubble a img {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
div.schedule table.short div.over {
|
||||
position: absolute;
|
||||
top: auto;
|
||||
left: auto;
|
||||
z-index: 900;
|
||||
}
|
||||
|
||||
div.schedule table.short td div.past {
|
||||
font-weight: bold;
|
||||
color: #FFF;
|
||||
background-color: #444;
|
||||
opacity: 0.7;
|
||||
margin: 0 0 0 3px !important;
|
||||
}
|
||||
|
||||
div.schedule table.short td div.scheduleToday {
|
||||
opacity: 1;
|
||||
z-index: 3;
|
||||
font-weight: bold;
|
||||
margin: -3px -4px 0 0;
|
||||
border: 3px solid red;
|
||||
padding: 0;
|
||||
color: black;
|
||||
}
|
||||
|
||||
div.schedule table.short td div.scheduleShow {
|
||||
opacity: 1;
|
||||
z-index: 3;
|
||||
font-weight: bold;
|
||||
margin: -3px -4px 0 0;
|
||||
border: 3px solid orange;
|
||||
padding: 0;
|
||||
color: black;
|
||||
}
|
||||
|
||||
div.schedule table.short td div.mapSelect {
|
||||
z-index: 4;
|
||||
font-weight: bold;
|
||||
margin: -3px -4px 0 0;
|
||||
border: 3px solid #F0F;
|
||||
padding: 0;
|
||||
color: #F0F;
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
form.scheduleCitiesForm input {
|
||||
width: 26em;
|
||||
}
|
||||
|
||||
div.schedule table.form select,
|
||||
div.schedule table.form input {
|
||||
font-size: 100%;
|
||||
}
|
||||
|
||||
div.scheduleTabForm textarea {
|
||||
width: 100%;
|
||||
height: 5em;
|
||||
}
|
||||
|
||||
div.scheduleTabForm input.lat {
|
||||
width: 4em;
|
||||
}
|
||||
div.scheduleTabForm input.lon {
|
||||
width: 4em;
|
||||
}
|
||||
|
||||
div.scheduleTabForm input.date {
|
||||
width: 6em;
|
||||
}
|
||||
div.scheduleTabForm input.where {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.scheduleTabForm input.hour {
|
||||
width: 10em;
|
||||
}
|
||||
|
||||
div.scheduleTabForm input.repeat {
|
||||
width: 2em;
|
||||
}
|
||||
|
||||
div.scheduleTabForm td.repeat {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.scheduleTabForm div >* {
|
||||
vertical-align: top;
|
||||
}
|
||||
div.scheduleTabForm p >* {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
div.scheduleTabForm img.checked {
|
||||
height: 16px;
|
||||
background-image: url("images/poi.png"); /* poi.png */
|
||||
background-size: 10px 16px;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
div.scheduleTabForm li:hover img.checked {
|
||||
background-image: url("images/poiRed.png"); /* selectedPoi.gif */
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
|
||||
.ui-accordion .ui-accordion-content {
|
||||
height: auto !important;
|
||||
}
|
||||
|
||||
.scheduleCitiesForm ul {
|
||||
/*padding: 0 !important;*/
|
||||
margin: 0 !important;
|
||||
}
|
||||
.scheduleCitiesForm ul li {
|
||||
margin-left: 20px;
|
||||
}
|
||||
.scheduleCitiesForm ul img {
|
||||
margin-left: -20px;
|
||||
}
|
||||
|
||||
.scheduleCitiesForm .ui-widget>* {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.scheduleCitiesForm div>div {
|
||||
vertical-align: top;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.scheduleCitiesForm .cities {
|
||||
min-height: 4em;
|
||||
max-height: 4em;
|
||||
overflow-y: scroll;
|
||||
overflow-x:hidden;
|
||||
border-style: solid;
|
||||
border-color: grey;
|
||||
border-width: 1px;
|
||||
padding: 1px;
|
||||
}
|
||||
|
||||
.scheduleCitiesForm .cities li {
|
||||
list-style-type:none;
|
||||
}
|
||||
|
||||
.scheduleCitiesForm .unknown {
|
||||
background-color: #FDD;
|
||||
}
|
||||
|
||||
div.schedule table.short div.tabSelect {
|
||||
position: absolute;
|
||||
top: auto;
|
||||
left: auto;
|
||||
z-index: 900;
|
||||
margin-top: -16px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
min-width: 16px;
|
||||
min-height: 16px;
|
||||
background-image: url("images/cat_c.gif"); /* selectedPoi.gif */
|
||||
background-size: 10px 16px;
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
.schedule .scheduleMap {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
}
|
||||
|
||||
.schedule div.olControlPanZoom {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scheduleScaledMap .scheduleMap {
|
||||
width: 200px;
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
.scheduleScaledMap div.olControlPanZoom {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
div.scheduleMap div.olControlAttribution,
|
||||
div.scheduleMap div.olControlScaleLine {
|
||||
font-family: Verdana;
|
||||
font-size: 0.5em;
|
||||
right: 1px;
|
||||
bottom: 1px;
|
||||
}
|
||||
|
||||
ul.ui-autocomplete {
|
||||
max-height: 10em;
|
||||
overflow-y:scroll;
|
||||
overflow-x:hidden;
|
||||
}
|
||||
|
||||
.poiPinPush {
|
||||
background-image: url("images/cat_ab.png"); /* poi.png */
|
||||
opacity: 0.6;
|
||||
}
|
||||
.poiPinPop {
|
||||
background-image: url("images/cat_ac.png"); /* poi.png */
|
||||
background-size: 10px 16px;
|
||||
}
|
||||
.poiPinLight {
|
||||
background-image: url("images/cat_bc.png"); /* poi.png */
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
/* ==================== */
|
||||
.scheduleAddresse {
|
||||
width: 16em;
|
||||
max-width: 16em;
|
||||
min-height: 8em;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.proposal {
|
||||
border-width: 2px;
|
||||
border-style: solid none;
|
||||
border-color: orange;
|
||||
}
|
||||
|
||||
div.scheduleTabForm div.warningPlace {
|
||||
display: inline-block;
|
||||
}
|
||||
div.scheduleTabForm div.warning {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
div.schedule table.long tr.proposal,
|
||||
div.scheduleTabForm div.warning,
|
||||
div.scheduleTabForm a.warning,
|
||||
div.scheduleTabForm input.warning,
|
||||
div.scheduleTabForm ul.warning {
|
||||
background-image: url("images/warning.png") !important;
|
||||
background-repeat: no-repeat !important;
|
||||
}
|
||||
div.scheduleTabForm input.warning {
|
||||
border: 2px solid yellow !important;
|
||||
background-position: right center !important;
|
||||
}
|
||||
|
||||
div.scheduleAddresse {
|
||||
}
|
||||
|
||||
div.scheduleAddresse.poiAdrLight {
|
||||
background-color: #DDD;
|
||||
}
|
205
syntax/block.php
Normal file
@ -0,0 +1,205 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
*/
|
||||
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (__DIR__.'/../../../').'/');
|
||||
if (!defined ('DOKU_PLUGIN'))
|
||||
define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
|
||||
require_once(DOKU_PLUGIN.'syntax.php');
|
||||
|
||||
require_once (realpath (__DIR__.'/..').'/schedule.class.php');
|
||||
require_once (realpath (__DIR__.'/..').'/scheduleRoot.class.php');
|
||||
require_once (realpath (__DIR__.'/..').'/schedules.class.php');
|
||||
|
||||
// ============================================================
|
||||
class syntax_plugin_schedule_block extends DokuWiki_Syntax_Plugin {
|
||||
|
||||
// ============================================================
|
||||
function getType () { return 'substition'; }
|
||||
function getPType () { return 'block'; }
|
||||
function getSort () { return 299; }
|
||||
function connectTo ($mode) {
|
||||
$this->Lexer->addSpecialPattern ('\{\{schedule[^}]*\}\}', $mode, 'plugin_schedule_block');
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function handle ($match, $state, $pos, Doku_Handler $handler) {
|
||||
switch ($state) {
|
||||
case DOKU_LEXER_SPECIAL :
|
||||
return array ($state, trim (substr ($match, 10, -2))); // "{{schedule" => 10 "}}" => 2
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
var $scheduleRoot;
|
||||
var $schedules;
|
||||
|
||||
// ============================================================
|
||||
function render ($mode, Doku_Renderer $renderer, $indata) {
|
||||
$dumy = "";
|
||||
if (empty($indata))
|
||||
return false;
|
||||
if ($mode != 'xhtml')
|
||||
return false;
|
||||
list ($instr, $data) = $indata;
|
||||
switch ($instr) {
|
||||
case DOKU_LEXER_SPECIAL :
|
||||
$args = " ".$data." ";
|
||||
if (preg_match_all ("#(\"[^\"]*\")* help (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) {
|
||||
$renderer->doc .= $this->scheduleHelp ();
|
||||
return true;
|
||||
}
|
||||
|
||||
$this->scheduleRoot = new scheduleRoot ($this);
|
||||
|
||||
if (preg_match_all ("#(\"[^\"]*\")* admin (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) {
|
||||
ob_start ();
|
||||
echo '<div class="schedule">'.NL;
|
||||
$this->scheduleRoot->manageAction ($_REQUEST['schd']);
|
||||
$this->scheduleRoot->printForm ();
|
||||
echo ' </div>';
|
||||
$text = ob_get_contents ();
|
||||
ob_end_clean ();
|
||||
foreach ($this->scheduleRoot->message as $type => $msg)
|
||||
$text = '<div class="'.$type.'">'.$msg.'</div>'.$text;
|
||||
$renderer->doc .= $text;
|
||||
return true;
|
||||
}
|
||||
|
||||
// namespace
|
||||
global $ID;
|
||||
$ns = getNS ($ID);
|
||||
if (preg_match_all ("#^ >([^ ]*) (.*)#", $args, $dumy) > 0) {
|
||||
$ns = $dumy[1][0];
|
||||
$args = ' '.$dumy[2][0];
|
||||
if (($ns == '*') || ($ns == ':'))
|
||||
$ns = '';
|
||||
elseif ($ns == '.')
|
||||
$ns = getNS ($ID);
|
||||
else
|
||||
$ns = cleanID ($ns);
|
||||
}
|
||||
$mapId = "";
|
||||
if (preg_match_all ('/("[^"]*")* id="(?<id>[0-9a-zA-Z_]+)" ("[^"]*")*/', strtolower ($args), $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['id']); $i++)
|
||||
$mapId = $dumy ['id'][$i];
|
||||
$this->schedules = new schedules ($this->scheduleRoot, $ns);
|
||||
$renderer->info ['cache'] = FALSE;
|
||||
$request = false;
|
||||
global $_REQUEST;
|
||||
if ((isset ($_REQUEST['schd']) && isset ($_REQUEST['schd']['ns']) && $_REQUEST['schd']['ns'] == $ns) ||
|
||||
(preg_match_all ("#(\"[^\"]*\")* (prop|form|ctrl) (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0))
|
||||
$request = true;
|
||||
if ($this->getConf ('useMap') && !is_dir (__DIR__.'/../../ol3'))
|
||||
$renderer->doc .= '<p><a href="http://www.dokuwiki.org/plugin:ol3">ol3 plugin</a> not installed (see <a href="http://www.dokuwiki.org/plugin:schedule">doc</a>)</p>';
|
||||
$cache = $this->schedules->readCache ($args);
|
||||
if ($cache) {
|
||||
$renderer->doc .= $cache;
|
||||
return true;
|
||||
}
|
||||
$this->schedules->load ();
|
||||
ob_start ();
|
||||
if (preg_match_all ("#(\"[^\"]*\")* table (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0) {
|
||||
echo '<div class="schedule">'.NL;
|
||||
$this->schedules->printScheduleCalendar (($mapId ? $mapId : "scheduleMapTable"), mktime (0, 0, 0, date ("n"), date ("j"), date ("Y")));
|
||||
echo '</div>';
|
||||
} else {
|
||||
$formLevel = 0;
|
||||
// form
|
||||
if (preg_match_all ("#(\"[^\"]*\")* prop (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0)
|
||||
$formLevel = max ($formLevel, 3);
|
||||
if (preg_match_all ("#(\"[^\"]*\")* form (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0)
|
||||
$formLevel = max ($formLevel, 2);
|
||||
if (preg_match_all ("#(\"[^\"]*\")* ctrl (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0)
|
||||
$formLevel = max ($formLevel, 1);
|
||||
$this->scheduleDateFilters ($args);
|
||||
$this->schedules->setFormLevel ($formLevel);
|
||||
if ($request)
|
||||
$this->schedules->manageAction ($_REQUEST['schd']);
|
||||
$this->scheduleOtherFilters ($args);
|
||||
$this->schedules->printScheduleList (($mapId ? $mapId : "scheduleMapList"));
|
||||
}
|
||||
$text = ob_get_contents ();
|
||||
ob_end_clean ();
|
||||
if (!$request)
|
||||
$this->schedules->writeCache ($args, $text);
|
||||
|
||||
$this->schedules->writeSchedules ();
|
||||
$this->schedules->writeProp ();
|
||||
foreach ($this->scheduleRoot->message as $type => $msg)
|
||||
$text = '<div class="'.$type.'">'.$msg.'</div>'.$text;
|
||||
$renderer->doc .= $text;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function scheduleHelp () {
|
||||
$url = "http://admin.parlenet.org/plugins/schedule/";
|
||||
return
|
||||
' <h1>Help Schedule</h1>'.NL.
|
||||
' <ul>'.NL.
|
||||
' <li><b>{{schedule</b> help <b>}}</b></li>'.NL.
|
||||
' <li><b>{{schedule</b> admin <b>}}</b></li>'.NL.
|
||||
' <li><b>{{schedule></b>nameSpace table [(<|=|>)(!|+-delta|jj/mm/aa|jj/mm/aaaa)] <b>}}</b></li>'.NL.
|
||||
' <li><b>{{schedule></b>nameSpace id="id" [(<|=|>)(!|+-delta|jj/mm/aa|jj/mm/aaaa)] [#maxLine] [prop|form|ctrl] [(member|what|audience|noMember|noWhat|noAudience)="x1,x2,..."] <b>}}</b></li>'.NL.
|
||||
' </ul>'.NL.
|
||||
' <p><a class="urlextern" rel="nofollow" title="'.$url.'" href="'.$url.'">'.$url.'</a></p>'.NL;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function scheduleDateFilters ($args) {
|
||||
$before = "";
|
||||
$date = "";
|
||||
$after = "";
|
||||
$periode = array ("<" => &$before, "=" => &$date, ">" => &$after);
|
||||
$dumy = "";
|
||||
// <! =! >!
|
||||
if (preg_match_all ("#(\"[^\"]*\")*(?<op>[<=>])!(\"[^\"]*\")*#", $args, $dumy) > 0)
|
||||
$periode [$dumy ['op'][0]] = "!";
|
||||
// <+j =+j >+j <-j =-j >-j
|
||||
if (preg_match_all ("#(\"[^\"]*\")*(?<op>[<=>])(?<delta>[+\-][0-9]*)(\"[^\"]*\")*#", $args, $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['op']); $i++)
|
||||
$periode [$dumy ['op'][$i]] = $dumy ['delta'][$i];
|
||||
// <jj/mm/aaa =jj/mm/aaa >jj/mm/aaa
|
||||
if (preg_match_all ("# (?<op>[<=>])(?<date>[0-9]{1,2}[-/][0-9]{1,2}[-/][0-9]{1,4}) #", $args, $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['op']); $i++)
|
||||
$periode [$dumy ['op'][$i]] = $dumy ['date'][$i];
|
||||
$this->schedules->setDateFilters ($before, $date, $after);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function scheduleOtherFilters ($args) {
|
||||
$max = "";
|
||||
$filterNames = array ("member", "what", "audience", "noMember", "noWhat", "noAudience");
|
||||
$filters = array ();
|
||||
$grouped = "";
|
||||
$dumy = "";
|
||||
|
||||
// maxline
|
||||
if (preg_match_all ("/(\"[^\"]*\")*#(?<max>[0-9]+)(\"[^\"]*\")*/", strtolower ($args), $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['max']); $i++)
|
||||
$max = $dumy ['max'][$i];
|
||||
// filters
|
||||
foreach ($filterNames as $filterName) {
|
||||
if (preg_match_all ("#".$filterName."=\"(?<".$filterName.">[^\"]*)\"#", $args, $dumy) > 0) {
|
||||
$sep = "";
|
||||
for ($i = 0; $i < count ($dumy[$filterName]); $i++) {
|
||||
$filters [$filterName] .= $sep.trim (trim ($dumy[$filterName][$i]), ',');
|
||||
$sep = ',';
|
||||
}
|
||||
}
|
||||
}
|
||||
// grouped
|
||||
if (preg_match_all ("#(\"[^\"]*\")* (?<grouped>grouped|isolated) (\"[^\"]*\")*#", strtolower ($args), $dumy) > 0)
|
||||
$grouped = $dumy ['grouped'][0];
|
||||
$this->schedules->setOtherFilters ($max, $filters, $grouped);
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
}
|
136
syntax/display.php
Normal file
@ -0,0 +1,136 @@
|
||||
<?php
|
||||
/**
|
||||
* @license http://www.cecill.info/licences/Licence_CeCILL-B_V1-fr.html
|
||||
* @author Francois Merciol <dokuplugin@merciol.fr>
|
||||
*
|
||||
* Plugin Schedule: manage events per wiki @groups
|
||||
*/
|
||||
|
||||
if (!defined ('DOKU_INC'))
|
||||
define ('DOKU_INC', realpath (__DIR__.'/../../../').'/');
|
||||
if (!defined ('DOKU_PLUGIN'))
|
||||
define ('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
|
||||
require_once(DOKU_PLUGIN.'syntax.php');
|
||||
|
||||
require_once (realpath (__DIR__.'/..').'/scheduleInseeCities.php');
|
||||
|
||||
// ============================================================
|
||||
class syntax_plugin_schedule_display extends DokuWiki_Syntax_Plugin {
|
||||
|
||||
// ============================================================
|
||||
function getInfo() {
|
||||
return confToHash (__DIR__.'/../INFO.txt');
|
||||
}
|
||||
function getType () { return 'substition'; }
|
||||
function getPType () { return 'block'; }
|
||||
function getSort () { return 299; }
|
||||
function connectTo ($mode) {
|
||||
$this->Lexer->addEntryPattern ('<schedule[^>]*>', $mode, 'plugin_schedule_display');
|
||||
}
|
||||
function postConnect () {
|
||||
$this->Lexer->addExitPattern ('</schedule>', 'plugin_schedule_display');
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function handle ($match, $state, $pos, Doku_Handler $handler) {
|
||||
switch ($state) {
|
||||
case DOKU_LEXER_ENTER:
|
||||
return array ($state, trim (substr ($match, 8, -1))); // "<schedule" => 8 ">" => 1
|
||||
case DOKU_LEXER_UNMATCHED:
|
||||
return array ($state, $match);
|
||||
case DOKU_LEXER_EXIT:
|
||||
return array ($state, '');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
function render ($mode, Doku_Renderer $renderer, $indata) {
|
||||
if (empty($indata))
|
||||
return false;
|
||||
if ($mode != 'xhtml')
|
||||
return false;
|
||||
list ($instr, $data) = $indata;
|
||||
switch ($instr) {
|
||||
|
||||
case DOKU_LEXER_ENTER :
|
||||
$args = strtolower (" ".$data." ");
|
||||
$mapId = "scheduleMapPOI";
|
||||
$width = "";
|
||||
$height = "";
|
||||
if (preg_match_all ('/("[^"]*")* id="(?<id>[0-9a-zA-Z_]+)" ("[^"]*")*/', $args, $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['id']); $i++)
|
||||
$mapId = $dumy ['id'][$i];
|
||||
if (preg_match_all ('/.* width=(?<width>[0-9]+) .*/', $args, $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['width']); $i++)
|
||||
$width=' width="'.$dumy ['width'][$i].'"';
|
||||
if (preg_match_all ('/.* height=(?<height>[0-9]+) .*/', $args, $dumy) > 0)
|
||||
for ($i = 0; $i < count ($dumy['height']); $i++)
|
||||
$height=' height="'.$dumy ['height'][$i].'"';
|
||||
$renderer->doc .=
|
||||
'<div class="wrap_left plugin_wrap">'.NL.
|
||||
' <div class="schedulePOI scheduleScaledMap">'.NL;
|
||||
if ($this->getConf ('useMap')) {
|
||||
if (!is_dir (realpath (__DIR__.'/../../ol3')))
|
||||
$renderer->doc .= '<p><a href="http://www.dokuwiki.org/plugin:ol3">ol3 plugin</a> not installed (see <a href="http://www.dokuwiki.org/plugin:schedule">doc</a>)</p>';
|
||||
$renderer->doc .= ' <div id="'.$mapId.'" class="scheduleMap scheduleMapDisplay"'.$width.$height.'></div>'.NL;
|
||||
}
|
||||
break;
|
||||
|
||||
case DOKU_LEXER_UNMATCHED :
|
||||
$data = trim ($data);
|
||||
$address ="";
|
||||
if ($this->getConf ('useMap'))
|
||||
$renderer->doc .= '<span class="wrap_tip wrap_center wrap_centeralign">'.$this->getLang ('reactiveMap').'</span>'.NL;
|
||||
$renderer->doc .= ' <ul style="display:none;" class="poiLatLon">'.NL;
|
||||
|
||||
global $scheduleInseeCities;
|
||||
if (! empty ($data))
|
||||
foreach (explode ("\n", preg_replace ('%~[eE][nN][dD]~%', "\n", $data)) as $line) {
|
||||
$line = trim (preg_replace ("/#.*$/", "", $line));
|
||||
if (!$line)
|
||||
continue;
|
||||
$line = preg_replace ("#\s+\|#", "|", $line);
|
||||
$line = preg_replace ("#\|\s+#", "|", $line);
|
||||
$line = trim ($line,'|');
|
||||
list ($insee, $lat, $lon, $addr, $occ) = explode ("|", $line);
|
||||
// XXX vérif des formats (nombres, ...)
|
||||
if (!$insee || !$lon) {
|
||||
if ($insee && $lat)
|
||||
$renderer->doc .= ' <li lat="'.$insee.'" lon="'.$lat.'">56000</li>'.NL; // XXX position par defaut
|
||||
continue;
|
||||
}
|
||||
if ($insee && $lat && $lon) {
|
||||
$iter=$occ?$occ:1;
|
||||
for ($i = 1; $i <= $iter; $i++)
|
||||
$renderer->doc .= ' <li lat="'.$lat.'" lon="'.$lon.'">'.$insee.'</li>'.NL;
|
||||
}
|
||||
$addrHtml =
|
||||
($addr ?
|
||||
preg_replace ('%\\\\\\\\%', "<br/>", preg_replace ('%~[bB][rR]~%', "<br/>", $addr)) :
|
||||
'<span class="wrap_round wrap_todo">'.$this->lang ('toComplet').'</span><br/>').' '.
|
||||
// XXX all insee ???
|
||||
(isset ($scheduleInseeCities[$insee]) ? $scheduleInseeCities[$insee][0] : $insee).'<br/>'.
|
||||
(($addr && $lat && $lon) ?
|
||||
'<span style="font-size:50%; background-color:#DDD;">(Lat. : '.$lat.' Long. : '.$lon.')</span>' :
|
||||
'');
|
||||
$address .=
|
||||
'<div class="scheduleAddresse wrap_left plugin_wrap" location="('.$lat.'|'.$lon.')">'.NL.
|
||||
' <p onMouseOver="javascript:scheduleHighlightLocation (\'('.$lat.'|'.$lon.')\')" onMouseOut="javascript:scheduleHighlightLocation (null)">'.$addrHtml.' </p>'.NL.
|
||||
'</div>'.NL;
|
||||
}
|
||||
$renderer->doc .=
|
||||
' </ul>'.NL.
|
||||
' </div>'.NL.
|
||||
'</div>'.NL.
|
||||
$address.
|
||||
'<div class="wrap_clear plugin_wrap"></div>'.NL;
|
||||
break;
|
||||
case DOKU_LEXER_EXIT :
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
}
|