diff --git a/INSTALL.md b/INSTALL.md index d213aec..bff3671 100755 --- a/INSTALL.md +++ b/INSTALL.md @@ -10,9 +10,16 @@ Diese Anleitung geht davon aus das du SSH-Zugriff auf deinen Server hast. Wenn du Calcifer auf einem Shared-Hosting-Anbieter installieren willst, so ist dies auch möglich, aber etwas komplizierter und wird irgendwann später beschrieben. - 1. Das [Repo](https://phablab.krautspace.de/diffusion/C/calcifer.git) irgendwo hin clonen - 2. In das calcifer Verzeichnis wechseln. - 3. composer install - 4. Im Verzeichnis app/config die Datei parameters.yml.dist nach parameters.yml kopieren und anpassen. - 5. Dann die Tabellen erstellen: php app/console doctrine:schema:create - 6. Zum Schluss must du noch deinen Webserver [konfigurieren](http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html) und dann ist calcifer auch schon erreichbar. \ No newline at end of file +1. Das [Repo](https://phablab.krautspace.de/diffusion/C/calcifer.git) irgendwo hin clonen +2. In das calcifer Verzeichnis wechseln. +3. Abhängigkeiten installieren + 1. composer herunterladen ```curl -sS https://getcomposer.org/installer | php``` + 2. Installation ausführen: ```php composer.phar install``` + - für PostgreSQL wähl pdo_pgsql als Datenbanktreiber + - für MySQL wähle pdo_mysql als Datenbanktreiber + - für SQLite ist pdo_sqlite zu nutzen, dabei ist der Pfad anzugeben. Der Standardpfad legt die Datei calcifer.sqlite3 im Verzeichnis app an. +5. Dann die Tabellen erstellen: ```php app/console doctrine:schema:update --force``` +6. Cache löschen ```php app/console cache:clear --env=prod --no-debug``` +7. Assets dumpen ```php app/console assetic:dump --env=prod --no-debug``` +8. Einen täglichen Cronjob anlegen, der die wiederholenden Termine anlegt: ```php app/console calcifer:events:generate``` +6. Zum Schluss must du noch deinen Webserver [konfigurieren](http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html) und dann ist calcifer auch schon erreichbar. diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php index ed00a6f..25bc938 100644 --- a/app/SymfonyRequirements.php +++ b/app/SymfonyRequirements.php @@ -602,6 +602,12 @@ class SymfonyRequirements extends RequirementCollection 'Install and enable the XML extension.' ); + $this->addRecommendation( + function_exists('filter_var'), + 'filter_var() should be available', + 'Install and enable the filter extension.' + ); + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { $this->addRecommendation( function_exists('posix_isatty'), @@ -662,7 +668,7 @@ class SymfonyRequirements extends RequirementCollection $this->addRecommendation( $accelerator, 'a PHP accelerator should be installed', - 'Install and enable a PHP accelerator like APC (highly recommended).' + 'Install and/or enable a PHP accelerator (highly recommended).' ); if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { diff --git a/app/check.php b/app/check.php index 91b826b..bb0a20e 100644 --- a/app/check.php +++ b/app/check.php @@ -2,61 +2,141 @@ require_once dirname(__FILE__).'/SymfonyRequirements.php'; +$lineSize = 70; $symfonyRequirements = new SymfonyRequirements(); - $iniPath = $symfonyRequirements->getPhpIniConfigPath(); -echo "********************************\n"; -echo "* *\n"; -echo "* Symfony requirements check *\n"; -echo "* *\n"; -echo "********************************\n\n"; +echo_title('Symfony2 Requirements Checker'); -echo $iniPath ? sprintf("* Configuration file used by PHP: %s\n\n", $iniPath) : "* WARNING: No configuration file (php.ini) used by PHP!\n\n"; - -echo "** ATTENTION **\n"; -echo "* The PHP CLI can use a different php.ini file\n"; -echo "* than the one used with your web server.\n"; -if ('\\' == DIRECTORY_SEPARATOR) { - echo "* (especially on the Windows platform)\n"; +echo '> PHP is using the following php.ini file:'.PHP_EOL; +if ($iniPath) { + echo_style('green', ' '.$iniPath); +} else { + echo_style('warning', ' WARNING: No configuration file (php.ini) used by PHP!'); } -echo "* To be on the safe side, please also launch the requirements check\n"; -echo "* from your web server using the web/config.php script.\n"; -echo_title('Mandatory requirements'); +echo PHP_EOL.PHP_EOL; -$checkPassed = true; +echo '> Checking Symfony requirements:'.PHP_EOL.' '; + +$messages = array(); foreach ($symfonyRequirements->getRequirements() as $req) { /** @var $req Requirement */ - echo_requirement($req); - if (!$req->isFulfilled()) { - $checkPassed = false; + if ($helpText = get_error_message($req, $lineSize)) { + echo_style('red', 'E'); + $messages['error'][] = $helpText; + } else { + echo_style('green', '.'); } } -echo_title('Optional recommendations'); +$checkPassed = empty($messages['error']); foreach ($symfonyRequirements->getRecommendations() as $req) { - echo_requirement($req); + if ($helpText = get_error_message($req, $lineSize)) { + echo_style('yellow', 'W'); + $messages['warning'][] = $helpText; + } else { + echo_style('green', '.'); + } } +if ($checkPassed) { + echo_block('success', 'OK', 'Your system is ready to run Symfony2 projects', true); +} else { + echo_block('error', 'ERROR', 'Your system is not ready to run Symfony2 projects', true); + + echo_title('Fix the following mandatory requirements', 'red'); + + foreach ($messages['error'] as $helpText) { + echo ' * '.$helpText.PHP_EOL; + } +} + +if (!empty($messages['warning'])) { + echo_title('Optional recommendations to improve your setup', 'yellow'); + + foreach ($messages['warning'] as $helpText) { + echo ' * '.$helpText.PHP_EOL; + } +} + +echo PHP_EOL; +echo_style('title', 'Note'); +echo ' The command console could use a different php.ini file'.PHP_EOL; +echo_style('title', '~~~~'); +echo ' than the one used with your web server. To be on the'.PHP_EOL; +echo ' safe side, please check the requirements from your web'.PHP_EOL; +echo ' server using the '; +echo_style('yellow', 'web/config.php'); +echo ' script.'.PHP_EOL; +echo PHP_EOL; + exit($checkPassed ? 0 : 1); -/** - * Prints a Requirement instance - */ -function echo_requirement(Requirement $requirement) +function get_error_message(Requirement $requirement, $lineSize) { - $result = $requirement->isFulfilled() ? 'OK' : ($requirement->isOptional() ? 'WARNING' : 'ERROR'); - echo ' ' . str_pad($result, 9); - echo $requirement->getTestMessage() . "\n"; - - if (!$requirement->isFulfilled()) { - echo sprintf(" %s\n\n", $requirement->getHelpText()); + if ($requirement->isFulfilled()) { + return; } + + $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL; + $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL; + + return $errorMessage; } -function echo_title($title) +function echo_title($title, $style = null) { - echo "\n** $title **\n\n"; + $style = $style ?: 'title'; + + echo PHP_EOL; + echo_style($style, $title.PHP_EOL); + echo_style($style, str_repeat('~', strlen($title)).PHP_EOL); + echo PHP_EOL; +} + +function echo_style($style, $message) +{ + // ANSI color codes + $styles = array( + 'reset' => "\033[0m", + 'red' => "\033[31m", + 'green' => "\033[32m", + 'yellow' => "\033[33m", + 'error' => "\033[37;41m", + 'success' => "\033[37;42m", + 'title' => "\033[34m", + ); + $supports = has_color_support(); + + echo ($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); +} + +function echo_block($style, $title, $message) +{ + $message = ' '.trim($message).' '; + $width = strlen($message); + + echo PHP_EOL.PHP_EOL; + + echo_style($style, str_repeat(' ', $width).PHP_EOL); + echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL); + echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL); + echo_style($style, str_repeat(' ', $width).PHP_EOL); +} + +function has_color_support() +{ + static $support; + + if (null === $support) { + if (DIRECTORY_SEPARATOR == '\\') { + $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); + } else { + $support = function_exists('posix_isatty') && @posix_isatty(STDOUT); + } + } + + return $support; } diff --git a/app/config/config.yml b/app/config/config.yml index ad67c1d..a9fdf65 100755 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -60,7 +60,7 @@ doctrine: charset: UTF8 # if using pdo_sqlite as your database driver, add the path in parameters.yml # e.g. database_path: "%kernel.root_dir%/data/data.db3" - # path: "%database_path%" + path: "%database_path%" orm: auto_generate_proxy_classes: "%kernel.debug%" diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist old mode 100644 new mode 100755 index ebdabb5..64d8e1c --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -5,6 +5,7 @@ parameters: database_name: symfony database_user: root database_password: ~ + database_path: "%kernel.root_dir%/calcifer.sqlite3" mailer_transport: smtp mailer_host: 127.0.0.1 diff --git a/composer.json b/composer.json index 3ee53f9..4823ea7 100755 --- a/composer.json +++ b/composer.json @@ -33,7 +33,7 @@ "incenteev/composer-parameter-handler": "~2.0", "jquery/jquery": "1.10.*", "knplabs/knp-markdown-bundle": "~1.3", - "jsvrcek/ics": "dev-master", + "enko/ics": "~0.1", "doctrine/migrations": "dev-master", "doctrine/doctrine-migrations-bundle": "dev-master", "jbroadway/urlify" : "~1.0" diff --git a/composer.lock b/composer.lock index db1aac7..d3cb91e 100755 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "a72c02cc5e14c865991a846b5bac02fb", + "hash": "77745a3287830b815f677d20df33b385", "packages": [ { "name": "doctrine/annotations", @@ -444,12 +444,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git", - "reference": "f7138381aa884c0f679da4de41e369b94ead9cd3" + "reference": "81575a4316951125ce408c70f30547c77d98f78a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/f7138381aa884c0f679da4de41e369b94ead9cd3", - "reference": "f7138381aa884c0f679da4de41e369b94ead9cd3", + "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/81575a4316951125ce408c70f30547c77d98f78a", + "reference": "81575a4316951125ce408c70f30547c77d98f78a", "shasum": "" }, "require": { @@ -474,12 +474,6 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" @@ -487,6 +481,10 @@ { "name": "Doctrine Project", "homepage": "http://www.doctrine-project.org" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "Symfony DoctrineMigrationsBundle", @@ -496,7 +494,7 @@ "migrations", "schema" ], - "time": "2014-03-20 14:48:55" + "time": "2014-08-17 07:53:47" }, { "name": "doctrine/inflector", @@ -620,12 +618,12 @@ "source": { "type": "git", "url": "https://github.com/doctrine/migrations.git", - "reference": "4256449c5e2603a6b6ee5a78c7c4521d4d4430b8" + "reference": "1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/migrations/zipball/4256449c5e2603a6b6ee5a78c7c4521d4d4430b8", - "reference": "4256449c5e2603a6b6ee5a78c7c4521d4d4430b8", + "url": "https://api.github.com/repos/doctrine/migrations/zipball/1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021", + "reference": "1a9dffa64e33fdc10f4b4c3f5d7230b74d4a1021", "shasum": "" }, "require": { @@ -655,15 +653,13 @@ "LGPL" ], "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" - }, { "name": "Benjamin Eberlei", "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" } ], "description": "Database Schema migrations using Doctrine DBAL", @@ -672,20 +668,20 @@ "database", "migrations" ], - "time": "2014-07-09 07:58:02" + "time": "2014-08-18 18:03:07" }, { "name": "doctrine/orm", - "version": "v2.4.3", + "version": "v2.4.4", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "8a13376d42b5ea467727ffe730aa0e14ca3c5e29" + "reference": "fc19c3b53dcd00e6584db40669fdd699c4671f97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/8a13376d42b5ea467727ffe730aa0e14ca3c5e29", - "reference": "8a13376d42b5ea467727ffe730aa0e14ca3c5e29", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/fc19c3b53dcd00e6584db40669fdd699c4671f97", + "reference": "fc19c3b53dcd00e6584db40669fdd699c4671f97", "shasum": "" }, "require": { @@ -748,7 +744,59 @@ "database", "orm" ], - "time": "2014-06-10 11:49:08" + "time": "2014-07-11 03:05:53" + }, + { + "name": "enko/ics", + "version": "0.1.0", + "source": { + "type": "git", + "url": "https://github.com/enko/ICS.git", + "reference": "60416fc3842a7b4ee4f0938b8c35c96b402fee32" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/enko/ICS/zipball/60416fc3842a7b4ee4f0938b8c35c96b402fee32", + "reference": "60416fc3842a7b4ee4f0938b8c35c96b402fee32", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "3.6.*" + }, + "type": "library", + "autoload": { + "psr-0": { + "Jsvrcek\\ICS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Svrcek", + "homepage": "https://github.com/jasvrcek" + }, + { + "name": "Tim Schumacher", + "homepage": "https://github.com/enko" + } + ], + "description": "abstraction layer for creating multi-byte safe RFC 5545 compliant .ics files", + "homepage": "https://github.com/enko/ICS", + "keywords": [ + ".ics", + "RFC 5545", + "calendar", + "export", + "ical", + "multi-byte safe" + ], + "time": "2014-07-30 23:43:46" }, { "name": "incenteev/composer-parameter-handler", @@ -918,54 +966,6 @@ }, "type": "library" }, - { - "name": "jsvrcek/ics", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/jasvrcek/ICS.git", - "reference": "85e3e34214547a9981bd3be38633f9dce4f85094" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/jasvrcek/ICS/zipball/85e3e34214547a9981bd3be38633f9dce4f85094", - "reference": "85e3e34214547a9981bd3be38633f9dce4f85094", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "3.6.*" - }, - "type": "library", - "autoload": { - "psr-0": { - "Jsvrcek\\ICS\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Justin Svrcek", - "homepage": "https://github.com/jasvrcek" - } - ], - "description": "abstraction layer for creating multi-byte safe RFC 5545 compliant .ics files", - "homepage": "https://github.com/jasvrcek/ICS", - "keywords": [ - ".ics", - "RFC 5545", - "calendar", - "export", - "ical", - "multi-byte safe" - ], - "time": "2013-10-28 17:21:17" - }, { "name": "knplabs/knp-markdown-bundle", "version": "1.3.2", @@ -1255,29 +1255,25 @@ }, { "name": "sensio/distribution-bundle", - "version": "v3.0.1", + "version": "v3.0.5", "target-dir": "Sensio/Bundle/DistributionBundle", "source": { "type": "git", "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", - "reference": "e9caa300faf95076c8e27693f3fdb0bb6e3148c0" + "reference": "ad10123f2532f6e311e583cce203ef368eedc469" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/e9caa300faf95076c8e27693f3fdb0bb6e3148c0", - "reference": "e9caa300faf95076c8e27693f3fdb0bb6e3148c0", + "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/ad10123f2532f6e311e583cce203ef368eedc469", + "reference": "ad10123f2532f6e311e583cce203ef368eedc469", "shasum": "" }, "require": { "php": ">=5.3.3", + "sensiolabs/security-checker": "~2.0", "symfony/class-loader": "~2.2", - "symfony/config": "~2.2", - "symfony/dependency-injection": "~2.2", - "symfony/filesystem": "~2.2", "symfony/form": "~2.2", - "symfony/framework-bundle": "~2.2", - "symfony/http-foundation": "~2.2", - "symfony/http-kernel": "~2.2", + "symfony/framework-bundle": "~2.4", "symfony/process": "~2.2", "symfony/validator": "~2.2", "symfony/yaml": "~2.2" @@ -1300,17 +1296,15 @@ "authors": [ { "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" + "email": "fabien@symfony.com" } ], - "description": "The base bundle for the Symfony Distributions", + "description": "Base bundle for Symfony Distributions", "keywords": [ "configuration", "distribution" ], - "time": "2014-06-06 02:53:20" + "time": "2014-08-26 13:14:47" }, { "name": "sensio/framework-extra-bundle", @@ -1369,6 +1363,51 @@ ], "time": "2014-05-22 23:27:44" }, + { + "name": "sensiolabs/security-checker", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sensiolabs/security-checker.git", + "reference": "5b4eb4743ebe68276c911c84101ecdf4a9ae76ee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/5b4eb4743ebe68276c911c84101ecdf4a9ae76ee", + "reference": "5b4eb4743ebe68276c911c84101ecdf4a9ae76ee", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "symfony/console": "~2.0" + }, + "bin": [ + "security-checker" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-0": { + "SensioLabs\\Security": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien.potencier@gmail.com" + } + ], + "description": "A security checker for your composer.lock", + "time": "2014-07-19 10:52:35" + }, { "name": "swiftmailer/swiftmailer", "version": "v5.2.1", @@ -1488,20 +1527,21 @@ }, { "name": "symfony/icu", - "version": "v1.2.1", + "version": "v1.2.2", "target-dir": "Symfony/Component/Icu", "source": { "type": "git", "url": "https://github.com/symfony/Icu.git", - "reference": "98e197da54df1f966dd5e8a4992135703569c987" + "reference": "d4d85d6055b87f394d941b45ddd3a9173e1e3d2a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Icu/zipball/98e197da54df1f966dd5e8a4992135703569c987", - "reference": "98e197da54df1f966dd5e8a4992135703569c987", + "url": "https://api.github.com/repos/symfony/Icu/zipball/d4d85d6055b87f394d941b45ddd3a9173e1e3d2a", + "reference": "d4d85d6055b87f394d941b45ddd3a9173e1e3d2a", "shasum": "" }, "require": { + "ext-intl": "*", "lib-icu": ">=4.4", "php": ">=5.3.3", "symfony/intl": "~2.3" @@ -1532,21 +1572,20 @@ "icu", "intl" ], - "time": "2013-10-04 10:06:38" + "time": "2014-07-25 09:58:17" }, { "name": "symfony/monolog-bundle", - "version": "v2.6.0", - "target-dir": "Symfony/Bundle/MonologBundle", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/symfony/MonologBundle.git", - "reference": "e1d4aa99c7440b11e9dfbfef7ed63084401dbc6a" + "reference": "227bbeefe30f2d95e3fe5fbd1ccda414287a957a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/e1d4aa99c7440b11e9dfbfef7ed63084401dbc6a", - "reference": "e1d4aa99c7440b11e9dfbfef7ed63084401dbc6a", + "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/227bbeefe30f2d95e3fe5fbd1ccda414287a957a", + "reference": "227bbeefe30f2d95e3fe5fbd1ccda414287a957a", "shasum": "" }, "require": { @@ -1568,8 +1607,8 @@ } }, "autoload": { - "psr-0": { - "Symfony\\Bundle\\MonologBundle": "" + "psr-4": { + "Symfony\\Bundle\\MonologBundle\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1577,15 +1616,13 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "Symfony MonologBundle", @@ -1594,7 +1631,7 @@ "log", "logging" ], - "time": "2014-06-04 16:49:13" + "time": "2014-07-21 00:36:06" }, { "name": "symfony/swiftmailer-bundle", @@ -1655,16 +1692,16 @@ }, { "name": "symfony/symfony", - "version": "v2.5.1", + "version": "v2.5.3", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "e3d2844abc988bc467bb1593cd340700096b0ac0" + "reference": "f077a238c781f845487a7c81fea8033ccd0e6a02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/e3d2844abc988bc467bb1593cd340700096b0ac0", - "reference": "e3d2844abc988bc467bb1593cd340700096b0ac0", + "url": "https://api.github.com/repos/symfony/symfony/zipball/f077a238c781f845487a7c81fea8033ccd0e6a02", + "reference": "f077a238c781f845487a7c81fea8033ccd0e6a02", "shasum": "" }, "require": { @@ -1751,15 +1788,13 @@ "MIT" ], "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, { "name": "Symfony Community", "homepage": "http://symfony.com/contributors" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" } ], "description": "The Symfony PHP framework", @@ -1767,7 +1802,7 @@ "keywords": [ "framework" ], - "time": "2014-07-08 14:42:08" + "time": "2014-08-06 07:03:01" }, { "name": "twig/extensions", @@ -1927,19 +1962,15 @@ "time": "2014-04-28 14:01:06" } ], - "aliases": [ - - ], + "aliases": [], "minimum-stability": "stable", "stability-flags": { - "jsvrcek/ics": 20, "doctrine/migrations": 20, "doctrine/doctrine-migrations-bundle": 20 }, + "prefer-stable": false, "platform": { "php": ">=5.3.3" }, - "platform-dev": [ - - ] + "platform-dev": [] } diff --git a/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php new file mode 100755 index 0000000..f697a78 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Command/GenerateEventsCommand.php @@ -0,0 +1,88 @@ +setName('calcifer:events:generate') + ->setDescription('Generate events from repeating events') + ->addOption('duration', 'd', InputOption::VALUE_OPTIONAL, 'The duration you want to generate events into the future. Default is 2 monts','2 months') + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) + { + $duration = \DateInterval::createFromDateString($input->getOption('duration')); + if ($duration instanceof \DateInterval) { + $now = new \DateTime(); + $end = new \DateTime(); + $end->add($duration); + $output->writeln(sprintf("Generating Dates from %s to %s",$now->format('Y-m-d'),$end->format('Y-m-d'))); + $output->writeln("Fetching repeating events"); + /** @var EntityManager $entityManager */ + $entityManager = $this->getContainer()->get('doctrine')->getManager(); + $repo = $entityManager->getRepository('CalciferBundle:RepeatingEvent'); + $entities = $repo->findAll(); + foreach($entities as $entity) { + /** @var RepeatingEvent $entity */ + $period = new \DatePeriod($entity->nextdate,new \DateInterval($entity->repeating_pattern),$end); + $event = null; + foreach($period as $date) { + /** @var \DateTime $date */ + $output->writeln(sprintf("Creating Event %s for %s",$entity->summary,$date->format('Y-m-d H:i'))); + $event = new Event(); + $event->location = $entity->location; + $event->startdate = $date; + if ($entity->duration > 0) { + $duration = new \DateInterval("PT".$entity->duration.'H'); + /** @var \DateTime $enddate */ + $enddate = clone $date; + $enddate->add($duration); + $entity->enddate = $enddate; + } + $event->summary = $entity->summary; + $event->description = $entity->description; + $event->url = $entity->url; + $entityManager->persist($event); + $entityManager->flush(); + $event->slug = \URLify::filter($event->id . '-' . $event->summary,255,'de'); + $entityManager->persist($event); + $entityManager->flush(); + foreach($entity->getTags() as $tag) { + $event->addTag($tag); + } + $entityManager->persist($event); + $entityManager->flush(); + } + if (!is_null($event)) { + $entity->nextdate = $event->startdate; + $entity->nextdate->add(new \DateInterval($entity->repeating_pattern)); + $entityManager->persist($entity); + $entityManager->flush(); + } + } + } else { + $output->writeln('Invalid duration'); + } + + } +} diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php index 18dd67d..3397192 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/EventController.php @@ -59,76 +59,8 @@ class EventController extends Controller public function createAction(Request $request) { $entity = new Event(); - $entity->setDescription($request->get('description')); - $entity->setSummary($request->get('summary')); - $entity->setUrl($request->get('url')); - $startdate = $request->get('startdate'); - $startdate = new \DateTime($startdate); - $entity->setStartdate($startdate); - $entity->setSlug(\URLify::filter($entity->getSummary(),255,'de')); - $enddate = $request->get('enddate'); - if (strlen($enddate) > 0) { - $enddate = new \DateTime($enddate); - $entity->setenddate($enddate); - } - - $location = $request->get('location'); - $location_lat = $request->get('location_lat'); - $location_lon = $request->get('location_lon'); - if (strlen($location) > 0) { - // check if the location already exists - /** @var EntityManager $em */ - $em = $this->getDoctrine()->getManager(); - $repo = $em->getRepository('CalciferBundle:Location'); - $results = $repo->findBy(['name' => $location]); - if (count($results) > 0) { - $location_obj = $results[0]; - if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); - } - if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); - } - $em->persist($location_obj); - $em->flush(); - $entity->setLocation($results[0]); - } else { - $location_obj = new Location(); - $location_obj->setName($location); - if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); - } - if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); - } - $location_obj->setSlug(\URLify::filter($location_obj->getName(),255,'de')); - $em->persist($location_obj); - $em->flush(); - $entity->setLocation($location_obj); - } - } - - $tags = $request->get('tags'); - if (strlen($tags) > 0) { - $tags = explode(',',$tags); - $em = $this->getDoctrine()->getManager(); - $repo = $em->getRepository('CalciferBundle:Tag'); - foreach ($tags as $tag) { - $tag = trim($tag); - $results = $repo->findBy(['name' => $tag]); - if (count($results) > 0) { - $entity->addTag($results[0]); - } else { - $tag_obj = new Tag(); - $tag_obj->setName($tag); - $tag_obj->setSlug(\URLify::filter($tag_obj->getName(),255,'de')); - $em->persist($tag_obj); - $em->flush(); - $entity->addTag($tag_obj); - } - } - } + $em = $this->saveEvent($request, $entity); if ($entity->isValid()) { @@ -136,7 +68,7 @@ class EventController extends Controller $em->persist($entity); $em->flush(); - return $this->redirect($this->generateUrl('_show', array('slug' => $entity->getSlug()))); + return $this->redirect($this->generateUrl('_show', array('slug' => $entity->slug))); } return array( @@ -236,18 +168,44 @@ class EventController extends Controller throw $this->createNotFoundException('Unable to find Event entity.'); } - $entity->setDescription($request->get('description')); - $entity->setSummary($request->get('summary')); - $entity->setUrl($request->get('url')); + $em = $this->saveEvent($request, $entity); + + + if ($entity->isValid()) { + $em = $this->getDoctrine()->getManager(); + $em->persist($entity); + $em->flush(); + + return $this->redirect($this->generateUrl('_show', array('slug' => $entity->slug))); + } + + return array( + 'entity' => $entity, + + ); + } + + /** + * @param Request $request + * @param $entity + * @return EntityManager + */ + public function saveEvent(Request $request, Event $entity) + { + $entity->description = $request->get('description'); + $entity->summary = $request->get('summary'); + $entity->url = $request->get('url'); $startdate = $request->get('startdate'); $startdate = new \DateTime($startdate); - $entity->setStartdate($startdate); - $entity->setSlug(\URLify::filter($entity->getSummary(),255,'de')); + $entity->startdate = $startdate; + $entity->slug = \URLify::filter($entity->summary, 255, 'de'); $enddate = $request->get('enddate'); if (strlen($enddate) > 0) { $enddate = new \DateTime($enddate); - $entity->setenddate($enddate); + $entity->enddate = $enddate; + } else { + $entity->enddate = null; } $location = $request->get('location'); @@ -262,24 +220,24 @@ class EventController extends Controller if (count($results) > 0) { $location_obj = $results[0]; if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); + $location_obj->lat = $location_lat; } if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); + $location_obj->lon = $location_lon; } $em->persist($location_obj); $em->flush(); $entity->setLocation($results[0]); } else { $location_obj = new Location(); - $location_obj->setName($location); + $location_obj->name = $location; if (strlen($location_lat) > 0) { - $location_obj->setLat($location_lat); + $location_obj->lat = $location_lat; } if (strlen($location_lon) > 0) { - $location_obj->setLon($location_lon); + $location_obj->lon = $location_lon; } - $location_obj->setSlug(\URLify::filter($location_obj->getName(),255,'de')); + $location_obj->slug = \URLify::filter($location_obj->name, 255, 'de'); $em->persist($location_obj); $em->flush(); $entity->setLocation($location_obj); @@ -288,9 +246,10 @@ class EventController extends Controller $tags = $request->get('tags'); if (strlen($tags) > 0) { - $tags = explode(',',$tags); + $tags = explode(',', $tags); $em = $this->getDoctrine()->getManager(); $repo = $em->getRepository('CalciferBundle:Tag'); + $entity->clearTags(); foreach ($tags as $tag) { $tag = trim($tag); $results = $repo->findBy(['name' => $tag]); @@ -298,22 +257,47 @@ class EventController extends Controller $entity->addTag($results[0]); } else { $tag_obj = new Tag(); - $tag_obj->setName($tag); - $tag_obj->setSlug(\URLify::filter($tag_obj->getName(),255,'de')); + $tag_obj->name = $tag; + $tag_obj->slug = \URLify::filter($tag_obj->name, 255, 'de'); $em->persist($tag_obj); $em->flush(); $entity->addTag($tag_obj); } } + return $em; + } + return $em; + } + + /** + * Deletes a Event entity. + * + * @Route("/termine/{slug}/löschen", name="_delete") + * @Method({"GET", "POST"}) + * @Template("CalciferBundle:Event:delete.html.twig") + */ + public function deleteAction(Request $request, $slug) { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:Event'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find Event entity.'); } - if ($entity->isValid()) { - $em = $this->getDoctrine()->getManager(); - $em->persist($entity); + $confirmation = $request->get('confirmation',false); + + if (($request->getMethod() == 'POST') && ($confirmation)) { + $em->remove($entity); $em->flush(); - return $this->redirect($this->generateUrl('_show', array('slug' => $entity->getSlug()))); + return $this->redirect('/'); } return array( @@ -321,4 +305,33 @@ class EventController extends Controller ); } + + /** + * Copies a Event entity. + * + * @Route("/termine/{slug}/kopieren", name="_copy") + * @Method("GET") + * @Template("CalciferBundle:Event:new.html.twig") + */ + public function copyAction(Request $request, $slug) { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:Event'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find Event entity.'); + } + + $entity->id = null; + + return array( + 'entity' => $entity, + + ); + } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php index 3151254..631892a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/LocationController.php @@ -2,6 +2,7 @@ namespace Hackspace\Bundle\CalciferBundle\Controller; +use Doctrine\Common\Annotations\Annotation\Required; use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; @@ -23,7 +24,7 @@ use Jsvrcek\ICS\Model\Relationship\Organizer; use Jsvrcek\ICS\Utility\Formatter; use Jsvrcek\ICS\CalendarStream; use Jsvrcek\ICS\CalendarExport; -use Symfony\Component\Validator\Constraints\DateTime; +use Jsvrcek\ICS\Model\Description\Geo; /** * Location controller. @@ -35,11 +36,11 @@ class LocationController extends Controller /** * Finds and displays a Event entity. * - * @Route("/{slug}(?!\.ics)", name="location_show") + * @Route("/{slug}.{format}", name="location_show", defaults={"format" = "html"}) * @Method("GET") * @Template("CalciferBundle:Event:index.html.twig") */ - public function showAction($slug) + public function showAction($slug,$format) { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -67,52 +68,54 @@ class LocationController extends Controller ->andWhere('e.locations_id = :location') ->orderBy('e.startdate') ->setParameter('startdate',$now) - ->setParameter('location',$location->getId()); + ->setParameter('location',$location->id); $entities = $qb->getQuery()->execute(); - return array( - 'entities' => $entities, - 'location' => $location, - ); - } + if ($format == 'ics') { + $calendar = new Calendar(); + $calendar->setProdId('-//My Company//Cool Calendar App//EN'); - /** - * Finds and displays a Event entity. - * - * @Route("/{slug}.ics", name="location_show_ics") - * @Method("GET") - */ - public function showActionICS($slug) - { - $results = $this->showAction(str_replace('.ics','',$slug)); - $entities = $results['entities']; + foreach ($entities as $entity) { + /** @var Event $entity */ + $event = new CalendarEvent(); + $event->setStart($entity->startdate); + if ($entity->enddate instanceof \DateTime) + $event->setEnd($entity->enddate); + $event->setSummary($entity->summary); + $event->setUrl($entity->url); + if ($entity->location instanceof Location) { + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->location->name); + $event->setLocations([$location]); + if (\is_float($entity->location->lon) && \is_float($entity->location->lat)) { + $geo = new Geo(); + $geo->setLatitude($entity->location->lat); + $geo->setLongitude($entity->location->lon); + $event->setGeo($geo); + } + } + $event->setDescription($entity->description); + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->getLocation()->name); + $event->setLocations([$location]); + $calendar->addEvent($event); + } - $calendar = new Calendar(); - $calendar->setProdId('-//My Company//Cool Calendar App//EN'); + $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); + $calendarExport->addCalendar($calendar); - foreach($entities as $entity) { - /** @var Event $entity */ - $event = new CalendarEvent(); - $event->setStart($entity->getStartdate()); - if ($entity->getEnddate() instanceof DateTime) - $event->setEnd($entity->getEnddate()); - $event->setSummary($entity->getSummary()); - $event->setDescription($entity->getDescription()); - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->getLocation()->getName()); - $event->setLocations([$location]); - $calendar->addEvent($event); + //output .ics formatted text + $result = $calendarExport->getStream(); + + $response = new Response($result); + $response->headers->set('Content-Type', 'text/calendar'); + + return $response; + } else { + return array( + 'entities' => $entities, + 'location' => $location, + ); } - - $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); - $calendarExport->addCalendar($calendar); - - //output .ics formatted text - $result = $calendarExport->getStream(); - - $response = new Response($result); - $response->headers->set('Content-Type', 'text/calendar'); - - return $response; } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php new file mode 100755 index 0000000..db41dca --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/RepeatingEventController.php @@ -0,0 +1,262 @@ +getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:RepeatingEvent'); + + $entities = $repo->findAll(); + + return [ + 'entities' => $entities, + ]; + } + + /** + * Displays a form to create a repeating event + * + * @Route("/neu", name="repeating_event_new") + * @Method("GET") + * @Template() + */ + public function newAction() + { + $entity = new RepeatingEvent(); + + return [ + 'entity' => $entity, + ]; + } + + /** + * Creates a repeating event + * + * @Route("/neu", name="repeating_event_create") + * @Method("POST") + * @Template("CalciferBundle:RepeatingEvent:new.html.twig") + */ + public function createAction(Request $request) + { + $entity = new RepeatingEvent(); + $this->fillEntity($request, $entity); + if ($this->validateRepeatingEvent($entity)) { + $ret = $this->saveRepeatingEvent($request, $entity); + if ($entity->id > 0) { + return $this->redirect($this->generateUrl('repeating_event_show')); + } else { + throw new \Exception('Could not save repeating event?!?'); + } + } + return [ + 'entity' => $entity, + ]; + + } + + /** + * Displays a form to edit a repeating event + * + * @Route("/{slug}/bearbeiten",name="repeating_event_edit") + * @Method("GET") + * @Template() + */ + public function editAction($slug) + { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:RepeatingEvent'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find RepeatingEvent entity.'); + } + + return array( + 'entity' => $entity, + ); + } + + /** + * Updates a repeating event + * + * @Route("/{slug}/bearbeiten",name="repeating_event_update") + * @Method("POST") + * @Template("CalciferBundle:RepeatingEvent:edit.html.twig") + */ + public function updateAction(Request $request, $slug) + { + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + + /** @var EntityRepository $repo */ + $repo = $em->getRepository('CalciferBundle:RepeatingEvent'); + + /** @var Event $entity */ + $entity = $repo->findOneBy(['slug' => $slug]); + + if (!$entity) { + throw $this->createNotFoundException('Unable to find RepeatingEvent entity.'); + } + + $this->fillEntity($request, $entity); + if ($this->validateRepeatingEvent($entity)) { + $ret = $this->saveRepeatingEvent($request, $entity); + if ($entity->id > 0) { + return $this->redirect($this->generateUrl('repeating_event_show')); + } else { + throw new \Exception('Could not save repeating event?!?'); + } + } + return [ + 'entity' => $entity, + ]; + } + + private function fillEntity(Request $request, RepeatingEvent $entity) + { + $fields = [ + 'duration', + 'repeating_pattern', + 'summary', + 'description', + 'url', + ]; + foreach ($fields as $field) { + $entity->$field = $request->get($field); + } + if (strlen($entity->duration) == 0) + $entity->duration = null; + $nextdate = $request->get('nextdate'); + $nextdate = new \DateTime($nextdate); + $entity->nextdate = $nextdate; + + } + + private function validateRepeatingEvent(RepeatingEvent $entity) + { + $fields = [ + 'nextdate', + 'repeating_pattern', + 'summary', + ]; + foreach ($fields as $field) { + if ((is_null($entity->$field)) && (strlen($entity->$field) > 0)) + return false; + } + return true; + } + + private function saveRepeatingEvent(Request $request, RepeatingEvent $entity) + { + $location = $request->get('location'); + $location_lat = $request->get('location_lat'); + $location_lon = $request->get('location_lon'); + if (strlen($location) > 0) { + // check if the location already exists + /** @var EntityManager $em */ + $em = $this->getDoctrine()->getManager(); + $repo = $em->getRepository('CalciferBundle:Location'); + $results = $repo->findBy(['name' => $location]); + if (count($results) > 0) { + $location_obj = $results[0]; + if (strlen($location_lat) > 0) { + $location_obj->lat = $location_lat; + } + if (strlen($location_lon) > 0) { + $location_obj->lon = $location_lon; + } + $em->persist($location_obj); + $em->flush(); + $entity->location = $results[0]; + } else { + $location_obj = new Location(); + $location_obj->name = $location; + if (strlen($location_lat) > 0) { + $location_obj->lat = $location_lat; + } + if (strlen($location_lon) > 0) { + $location_obj->lon = $location_lon; + } + $location_obj->slug = \URLify::filter($location_obj->name, 255, 'de'); + $em->persist($location_obj); + $em->flush(); + $entity->location = $location_obj; + } + } else { + $entity->location = null; + } + + $tags = $request->get('tags'); + if (strlen($tags) > 0) { + $tags = explode(',', $tags); + $em = $this->getDoctrine()->getManager(); + $repo = $em->getRepository('CalciferBundle:Tag'); + $entity->clearTags(); + foreach ($tags as $tag) { + $tag = trim($tag); + $results = $repo->findBy(['name' => $tag]); + if (count($results) > 0) { + $entity->addTag($results[0]); + } else { + $tag_obj = new Tag(); + $tag_obj->name = $tag; + $tag_obj->slug = \URLify::filter($tag_obj->name, 255, 'de'); + $em->persist($tag_obj); + $em->flush(); + $entity->addTag($tag_obj); + } + } + } else { + $entity->clearTags(); + } + + $entity->slug = \URLify::filter($entity->summary,255,'de'); + + $em = $this->getDoctrine()->getManager(); + $em->persist($entity); + $em->flush(); + + return $entity; + + } +} diff --git a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php index b6128d9..dfb63f5 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php +++ b/src/Hackspace/Bundle/CalciferBundle/Controller/TagController.php @@ -7,6 +7,7 @@ use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; use Hackspace\Bundle\CalciferBundle\Entity\Location; use Hackspace\Bundle\CalciferBundle\Entity\Tag; +use Jsvrcek\ICS\Model\Description\Geo; use Symfony\Component\HttpFoundation\Request; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method; @@ -35,11 +36,11 @@ class TagController extends Controller /** * Finds and displays a Event entity. * - * @Route("/{slug}(?!\.ics)", name="tag_show") + * @Route("/{slug}.{format}", defaults={"format" = "html"}, name="tag_show") * @Method("GET") * @Template("CalciferBundle:Event:index.html.twig") */ - public function showAction($slug) + public function showAction($slug, $format) { /** @var EntityManager $em */ $em = $this->getDoctrine()->getManager(); @@ -55,60 +56,60 @@ class TagController extends Controller } $now = new \DateTime(); - $now->setTime(0,0,0); + $now->setTime(0, 0, 0); /** @var QueryBuilder $qb */ $qb = $em->createQueryBuilder(); - $qb ->select(array('e')) + $qb->select(array('e')) ->from('CalciferBundle:Event', 'e') - ->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', $tag->getId())) + ->join('e.tags', 't', 'WITH', $qb->expr()->in('t.id', $tag->id)) ->where('e.startdate >= :startdate') ->orderBy('e.startdate') - ->setParameter('startdate',$now); + ->setParameter('startdate', $now); $entities = $qb->getQuery()->execute(); - return array( - 'entities' => $entities, - 'tag' => $tag, - ); - } + if ($format == 'ics') { + $calendar = new Calendar(); + $calendar->setProdId('-//My Company//Cool Calendar App//EN'); - /** - * Finds and displays a Event entity. - * - * @Route("/{slug}.ics", name="tag_show_ics") - * @Method("GET") - */ - public function showActionICS($slug) - { - $results = $this->showAction(str_replace('.ics','',$slug)); - $entities = $results['entities']; + foreach ($entities as $entity) { + /** @var Event $entity */ + $event = new CalendarEvent(); + $event->setStart($entity->startdate); + if ($entity->enddate instanceof \DateTime) + $event->setEnd($entity->enddate); + $event->setSummary($entity->summary); + $event->setDescription($entity->description); + $event->setUrl($entity->url); + if ($entity->location instanceof Location) { + $location = new \Jsvrcek\ICS\Model\Description\Location(); + $location->setName($entity->location->name); + $event->setLocations([$location]); + if (\is_float($entity->location->lon) && \is_float($entity->location->lat)) { + $geo = new Geo(); + $geo->setLatitude($entity->location->lat); + $geo->setLongitude($entity->location->lon); + $event->setGeo($geo); + } + } + $calendar->addEvent($event); + } - $calendar = new Calendar(); - $calendar->setProdId('-//My Company//Cool Calendar App//EN'); + $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); + $calendarExport->addCalendar($calendar); - foreach($entities as $entity) { - /** @var Event $entity */ - $event = new CalendarEvent(); - $event->setStart($entity->getStartdate()); - $event->setEnd($entity->getEnddate()); - $event->setSummary($entity->getSummary()); - $event->setDescription($entity->getDescription()); - $location = new \Jsvrcek\ICS\Model\Description\Location(); - $location->setName($entity->getLocation()->getName()); - $event->setLocations([$location]); - $calendar->addEvent($event); + //output .ics formatted text + $result = $calendarExport->getStream(); + + $response = new Response($result); + $response->headers->set('Content-Type', 'text/calendar'); + + return $response; + } else { + return array( + 'entities' => $entities, + 'tag' => $tag, + ); } - - $calendarExport = new CalendarExport(new CalendarStream, new Formatter()); - $calendarExport->addCalendar($calendar); - - //output .ics formatted text - $result = $calendarExport->getStream(); - - $response = new Response($result); - $response->headers->set('Content-Type', 'text/calendar'); - - return $response; } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php new file mode 100755 index 0000000..ed3a198 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/BaseEntity.php @@ -0,0 +1,63 @@ +$name; + } else { + throw new \Exception("Property {$name} does not Exists"); + } + } + + public function __set($name,$value) { + if (property_exists($this,$name)) { + $this->$name = $value; + return $this; + } else { + throw new \Exception("Property {$name} does not Exists"); + } + } +} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php index 82dfc4e..8a3a791 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Event.php @@ -3,59 +3,59 @@ namespace Hackspace\Bundle\CalciferBundle\Entity; use Doctrine\ORM\Mapping as ORM; -use Doctrine\ORM\PersistentCollection; /** * Event * + * @property \DateTime $startdate + * @property \DateTime $enddate + * @property string $summary + * @property string $description + * @property Location $location + * @property string $url + * @property array $tags + * * @ORM\Table(name="events") * @ORM\Entity */ -class Event +class Event extends BaseEntity { - /** - * @var integer - * - * @ORM\Column(name="id", type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - */ - private $id; + use TagTrait; /** * @var \DateTime * * @ORM\Column(name="startdate", type="datetimetz") */ - private $startdate; + protected $startdate; /** * @var \DateTime * * @ORM\Column(name="enddate", type="datetimetz", nullable=true) */ - private $enddate; + protected $enddate; /** * @var string * * @ORM\Column(name="summary", type="string", length=255) */ - private $summary; + protected $summary; /** * @var string * * @ORM\Column(name="description", type="text", nullable=true) */ - private $description; + protected $description; /** * @var string * * @ORM\Column(name="locations_id", type="integer", nullable=true) */ - private $locations_id; + protected $locations_id; /** * @var Location @@ -63,14 +63,14 @@ class Event * @ORM\ManyToOne(targetEntity="Location") * @ORM\JoinColumn(name="locations_id", referencedColumnName="id") */ - private $location; + protected $location; /** * @var string * * @ORM\Column(name="url", type="string", length=255, nullable=true) */ - private $url; + protected $url; /** * @var array @@ -81,179 +81,7 @@ class Event * inverseJoinColumns={@ORM\JoinColumn(name="tags_id", referencedColumnName="id")} * ) */ - private $tags = []; - - /** - * @var string - * - * @ORM\Column(name="slug", type="string", length=255,options={"default" = ""}) - */ - private $slug = ''; - - /** - * @param string $slug - */ - public function setSlug($slug) - { - $this->slug = $slug; - } - - /** - * @return string - */ - public function getSlug() - { - return $this->slug; - } - - - /** - * Get id - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Set startdate - * - * @param \DateTime $startdate - * @return Event - */ - public function setStartdate($startdate) - { - $this->startdate = $startdate; - - return $this; - } - - /** - * Get startdate - * - * @return \DateTime - */ - public function getStartdate() - { - return $this->startdate; - } - - /** - * Set enddate - * - * @param \DateTime $enddate - * @return Event - */ - public function setEnddate($enddate) - { - $this->enddate = $enddate; - - return $this; - } - - /** - * Get enddate - * - * @return \DateTime - */ - public function getEnddate() - { - return $this->enddate; - } - - /** - * Set summary - * - * @param string $summary - * @return Event - */ - public function setSummary($summary) - { - $this->summary = $summary; - - return $this; - } - - /** - * Get summary - * - * @return string - */ - public function getSummary() - { - return $this->summary; - } - - /** - * Set description - * - * @param string $description - * @return Event - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Get description - * - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * Set location - * - * @param string $locations_id - * @return Event - */ - public function setLocationsID($locations_id) - { - $this->locations_id = $locations_id; - - return $this; - } - - /** - * Get location - * - * @return string - */ - public function getLocationsID() - { - return $this->locations_id; - } - - /** - * Set url - * - * @param string $url - * @return Event - */ - public function setUrl($url) - { - $this->url = $url; - - return $this; - } - - /** - * Get url - * - * @return string - */ - public function getUrl() - { - return $this->url; - } + protected $tags = []; /** * @param \Hackspace\Bundle\CalciferBundle\Entity\Location $location @@ -273,41 +101,20 @@ class Event return $this->location; } - public function getTags() { - return $this->tags; - } - - public function hasTag(Tag $tag) { - if ($this->tags instanceof PersistentCollection) { - return $this->tags->contains($tag); - } elseif (is_array($this->tags)) { - return in_array($tag,$this->tags); - } else { - return false; - } - - } - - public function addTag(Tag $tag) { - /** @var PersistentCollection $this->tags */ - if (!$this->hasTag($tag)) { - $this->tags[] = $tag; - } - } - public function isValid() { return true; } - public function getTagsAsText() { - if (count($this->tags) > 0) { - $tags = []; - foreach ($this->tags as $tag) { - $tags[] = $tag->getName(); + public function getFormatedDate() { + $retval = $this->startdate->format('Y-m-d H:i'); + if (!is_null($this->enddate)) { + $retval .= " — "; + if ($this->startdate->format('Y-m-d') == $this->enddate->format('Y-m-d')) { + $retval .= $this->enddate->format('H:i'); + } else { + $retval .= $this->enddate->format('Y-m-d H:i'); } - return implode(',',$tags); - } else { - return ''; } + return $retval; } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php index 8d3b6a2..afd6feb 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Location.php @@ -7,141 +7,35 @@ use Doctrine\ORM\Mapping as ORM; /** * Location * + * @property string $name + * @property float $lon + * @property float $lat + * * @ORM\Table(name="locations") * @ORM\Entity */ -class Location +class Location extends BaseEntity { - /** - * @var integer - * - * @ORM\Column(name="id", type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - */ - private $id; - /** * @var string * * @ORM\Column(name="name", type="string", length=255) */ - private $name; + protected $name; /** * @var float * * @ORM\Column(name="lon", type="float", nullable=true) */ - private $lon; + protected $lon; /** * @var float * * @ORM\Column(name="lat", type="float", nullable=true) */ - private $lat; - - /** - * @var string - * - * @ORM\Column(name="slug", type="string", length=255,options={"default" = ""}) - */ - private $slug = ''; - - /** - * @param string $slug - */ - public function setSlug($slug) - { - $this->slug = $slug; - } - - /** - * @return string - */ - public function getSlug() - { - return $this->slug; - } + protected $lat; - /** - * Get id - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Set name - * - * @param string $name - * @return Location - */ - public function setName($name) - { - $this->name = $name; - - return $this; - } - - /** - * Get name - * - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Set lon - * - * @param float $lon - * @return Location - */ - public function setLon($lon) - { - $this->lon = $lon; - - return $this; - } - - /** - * Get lon - * - * @return float - */ - public function getLon() - { - return $this->lon; - } - - /** - * Set lat - * - * @param float $lat - * @return Location - */ - public function setLat($lat) - { - $this->lat = $lat; - - return $this; - } - - /** - * Get lat - * - * @return float - */ - public function getLat() - { - return $this->lat; - } } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php new file mode 100755 index 0000000..d7a6bcd --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/RepeatingEvent.php @@ -0,0 +1,100 @@ +repeating_pattern) { + case 'P7D': + return 'Wöchentlich'; + case 'P14D': + return 'Alle 2 Wochen'; + case 'P1M': + return 'Monatlich'; + default: + return $this->repeating_pattern; + } + } +} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/Tag.php b/src/Hackspace/Bundle/CalciferBundle/Entity/Tag.php index ae4ad82..2e296ef 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Entity/Tag.php +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/Tag.php @@ -10,77 +10,12 @@ use Doctrine\ORM\Mapping as ORM; * @ORM\Table(name="tags") * @ORM\Entity */ -class Tag +class Tag extends BaseEntity { - /** - * @var integer - * - * @ORM\Column(name="id", type="integer") - * @ORM\Id - * @ORM\GeneratedValue(strategy="AUTO") - */ - private $id; - /** * @var string * * @ORM\Column(name="name", type="string", length=255) */ - private $name; - - /** - * @var string - * - * @ORM\Column(name="slug", type="string", length=255,options={"default" = ""}) - */ - private $slug = ''; - - /** - * @param string $slug - */ - public function setSlug($slug) - { - $this->slug = $slug; - } - - /** - * @return string - */ - public function getSlug() - { - return $this->slug; - } - - /** - * Get id - * - * @return integer - */ - public function getId() - { - return $this->id; - } - - /** - * Set name - * - * @param string $name - * @return Tag - */ - public function setName($name) - { - $this->name = $name; - - return $this; - } - - /** - * Get name - * - * @return string - */ - public function getName() - { - return $this->name; - } + protected $name; } diff --git a/src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php b/src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php new file mode 100755 index 0000000..952d990 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Entity/TagTrait.php @@ -0,0 +1,61 @@ +tags; + } + + public function clearTags() + { + if ($this->tags instanceof PersistentCollection) { + $this->tags->clear(); + } elseif (is_array($this->tags)) { + $this->tags = []; + } + } + + public function hasTag(Tag $tag) + { + if ($this->tags instanceof PersistentCollection) { + return $this->tags->contains($tag); + } elseif (is_array($this->tags)) { + return in_array($tag, $this->tags); + } else { + return false; + } + + } + + public function addTag(Tag $tag) + { + if (!$this->hasTag($tag)) { + $this->tags[] = $tag; + } + } + + public function getTagsAsText() + { + if (count($this->tags) > 0) { + $tags = []; + foreach ($this->tags as $tag) { + $tags[] = $tag->name; + } + return implode(',', $tags); + } else { + return ''; + } + } +} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss index 867884c..6b615cb 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/events.scss @@ -6,13 +6,17 @@ } } - .startdate,.location,.url,.edit { + .startdate,.location,.url,.action { display: inline; margin: 0; margin-right: 0.5rem; margin-bottom: 0.5rem; } + a i.icon { + text-decoration: none; + } + ul.tags { padding-left: 0; margin: 0; diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss new file mode 100644 index 0000000..b4dd9dd --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/css/main.scss @@ -0,0 +1,37 @@ +body { + margin: 0; + font-family: 'Roboto', sans-serif; +} + +header { + top: 0; +} + +header .ui.grid > .column, .title.ui.grid > .column { + margin-top: 0; + margin-bottom: 0; +} + +.box h2 { + font-size: 1rem !important; +} + +a .icon { + text-decoration: none; +} + +a, a:hover, a:visited { + color: #000000; +} + +a:hover { + text-decoration: none; +} + +#mission-statement { + overflow: hidden; + + img { + margin-bottom: 0; + } +} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/images/logo.png b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/images/logo.png new file mode 100644 index 0000000..a377dab Binary files /dev/null and b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/images/logo.png differ diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js new file mode 100755 index 0000000..3ffdf0e --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/assets/js/repeating_events.js @@ -0,0 +1,6 @@ +$(document).ready(function(){ + $('.ui.dropdown.selection') + .dropdown() + .dropdown('set value',$('.ui.dropdown.selection input[type=hidden]').val()) + ; +}); diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig new file mode 100755 index 0000000..66a4061 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/delete.html.twig @@ -0,0 +1,29 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/events.scss" %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/events.js" %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+
+
+

Möchtest du die Veranstaltung „{{ entity.summary }}“ zum Datum „{{ entity.startdate.format('Y-m-d H:i') }}“ wirklich löschen?

+ + Nein +
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig index 07d2d67..a004f41 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/edit.html.twig @@ -4,8 +4,7 @@ {% stylesheets filter="compass" "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" "@CalciferBundle/Resources/assets/css/events.scss" - "@CalciferBundle/Resources/assets/css/leaflet.scss" - %} + "@CalciferBundle/Resources/assets/css/leaflet.scss" %} {% endstylesheets %} {% endblock %} @@ -14,8 +13,7 @@ {% javascripts "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" "@CalciferBundle/Resources/assets/js/events.js" - "@CalciferBundle/Resources/assets/js/leaflet.js" - %} + "@CalciferBundle/Resources/assets/js/leaflet.js" %} {% endjavascripts %} {% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig index 1bcb28d..4a9b99a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_box.html.twig @@ -1,25 +1,41 @@
-

{{ entity.summary }} +

{{ entity.summary }}

-

- Bearbeiten + {% if (detail|default(false)) %} +

+ Bearbeiten

+

+ Löschen +

+ +

+ Kopieren +

+ {% endif %} +

- {{ entity.startdate.format('Y-m-d H:i') }} + {{ entity.getFormatedDate() }}

{% if entity.location is not null %}

- {{ entity.location.name }} + {{ entity.location.name }}

{% endif %} {% if entity.tags|length > 0 %} {% endif %} @@ -37,6 +53,5 @@ {% else %}

{{ entity.description|markdown }}

{% endif %} -
\ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig index 83be9d6..d2f1e82 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/event_form.html.twig @@ -1,4 +1,4 @@ -
+
@@ -9,7 +9,7 @@ name="startdate" required="required" value="{{ entity.startdate.format('Y-m-d H:i')|default('') }}" - placeholder="{{ "now"|date('d.m.Y H:i') }}" + placeholder="{{ "now"|date('Y-m-d H:i') }}" class="form-control"> @@ -27,7 +27,7 @@ id="event_enddate" name="enddate" value="{{ entity.enddate.format('Y-m-d H:i')|default('') }}" - placeholder="{{ "now"|date('d.m.Y H:i') }}" + placeholder="{{ "now"|date('Y-m-d H:i') }}" class="form-control"> diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig index b91fabd..7d19293 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/Event/show.html.twig @@ -18,6 +18,6 @@ {% block body -%}
- {{ include('CalciferBundle:Event:event_box.html.twig') }} + {{ include('CalciferBundle:Event:event_box.html.twig',{'entity' : entity,'detail' : true}) }}
{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig new file mode 100755 index 0000000..25f2f34 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/edit.html.twig @@ -0,0 +1,37 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" + "@CalciferBundle/Resources/assets/css/events.scss" + "@CalciferBundle/Resources/assets/css/leaflet.scss" + %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" + "@CalciferBundle/Resources/assets/js/repeating_events.js" + "@CalciferBundle/Resources/assets/js/events.js" + "@CalciferBundle/Resources/assets/js/leaflet.js" + %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+

Wiederholenden Termin bearbeiten

+
+
+ +
+
+ {{ include('CalciferBundle:RepeatingEvent:repeating_event_form.html.twig',{'entity':entity}) }} +
+
+ +{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig new file mode 100755 index 0000000..ce108c5 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/index.html.twig @@ -0,0 +1,65 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/events.scss" %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/events.js" %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+

+ Wiederholende Termine +

+
+
+ +
+
+ + + + + + + + + + + {% for entity in entities %} + + + + + + + {% endfor %} + + + + + + +
ZusammenfassungNächstes DatumWiederholungsmusterAktionen
+ {{ entity.summary }} + + {{ entity.nextdate.format('Y-m-d H:i') }} + + {{ entity.getFormatedRepeatPattern() }} + + Bearbeiten +
Neuen wiederholenden Termin anlegen
+
+ +
+ +{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig new file mode 100755 index 0000000..22b9509 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/new.html.twig @@ -0,0 +1,35 @@ +{% extends 'CalciferBundle::layout.html.twig' %} + +{% block css %} + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/jquery.datetimepicker.scss" + "@CalciferBundle/Resources/assets/css/events.scss" + "@CalciferBundle/Resources/assets/css/leaflet.scss" %} + + {% endstylesheets %} +{% endblock %} + +{% block javascripts %} + {% javascripts + "@CalciferBundle/Resources/assets/js/jquery.datetimepicker.js" + "@CalciferBundle/Resources/assets/js/repeating_events.js" + "@CalciferBundle/Resources/assets/js/events.js" + "@CalciferBundle/Resources/assets/js/leaflet.js" %} + + {% endjavascripts %} +{% endblock %} + +{% block body -%} +
+
+

Wiederholenden Termin erstellen

+
+
+ +
+
+ {{ include('CalciferBundle:RepeatingEvent:repeating_event_form.html.twig') }} +
+
+ +{% endblock %} diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig new file mode 100755 index 0000000..c3eb044 --- /dev/null +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/RepeatingEvent/repeating_event_form.html.twig @@ -0,0 +1,166 @@ + +
+
+ + +
+ + + + +
+ +
+
+
+
+ + +
+ + +
+ Hier gibst du bitte die Dauer der Veranstaltung in Minuten an. +
+
+
+ +
+ + +
+ +
+ +
+ +
+ + +
+ + +
+ +
+
+
+ +
+ + +
+ + +
Du kannst hier Markdown + benutzen. +
+
+
+ +
+ + +
+ + +
+
+ +
+ + +
+ + + + + +
+ Du kannst zu diesem Ort auch Geokoordinaten hinterlegen.
+ {% if entity.location.lat|default(0) > 0 %}Folgende Koordinaten sind angegeben: lat:{{ entity.location.lat }}, lon:{{ entity.location.lon }}{% endif %} +
+ +
+
+ +
+ + +
+ + + +
Du kannst hier kommasepariert Tags angeben. +
+
+
+ + +
+ + \ No newline at end of file diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig index 5850fde..dcc898a 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/layout.html.twig @@ -5,9 +5,15 @@ {% block title %}Terminverwaltung Calcifer{% endblock %} - + - + {% stylesheets filter="compass" + "@CalciferBundle/Resources/assets/css/main.scss" + "css/semantic.scss" + "css/custom.scss" + %} + + {% endstylesheets %} {% block css %} {% endblock %} @@ -17,6 +23,21 @@ {% include "CalciferBundle::navigation.html.twig" %} +
+
+
+ {% image '@CalciferBundle/Resources/assets/images/logo.png' %} + Eine Zeichnung von Calcifer. Gezeichnet von simply-Sylvan (http://simply-sylvan.deviantart.com/art/Calcifer-Purple-176746086) + {% endimage %} +

Calcifer ist ein Daemon aus dem Anime „Das wandelnde Schloss“, der sich darum kümmert das sich Howls Schloss weiter bewegt. Diese Terminverwaltung soll dafür sorgen das sich der Hackspace Jena auch weiter bewegt und viele tolle Termine statfinden.

+
+
+
+
{% block body %}{% endblock %}
diff --git a/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig b/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig index c2e4ce9..3991996 100755 --- a/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig +++ b/src/Hackspace/Bundle/CalciferBundle/Resources/views/navigation.html.twig @@ -3,6 +3,7 @@
\ No newline at end of file diff --git a/web/css/a7b77f2.css b/web/css/a7b77f2.css deleted file mode 100644 index 75c07c6..0000000 --- a/web/css/a7b77f2.css +++ /dev/null @@ -1,460 +0,0 @@ -/* line 1, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker { - box-shadow: 0px 5px 15px -5px rgba(0, 0, 0, 0.506); - background: #FFFFFF; - border-bottom: 1px solid #BBBBBB; - border-left: 1px solid #CCCCCC; - border-right: 1px solid #CCCCCC; - border-top: 1px solid #CCCCCC; - color: #333333; - font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; - padding: 8px; - padding-left: 0px; - padding-top: 2px; - position: absolute; - z-index: 9999; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: none; -} - -/* line 20, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker iframe { - position: absolute; - left: 0; - top: 0; - width: 75px; - height: 210px; - background: transparent; - border: none; -} - -/*For IE8 or lower*/ -/* line 31, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker button { - border: none !important; -} - -/* line 35, assetic_compassiP1C2P.scss */ -.xdsoft_noselect { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -/* line 45, assetic_compassiP1C2P.scss */ -.xdsoft_noselect::selection { - background: transparent; -} - -/* line 49, assetic_compassiP1C2P.scss */ -.xdsoft_noselect::-moz-selection { - background: transparent; -} - -/* line 53, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker.xdsoft_inline { - display: inline-block; - position: static; - box-shadow: none; -} - -/* line 59, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker * { - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0px; - margin: 0px; -} - -/* line 66, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker { - display: none; -} - -/* line 70, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active { - display: block; -} - -/* line 74, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker { - width: 224px; - float: left; - margin-left: 8px; -} - -/* line 80, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker { - width: 58px; - float: left; - text-align: center; - margin-left: 8px; - margin-top: 0px; -} - -/* line 88, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active + .xdsoft_timepicker { - margin-top: 8px; - margin-bottom: 3px; -} - -/* line 93, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_mounthpicker { - position: relative; - text-align: center; -} - -/* line 98, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_today_button { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozQjRCQjRGREU4MkNFMzExQjRDQkIyRDJDOTdBRUI1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQjg0OUYyNTZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQjg0OUYyNDZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI5NzE3MjFBN0E2Q0UzMTFBQjJEQjgzMDk5RTNBNTdBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNCNEJCNEZERTgyQ0UzMTFCNENCQjJEMkM5N0FFQjUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+aQvATgAAAfVJREFUeNrsmr1OwzAQxzGtkPjYEAuvVGAvfQIGRKADE49gdLwDDwBiZ2RhQUKwICQkWLsgFiRQuIBTucFJ/XFp4+hO+quqnZ4uvzj2nV2RpukCW/22yAgYNINmc7du7DcghCjrkqgOKjF1znpt6rZ0AGWQj7TvCU8d9UM+QAGDrhdyc2Bnc1WVVPBev9V8lBnY+rDwncWZThG4xk4lmxtJy2AHgoY/FySgbSBPwPZ8mEXbQx3aDERb0EbYAYFC7pcAtAvkMWwC0D3NX58S9D/YnoGC7nPWr3Dg9JTbtuHhDShBT8D2CBSK/iIEvVXxpuxSgh7DdgwUTL4iA92zmJb6lKB/YTsECmV+IgK947AGDIqgQ/LojsO135Hn51l2cWlov0JdGNrPUceueXRwilSVgkUyom9Rd6gbLfYTDeO+1v6orn0InTogYDGUkYLO3/wc9BdqqTCKP1Tfi+oTIaCBIL2TES+GTyruT9S61p6BHam+99DFEAgLFklYsIBHwSI9QY80H5ta+1rB/6ovaKihBJeEJbgLbBlQgl+j3lDPqA2tfQV1j3pVn8s+oKHGTSVJ+FqDLeR5bCqJ2E/BCycsoLZETXaKGs7rhKVt+9HZScrZNMi88V8P7LlDbvOZYaJVpMMmBCT4n0o8dTBoNgbdWPsRYACs3r7XyNfbnAAAAABJRU5ErkJggg=="); -} - -/* line 102, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_prev { - float: left; - background-position: -20px 0px; -} - -/* line 107, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_today_button { - float: left; - background-position: -70px 0px; - margin-left: 5px; -} - -/* line 113, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_next { - float: right; - background-position: 0px 0px; -} - -/* line 121, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_today_button { - background-color: transparent; - background-repeat: no-repeat; - border: 0px none currentColor; - cursor: pointer; - display: block; - height: 30px; - opacity: 0.5; - outline: medium none currentColor; - overflow: hidden; - padding: 0px; - position: relative; - text-indent: 100%; - white-space: nowrap; - width: 20px; -} - -/* line 139, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next { - float: none; - background-position: -40px -15px; - height: 15px; - width: 30px; - display: block; - margin-left: 14px; - margin-top: 7px; -} - -/* line 149, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev { - background-position: -40px 0px; - margin-bottom: 7px; - margin-top: 0px; -} - -/* line 155, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box { - height: 151px; - overflow: hidden; - border-bottom: 1px solid #DDDDDD; -} - -/* line 161, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div { - background: #F5F5F5; - border-top: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: center; - border-collapse: collapse; - cursor: pointer; - border-bottom-width: 0px; - height: 25px; - line-height: 25px; -} - -/* line 174, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:first-child { - border-top-width: 0px; -} - -/* line 180, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_today_button:hover, -.xdsoft_datetimepicker .xdsoft_next:hover, -.xdsoft_datetimepicker .xdsoft_prev:hover { - opacity: 1; -} - -/* line 184, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label { - display: inline; - position: relative; - z-index: 9999; - margin: 0; - padding: 5px 3px; - font-size: 14px; - line-height: 20px; - font-weight: bold; - background-color: #fff; - float: left; - width: 182px; - text-align: center; - cursor: pointer; -} - -/* line 200, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label:hover { - text-decoration: underline; -} - -/* line 204, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select { - border: 1px solid #ccc; - position: absolute; - right: 0px; - top: 30px; - z-index: 101; - display: none; - background: #fff; - max-height: 160px; - overflow-y: hidden; -} - -/* line 216, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect { - right: -7px; -} - -/* line 220, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect { - right: 2px; -} - -/* line 224, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover { - color: #fff; - background: #ff8000; -} - -/* line 229, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option { - padding: 2px 10px 2px 5px; -} - -/* line 233, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 240, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_month { - width: 90px; - text-align: right; -} - -/* line 245, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar { - clear: both; -} - -/* line 249, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_year { - width: 56px; -} - -/* line 253, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar table { - border-collapse: collapse; - width: 100%; -} - -/* line 259, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td > div { - padding-right: 5px; -} - -/* line 263, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - height: 25px; -} - -/* line 267, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td, .xdsoft_datetimepicker .xdsoft_calendar th { - width: 14.2857142%; - background: #F5F5F5; - border: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: right; - padding: 0px; - border-collapse: collapse; - cursor: pointer; - height: 25px; -} - -/* line 280, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - background: #F1F1F1; -} - -/* line 284, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today { - color: #33AAFF; -} - -/* line 290, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 299, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled, -.xdsoft_datetimepicker .xdsoft_time_box > div > div.xdsoft_disabled { - opacity: 0.5; -} - -/* line 303, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled { - opacity: 0.2; -} - -/* line 308, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:hover { - color: #fff !important; - background: #ff8000 !important; - box-shadow: none !important; -} - -/* line 315, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_disabled:hover { - color: inherit !important; - background: inherit !important; - /*box-shadow: inherit !important;*/ -} - -/* line 321, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - font-weight: 700; - text-align: center; - color: #999; - cursor: default; -} - -/* line 328, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_copyright { - color: #ccc !important; - font-size: 10px; - clear: both; - float: none; - margin-left: 8px; -} - -/* line 336, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a { - color: #eee !important; -} - -/* line 340, assetic_compassiP1C2P.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a:hover { - color: #aaa !important; -} - -/* line 344, assetic_compassiP1C2P.scss */ -.xdsoft_time_box { - position: relative; - border: 1px solid #ccc; -} - -/* line 349, assetic_compassiP1C2P.scss */ -.xdsoft_scrollbar > .xdsoft_scroller { - background: #ccc !important; - height: 20px; - border-radius: 3px; -} - -/* line 355, assetic_compassiP1C2P.scss */ -.xdsoft_scrollbar { - position: absolute; - width: 7px; - right: 0px; - top: 0px; - bottom: 0px; - cursor: pointer; -} - -/* line 364, assetic_compassiP1C2P.scss */ -.xdsoft_scroller_box { - position: relative; -} - -/* line 2, assetic_compass09ABip.scss */ -.event.box h2 { - padding: 0.5rem; -} -/* line 4, assetic_compass09ABip.scss */ -.event.box h2 a, .event.box h2 a:hover, .event.box h2 a:visited { - color: #ffffff; -} -/* line 9, assetic_compass09ABip.scss */ -.event.box .startdate, .event.box .location, .event.box .url, .event.box .edit { - /*float: left;*/ - display: inline; - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; -} -/* line 17, assetic_compass09ABip.scss */ -.event.box ul.tags { - padding-left: 0; - /*float: left;*/ - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; - display: inline; -} -/* line 24, assetic_compass09ABip.scss */ -.event.box ul.tags li { - list-style-type: none; - /*float: left;*/ - display: inline; - margin-right: 0.5rem; -} - -/* line 35, assetic_compass09ABip.scss */ -form .ui.form .field .attached-label > input, form .ui.form .field .attached-label > textarea { - margin-bottom: 2rem; -} - -/* line 41, assetic_compass09ABip.scss */ -#map { - height: 20rem; -} diff --git a/web/css/c57d364.css b/web/css/c57d364.css deleted file mode 100644 index b46e4da..0000000 --- a/web/css/c57d364.css +++ /dev/null @@ -1,42 +0,0 @@ -/* line 2, assetic_compasscXEbLP.scss */ -.event.box h2 { - padding: 0.5rem; -} -/* line 4, assetic_compasscXEbLP.scss */ -.event.box h2 a, .event.box h2 a:hover, .event.box h2 a:visited { - color: #ffffff; -} -/* line 9, assetic_compasscXEbLP.scss */ -.event.box .startdate, .event.box .location, .event.box .url, .event.box .edit { - /*float: left;*/ - display: inline; - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; -} -/* line 17, assetic_compasscXEbLP.scss */ -.event.box ul.tags { - padding-left: 0; - /*float: left;*/ - margin: 0; - margin-right: 0.5rem; - margin-bottom: 0.5rem; - display: inline; -} -/* line 24, assetic_compasscXEbLP.scss */ -.event.box ul.tags li { - list-style-type: none; - /*float: left;*/ - display: inline; - margin-right: 0.5rem; -} - -/* line 35, assetic_compasscXEbLP.scss */ -form .ui.form .field .attached-label > input, form .ui.form .field .attached-label > textarea { - margin-bottom: 2rem; -} - -/* line 41, assetic_compasscXEbLP.scss */ -#map { - height: 20rem; -} diff --git a/web/css/custom.css b/web/css/custom.css deleted file mode 100755 index eeefcc3..0000000 --- a/web/css/custom.css +++ /dev/null @@ -1,33 +0,0 @@ -body { - margin: 0; - font-family: 'Roboto', sans-serif; -} - -header { - top: 0; -} - -header .ui.grid > .column, .title.ui.grid > .column { - margin-top: 0; - margin-bottom: 0; -} - -.box h2 { - font-size: 1rem !important; -} - -#main { - margin-top: 4rem; -} - -a .icon { - text-decoration: none; -} - -a, a:hover, a:visited { - color: #000000; -} - -a:hover { - text-decoration: none; -} \ No newline at end of file diff --git a/web/css/custom.scss b/web/css/custom.scss new file mode 100644 index 0000000..e69de29 diff --git a/web/css/f9f8a0d.css b/web/css/f9f8a0d.css deleted file mode 100644 index 84ac2bf..0000000 --- a/web/css/f9f8a0d.css +++ /dev/null @@ -1,417 +0,0 @@ -/* line 1, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker { - box-shadow: 0px 5px 15px -5px rgba(0, 0, 0, 0.506); - background: #FFFFFF; - border-bottom: 1px solid #BBBBBB; - border-left: 1px solid #CCCCCC; - border-right: 1px solid #CCCCCC; - border-top: 1px solid #CCCCCC; - color: #333333; - font-family: "Helvetica Neue", "Helvetica", "Arial", sans-serif; - padding: 8px; - padding-left: 0px; - padding-top: 2px; - position: absolute; - z-index: 9999; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: none; -} - -/* line 20, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker iframe { - position: absolute; - left: 0; - top: 0; - width: 75px; - height: 210px; - background: transparent; - border: none; -} - -/*For IE8 or lower*/ -/* line 31, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker button { - border: none !important; -} - -/* line 35, assetic_compassQzxHpj.scss */ -.xdsoft_noselect { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -/* line 45, assetic_compassQzxHpj.scss */ -.xdsoft_noselect::selection { - background: transparent; -} - -/* line 49, assetic_compassQzxHpj.scss */ -.xdsoft_noselect::-moz-selection { - background: transparent; -} - -/* line 53, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker.xdsoft_inline { - display: inline-block; - position: static; - box-shadow: none; -} - -/* line 59, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker * { - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0px; - margin: 0px; -} - -/* line 66, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker, .xdsoft_datetimepicker .xdsoft_timepicker { - display: none; -} - -/* line 70, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active, .xdsoft_datetimepicker .xdsoft_timepicker.active { - display: block; -} - -/* line 74, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker { - width: 224px; - float: left; - margin-left: 8px; -} - -/* line 80, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker { - width: 58px; - float: left; - text-align: center; - margin-left: 8px; - margin-top: 0px; -} - -/* line 88, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_datepicker.active + .xdsoft_timepicker { - margin-top: 8px; - margin-bottom: 3px; -} - -/* line 93, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_mounthpicker { - position: relative; - text-align: center; -} - -/* line 98, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_today_button { - background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAeCAYAAACsYQl4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozQjRCQjRGREU4MkNFMzExQjRDQkIyRDJDOTdBRUI1MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCQjg0OUYyNTZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCQjg0OUYyNDZDODAxMUUzQjMwM0IwMERBNUU0ODQ5NSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI5NzE3MjFBN0E2Q0UzMTFBQjJEQjgzMDk5RTNBNTdBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNCNEJCNEZERTgyQ0UzMTFCNENCQjJEMkM5N0FFQjUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+aQvATgAAAfVJREFUeNrsmr1OwzAQxzGtkPjYEAuvVGAvfQIGRKADE49gdLwDDwBiZ2RhQUKwICQkWLsgFiRQuIBTucFJ/XFp4+hO+quqnZ4uvzj2nV2RpukCW/22yAgYNINmc7du7DcghCjrkqgOKjF1znpt6rZ0AGWQj7TvCU8d9UM+QAGDrhdyc2Bnc1WVVPBev9V8lBnY+rDwncWZThG4xk4lmxtJy2AHgoY/FySgbSBPwPZ8mEXbQx3aDERb0EbYAYFC7pcAtAvkMWwC0D3NX58S9D/YnoGC7nPWr3Dg9JTbtuHhDShBT8D2CBSK/iIEvVXxpuxSgh7DdgwUTL4iA92zmJb6lKB/YTsECmV+IgK947AGDIqgQ/LojsO135Hn51l2cWlov0JdGNrPUceueXRwilSVgkUyom9Rd6gbLfYTDeO+1v6orn0InTogYDGUkYLO3/wc9BdqqTCKP1Tfi+oTIaCBIL2TES+GTyruT9S61p6BHam+99DFEAgLFklYsIBHwSI9QY80H5ta+1rB/6ovaKihBJeEJbgLbBlQgl+j3lDPqA2tfQV1j3pVn8s+oKHGTSVJ+FqDLeR5bCqJ2E/BCycsoLZETXaKGs7rhKVt+9HZScrZNMi88V8P7LlDbvOZYaJVpMMmBCT4n0o8dTBoNgbdWPsRYACs3r7XyNfbnAAAAABJRU5ErkJggg=="); -} - -/* line 102, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_prev { - float: left; - background-position: -20px 0px; -} - -/* line 107, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_today_button { - float: left; - background-position: -70px 0px; - margin-left: 5px; -} - -/* line 113, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_next { - float: right; - background-position: 0px 0px; -} - -/* line 121, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_next, .xdsoft_datetimepicker .xdsoft_prev, .xdsoft_datetimepicker .xdsoft_today_button { - background-color: transparent; - background-repeat: no-repeat; - border: 0px none currentColor; - cursor: pointer; - display: block; - height: 30px; - opacity: 0.5; - outline: medium none currentColor; - overflow: hidden; - padding: 0px; - position: relative; - text-indent: 100%; - white-space: nowrap; - width: 20px; -} - -/* line 139, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_next { - float: none; - background-position: -40px -15px; - height: 15px; - width: 30px; - display: block; - margin-left: 14px; - margin-top: 7px; -} - -/* line 149, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_prev { - background-position: -40px 0px; - margin-bottom: 7px; - margin-top: 0px; -} - -/* line 155, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box { - height: 151px; - overflow: hidden; - border-bottom: 1px solid #DDDDDD; -} - -/* line 161, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div { - background: #F5F5F5; - border-top: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: center; - border-collapse: collapse; - cursor: pointer; - border-bottom-width: 0px; - height: 25px; - line-height: 25px; -} - -/* line 174, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:first-child { - border-top-width: 0px; -} - -/* line 180, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_today_button:hover, -.xdsoft_datetimepicker .xdsoft_next:hover, -.xdsoft_datetimepicker .xdsoft_prev:hover { - opacity: 1; -} - -/* line 184, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label { - display: inline; - position: relative; - z-index: 9999; - margin: 0; - padding: 5px 3px; - font-size: 14px; - line-height: 20px; - font-weight: bold; - background-color: #fff; - float: left; - width: 182px; - text-align: center; - cursor: pointer; -} - -/* line 200, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label:hover { - text-decoration: underline; -} - -/* line 204, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select { - border: 1px solid #ccc; - position: absolute; - right: 0px; - top: 30px; - z-index: 101; - display: none; - background: #fff; - max-height: 160px; - overflow-y: hidden; -} - -/* line 216, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_monthselect { - right: -7px; -} - -/* line 220, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select.xdsoft_yearselect { - right: 2px; -} - -/* line 224, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option:hover { - color: #fff; - background: #ff8000; -} - -/* line 229, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option { - padding: 2px 10px 2px 5px; -} - -/* line 233, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_label > .xdsoft_select > div > .xdsoft_option.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 240, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_month { - width: 90px; - text-align: right; -} - -/* line 245, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar { - clear: both; -} - -/* line 249, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_year { - width: 56px; -} - -/* line 253, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar table { - border-collapse: collapse; - width: 100%; -} - -/* line 259, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td > div { - padding-right: 5px; -} - -/* line 263, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - height: 25px; -} - -/* line 267, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td, .xdsoft_datetimepicker .xdsoft_calendar th { - width: 14.2857142%; - background: #F5F5F5; - border: 1px solid #DDDDDD; - color: #666666; - font-size: 12px; - text-align: right; - padding: 0px; - border-collapse: collapse; - cursor: pointer; - height: 25px; -} - -/* line 280, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - background: #F1F1F1; -} - -/* line 284, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_today { - color: #33AAFF; -} - -/* line 290, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_default, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_current, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_current { - background: #33AAFF; - box-shadow: #178FE5 0px 1px 3px 0px inset; - color: #fff; - font-weight: 700; -} - -/* line 299, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month, -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled, -.xdsoft_datetimepicker .xdsoft_time_box > div > div.xdsoft_disabled { - opacity: 0.5; -} - -/* line 303, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_other_month.xdsoft_disabled { - opacity: 0.2; -} - -/* line 308, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div:hover { - color: #fff !important; - background: #ff8000 !important; - box-shadow: none !important; -} - -/* line 315, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar td.xdsoft_disabled:hover, -.xdsoft_datetimepicker .xdsoft_timepicker .xdsoft_time_box > div > div.xdsoft_disabled:hover { - color: inherit !important; - background: inherit !important; - /*box-shadow: inherit !important;*/ -} - -/* line 321, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_calendar th { - font-weight: 700; - text-align: center; - color: #999; - cursor: default; -} - -/* line 328, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_copyright { - color: #ccc !important; - font-size: 10px; - clear: both; - float: none; - margin-left: 8px; -} - -/* line 336, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a { - color: #eee !important; -} - -/* line 340, assetic_compassQzxHpj.scss */ -.xdsoft_datetimepicker .xdsoft_copyright a:hover { - color: #aaa !important; -} - -/* line 344, assetic_compassQzxHpj.scss */ -.xdsoft_time_box { - position: relative; - border: 1px solid #ccc; -} - -/* line 349, assetic_compassQzxHpj.scss */ -.xdsoft_scrollbar > .xdsoft_scroller { - background: #ccc !important; - height: 20px; - border-radius: 3px; -} - -/* line 355, assetic_compassQzxHpj.scss */ -.xdsoft_scrollbar { - position: absolute; - width: 7px; - right: 0px; - top: 0px; - bottom: 0px; - cursor: pointer; -} - -/* line 364, assetic_compassQzxHpj.scss */ -.xdsoft_scroller_box { - position: relative; -} diff --git a/web/css/semantic.css b/web/css/semantic.scss similarity index 99% rename from web/css/semantic.css rename to web/css/semantic.scss index 610c924..b5b8295 100755 --- a/web/css/semantic.css +++ b/web/css/semantic.scss @@ -1,3 +1,5 @@ +@charset "UTF-8"; + /* * # Semantic - Breadcrumb * http://github.com/jlukic/semantic-ui/ diff --git a/web/favicon.ico b/web/favicon.ico deleted file mode 100644 index 8648036..0000000 Binary files a/web/favicon.ico and /dev/null differ diff --git a/web/favicon.png b/web/favicon.png new file mode 100644 index 0000000..be99b5e Binary files /dev/null and b/web/favicon.png differ diff --git a/web/js/73cfd50.js b/web/js/73cfd50.js deleted file mode 100644 index c979ce3..0000000 --- a/web/js/73cfd50.js +++ /dev/null @@ -1,1472 +0,0 @@ -/** - * @preserve jQuery DateTimePicker plugin v2.3.0 - * @homepage http://xdsoft.net/jqplugins/datetimepicker/ - * (c) 2014, Chupurnov Valeriy. - */ -(function( $ ) { - 'use strict'; - var default_options = { - i18n:{ - bg:{ // Bulgarian - months:[ - "Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември" - ], - dayOfWeek:[ - "Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" - ] - }, - fa:{ // Persian/Farsi - months:[ - 'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند' - ], - dayOfWeek:[ - 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه' - ] - }, - ru:{ // Russian - months:[ - 'Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь' - ], - dayOfWeek:[ - "Вск", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб" - ] - }, - en:{ // English - months: [ - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ], - dayOfWeek: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" - ] - }, - el:{ // Ελληνικά - months: [ - "Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος" - ], - dayOfWeek: [ - "Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ" - ] - }, - de:{ // German - months:[ - 'Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember' - ], - dayOfWeek:[ - "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" - ] - }, - nl:{ // Dutch - months:[ - "januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december" - ], - dayOfWeek:[ - "zo", "ma", "di", "wo", "do", "vr", "za" - ] - }, - tr:{ // Turkish - months:[ - "Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık" - ], - dayOfWeek:[ - "Paz", "Pts", "Sal", "Çar", "Per", "Cum", "Cts" - ] - }, - fr:{ //French - months:[ - "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre" - ], - dayOfWeek:[ - "Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam" - ] - }, - es:{ // Spanish - months: [ - "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb" - ] - }, - th:{ // Thai - months:[ - 'มกราคม','กุมภาพันธ์','มีนาคม','เมษายน','พฤษภาคม','มิถุนายน','กรกฎาคม','สิงหาคม','กันยายน','ตุลาคม','พฤศจิกายน','ธันวาคม' - ], - dayOfWeek:[ - 'อา.','จ.','อ.','พ.','พฤ.','ศ.','ส.' - ] - }, - pl:{ // Polish - months: [ - "styczeń", "luty", "marzec", "kwiecień", "maj", "czerwiec", "lipiec", "sierpień", "wrzesień", "październik", "listopad", "grudzień" - ], - dayOfWeek: [ - "nd", "pn", "wt", "śr", "cz", "pt", "sb" - ] - }, - pt:{ // Portuguese - months: [ - "Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro" - ], - dayOfWeek: [ - "Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab" - ] - }, - ch:{ // Simplified Chinese - months: [ - "一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月" - ], - dayOfWeek: [ - "日", "一","二","三","四","五","六" - ] - }, - se:{ // Swedish - months: [ - "Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September","Oktober", "November", "December" - ], - dayOfWeek: [ - "Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör" - ] - }, - kr:{ // Korean - months: [ - "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" - ], - dayOfWeek: [ - "일", "월", "화", "수", "목", "금", "토" - ] - }, - it:{ // Italian - months: [ - "Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre" - ], - dayOfWeek: [ - "Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab" - ] - }, - da:{ // Dansk - months: [ - "January", "Februar", "Marts", "April", "Maj", "Juni", "July", "August", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Søn", "Man", "Tir", "ons", "Tor", "Fre", "lør" - ] - }, - no:{ // Norwegian - months: [ - "Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember" - ], - dayOfWeek: [ - "Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør" - ] - }, - ja:{ // Japanese - months: [ - "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月" - ], - dayOfWeek: [ - "日", "月", "火", "水", "木", "金", "土" - ] - }, - vi:{ // Vietnamese - months: [ - "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10", "Tháng 11", "Tháng 12" - ], - dayOfWeek: [ - "CN", "T2", "T3", "T4", "T5", "T6", "T7" - ] - }, - sl:{ // Slovenščina - months: [ - "Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December" - ], - dayOfWeek: [ - "Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob" - ] - }, - cs:{ // Čeština - months: [ - "Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec" - ], - dayOfWeek: [ - "Ne", "Po", "Út", "St", "Čt", "Pá", "So" - ] - }, - hu:{ // Hungarian - months: [ - "Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December" - ], - dayOfWeek: [ - "Va", "Hé", "Ke", "Sze", "Cs", "Pé", "Szo" - ] - } - }, - value:'', - lang:'en', - - format: 'Y/m/d H:i', - formatTime: 'H:i', - formatDate: 'Y/m/d', - - startDate: false, // new Date(), '1986/12/08', '-1970/01/05','-1970/01/05', - - step:60, - monthChangeSpinner:true, - closeOnDateSelect:false, - closeOnWithoutClick:true, - closeOnInputClick: true, - - timepicker:true, - datepicker:true, - - minDate:false, - maxDate:false, - minTime:false, - maxTime:false, - - allowTimes:[], - opened:false, - initTime:true, - inline:false, - - onSelectDate:function() {}, - onSelectTime:function() {}, - onChangeMonth:function() {}, - onChangeDateTime:function() {}, - onShow:function() {}, - onClose:function() {}, - onGenerate:function() {}, - - withoutCopyright:true, - - inverseButton:false, - hours12:false, - next: 'xdsoft_next', - prev : 'xdsoft_prev', - dayOfWeekStart:0, - - timeHeightInTimePicker:25, - timepickerScrollbar:true, - - todayButton:true, // 2.1.0 - defaultSelect:true, // 2.1.0 - - scrollMonth:true, - scrollTime:true, - scrollInput:true, - - lazyInit:false, - - mask:false, - validateOnBlur:true, - allowBlank:true, - - yearStart:1950, - yearEnd:2050, - - style:'', - id:'', - - fixed: false, - - roundTime:'round', // ceil, floor - className:'', - - weekends : [], - yearOffset:0, - beforeShowDay: null - }; - - // fix for ie8 - if ( !Array.prototype.indexOf ) { - Array.prototype.indexOf = function(obj, start) { - for (var i = (start || 0), j = this.length; i < j; i++) { - if (this[i] === obj) { return i; } - } - return -1; - } - } - - Date.prototype.countDaysInMonth = function(){ - return new Date(this.getFullYear(), this.getMonth()+1, 0).getDate(); - }; - - $.fn.xdsoftScroller = function( _percent ) { - return this.each(function() { - var timeboxparent = $(this); - if( !$(this).hasClass('xdsoft_scroller_box') ) { - var pointerEventToXY = function( e ) { - var out = {x:0, y:0}; - if( e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel' ) { - var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0]; - out.x = touch.pageX; - out.y = touch.pageY; - }else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') { - out.x = e.pageX; - out.y = e.pageY; - } - return out; - }, - move = 0, - timebox = timeboxparent.children().eq(0), - parentHeight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - scrollbar = $('
'), - scroller = $('
'), - maximumOffset = 100, - start = false; - - scrollbar.append(scroller); - - timeboxparent.addClass('xdsoft_scroller_box').append(scrollbar); - scroller.on('mousedown.xdsoft_scroller',function ( event ) { - if( !parentHeight ) - timeboxparent.trigger('resize_scroll.xdsoft_scroller',[_percent]); - var pageY = event.pageY, - top = parseInt(scroller.css('margin-top')), - h1 = scrollbar[0].offsetHeight; - $(document.body).addClass('xdsoft_noselect'); - $([document.body,window]).on('mouseup.xdsoft_scroller',function arguments_callee() { - $([document.body,window]).off('mouseup.xdsoft_scroller',arguments_callee) - .off('mousemove.xdsoft_scroller',move) - .removeClass('xdsoft_noselect'); - }); - $(document.body).on('mousemove.xdsoft_scroller',move = function(event) { - var offset = event.pageY-pageY+top; - if( offset<0 ) - offset = 0; - if( offset+scroller[0].offsetHeight>h1 ) - offset = h1-scroller[0].offsetHeight; - timeboxparent.trigger('scroll_element.xdsoft_scroller',[maximumOffset?offset/maximumOffset:0]); - }); - }); - - timeboxparent - .on('scroll_element.xdsoft_scroller',function( event,percent ) { - if( !parentHeight ) - timeboxparent.trigger('resize_scroll.xdsoft_scroller',[percent,true]); - percent = percent>1?1:(percent<0||isNaN(percent))?0:percent; - scroller.css('margin-top',maximumOffset*percent); - timebox.css('marginTop',-parseInt((height-parentHeight)*percent)) - }) - .on('resize_scroll.xdsoft_scroller',function( event,_percent,noTriggerScroll ) { - parentHeight = timeboxparent[0].clientHeight; - height = timebox[0].offsetHeight; - var percent = parentHeight/height, - sh = percent*scrollbar[0].offsetHeight; - if( percent>1 ) - scroller.hide(); - else{ - scroller.show(); - scroller.css('height',parseInt(sh>10?sh:10)); - maximumOffset = scrollbar[0].offsetHeight-scroller[0].offsetHeight; - if( noTriggerScroll!==true ) - timeboxparent.trigger('scroll_element.xdsoft_scroller',[_percent?_percent:Math.abs(parseInt(timebox.css('marginTop')))/(height-parentHeight)]); - } - }); - timeboxparent.mousewheel&&timeboxparent.mousewheel(function(event, delta, deltaX, deltaY) { - var top = Math.abs(parseInt(timebox.css('marginTop'))); - timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-delta*20)/(height-parentHeight)]); - event.stopPropagation(); - return false; - }); - timeboxparent.on('touchstart',function( event ) { - start = pointerEventToXY(event); - }); - timeboxparent.on('touchmove',function( event ) { - if( start ) { - var coord = pointerEventToXY(event), top = Math.abs(parseInt(timebox.css('marginTop'))); - timeboxparent.trigger('scroll_element.xdsoft_scroller',[(top-(coord.y-start.y))/(height-parentHeight)]); - event.stopPropagation(); - event.preventDefault(); - start = pointerEventToXY(event); - } - }); - timeboxparent.on('touchend touchcancel',function( event ) { - start = false; - }); - } - timeboxparent.trigger('resize_scroll.xdsoft_scroller',[_percent]); - }); - }; - $.fn.datetimepicker = function( opt ) { - var KEY0 = 48, - KEY9 = 57, - _KEY0 = 96, - _KEY9 = 105, - CTRLKEY = 17, - DEL = 46, - ENTER = 13, - ESC = 27, - BACKSPACE = 8, - ARROWLEFT = 37, - ARROWUP = 38, - ARROWRIGHT = 39, - ARROWDOWN = 40, - TAB = 9, - F5 = 116, - AKEY = 65, - CKEY = 67, - VKEY = 86, - ZKEY = 90, - YKEY = 89, - ctrlDown = false, - options = ($.isPlainObject(opt)||!opt)?$.extend(true,{},default_options,opt):$.extend({},default_options), - - lazyInitTimer = 0, - - lazyInit = function( input ){ - input - .on('open.xdsoft focusin.xdsoft mousedown.xdsoft',function initOnActionCallback(event) { - if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible')||input.data( 'xdsoft_datetimepicker') ) - return; - - clearTimeout(lazyInitTimer); - - lazyInitTimer = setTimeout(function() { - - if( !input.data( 'xdsoft_datetimepicker') ) - createDateTimePicker(input); - - input - .off('open.xdsoft focusin.xdsoft mousedown.xdsoft',initOnActionCallback) - .trigger('open.xdsoft'); - },100); - - }); - }, - - createDateTimePicker = function( input ) { - - var datetimepicker = $('
'), - xdsoft_copyright = $(''), - datepicker = $('
'), - mounth_picker = $('
'), - calendar = $('
'), - timepicker = $('
'), - timeboxparent = timepicker.find('.xdsoft_time_box').eq(0), - timebox = $('
'), - scrollbar = $('
'), - scroller = $('
'), - monthselect =$('
'), - yearselect =$('
'); - - //constructor lego - mounth_picker - .find('.xdsoft_month span') - .after(monthselect); - mounth_picker - .find('.xdsoft_year span') - .after(yearselect); - - mounth_picker - .find('.xdsoft_month,.xdsoft_year') - .on('mousedown.xdsoft',function(event) { - mounth_picker - .find('.xdsoft_select') - .hide(); - - var select = $(this).find('.xdsoft_select').eq(0), - val = 0, - top = 0; - - if( _xdsoft_datetime.currentTime ) - val = _xdsoft_datetime.currentTime[$(this).hasClass('xdsoft_month')?'getMonth':'getFullYear'](); - - select.show(); - - for(var items = select.find('div.xdsoft_option'),i = 0;i6 ) - options.dayOfWeekStart = 0; - else - options.dayOfWeekStart = parseInt(options.dayOfWeekStart); - - if( !options.timepickerScrollbar ) - scrollbar.hide(); - - if( options.minDate && /^-(.*)$/.test(options.minDate) ){ - options.minDate = _xdsoft_datetime.strToDateTime(options.minDate).dateFormat( options.formatDate ); - } - - if( options.maxDate && /^\+(.*)$/.test(options.maxDate) ) { - options.maxDate = _xdsoft_datetime.strToDateTime(options.maxDate).dateFormat( options.formatDate ); - } - - mounth_picker - .find('.xdsoft_today_button') - .css('visibility',!options.todayButton?'hidden':'visible'); - - if( options.mask ) { - var e, - getCaretPos = function ( input ) { - try{ - if ( document.selection && document.selection.createRange ) { - var range = document.selection.createRange(); - return range.getBookmark().charCodeAt(2) - 2; - }else - if ( input.setSelectionRange ) - return input.selectionStart; - }catch(e) { - return 0; - } - }, - setCaretPos = function ( node,pos ) { - node = (typeof node == "string" || node instanceof String) ? document.getElementById(node) : node; - if(!node) { - return false; - }else if(node.createTextRange) { - var textRange = node.createTextRange(); - textRange.collapse(true); - textRange.moveEnd(pos); - textRange.moveStart(pos); - textRange.select(); - return true; - }else if(node.setSelectionRange) { - node.setSelectionRange(pos,pos); - return true; - } - return false; - }, - isValidValue = function ( mask,value ) { - var reg = mask - .replace(/([\[\]\/\{\}\(\)\-\.\+]{1})/g,'\\$1') - .replace(/_/g,'{digit+}') - .replace(/([0-9]{1})/g,'{digit$1}') - .replace(/\{digit([0-9]{1})\}/g,'[0-$1_]{1}') - .replace(/\{digit[\+]\}/g,'[0-9_]{1}'); - return RegExp(reg).test(value); - }; - input.off('keydown.xdsoft'); - switch(true) { - case ( options.mask===true ): - - options.mask = options.format - .replace(/Y/g,'9999') - .replace(/F/g,'9999') - .replace(/m/g,'19') - .replace(/d/g,'39') - .replace(/H/g,'29') - .replace(/i/g,'59') - .replace(/s/g,'59'); - - case ( $.type(options.mask) == 'string' ): - - if( !isValidValue( options.mask,input.val() ) ) - input.val(options.mask.replace(/[0-9]/g,'_')); - - input.on('keydown.xdsoft',function( event ) { - var val = this.value, - key = event.which; - - switch(true) { - case (( key>=KEY0&&key<=KEY9 )||( key>=_KEY0&&key<=_KEY9 ))||(key==BACKSPACE||key==DEL): - var pos = getCaretPos(this), - digit = ( key!=BACKSPACE&&key!=DEL )?String.fromCharCode((_KEY0 <= key && key <= _KEY9)? key-KEY0 : key):'_'; - - if( (key==BACKSPACE||key==DEL)&&pos ) { - pos--; - digit='_'; - } - - while( /[^0-9_]/.test(options.mask.substr(pos,1))&&pos0 ) - pos+=( key==BACKSPACE||key==DEL )?-1:1; - - val = val.substr(0,pos)+digit+val.substr(pos+1); - if( $.trim(val)=='' ){ - val = options.mask.replace(/[0-9]/g,'_'); - }else{ - if( pos==options.mask.length ) - break; - } - - pos+=(key==BACKSPACE||key==DEL)?0:1; - while( /[^0-9_]/.test(options.mask.substr(pos,1))&&pos0 ) - pos+=(key==BACKSPACE||key==DEL)?-1:1; - - if( isValidValue( options.mask,val ) ) { - this.value = val; - setCaretPos(this,pos); - }else if( $.trim(val)=='' ) - this.value = options.mask.replace(/[0-9]/g,'_'); - else{ - input.trigger('error_input.xdsoft'); - } - break; - case ( !!~([AKEY,CKEY,VKEY,ZKEY,YKEY].indexOf(key))&&ctrlDown ): - case !!~([ESC,ARROWUP,ARROWDOWN,ARROWLEFT,ARROWRIGHT,F5,CTRLKEY,TAB,ENTER].indexOf(key)): - return true; - } - event.preventDefault(); - return false; - }); - break; - } - } - if( options.validateOnBlur ) { - input - .off('blur.xdsoft') - .on('blur.xdsoft', function() { - if( options.allowBlank && !$.trim($(this).val()).length ) { - $(this).val(null); - datetimepicker.data('xdsoft_datetime').empty(); - }else if( !Date.parseDate( $(this).val(), options.format ) ) { - $(this).val((_xdsoft_datetime.now()).dateFormat( options.format )); - datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val()); - } - else{ - datetimepicker.data('xdsoft_datetime').setCurrentTime($(this).val()); - } - datetimepicker.trigger('changedatetime.xdsoft'); - }); - } - options.dayOfWeekStartPrev = (options.dayOfWeekStart==0)?6:options.dayOfWeekStart-1; - - datetimepicker - .trigger('xchange.xdsoft') - .trigger('afterOpen.xdsoft') - }; - - datetimepicker - .data('options',options) - .on('mousedown.xdsoft',function( event ) { - event.stopPropagation(); - event.preventDefault(); - yearselect.hide(); - monthselect.hide(); - return false; - }); - - var scroll_element = timepicker.find('.xdsoft_time_box'); - scroll_element.append(timebox); - scroll_element.xdsoftScroller(); - - datetimepicker.on('afterOpen.xdsoft',function() { - scroll_element.xdsoftScroller(); - }); - - datetimepicker - .append(datepicker) - .append(timepicker); - - if( options.withoutCopyright!==true ) - datetimepicker - .append(xdsoft_copyright); - - datepicker - .append(mounth_picker) - .append(calendar); - - $('body').append(datetimepicker); - - var _xdsoft_datetime = new function() { - var _this = this; - _this.now = function() { - var d = new Date(); - if( options.yearOffset ) - d.setFullYear(d.getFullYear()+options.yearOffset); - return d; - }; - - _this.currentTime = this.now(); - _this.isValidDate = function (d) { - if ( Object.prototype.toString.call(d) !== "[object Date]" ) - return false; - return !isNaN(d.getTime()); - }; - - _this.setCurrentTime = function( dTime) { - _this.currentTime = (typeof dTime == 'string')? _this.strToDateTime(dTime) : _this.isValidDate(dTime) ? dTime: _this.now(); - datetimepicker.trigger('xchange.xdsoft'); - }; - - _this.empty = function() { - _this.currentTime = null; - }; - - _this.getCurrentTime = function( dTime) { - return _this.currentTime; - }; - - _this.nextMonth = function() { - var month = _this.currentTime.getMonth()+1; - if( month==12 ) { - _this.currentTime.setFullYear(_this.currentTime.getFullYear()+1); - month = 0; - } - _this.currentTime.setDate( - Math.min( - Date.daysInMonth[month], - _this.currentTime.getDate() - ) - ); - _this.currentTime.setMonth(month); - options.onChangeMonth&&options.onChangeMonth.call&&options.onChangeMonth.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - datetimepicker.trigger('xchange.xdsoft'); - return month; - }; - - _this.prevMonth = function() { - var month = _this.currentTime.getMonth()-1; - if( month==-1 ) { - _this.currentTime.setFullYear(_this.currentTime.getFullYear()-1); - month = 11; - } - _this.currentTime.setDate( - Math.min( - Date.daysInMonth[month], - _this.currentTime.getDate() - ) - ); - _this.currentTime.setMonth(month); - options.onChangeMonth&&options.onChangeMonth.call&&options.onChangeMonth.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - datetimepicker.trigger('xchange.xdsoft'); - return month; - }; - - _this.strToDateTime = function( sDateTime ) { - if( sDateTime && sDateTime instanceof Date && _this.isValidDate(sDateTime) ) - return sDateTime; - - var tmpDate = [],timeOffset,currentTime; - - if( ( tmpDate = /^(\+|\-)(.*)$/.exec(sDateTime) ) && ( tmpDate[2]=Date.parseDate(tmpDate[2], options.formatDate) ) ) { - timeOffset = tmpDate[2].getTime()-(tmpDate[2].getTimezoneOffset())*60000; - currentTime = new Date((_xdsoft_datetime.now()).getTime()+parseInt(tmpDate[1]+'1')*timeOffset); - }else - currentTime = sDateTime?Date.parseDate(sDateTime, options.format):_this.now(); - - if( !_this.isValidDate(currentTime) ) - currentTime = _this.now(); - - return currentTime; - }; - - _this.strtodate = function( sDate ) { - if( sDate && sDate instanceof Date && _this.isValidDate(sDate) ) - return sDate; - - var currentTime = sDate?Date.parseDate(sDate, options.formatDate):_this.now(); - if( !_this.isValidDate(currentTime) ) - currentTime = _this.now(); - - return currentTime; - }; - - _this.strtotime = function( sTime ) { - if( sTime && sTime instanceof Date && _this.isValidDate(sTime) ) - return sTime; - - var currentTime = sTime?Date.parseDate(sTime, options.formatTime):_this.now(); - if( !_this.isValidDate(currentTime) ) - currentTime = _this.now(); - - return currentTime; - }; - - _this.str = function() { - return _this.currentTime.dateFormat(options.format); - }; - }; - mounth_picker - .find('.xdsoft_today_button') - .on('mousedown.xdsoft',function() { - datetimepicker.data('changed',true); - _xdsoft_datetime.setCurrentTime(0); - datetimepicker.trigger('afterOpen.xdsoft'); - }).on('dblclick.xdsoft',function(){ - input.val( _xdsoft_datetime.str() ); - datetimepicker.trigger('close.xdsoft'); - }); - mounth_picker - .find('.xdsoft_prev,.xdsoft_next') - .on('mousedown.xdsoft',function() { - var $this = $(this), - timer = 0, - stop = false; - - (function arguments_callee1(v) { - var month = _xdsoft_datetime.currentTime.getMonth(); - if( $this.hasClass( options.next ) ) { - _xdsoft_datetime.nextMonth(); - }else if( $this.hasClass( options.prev ) ) { - _xdsoft_datetime.prevMonth(); - } - if (options.monthChangeSpinner) { - !stop&&(timer = setTimeout(arguments_callee1,v?v:100)); - } - })(500); - - $([document.body,window]).on('mouseup.xdsoft',function arguments_callee2() { - clearTimeout(timer); - stop = true; - $([document.body,window]).off('mouseup.xdsoft',arguments_callee2); - }); - }); - - timepicker - .find('.xdsoft_prev,.xdsoft_next') - .on('mousedown.xdsoft',function() { - var $this = $(this), - timer = 0, - stop = false, - period = 110; - (function arguments_callee4(v) { - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = Math.abs(parseInt(timebox.css('marginTop'))); - if( $this.hasClass(options.next) && (height-pheight)- options.timeHeightInTimePicker>=top ) { - timebox.css('marginTop','-'+(top+options.timeHeightInTimePicker)+'px') - }else if( $this.hasClass(options.prev) && top-options.timeHeightInTimePicker>=0 ) { - timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px') - } - timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]); - period= ( period>10 )?10:period-10; - !stop&&(timer = setTimeout(arguments_callee4,v?v:period)); - })(500); - $([document.body,window]).on('mouseup.xdsoft',function arguments_callee5() { - clearTimeout(timer); - stop = true; - $([document.body,window]) - .off('mouseup.xdsoft',arguments_callee5); - }); - }); - - var xchangeTimer = 0; - // base handler - generating a calendar and timepicker - datetimepicker - .on('xchange.xdsoft',function( event ) { - clearTimeout(xchangeTimer); - xchangeTimer = setTimeout(function(){ - var table = '', - start = new Date(_xdsoft_datetime.currentTime.getFullYear(),_xdsoft_datetime.currentTime.getMonth(),1, 12, 0, 0), - i = 0, - today = _xdsoft_datetime.now(); - - while( start.getDay()!=options.dayOfWeekStart ) - start.setDate(start.getDate()-1); - - //generate calendar - table+=''; - - // days - for(var j = 0; j<7; j++) { - table+=''; - } - - table+=''; - table+=''; - var maxDate = false, minDate = false; - - if( options.maxDate!==false ) { - maxDate = _xdsoft_datetime.strtodate(options.maxDate); - maxDate = new Date(maxDate.getFullYear(),maxDate.getMonth(),maxDate.getDate(),23,59,59,999); - } - - if( options.minDate!==false ) { - minDate = _xdsoft_datetime.strtodate(options.minDate); - minDate = new Date(minDate.getFullYear(),minDate.getMonth(),minDate.getDate()); - } - - var d,y,m,classes = [],customDateSettings; - - while( i<_xdsoft_datetime.currentTime.countDaysInMonth()||start.getDay()!=options.dayOfWeekStart||_xdsoft_datetime.currentTime.getMonth()==start.getMonth() ) { - classes = []; - i++; - - d = start.getDate(); y = start.getFullYear(); m = start.getMonth(); - - classes.push('xdsoft_date'); - - if ( options.beforeShowDay && options.beforeShowDay.call ) { - customDateSettings = options.beforeShowDay.call(datetimepicker, start); - } else { - customDateSettings = null; - } - - if( ( maxDate!==false && start > maxDate )||( minDate!==false && start < minDate )||(customDateSettings && customDateSettings[0] === false) ){ - classes.push('xdsoft_disabled'); - } - - if ( customDateSettings && customDateSettings[1] != "" ) { - classes.push(customDateSettings[1]); - } - - if( _xdsoft_datetime.currentTime.getMonth()!=m ) classes.push('xdsoft_other_month'); - - if( (options.defaultSelect||datetimepicker.data('changed')) && _xdsoft_datetime.currentTime.dateFormat( options.formatDate )==start.dateFormat( options.formatDate ) ) { - classes.push('xdsoft_current'); - } - - if( today.dateFormat( options.formatDate )==start.dateFormat( options.formatDate ) ) { - classes.push('xdsoft_today'); - } - - if( start.getDay()==0||start.getDay()==6||~options.weekends.indexOf(start.dateFormat( options.formatDate )) ) { - classes.push('xdsoft_weekend'); - } - - if(options.beforeShowDay && typeof options.beforeShowDay == 'function') { - classes.push(options.beforeShowDay(start)) - } - - table+=''; - - if( start.getDay()==options.dayOfWeekStartPrev ) { - table+=''; - } - - start.setDate(d+1); - } - table+='
'+options.i18n[options.lang].dayOfWeek[(j+options.dayOfWeekStart)>6?0:j+options.dayOfWeekStart]+'
'+ - '
'+d+'
'+ - '
'; - - calendar.html(table); - - mounth_picker.find('.xdsoft_label span').eq(0).text(options.i18n[options.lang].months[_xdsoft_datetime.currentTime.getMonth()]); - mounth_picker.find('.xdsoft_label span').eq(1).text(_xdsoft_datetime.currentTime.getFullYear()); - - // generate timebox - var time = '', - h = '', - m ='', - line_time = function line_time( h,m ) { - var now = _xdsoft_datetime.now(); - now.setHours(h); - h = parseInt(now.getHours()); - now.setMinutes(m); - m = parseInt(now.getMinutes()); - - classes = []; - if( (options.maxTime!==false&&_xdsoft_datetime.strtotime(options.maxTime).getTime()now.getTime())) - classes.push('xdsoft_disabled'); - if( (options.initTime||options.defaultSelect||datetimepicker.data('changed')) && parseInt(_xdsoft_datetime.currentTime.getHours())==parseInt(h)&&(options.step>59||Math[options.roundTime](_xdsoft_datetime.currentTime.getMinutes()/options.step)*options.step==parseInt(m))) { - if( options.defaultSelect||datetimepicker.data('changed')) { - classes.push('xdsoft_current'); - } else if( options.initTime ) { - classes.push('xdsoft_init_time'); - } - } - if( parseInt(today.getHours())==parseInt(h)&&parseInt(today.getMinutes())==parseInt(m)) - classes.push('xdsoft_today'); - time+= '
'+now.dateFormat(options.formatTime)+'
'; - }; - - if( !options.allowTimes || !$.isArray(options.allowTimes) || !options.allowTimes.length ) { - for( var i=0,j=0;i<(options.hours12?12:24);i++ ) { - for( j=0;j<60;j+=options.step ) { - h = (i<10?'0':'')+i; - m = (j<10?'0':'')+j; - line_time( h,m ); - } - } - }else{ - for( var i=0;i'+i+'
'; - } - yearselect.children().eq(0) - .html(opt); - - for( i = 0,opt = '';i<= 11;i++ ) { - opt+='
'+options.i18n[options.lang].months[i]+'
'; - } - monthselect.children().eq(0).html(opt); - $(datetimepicker) - .trigger('generate.xdsoft'); - },10); - event.stopPropagation(); - }) - .on('afterOpen.xdsoft',function() { - if( options.timepicker ) { - var classType; - if( timebox.find('.xdsoft_current').length ) { - classType = '.xdsoft_current'; - } else if( timebox.find('.xdsoft_init_time').length ) { - classType = '.xdsoft_init_time'; - } - - if( classType ) { - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = timebox.find(classType).index()*options.timeHeightInTimePicker+1; - if( (height-pheight)1||(options.closeOnDateSelect===true||( options.closeOnDateSelect===0&&!options.timepicker )))&&!options.inline ) { - datetimepicker.trigger('close.xdsoft'); - } - - if( options.onSelectDate && options.onSelectDate.call ) { - options.onSelectDate.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - - datetimepicker.data('changed',true); - datetimepicker.trigger('xchange.xdsoft'); - datetimepicker.trigger('changedatetime.xdsoft'); - setTimeout(function(){ - timerclick = 0; - },200); - }); - - timebox - .on('click.xdsoft', 'div', function (xdevent) { - xdevent.stopPropagation(); // NAJ: Prevents closing of Pop-ups, Modals and Flyouts - var $this = $(this), - currentTime = _xdsoft_datetime.currentTime; - if( $this.hasClass('xdsoft_disabled') ) - return false; - currentTime.setHours($this.data('hour')); - currentTime.setMinutes($this.data('minute')); - datetimepicker.trigger('select.xdsoft',[currentTime]); - - datetimepicker.data('input').val( _xdsoft_datetime.str() ); - - !options.inline&&datetimepicker.trigger('close.xdsoft'); - - if( options.onSelectTime&&options.onSelectTime.call ) { - options.onSelectTime.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - datetimepicker.data('changed',true); - datetimepicker.trigger('xchange.xdsoft'); - datetimepicker.trigger('changedatetime.xdsoft'); - }); - - datetimepicker.mousewheel&&datepicker.mousewheel(function(event, delta, deltaX, deltaY) { - if( !options.scrollMonth ) - return true; - if( delta<0 ) - _xdsoft_datetime.nextMonth(); - else - _xdsoft_datetime.prevMonth(); - return false; - }); - - datetimepicker.mousewheel&&timeboxparent.unmousewheel().mousewheel(function(event, delta, deltaX, deltaY) { - if( !options.scrollTime ) - return true; - var pheight = timeboxparent[0].clientHeight, - height = timebox[0].offsetHeight, - top = Math.abs(parseInt(timebox.css('marginTop'))), - fl = true; - if( delta<0 && (height-pheight)-options.timeHeightInTimePicker>=top ) { - timebox.css('marginTop','-'+(top+options.timeHeightInTimePicker)+'px'); - fl = false; - }else if( delta>0&&top-options.timeHeightInTimePicker>=0 ) { - timebox.css('marginTop','-'+(top-options.timeHeightInTimePicker)+'px'); - fl = false; - } - timeboxparent.trigger('scroll_element.xdsoft_scroller',[Math.abs(parseInt(timebox.css('marginTop'))/(height-pheight))]); - event.stopPropagation(); - return fl; - }); - - var triggerAfterOpen = false; - datetimepicker - .on('changedatetime.xdsoft',function() { - if( options.onChangeDateTime&&options.onChangeDateTime.call ) { - var $input = datetimepicker.data('input'); - options.onChangeDateTime.call(datetimepicker, _xdsoft_datetime.currentTime, $input); - $input.trigger('change'); - } - }) - .on('generate.xdsoft',function() { - if( options.onGenerate&&options.onGenerate.call ) - options.onGenerate.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - if( triggerAfterOpen ){ - datetimepicker.trigger('afterOpen.xdsoft'); - triggerAfterOpen = false; - } - }) - .on( 'click.xdsoft', function( xdevent ) - { - xdevent.stopPropagation(); // Prevents closing of Pop-ups, Modals and Flyouts in Bootstrap - }); - - var current_time_index = 0; - input.mousewheel&&input.mousewheel(function( event, delta, deltaX, deltaY ) { - if( !options.scrollInput ) - return true; - if( !options.datepicker && options.timepicker ) { - current_time_index = timebox.find('.xdsoft_current').length?timebox.find('.xdsoft_current').eq(0).index():0; - if( current_time_index+delta>=0&¤t_time_index+delta$(window).height()+$(window).scrollTop() ) - top = offset.top-datetimepicker[0].offsetHeight+1; - if (top < 0) - top = 0; - if( left+datetimepicker[0].offsetWidth>$(window).width() ) - left = offset.left-datetimepicker[0].offsetWidth+datetimepicker.data('input')[0].offsetWidth; - } - datetimepicker.css({ - left:left, - top:top, - position: position - }); - }; - datetimepicker - .on('open.xdsoft', function() { - var onShow = true; - if( options.onShow&&options.onShow.call) { - onShow = options.onShow.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - if( onShow!==false ) { - datetimepicker.show(); - setPos(); - $(window) - .off('resize.xdsoft',setPos) - .on('resize.xdsoft',setPos); - - if( options.closeOnWithoutClick ) { - $([document.body,window]).on('mousedown.xdsoft',function arguments_callee6() { - datetimepicker.trigger('close.xdsoft'); - $([document.body,window]).off('mousedown.xdsoft',arguments_callee6); - }); - } - } - }) - .on('close.xdsoft', function( event ) { - var onClose = true; - if( options.onClose&&options.onClose.call ) { - onClose=options.onClose.call(datetimepicker,_xdsoft_datetime.currentTime,datetimepicker.data('input')); - } - if( onClose!==false&&!options.opened&&!options.inline ) { - datetimepicker.hide(); - } - event.stopPropagation(); - }) - .data('input',input); - - var timer = 0, - timer1 = 0; - - datetimepicker.data('xdsoft_datetime',_xdsoft_datetime); - datetimepicker.setOptions(options); - - function getCurrentValue(){ - - var ct = false; - - if (options.startDate instanceof Date && !isNaN(options.startDate.valueOf())) { - ct = options.startDate; - } else if (!ct && options.startDate!==false) { - ct = _xdsoft_datetime.strToDateTime(options.startDate); - } else if (!ct) { - ct = options.value?options.value:(input&&input.val&&input.val())?input.val():''; - ct = Date.parseDate(ct, options.format); - } - - if ( ct && _xdsoft_datetime.isValidDate(ct) ) { - datetimepicker.data('changed',true); - } else { - ct = ''; - } - - return ct?ct:0; - } - - _xdsoft_datetime.setCurrentTime( getCurrentValue() ); - - input - .data( 'xdsoft_datetimepicker',datetimepicker ) - .on('open.xdsoft focusin.xdsoft mousedown.xdsoft',function(event) { - if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible')||(input.data('xdsoft_datetimepicker').is(':visible') && options.closeOnInputClick) ) - return; - clearTimeout(timer); - timer = setTimeout(function() { - if( input.is(':disabled')||input.is(':hidden')||!input.is(':visible') ) - return; - - triggerAfterOpen = true; - _xdsoft_datetime.setCurrentTime(getCurrentValue()); - - datetimepicker.trigger('open.xdsoft'); - },100); - }) - .on('keydown.xdsoft',function( event ) { - var val = this.value, - key = event.which; - switch(true) { - case !!~([ENTER].indexOf(key)): - var elementSelector = $("input:visible,textarea:visible"); - datetimepicker.trigger('close.xdsoft'); - elementSelector.eq(elementSelector.index(this) + 1).focus(); - return false; - case !!~[TAB].indexOf(key): - datetimepicker.trigger('close.xdsoft'); - return true; - } - }); - }, - destroyDateTimePicker = function( input ) { - var datetimepicker = input.data('xdsoft_datetimepicker'); - if( datetimepicker ) { - datetimepicker.data('xdsoft_datetime',null); - datetimepicker.remove(); - input - .data( 'xdsoft_datetimepicker',null ) - .off( 'open.xdsoft focusin.xdsoft focusout.xdsoft mousedown.xdsoft blur.xdsoft keydown.xdsoft' ); - $(window).off('resize.xdsoft'); - $([window,document.body]).off('mousedown.xdsoft'); - input.unmousewheel&&input.unmousewheel(); - } - }; - $(document) - .off('keydown.xdsoftctrl keyup.xdsoftctrl') - .on('keydown.xdsoftctrl',function(e) { - if ( e.keyCode == CTRLKEY ) - ctrlDown = true; - }) - .on('keyup.xdsoftctrl',function(e) { - if ( e.keyCode == CTRLKEY ) - ctrlDown = false; - }); - return this.each(function() { - var datetimepicker; - if( datetimepicker = $(this).data('xdsoft_datetimepicker') ) { - if( $.type(opt) === 'string' ) { - switch(opt) { - case 'show': - $(this).select().focus(); - datetimepicker.trigger( 'open.xdsoft' ); - break; - case 'hide': - datetimepicker.trigger('close.xdsoft'); - break; - case 'destroy': - destroyDateTimePicker($(this)); - break; - case 'reset': - this.value = this.defaultValue; - if(!this.value || !datetimepicker.data('xdsoft_datetime').isValidDate(Date.parseDate(this.value, options.format))) - datetimepicker.data('changed',false); - datetimepicker.data('xdsoft_datetime').setCurrentTime(this.value); - break; - } - }else{ - datetimepicker - .setOptions(opt); - } - return 0; - }else - if( ($.type(opt) !== 'string') ){ - if( !options.lazyInit||options.open||options.inline ){ - createDateTimePicker($(this)); - }else - lazyInit($(this)); - } - }); - }; - $.fn.datetimepicker.defaults = default_options; -})( jQuery ); - -/* - * Copyright (c) 2013 Brandon Aaron (http://brandonaaron.net) - * - * Licensed under the MIT License (LICENSE.txt). - * - * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers. - * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix. - * Thanks to: Seamus Leahy for adding deltaX and deltaY - * - * Version: 3.1.3 - * - * Requires: 1.2.2+ - */ -(function(factory) {if(typeof define==='function'&&define.amd) {define(['jquery'],factory)}else if(typeof exports==='object') {module.exports=factory}else{factory(jQuery)}}(function($) {var toFix=['wheel','mousewheel','DOMMouseScroll','MozMousePixelScroll'];var toBind='onwheel'in document||document.documentMode>=9?['wheel']:['mousewheel','DomMouseScroll','MozMousePixelScroll'];var lowestDelta,lowestDeltaXY;if($.event.fixHooks) {for(var i=toFix.length;i;) {$.event.fixHooks[toFix[--i]]=$.event.mouseHooks}}$.event.special.mousewheel={setup:function() {if(this.addEventListener) {for(var i=toBind.length;i;) {this.addEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=handler}},teardown:function() {if(this.removeEventListener) {for(var i=toBind.length;i;) {this.removeEventListener(toBind[--i],handler,false)}}else{this.onmousewheel=null}}};$.fn.extend({mousewheel:function(fn) {return fn?this.bind("mousewheel",fn):this.trigger("mousewheel")},unmousewheel:function(fn) {return this.unbind("mousewheel",fn)}});function handler(event) {var orgEvent=event||window.event,args=[].slice.call(arguments,1),delta=0,deltaX=0,deltaY=0,absDelta=0,absDeltaXY=0,fn;event=$.event.fix(orgEvent);event.type="mousewheel";if(orgEvent.wheelDelta) {delta=orgEvent.wheelDelta}if(orgEvent.detail) {delta=orgEvent.detail*-1}if(orgEvent.deltaY) {deltaY=orgEvent.deltaY*-1;delta=deltaY}if(orgEvent.deltaX) {deltaX=orgEvent.deltaX;delta=deltaX*-1}if(orgEvent.wheelDeltaY!==undefined) {deltaY=orgEvent.wheelDeltaY}if(orgEvent.wheelDeltaX!==undefined) {deltaX=orgEvent.wheelDeltaX*-1}absDelta=Math.abs(delta);if(!lowestDelta||absDelta0?'floor':'ceil';delta=Math[fn](delta/lowestDelta);deltaX=Math[fn](deltaX/lowestDeltaXY);deltaY=Math[fn](deltaY/lowestDeltaXY);args.unshift(event,delta,deltaX,deltaY);return($.event.dispatch||$.event.handle).apply(this,args)}})); - - -// Parse and Format Library -//http://www.xaprb.com/blog/2005/12/12/javascript-closures-for-runtime-efficiency/ -/* - * Copyright (C) 2004 Baron Schwartz - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License as published by the - * Free Software Foundation, version 2.1. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - */ -Date.parseFunctions={count:0};Date.parseRegexes=[];Date.formatFunctions={count:0};Date.prototype.dateFormat=function(b){if(b=="unixtime"){return parseInt(this.getTime()/1000);}if(Date.formatFunctions[b]==null){Date.createNewFormat(b);}var a=Date.formatFunctions[b];return this[a]();};Date.createNewFormat=function(format){var funcName="format"+Date.formatFunctions.count++;Date.formatFunctions[format]=funcName;var code="Date.prototype."+funcName+" = function() {return ";var special=false;var ch="";for(var i=0;i 0) {";var regex="";var special=false;var ch="";for(var i=0;i 0 && z > 0){\nvar doyDate = new Date(y,0);\ndoyDate.setDate(z);\nm = doyDate.getMonth();\nd = doyDate.getDate();\n}";code+="if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0 && s >= 0)\n{return new Date(y, m, d, h, i, s);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0 && i >= 0)\n{return new Date(y, m, d, h, i);}\nelse if (y > 0 && m >= 0 && d > 0 && h >= 0)\n{return new Date(y, m, d, h);}\nelse if (y > 0 && m >= 0 && d > 0)\n{return new Date(y, m, d);}\nelse if (y > 0 && m >= 0)\n{return new Date(y, m);}\nelse if (y > 0)\n{return new Date(y);}\n}return null;}";Date.parseRegexes[regexNum]=new RegExp("^"+regex+"$");eval(code);};Date.formatCodeToRegex=function(b,a){switch(b){case"D":return{g:0,c:null,s:"(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)"};case"j":case"d":return{g:1,c:"d = parseInt(results["+a+"], 10);\n",s:"(\\d{1,2})"};case"l":return{g:0,c:null,s:"(?:"+Date.dayNames.join("|")+")"};case"S":return{g:0,c:null,s:"(?:st|nd|rd|th)"};case"w":return{g:0,c:null,s:"\\d"};case"z":return{g:1,c:"z = parseInt(results["+a+"], 10);\n",s:"(\\d{1,3})"};case"W":return{g:0,c:null,s:"(?:\\d{2})"};case"F":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"].substring(0, 3)], 10);\n",s:"("+Date.monthNames.join("|")+")"};case"M":return{g:1,c:"m = parseInt(Date.monthNumbers[results["+a+"]], 10);\n",s:"(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)"};case"n":case"m":return{g:1,c:"m = parseInt(results["+a+"], 10) - 1;\n",s:"(\\d{1,2})"};case"t":return{g:0,c:null,s:"\\d{1,2}"};case"L":return{g:0,c:null,s:"(?:1|0)"};case"Y":return{g:1,c:"y = parseInt(results["+a+"], 10);\n",s:"(\\d{4})"};case"y":return{g:1,c:"var ty = parseInt(results["+a+"], 10);\ny = ty > Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"};case"a":return{g:1,c:"if (results["+a+"] == 'am') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(am|pm)"};case"A":return{g:1,c:"if (results["+a+"] == 'AM') {\nif (h == 12) { h = 0; }\n} else { if (h < 12) { h += 12; }}",s:"(AM|PM)"};case"g":case"G":case"h":case"H":return{g:1,c:"h = parseInt(results["+a+"], 10);\n",s:"(\\d{1,2})"};case"i":return{g:1,c:"i = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"s":return{g:1,c:"s = parseInt(results["+a+"], 10);\n",s:"(\\d{2})"};case"O":return{g:0,c:null,s:"[+-]\\d{4}"};case"T":return{g:0,c:null,s:"[A-Z]{3}"};case"Z":return{g:0,c:null,s:"[+-]\\d{1,5}"};default:return{g:0,c:null,s:String.escape(b)};}};Date.prototype.getTimezone=function(){return this.toString().replace(/^.*? ([A-Z]{3}) [0-9]{4}.*$/,"$1").replace(/^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/,"$1$2$3");};Date.prototype.getGMTOffset=function(){return(this.getTimezoneOffset()>0?"-":"+")+String.leftPad(Math.floor(Math.abs(this.getTimezoneOffset())/60),2,"0")+String.leftPad(Math.abs(this.getTimezoneOffset())%60,2,"0");};Date.prototype.getDayOfYear=function(){var a=0;Date.daysInMonth[1]=this.isLeapYear()?29:28;for(var b=0;bOpenStreetMap contributors' - }).addTo(map); - - map.setView([51.505, -0.09], 0); - - L.Icon.Default.imagePath = '/css/images'; - var popup = L.popup(); - - var marker = L.marker(); - - function onMapClick(e) { - marker - .setLatLng(e.latlng) - //.setContent("You clicked the map at " + e.latlng.toString()) - .addTo(map); - } - - map.on('click', onMapClick); - - $('.geo.chooser').modal('setting', { - closable: false, - onApprove: function () { - var coords = marker.getLatLng(); - $('input[name=location_lat]').val(coords.lat); - $('input[name=location_lon]').val(coords.lng); - $('input[name=location]').css('margin-bottom','3.2rem'); - $('span.coords').text('Folgende Koordinaten sind angegeben: lat:' +coords.lat + ', lon:' + coords.lng); - }, - onDeny: function () { - - }, - onVisible: function () { - map.invalidateSize(true); - map.locate({setView: true}); - } - }).modal('attach events', '.add_geo', 'show'); -}); diff --git a/web/js/e306c7e.js b/web/js/e306c7e.js deleted file mode 100644 index 93d9060..0000000 --- a/web/js/e306c7e.js +++ /dev/null @@ -1,56 +0,0 @@ -/** - * Created by tim on 06.07.14. - */ - -// initializing with settings - -function addGeoCoordinates(ev) { - return false; -} -var map = null; -$(document).ready(function () { - $('.icon.link').popup(); - jQuery('input[type=datetime]').datetimepicker({lang: 'de', format: 'Y-m-d H:i'}); - - $('.add_geo').click(addGeoCoordinates); - map = L.map('map'); - - // add an OpenStreetMap tile layer - L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png', { - attribution: '© OpenStreetMap contributors' - }).addTo(map); - - map.setView([51.505, -0.09], 0); - - L.Icon.Default.imagePath = '/css/images'; - var popup = L.popup(); - - var marker = L.marker(); - - function onMapClick(e) { - marker - .setLatLng(e.latlng) - //.setContent("You clicked the map at " + e.latlng.toString()) - .addTo(map); - } - - map.on('click', onMapClick); - - $('.geo.chooser').modal('setting', { - closable: false, - onApprove: function () { - var coords = marker.getLatLng(); - $('input[name=location_lat]').val(coords.lat); - $('input[name=location_lon]').val(coords.lng); - $('input[name=location]').css('margin-bottom','3.2rem'); - $('span.coords').text('Folgende Koordinaten sind angegeben: lat:' +coords.lat + ', lon:' + coords.lng); - }, - onDeny: function () { - - }, - onVisible: function () { - map.invalidateSize(true); - map.locate({setView: true}); - } - }).modal('attach events', '.add_geo', 'show'); -});