From b332d8f713cc3a52015c2a4c6054eb2995755203 Mon Sep 17 00:00:00 2001 From: Kelsey Martens Date: Tue, 13 Mar 2018 12:40:55 -0500 Subject: [PATCH] v2.0.0-beta.1 --- CHANGELOG.md | 13 + composer.json | 2 +- src/Controllers/CalendarsController.php | 10 +- src/Controllers/EventsController.php | 10 +- src/Controllers/ViewController.php | 29 +- src/Elements/Db/EventQuery.php | 59 ++- src/Elements/Event.php | 8 + src/Library/ColorHelper.php | 35 +- src/Library/DatabaseHelper.php | 24 +- src/Library/Migrations/ForeignKey.php | 117 ------ src/Library/Migrations/Index.php | 53 --- src/Library/Migrations/Table.php | 127 ------ src/Models/CalendarSiteSettingsModel.php | 9 + src/Resources/css/src/calendar.css | 2 +- src/Resources/css/src/widget/agenda.css | 2 +- .../js/src/calendar-fullcalendar-methods.js | 2 +- src/Resources/js/src/widget/agenda.js | 2 +- src/Resources/js/src/widget/month.js | 2 +- src/Services/CalendarsService.php | 60 +-- src/Services/EventsService.php | 5 +- .../Calendar_EventElementType.php | 373 ------------------ src/fieldtypes/Calendar_EventFieldType.php | 20 - src/migrations/Install.php | 66 +--- src/templates/events/_edit.html | 9 + 24 files changed, 167 insertions(+), 872 deletions(-) delete mode 100644 src/Library/Migrations/ForeignKey.php delete mode 100644 src/Library/Migrations/Index.php delete mode 100644 src/Library/Migrations/Table.php delete mode 100755 src/elementtypes/Calendar_EventElementType.php delete mode 100644 src/fieldtypes/Calendar_EventFieldType.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a61626..aa8a5df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Solspace Freeform Changelog +## 2.0.0-beta.2 - 2018-03-13 +### Fixed +- Fixed a bug where the `calendar.events` function was not displaying events in order. +- Fixed a bug where the `calendar.month` function was not prioritizing multi-day events to be displayed first (to improve overall display of month view). +- Fixed a bug where the time picker was showing behind the Quick Create feature in CP Month/Week/Day views. +- Fixed a bug where Calendar wouldn't work correctly with sites using database table prefixes. +- Fixed a bug where the Quick Create feature would not work with title format option. +- Fixed a bug where URI and slug generation was not working correctly. +- Fixed a bug where the 'Enabled for Site' toggle was missing on Event Create/Edit view. +- Fixed a bug where the `calendar.events` function was not ordering events correctly. +- Fixed a bug where the `calendar.events` function would display an error when filtering with a calendar handle and searching. +- Fixed a bug where an error would show when attempting to edit events on the front end templates. + ## 2.0.0-beta.1 - 2018-03-09 ### Added - Added compatibility for Craft 3.x. diff --git a/composer.json b/composer.json index 761726b..0bfa4fe 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "solspace/craft3-calendar", "description": "The most powerful event management plugin for Craft.", - "version": "2.0.0-beta.1", + "version": "2.0.0-beta.2", "type": "craft-plugin", "minimum-stability": "dev", "authors": [ diff --git a/src/Controllers/CalendarsController.php b/src/Controllers/CalendarsController.php index 8271ebb..45945fb 100644 --- a/src/Controllers/CalendarsController.php +++ b/src/Controllers/CalendarsController.php @@ -79,7 +79,7 @@ public function actionEditCalendar(string $handle): Response * @throws \yii\web\BadRequestHttpException * @throws \yii\web\ForbiddenHttpException */ - public function actionSaveCalendar() + public function actionSaveCalendar(): Response { $this->requirePostRequest(); $request = \Craft::$app->request; @@ -119,9 +119,9 @@ public function actionSaveCalendar() continue; } - $siteSettings = new CalendarSiteSettingsModel(); - $siteSettings->siteId = $site->id; - $siteSettings->hasUrls = !empty($postedSettings['uriFormat']); + $siteSettings = new CalendarSiteSettingsModel(); + $siteSettings->siteId = $site->id; + $siteSettings->hasUrls = !empty($postedSettings['uriFormat']); $siteSettings->enabledByDefault = (bool) $postedSettings['enabledByDefault']; if ($siteSettings->hasUrls) { @@ -139,7 +139,7 @@ public function actionSaveCalendar() // Set the field layout - $fieldLayout = \Craft::$app->getFields()->assembleLayoutFromPost(); + $fieldLayout = \Craft::$app->getFields()->assembleLayoutFromPost(); $fieldLayout->type = Event::class; $calendar->setFieldLayout($fieldLayout); diff --git a/src/Controllers/EventsController.php b/src/Controllers/EventsController.php index ab8cf8b..97a9913 100644 --- a/src/Controllers/EventsController.php +++ b/src/Controllers/EventsController.php @@ -10,7 +10,6 @@ use Solspace\Calendar\Calendar; use Solspace\Calendar\Elements\Event; use Solspace\Calendar\Library\CalendarPermissionHelper; -use Solspace\Calendar\Library\DatabaseHelper; use Solspace\Calendar\Library\DateHelper; use Solspace\Calendar\Library\Exceptions\EventException; use Solspace\Calendar\Library\RecurrenceHelper; @@ -218,14 +217,9 @@ public function actionSaveEvent() $event->enabledForSite = (bool) \Craft::$app->request->post('enabledForSite', $event->enabledForSite); $event->title = \Craft::$app->request->post('title', $event->title); + $event->slug = \Craft::$app->request->post('slug', $event->slug); $event->setFieldValuesFromRequest('fields'); - $slug = \Craft::$app->request->post('slug', $event->slug); - if (!$event->id) { - $slug = DatabaseHelper::getSuitableSlug($event->title); - } - $event->slug = $slug; - if ($this->getEventsService()->saveEvent($event)) { $exceptions = $values['exceptions'] ?? []; $this->getExceptionsService()->saveExceptions($event, $exceptions); @@ -255,7 +249,7 @@ public function actionSaveEvent() \Craft::$app->session->setError(Calendar::t('Couldn’t save event.')); if (\Craft::$app->request->isCpRequest) { - return $this->renderEditForm($event, $event->title); + return $this->renderEditForm($event, $event->title ?? ''); } else { \Craft::$app->urlManager->setRouteParams(['event' => $event, 'errors' => $event->getErrors()]); } diff --git a/src/Controllers/ViewController.php b/src/Controllers/ViewController.php index 1debe73..76ee858 100644 --- a/src/Controllers/ViewController.php +++ b/src/Controllers/ViewController.php @@ -21,15 +21,15 @@ public function actionMonthData(): Response { $this->requirePostRequest(); - $dateRangeStart = \Craft::$app->request->post('dateRangeStart'); - $dateRangeEnd = \Craft::$app->request->post('dateRangeEnd'); - $calendars = \Craft::$app->request->post('calendars'); - $nonEditable = \Craft::$app->request->post('nonEditable'); - $siteId = \Craft::$app->request->post('siteId'); + $rangeStart = \Craft::$app->request->post('rangeStart'); + $rangeEnd = \Craft::$app->request->post('rangeEnd'); + $calendars = \Craft::$app->request->post('calendars'); + $nonEditable = \Craft::$app->request->post('nonEditable'); + $siteId = \Craft::$app->request->post('siteId'); $criteria = [ - 'rangeStart' => $dateRangeStart, - 'rangeEnd' => $dateRangeEnd, + 'rangeStart' => $rangeStart, + 'rangeEnd' => $rangeEnd, ]; $calendarIds = null; @@ -68,18 +68,15 @@ public function actionTargetTime( int $year = null, int $month = null, int $day = null - ): Response { + ): Response + { $view = $view ?? Calendar::VIEW_MONTH; $calendarView = $view; - switch ($calendarView) { - case Calendar::VIEW_WEEK: - $calendarView = 'agendaWeek'; - break; - - case Calendar::VIEW_DAY: - $calendarView = 'agendaDay'; - break; + if ($calendarView === Calendar::VIEW_WEEK) { + $calendarView = 'agendaWeek'; + } else if ($calendarView === Calendar::VIEW_DAY) { + $calendarView = 'agendaDay'; } $currentSiteId = \Craft::$app->sites->currentSite->id; diff --git a/src/Elements/Db/EventQuery.php b/src/Elements/Db/EventQuery.php index 87a1994..97d9d86 100644 --- a/src/Elements/Db/EventQuery.php +++ b/src/Elements/Db/EventQuery.php @@ -93,6 +93,13 @@ class EventQuery extends ElementQuery /** @var int */ private $totalCount; + public function __construct(string $elementType, array $config = []) + { + $this->orderBy = ['startDate' => SORT_ASC]; + + parent::__construct($elementType, $config); + } + /** * @param int|array $value * @@ -331,11 +338,7 @@ public function all($db = null): array $this->cutOffExcess($this->eventCache); $this->cacheToStorage(); - - if (!$this->loadOccurrences && $this->shouldOrderByStartDate()) { - // Order the events based on strict ordering rules - $this->orderEvents($this->events); - } + $this->orderEvents($this->events); // Build up an event cache, to be accessed later $this->cacheEvents(); @@ -427,22 +430,23 @@ public function getEventsByHour(Carbon $date): array */ protected function beforePrepare(): bool { - $table = Event::TABLE_STD; - $calendarTable = CalendarRecord::TABLE_STD; + $table = Event::TABLE_STD; + $calendarTable = CalendarRecord::TABLE; + $calendarTableStd = CalendarRecord::TABLE_STD; // join in the products table $this->joinElementTable($table); $hasCalendarJoin = false; - if (\is_array($this->join)) { - foreach ($this->join as $joinData) { - if (isset($joinData[1]) && $joinData[1] === $calendarTable) { + if (\is_array($this->subQuery->join)) { + foreach ($this->subQuery->join as $joinData) { + if (isset($joinData[1]) && $joinData[1] === $calendarTableStd) { $hasCalendarJoin = true; } } } if (!$hasCalendarJoin) { - $this->innerJoin($calendarTable, "`$calendarTable`.`id` = `$table`.`calendarId`"); + $this->subQuery->innerJoin($calendarTable, "$calendarTable.id = $table.calendarId"); } // select the price column @@ -848,10 +852,19 @@ function (array $arrayA, array $arrayB) use ($modifier) { private function orderEvents(array &$events) { $modifier = $this->getSortModifier(); + $orderBy = $this->getOrderByField(); usort( $events, - function (Event $eventA, Event $eventB) use ($modifier) { + function (Event $eventA, Event $eventB) use ($modifier, $orderBy) { + if ($orderBy !== 'startDate') { + if ($modifier > 0) { + return $eventA->{$orderBy} <=> $eventB->{$orderBy}; + } + + return $eventB->{$orderBy} <=> $eventA->{$orderBy}; + } + if ($eventA->diffInDays($eventB)) { return $eventA->compareStartDates($eventB) * $modifier; } @@ -1027,12 +1040,32 @@ private function getSortModifier(): int if (\is_array($this->orderBy) && count($this->orderBy)) { $sortDirection = reset($this->orderBy); - return $sortDirection === SORT_ASC ? 1 : -1; + if (is_numeric($sortDirection)) { + return $sortDirection === SORT_DESC ? -1 : 1; + } + + return strtolower($sortDirection) === 'desc' ? -1 : 1; } return 1; } + /** + * Returns the first order by field + * + * @return string|null + */ + private function getOrderByField() + { + if (\is_array($this->orderBy) && \count($this->orderBy)) { + $keys = array_keys($this->orderBy); + + return reset($keys); + } + + return $this->orderBy; + } + /** * @return EventsService */ diff --git a/src/Elements/Event.php b/src/Elements/Event.php index 53a12e1..48dd7ae 100644 --- a/src/Elements/Event.php +++ b/src/Elements/Event.php @@ -117,6 +117,14 @@ public static function isLocalized(): bool return true; } + /** + * @return bool + */ + public static function hasUris(): bool + { + return true; + } + /** * @param array $config * diff --git a/src/Library/ColorHelper.php b/src/Library/ColorHelper.php index ef45e7e..bf4edc5 100644 --- a/src/Library/ColorHelper.php +++ b/src/Library/ColorHelper.php @@ -2,20 +2,11 @@ namespace Solspace\Calendar\Library; +use Solspace\Calendar\Library\ColorJizz\Exceptions\InvalidArgumentException; use Solspace\Calendar\Library\ColorJizz\Formats\Hex; -class ColorHelper +class ColorHelper extends \Solspace\Commons\Helpers\ColorHelper { - /** - * Generates a random HEX color code - * - * @return string - */ - public static function randomColor() - { - return sprintf('#%06X', mt_rand(0, 0xFFFFFF)); - } - /** * Lightens/darkens a given colour (hex format), returning the altered colour in hex format.7 * @@ -23,28 +14,10 @@ public static function randomColor() * @param float $percent Decimal (0.2 = lighten by 20%, -0.4 = darken by 40%) * * @return string Lightened/Darkend colour as hexadecimal (with hash); + * @throws InvalidArgumentException */ - public static function lightenDarkenColour($hexString, $percent) + public static function lightenDarkenColour($hexString, $percent): string { return '#' . Hex::fromString($hexString)->brightness($percent * 100); } - - /** - * Determines if the contrasting color to be used based on a HEX color code - * - * @param string $hexColor - * - * @return string - */ - public static function getContrastYIQ($hexColor) - { - $hexColor = str_replace('#', '', $hexColor); - - $r = hexdec(substr($hexColor, 0, 2)); - $g = hexdec(substr($hexColor, 2, 2)); - $b = hexdec(substr($hexColor, 4, 2)); - $yiq = (($r * 299) + ($g * 587) + ($b * 114)) / 1000; - - return ($yiq >= 128) ? 'black' : 'white'; - } } diff --git a/src/Library/DatabaseHelper.php b/src/Library/DatabaseHelper.php index 0fc7fc2..67b66bf 100644 --- a/src/Library/DatabaseHelper.php +++ b/src/Library/DatabaseHelper.php @@ -13,10 +13,10 @@ class DatabaseHelper const OPERATOR_NOT_IN = 'not'; const OPERATOR_IN = 'in'; - private static $operatorList = array( + private static $operatorList = [ self::OPERATOR_NOT_EQUAL, self::OPERATOR_NOT_IN, - ); + ]; /** * Looks through the database to see if a given $slug has been used @@ -33,8 +33,8 @@ public static function getSuitableSlug($slug): string while ($iterator <= 100) { $result = (new Query()) ->select(['id']) - ->from('elements_sites') - ->where(array('slug' => $slug)) + ->from('{{%elements_sites}}') + ->where(['slug' => $slug]) ->scalar(); if ($result) { @@ -59,33 +59,33 @@ public static function getSuitableSlug($slug): string */ public static function prepareOperator($value): array { - if (is_array($value)) { + if (\is_array($value)) { $firstValue = reset($value); - if (in_array($firstValue, self::$operatorList, true)) { + if (\in_array($firstValue, self::$operatorList, true)) { $operator = array_shift($value); } else { $operator = self::OPERATOR_IN; } - return array($operator, $value); + return [$operator, $value]; } $operator = self::OPERATOR_EQUALS; foreach (self::$operatorList as $searchableOperator) { - $length = strlen($searchableOperator); - if (substr($value, 0, $length) === $searchableOperator) { + $length = \strlen($searchableOperator); + if (0 === strpos($value, $searchableOperator)) { $operator = $searchableOperator; - $value = substr($value, $length + 1); + $value = substr($value, $length + 1); if ($operator === self::OPERATOR_NOT_IN) { $value = explode(',', $value); } - return array($operator, $value); + return [$operator, $value]; } } - return array($operator, $value); + return [$operator, $value]; } } diff --git a/src/Library/Migrations/ForeignKey.php b/src/Library/Migrations/ForeignKey.php deleted file mode 100644 index e13e8f0..0000000 --- a/src/Library/Migrations/ForeignKey.php +++ /dev/null @@ -1,117 +0,0 @@ -table = $table; - $this->column = $column; - $this->refTable = $refTable; - $this->refColumn = $refColumn; - $this->onDelete = $onDelete; - $this->onUpdate = $onUpdate; - } - - /** - * @return string - */ - public function generateFullName(): string - { - return $this->table . '_' . $this->getName(); - } - - /** - * @return string - */ - public function getName(): string - { - return $this->column . '_fk'; - } - - /** - * @return Table - */ - public function getTable(): Table - { - return $this->table; - } - - /** - * @return string - */ - public function getColumn(): string - { - return $this->column; - } - - /** - * @return string - */ - public function getRefTable(): string - { - return $this->refTable; - } - - /** - * @return string - */ - public function getRefColumn(): string - { - return $this->refColumn; - } - - /** - * @return string|null - */ - public function getOnDelete() - { - return $this->onDelete; - } - - /** - * @return string|null - */ - public function getOnUpdate() - { - return $this->onUpdate; - } -} diff --git a/src/Library/Migrations/Index.php b/src/Library/Migrations/Index.php deleted file mode 100644 index 6e83df0..0000000 --- a/src/Library/Migrations/Index.php +++ /dev/null @@ -1,53 +0,0 @@ -table = $table; - $this->columns = $columns; - $this->unique = $unique; - } - - /** - * @return string - */ - public function getName(): string - { - return implode('_', $this->columns) . ($this->unique ? '_unq' : '') . '_idx'; - } - - /** - * @return array - */ - public function getColumns(): array - { - return $this->columns; - } - - /** - * @return bool - */ - public function isUnique(): bool - { - return $this->unique; - } -} diff --git a/src/Library/Migrations/Table.php b/src/Library/Migrations/Table.php deleted file mode 100644 index 577a78f..0000000 --- a/src/Library/Migrations/Table.php +++ /dev/null @@ -1,127 +0,0 @@ -name = $name; - $this->fields = []; - $this->foreignKeys = []; - $this->indexes = []; - } - - /** - * @return string - */ - public function __toString(): string - { - return $this->name; - } - - /** - * @return string - */ - public function getName(): string - { - return $this->name; - } - - /** - * @return array - */ - public function getFields(): array - { - return $this->fields; - } - - /** - * @return ForeignKey[] - */ - public function getForeignKeys(): array - { - return $this->foreignKeys; - } - - /** - * @return Index[] - */ - public function getIndexes(): array - { - return $this->indexes; - } - - /** - * @param string $name - * @param ColumnSchemaBuilder $type - * - * @return Table - */ - public function addField(string $name, ColumnSchemaBuilder $type): Table - { - $this->fields[$name] = $type; - - return $this; - } - - /** - * @param array $columns - * @param bool $unique - * - * @return $this - */ - public function addIndex(array $columns, bool $unique = false): Table - { - $this->indexes[] = new Index($this, $columns, $unique); - - return $this; - } - - /** - * @param string $column - * @param string $refTable - * @param string $refColumn - * @param string|null $onDelete - * @param string|null $onUpdate - * - * @return Table - */ - public function addForeignKey( - string $column, - string $refTable, - string $refColumn, - string $onDelete = null, - string $onUpdate = null - ): Table { - $this->foreignKeys[] = new ForeignKey( - $this, - $column, - $refTable, - $refColumn, - $onDelete, - $onUpdate - ); - - return $this; - } -} diff --git a/src/Models/CalendarSiteSettingsModel.php b/src/Models/CalendarSiteSettingsModel.php index ffb3f3d..c7de8b2 100644 --- a/src/Models/CalendarSiteSettingsModel.php +++ b/src/Models/CalendarSiteSettingsModel.php @@ -3,6 +3,7 @@ namespace Solspace\Calendar\Models; use craft\base\Model; +use craft\models\Site; use craft\validators\SiteIdValidator; use craft\validators\UriFormatValidator; use Solspace\Calendar\Calendar; @@ -34,6 +35,14 @@ class CalendarSiteSettingsModel extends Model /** @var CalendarModel */ private $calendar; + /** + * @return Site + */ + public function getSite(): Site + { + return \Craft::$app->sites->getSiteById($this->siteId); + } + /** * Returns the section. * diff --git a/src/Resources/css/src/calendar.css b/src/Resources/css/src/calendar.css index 5d2fc2c..ad8a26a 100644 --- a/src/Resources/css/src/calendar.css +++ b/src/Resources/css/src/calendar.css @@ -1 +1 @@ -.alert{padding:7px 14px;margin-bottom:1rem;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:14px}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-heading{color:inherit}.alert-link{font-weight:bold}.alert-dismissible{position:relative;padding-right:7px 14px20}.alert-dismissible .close{position:absolute;top:5px;right:10px;color:inherit;font-size:18px}.alert-dismissible .close:before{font-family:Craft, sans-serif;content:'remove';margin-left:2px}.alert-dismissible .close:hover{text-decoration:none}.alert-success{border-color:#d0e9c6;color:#3c763d;background:#dff0d8;background:-moz-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:-webkit-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:linear-gradient(to bottom, #eef7ea 0%, #dff0d8 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7ea', endColorstr='#dff0d8',GradientType=0 )}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{border-color:#bcdff1;color:#31708f;background:#d9edf7;background:-moz-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:-webkit-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:linear-gradient(to bottom, #eef7fb 0%, #d9edf7 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7fb', endColorstr='#d9edf7',GradientType=0 )}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{border-color:#faf2cc;color:#8a6d3b;background:#fcf8e3;background:-moz-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:-webkit-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:linear-gradient(to bottom, #fefefa 0%, #fcf8e3 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fefefa', endColorstr='#fcf8e3',GradientType=0 )}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{border-color:#ebcccc;color:#a94442;background:#f2dede;background:-moz-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:-webkit-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:linear-gradient(to bottom, #f9f0f0 0%, #f2dede 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9f0f0', endColorstr='#f2dede',GradientType=0 )}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}#qtip-overlay>div{background:rgba(255,255,255,0.75) !important;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=” $value * 100 “)";filter:alpha(opacity=100);zoom:1}.qtip{padding:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 10px 100px rgba(0,0,0,0.5);-moz-box-shadow:0 10px 100px rgba(0,0,0,0.5);box-shadow:0 10px 100px rgba(0,0,0,0.5);border:1px solid transparent}.qtip .qtip-titlebar{padding:11px 14px;background:#FBFCFC;border-bottom:none;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:0 2px 1px -2px rgba(0,0,0,0.2)}.qtip .qtip-titlebar .qtip-title{font-family:HelveticaNeue-Light, HelveticaNeue, sans-serif;font-size:120%;color:#DA5A47}.qtip .qtip-titlebar .qtip-close{top:50%}.qtip div.buttons{position:relative;top:10px;margin:0px -14px !important;padding:11px 14px 3px;text-align:right;background:#EBEBED;background-image:-webkit-linear-gradient(#ecedef, #e9eaec);background-image:-moz-linear-gradient(#ecedef, #e9eaec);background-image:-ms-linear-gradient(#ecedef, #e9eaec);background-image:-o-linear-gradient(#ecedef, #e9eaec);background-image:linear-gradient(#ecedef, #e9eaec);-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-webkit-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2)}.qtip div.buttons a,.qtip div.buttons button{float:right !important;font-family:HelveticaNeue, sans-serif;font-size:12px}.calendar-mini-cal .fc-toolbar .fc-left button,.calendar-mini-cal .fc-toolbar .fc-right button{padding:0}.calendar-mini-cal td{border:none !important}.calendar-mini-cal td.fc-other-month{visibility:hidden !important}.calendar-mini-cal .fc-row.fc-widget-header{border-bottom:1px solid #D8D8D8}.calendar-mini-cal .fc-row.fc-widget-header .fc-day-header{text-align:center;color:#a0a7b1 !important;font-weight:normal;font-size:12px;border:none !important}.calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:3em}.calendar-mini-cal#calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:2em}.calendar-mini-cal .fc-bg td{background:none !important}.calendar-mini-cal .fc-row{margin-bottom:1px}.calendar-mini-cal .fc-content-skeleton{position:absolute;left:0;top:0;right:0;bottom:0;padding:0}.calendar-mini-cal .fc-content-skeleton td{cursor:pointer;border-style:solid;border-right:1px solid #fff !important;border-bottom:1px solid #fff !important}.calendar-mini-cal .fc-content-skeleton td.fc-day-top{text-align:center}.calendar-mini-cal .fc-content-skeleton td.fc-day-top span{font-size:13px;float:none !important}.calendar-mini-cal .fc-content-skeleton td.fc-has-event{background-color:#eeeeee;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.calendar-mini-cal .fc-content-skeleton td.fc-today{color:#FFFFFF;background-color:#D85B4C}.calendar-mini-cal .fc-content-skeleton td.fc-today:hover{background-color:#e18176;color:#FFFFFF}.calendar-mini-cal .fc-content-skeleton td:hover{background-color:#d9d9d9;color:#424242}.calendar-mini-cal .fc-content-skeleton>table{height:100%}.calendar-mini-cal#calendar-mini-cal .fc-content-skeleton td{border-right:1px solid #fafafa !important;border-bottom:1px solid #fafafa !important}.calendar-mini-cal .fc-toolbar h2{position:relative;top:4px;font-weight:normal !important;font-size:15px}.calendar-mini-cal .fc-toolbar button.fc-button{background:transparent none;text-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:none}.calendar-mini-cal .fc-toolbar button.fc-button,.calendar-mini-cal .fc-toolbar button.fc-button:active{outline:none}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon{width:auto}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon:after{margin:0}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-left-single-arrow:after{content:"←"}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-right-single-arrow:after{content:"→"}#sidebar ul.calendar-list li.item{margin-bottom:1px}#sidebar ul.calendar-list li.item>input{display:none}#sidebar ul.calendar-list li.item>label{position:relative;padding-left:20px;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#sidebar ul.calendar-list li.item>label>span{position:absolute;left:0;top:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:15px;height:15px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid white;background:white;text-align:center}#sidebar ul.calendar-list li.item>label>span:before{position:relative;top:-4px;content:"";font-family:Craft, sans-serif;font-size:10px;color:inherit}#sidebar ul.calendar-list li.item>input:checked+label>span:before{content:"check"}#mini-cal-wrapper .s-mini-calendar>table{width:auto}#mini-cal-wrapper .s-mini-calendar>table th{color:#a0a7b1 !important;font-weight:normal;font-size:12px}#mini-cal-wrapper .s-mini-calendar>table td{border:none;padding:1px 1px 0 0}#mini-cal-wrapper .s-mini-calendar>table td a{display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:24px;height:24px;padding:3px 4px;font-weight:normal;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}#mini-cal-wrapper .s-mini-calendar>table td a:hover{background-color:#d9d9d9}#mini-cal-wrapper .s-mini-calendar>table td .middot{display:none}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a{background-color:#eeeeee}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a:hover{background-color:#d9d9d9;color:#424242}#mini-cal-wrapper .s-mini-calendar>table td.today div a{background-color:#d65c50;-webkit-border-radius:24px;-moz-border-radius:24px;border-radius:24px}#mini-cal-wrapper .s-mini-calendar>table td.today div a:hover{background-color:#c53c2e;color:#FFF}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button{color:#29323d;background-image:-webkit-linear-gradient(#fff, #fafafa);background-image:-moz-linear-gradient(#fff, #fafafa);background-image:-ms-linear-gradient(#fff, #fafafa);background-image:-o-linear-gradient(#fff, #fafafa);background-image:linear-gradient(#fff, #fafafa);-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-moz-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding:6px 12px;border:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button:active{outline:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button.fc-state-hover{background-position:inherit}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon{top:-1px}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow{font-family:Craft, sans-serif}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{font-size:100%;font-weight:normal;left:0 !important}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after{content:'larr'}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{content:'rarr'}.calendar-agenda.fc.fc-unthemed .fc-left h2{font-size:28px}.calendar-agenda.fc.fc-unthemed th,.calendar-agenda.fc.fc-unthemed td,.calendar-agenda.fc.fc-unthemed tbody,.calendar-agenda.fc.fc-unthemed .fc-divider,.calendar-agenda.fc.fc-unthemed .fc-row,.calendar-agenda.fc.fc-unthemed .fc-popover{border-color:#E9E9E9}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container thead,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-day-header{border:none}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row{border-bottom:1px solid #D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-body>tr>td.fc-widget-content{border-color:transparent;border-top-color:#D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-day-header{padding:5px 7px;text-align:right;font-size:18px;font-weight:normal;color:#000}.calendar-agenda.fc.fc-unthemed .fc-day-grid .fc-other-month{background-color:#fcfcfc !important}.calendar-agenda.fc.fc-unthemed .fc-day-top{padding:2px}.calendar-agenda.fc.fc-unthemed .fc-day-top>a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;float:right;width:27px;height:27px;padding-top:4px;-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;font-size:16px;color:inherit;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-top>a:hover{cursor:pointer;text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-top.fc-today>a{background-color:#D85B4C;font-weight:bold;color:white}.calendar-agenda.fc.fc-unthemed .fc-day-top .fc-day-number{float:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a{position:relative;display:block;padding-right:35px;color:#000000}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a:hover{text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a>span>span{position:absolute;right:0;top:-4px;display:inline-block;width:30px;height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-top:3px;border:1px solid transparent;-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a.fc-title-today>span>span{color:#FFFFFF;background:#D85B4C}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-widget-content{border-left:none}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day.fc-today,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day.fc-today{background-color:#fff1ea}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sat,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sat{background-color:#F9F9F9}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event{padding:3px 5px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;opacity:0.8}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event.fc-event-disabled,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-time,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-time{font-size:10px}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-title,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-title{font-size:12px;font-weight:bold}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-axis,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-axis{border-color:transparent !important}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-bg .fc-day.fc-today.fc-state-highlight{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event{margin:1px 5px 0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-all-day,.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-multi-day{padding:2px 4px 1px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-black .fc-time{color:#000000}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-white .fc-time{color:#FFFFFF}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-time{font-size:10px;font-weight:normal;color:#fff}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-title{font-size:12px}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day{background-color:transparent !important;border-color:transparent !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-color-icon{display:inline-block;width:6px;height:6px;margin:0 5px 0 0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;border:1px solid transparent}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-title{color:#606060}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled .fc-time{color:black}.spinner{height:28px !important}.qtip{z-index:101 !important}.qtip-event{max-width:400px !important}.qtip .qtip-content{padding:9px 14px 0}.qtip .qtip-content div>label{font-weight:bold}.qtip .qtip-content div.buttons{position:relative;top:0;padding:11px 14px;margin:14px -14px 0 !important}.qtip .qtip-content div.buttons .btn{float:none !important}.qtip .qtip-content div.separator{margin-top:5px;padding-top:5px;border-top:1px dotted #e8e8e8}#event-creator{position:absolute;left:-9999px;visibility:hidden}#event-creator.shown{position:relative;left:0;visibility:visible}#event-creator .field{margin:9px 0}#sidebar nav{overflow:visible} +.alert{padding:7px 14px;margin-bottom:1rem;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:14px}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-heading{color:inherit}.alert-link{font-weight:bold}.alert-dismissible{position:relative;padding-right:7px 14px20}.alert-dismissible .close{position:absolute;top:5px;right:10px;color:inherit;font-size:18px}.alert-dismissible .close:before{font-family:Craft, sans-serif;content:'remove';margin-left:2px}.alert-dismissible .close:hover{text-decoration:none}.alert-success{border-color:#d0e9c6;color:#3c763d;background:#dff0d8;background:-moz-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:-webkit-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:linear-gradient(to bottom, #eef7ea 0%, #dff0d8 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7ea', endColorstr='#dff0d8',GradientType=0 )}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{border-color:#bcdff1;color:#31708f;background:#d9edf7;background:-moz-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:-webkit-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:linear-gradient(to bottom, #eef7fb 0%, #d9edf7 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7fb', endColorstr='#d9edf7',GradientType=0 )}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{border-color:#faf2cc;color:#8a6d3b;background:#fcf8e3;background:-moz-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:-webkit-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:linear-gradient(to bottom, #fefefa 0%, #fcf8e3 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fefefa', endColorstr='#fcf8e3',GradientType=0 )}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{border-color:#ebcccc;color:#a94442;background:#f2dede;background:-moz-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:-webkit-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:linear-gradient(to bottom, #f9f0f0 0%, #f2dede 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9f0f0', endColorstr='#f2dede',GradientType=0 )}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}#qtip-overlay>div{background:rgba(255,255,255,0.75) !important;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=” $value * 100 “)";filter:alpha(opacity=100);zoom:1}.qtip{padding:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 10px 100px rgba(0,0,0,0.5);-moz-box-shadow:0 10px 100px rgba(0,0,0,0.5);box-shadow:0 10px 100px rgba(0,0,0,0.5);border:1px solid transparent}.qtip .qtip-titlebar{padding:11px 14px;background:#FBFCFC;border-bottom:none;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:0 2px 1px -2px rgba(0,0,0,0.2)}.qtip .qtip-titlebar .qtip-title{font-family:HelveticaNeue-Light, HelveticaNeue, sans-serif;font-size:120%;color:#DA5A47}.qtip .qtip-titlebar .qtip-close{top:50%}.qtip div.buttons{position:relative;top:10px;margin:0px -14px !important;padding:11px 14px 3px;text-align:right;background:#EBEBED;background-image:-webkit-linear-gradient(#ecedef, #e9eaec);background-image:-moz-linear-gradient(#ecedef, #e9eaec);background-image:-ms-linear-gradient(#ecedef, #e9eaec);background-image:-o-linear-gradient(#ecedef, #e9eaec);background-image:linear-gradient(#ecedef, #e9eaec);-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-webkit-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2)}.qtip div.buttons a,.qtip div.buttons button{float:right !important;font-family:HelveticaNeue, sans-serif;font-size:12px}.calendar-mini-cal .fc-toolbar .fc-left button,.calendar-mini-cal .fc-toolbar .fc-right button{padding:0}.calendar-mini-cal td{border:none !important}.calendar-mini-cal td.fc-other-month{visibility:hidden !important}.calendar-mini-cal .fc-row.fc-widget-header{border-bottom:1px solid #D8D8D8}.calendar-mini-cal .fc-row.fc-widget-header .fc-day-header{text-align:center;color:#a0a7b1 !important;font-weight:normal;font-size:12px;border:none !important}.calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:3em}.calendar-mini-cal#calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:2em}.calendar-mini-cal .fc-bg td{background:none !important}.calendar-mini-cal .fc-row{margin-bottom:1px}.calendar-mini-cal .fc-content-skeleton{position:absolute;left:0;top:0;right:0;bottom:0;padding:0}.calendar-mini-cal .fc-content-skeleton td{cursor:pointer;border-style:solid;border-right:1px solid #fff !important;border-bottom:1px solid #fff !important}.calendar-mini-cal .fc-content-skeleton td.fc-day-top{text-align:center}.calendar-mini-cal .fc-content-skeleton td.fc-day-top span{font-size:13px;float:none !important}.calendar-mini-cal .fc-content-skeleton td.fc-has-event{background-color:#eeeeee;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.calendar-mini-cal .fc-content-skeleton td.fc-today{color:#FFFFFF;background-color:#D85B4C}.calendar-mini-cal .fc-content-skeleton td.fc-today:hover{background-color:#e18176;color:#FFFFFF}.calendar-mini-cal .fc-content-skeleton td:hover{background-color:#d9d9d9;color:#424242}.calendar-mini-cal .fc-content-skeleton>table{height:100%}.calendar-mini-cal#calendar-mini-cal .fc-content-skeleton td{border-right:1px solid #fafafa !important;border-bottom:1px solid #fafafa !important}.calendar-mini-cal .fc-toolbar h2{position:relative;top:4px;font-weight:normal !important;font-size:15px}.calendar-mini-cal .fc-toolbar button.fc-button{background:transparent none;text-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:none}.calendar-mini-cal .fc-toolbar button.fc-button,.calendar-mini-cal .fc-toolbar button.fc-button:active{outline:none}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon{width:auto}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon:after{margin:0}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-left-single-arrow:after{content:"←"}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-right-single-arrow:after{content:"→"}#sidebar ul.calendar-list li.item{margin-bottom:1px}#sidebar ul.calendar-list li.item>input{display:none}#sidebar ul.calendar-list li.item>label{position:relative;padding-left:20px;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#sidebar ul.calendar-list li.item>label>span{position:absolute;left:0;top:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:15px;height:15px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid white;background:white;text-align:center}#sidebar ul.calendar-list li.item>label>span:before{position:relative;top:-4px;content:"";font-family:Craft, sans-serif;font-size:10px;color:inherit}#sidebar ul.calendar-list li.item>input:checked+label>span:before{content:"check"}#mini-cal-wrapper .s-mini-calendar>table{width:auto}#mini-cal-wrapper .s-mini-calendar>table th{color:#a0a7b1 !important;font-weight:normal;font-size:12px}#mini-cal-wrapper .s-mini-calendar>table td{border:none;padding:1px 1px 0 0}#mini-cal-wrapper .s-mini-calendar>table td a{display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:24px;height:24px;padding:3px 4px;font-weight:normal;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}#mini-cal-wrapper .s-mini-calendar>table td a:hover{background-color:#d9d9d9}#mini-cal-wrapper .s-mini-calendar>table td .middot{display:none}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a{background-color:#eeeeee}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a:hover{background-color:#d9d9d9;color:#424242}#mini-cal-wrapper .s-mini-calendar>table td.today div a{background-color:#d65c50;-webkit-border-radius:24px;-moz-border-radius:24px;border-radius:24px}#mini-cal-wrapper .s-mini-calendar>table td.today div a:hover{background-color:#c53c2e;color:#FFF}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button{color:#29323d;background-image:-webkit-linear-gradient(#fff, #fafafa);background-image:-moz-linear-gradient(#fff, #fafafa);background-image:-ms-linear-gradient(#fff, #fafafa);background-image:-o-linear-gradient(#fff, #fafafa);background-image:linear-gradient(#fff, #fafafa);-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-moz-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding:6px 12px;border:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button:active{outline:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button.fc-state-hover{background-position:inherit}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon{top:-1px}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow{font-family:Craft, sans-serif}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{font-size:100%;font-weight:normal;left:0 !important}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after{content:'larr'}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{content:'rarr'}.calendar-agenda.fc.fc-unthemed .fc-left h2{font-size:28px}.calendar-agenda.fc.fc-unthemed th,.calendar-agenda.fc.fc-unthemed td,.calendar-agenda.fc.fc-unthemed tbody,.calendar-agenda.fc.fc-unthemed .fc-divider,.calendar-agenda.fc.fc-unthemed .fc-row,.calendar-agenda.fc.fc-unthemed .fc-popover{border-color:#E9E9E9}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container thead,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-day-header{border:none}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row{border-bottom:1px solid #D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-body>tr>td.fc-widget-content{border-color:transparent;border-top-color:#D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-day-header{padding:5px 7px;text-align:right;font-size:18px;font-weight:normal;color:#000}.calendar-agenda.fc.fc-unthemed .fc-day-grid .fc-other-month{background-color:#fcfcfc !important}.calendar-agenda.fc.fc-unthemed .fc-day-top{padding:2px}.calendar-agenda.fc.fc-unthemed .fc-day-top>a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;float:right;width:27px;height:27px;padding-top:4px;-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;font-size:16px;color:inherit;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-top>a:hover{cursor:pointer;text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-top.fc-today>a{background-color:#D85B4C;font-weight:bold;color:white}.calendar-agenda.fc.fc-unthemed .fc-day-top .fc-day-number{float:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a{position:relative;display:block;padding-right:35px;color:#000000}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a:hover{text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a>span>span{position:absolute;right:0;top:-4px;display:inline-block;width:30px;height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-top:3px;border:1px solid transparent;-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a.fc-title-today>span>span{color:#FFFFFF;background:#D85B4C}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-widget-content{border-left:none}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day.fc-today,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day.fc-today{background-color:#fff1ea}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sat,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sat{background-color:#F9F9F9}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event{padding:3px 5px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;opacity:0.8}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event.fc-event-disabled,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-time,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-time{font-size:10px}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-title,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-title{font-size:12px;font-weight:bold}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-axis,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-axis{border-color:transparent !important}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-bg .fc-day.fc-today.fc-state-highlight{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event{margin:1px 5px 0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-all-day,.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-multi-day{padding:2px 4px 1px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-black .fc-time{color:#000000}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-white .fc-time{color:#FFFFFF}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-time{font-size:10px;font-weight:normal;color:#fff}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-title{font-size:12px}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day{background-color:transparent !important;border-color:transparent !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-color-icon{display:inline-block;width:6px;height:6px;margin:0 5px 0 0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;border:1px solid transparent}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-title{color:#606060}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled .fc-time{color:black}.spinner{height:28px !important}.qtip{z-index:101 !important}.qtip-event{max-width:400px !important}.qtip .qtip-content{padding:9px 14px 0}.qtip .qtip-content div>label{font-weight:bold}.qtip .qtip-content div.buttons{position:relative;top:0;padding:11px 14px;margin:14px -14px 0 !important}.qtip .qtip-content div.buttons .btn{float:none !important}.qtip .qtip-content div.separator{margin-top:5px;padding-top:5px;border-top:1px dotted #e8e8e8}#event-creator{position:absolute;left:-9999px;visibility:hidden}#event-creator.shown{position:relative;left:0;visibility:visible}#event-creator .field{margin:9px 0}#sidebar nav{overflow:visible}.ui-datepicker-div{z-index:102 !important}.ui-datepicker{z-index:102 !important}.ui-timepicker-wrapper{z-index:102} diff --git a/src/Resources/css/src/widget/agenda.css b/src/Resources/css/src/widget/agenda.css index a96ae73..aa73d41 100644 --- a/src/Resources/css/src/widget/agenda.css +++ b/src/Resources/css/src/widget/agenda.css @@ -1 +1 @@ -.alert{padding:7px 14px;margin-bottom:1rem;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:14px}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-heading{color:inherit}.alert-link{font-weight:bold}.alert-dismissible{position:relative;padding-right:7px 14px20}.alert-dismissible .close{position:absolute;top:5px;right:10px;color:inherit;font-size:18px}.alert-dismissible .close:before{font-family:Craft, sans-serif;content:'remove';margin-left:2px}.alert-dismissible .close:hover{text-decoration:none}.alert-success{border-color:#d0e9c6;color:#3c763d;background:#dff0d8;background:-moz-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:-webkit-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:linear-gradient(to bottom, #eef7ea 0%, #dff0d8 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7ea', endColorstr='#dff0d8',GradientType=0 )}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{border-color:#bcdff1;color:#31708f;background:#d9edf7;background:-moz-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:-webkit-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:linear-gradient(to bottom, #eef7fb 0%, #d9edf7 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7fb', endColorstr='#d9edf7',GradientType=0 )}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{border-color:#faf2cc;color:#8a6d3b;background:#fcf8e3;background:-moz-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:-webkit-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:linear-gradient(to bottom, #fefefa 0%, #fcf8e3 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fefefa', endColorstr='#fcf8e3',GradientType=0 )}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{border-color:#ebcccc;color:#a94442;background:#f2dede;background:-moz-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:-webkit-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:linear-gradient(to bottom, #f9f0f0 0%, #f2dede 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9f0f0', endColorstr='#f2dede',GradientType=0 )}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}#qtip-overlay>div{background:rgba(255,255,255,0.75) !important;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=” $value * 100 “)";filter:alpha(opacity=100);zoom:1}.qtip{padding:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 10px 100px rgba(0,0,0,0.5);-moz-box-shadow:0 10px 100px rgba(0,0,0,0.5);box-shadow:0 10px 100px rgba(0,0,0,0.5);border:1px solid transparent}.qtip .qtip-titlebar{padding:11px 14px;background:#FBFCFC;border-bottom:none;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:0 2px 1px -2px rgba(0,0,0,0.2)}.qtip .qtip-titlebar .qtip-title{font-family:HelveticaNeue-Light, HelveticaNeue, sans-serif;font-size:120%;color:#DA5A47}.qtip .qtip-titlebar .qtip-close{top:50%}.qtip div.buttons{position:relative;top:10px;margin:0px -14px !important;padding:11px 14px 3px;text-align:right;background:#EBEBED;background-image:-webkit-linear-gradient(#ecedef, #e9eaec);background-image:-moz-linear-gradient(#ecedef, #e9eaec);background-image:-ms-linear-gradient(#ecedef, #e9eaec);background-image:-o-linear-gradient(#ecedef, #e9eaec);background-image:linear-gradient(#ecedef, #e9eaec);-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-webkit-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2)}.qtip div.buttons a,.qtip div.buttons button{float:right !important;font-family:HelveticaNeue, sans-serif;font-size:12px}.calendar-mini-cal .fc-toolbar .fc-left button,.calendar-mini-cal .fc-toolbar .fc-right button{padding:0}.calendar-mini-cal td{border:none !important}.calendar-mini-cal td.fc-other-month{visibility:hidden !important}.calendar-mini-cal .fc-row.fc-widget-header{border-bottom:1px solid #D8D8D8}.calendar-mini-cal .fc-row.fc-widget-header .fc-day-header{text-align:center;color:#a0a7b1 !important;font-weight:normal;font-size:12px;border:none !important}.calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:3em}.calendar-mini-cal#calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:2em}.calendar-mini-cal .fc-bg td{background:none !important}.calendar-mini-cal .fc-row{margin-bottom:1px}.calendar-mini-cal .fc-content-skeleton{position:absolute;left:0;top:0;right:0;bottom:0;padding:0}.calendar-mini-cal .fc-content-skeleton td{cursor:pointer;border-style:solid;border-right:1px solid #fff !important;border-bottom:1px solid #fff !important}.calendar-mini-cal .fc-content-skeleton td.fc-day-top{text-align:center}.calendar-mini-cal .fc-content-skeleton td.fc-day-top span{font-size:13px;float:none !important}.calendar-mini-cal .fc-content-skeleton td.fc-has-event{background-color:#eeeeee;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.calendar-mini-cal .fc-content-skeleton td.fc-today{color:#FFFFFF;background-color:#D85B4C}.calendar-mini-cal .fc-content-skeleton td.fc-today:hover{background-color:#e18176;color:#FFFFFF}.calendar-mini-cal .fc-content-skeleton td:hover{background-color:#d9d9d9;color:#424242}.calendar-mini-cal .fc-content-skeleton>table{height:100%}.calendar-mini-cal#calendar-mini-cal .fc-content-skeleton td{border-right:1px solid #fafafa !important;border-bottom:1px solid #fafafa !important}.calendar-mini-cal .fc-toolbar h2{position:relative;top:4px;font-weight:normal !important;font-size:15px}.calendar-mini-cal .fc-toolbar button.fc-button{background:transparent none;text-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:none}.calendar-mini-cal .fc-toolbar button.fc-button,.calendar-mini-cal .fc-toolbar button.fc-button:active{outline:none}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon{width:auto}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon:after{margin:0}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-left-single-arrow:after{content:"←"}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-right-single-arrow:after{content:"→"}#sidebar ul.calendar-list li.item{margin-bottom:1px}#sidebar ul.calendar-list li.item>input{display:none}#sidebar ul.calendar-list li.item>label{position:relative;padding-left:20px;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#sidebar ul.calendar-list li.item>label>span{position:absolute;left:0;top:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:15px;height:15px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid white;background:white;text-align:center}#sidebar ul.calendar-list li.item>label>span:before{position:relative;top:-4px;content:"";font-family:Craft, sans-serif;font-size:10px;color:inherit}#sidebar ul.calendar-list li.item>input:checked+label>span:before{content:"check"}#mini-cal-wrapper .s-mini-calendar>table{width:auto}#mini-cal-wrapper .s-mini-calendar>table th{color:#a0a7b1 !important;font-weight:normal;font-size:12px}#mini-cal-wrapper .s-mini-calendar>table td{border:none;padding:1px 1px 0 0}#mini-cal-wrapper .s-mini-calendar>table td a{display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:24px;height:24px;padding:3px 4px;font-weight:normal;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}#mini-cal-wrapper .s-mini-calendar>table td a:hover{background-color:#d9d9d9}#mini-cal-wrapper .s-mini-calendar>table td .middot{display:none}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a{background-color:#eeeeee}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a:hover{background-color:#d9d9d9;color:#424242}#mini-cal-wrapper .s-mini-calendar>table td.today div a{background-color:#d65c50;-webkit-border-radius:24px;-moz-border-radius:24px;border-radius:24px}#mini-cal-wrapper .s-mini-calendar>table td.today div a:hover{background-color:#c53c2e;color:#FFF}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button{color:#29323d;background-image:-webkit-linear-gradient(#fff, #fafafa);background-image:-moz-linear-gradient(#fff, #fafafa);background-image:-ms-linear-gradient(#fff, #fafafa);background-image:-o-linear-gradient(#fff, #fafafa);background-image:linear-gradient(#fff, #fafafa);-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-moz-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding:6px 12px;border:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button:active{outline:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button.fc-state-hover{background-position:inherit}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon{top:-1px}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow{font-family:Craft, sans-serif}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{font-size:100%;font-weight:normal;left:0 !important}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after{content:'larr'}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{content:'rarr'}.calendar-agenda.fc.fc-unthemed .fc-left h2{font-size:28px}.calendar-agenda.fc.fc-unthemed th,.calendar-agenda.fc.fc-unthemed td,.calendar-agenda.fc.fc-unthemed tbody,.calendar-agenda.fc.fc-unthemed .fc-divider,.calendar-agenda.fc.fc-unthemed .fc-row,.calendar-agenda.fc.fc-unthemed .fc-popover{border-color:#E9E9E9}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container thead,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-day-header{border:none}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row{border-bottom:1px solid #D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-body>tr>td.fc-widget-content{border-color:transparent;border-top-color:#D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-day-header{padding:5px 7px;text-align:right;font-size:18px;font-weight:normal;color:#000}.calendar-agenda.fc.fc-unthemed .fc-day-grid .fc-other-month{background-color:#fcfcfc !important}.calendar-agenda.fc.fc-unthemed .fc-day-top{padding:2px}.calendar-agenda.fc.fc-unthemed .fc-day-top>a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;float:right;width:27px;height:27px;padding-top:4px;-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;font-size:16px;color:inherit;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-top>a:hover{cursor:pointer;text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-top.fc-today>a{background-color:#D85B4C;font-weight:bold;color:white}.calendar-agenda.fc.fc-unthemed .fc-day-top .fc-day-number{float:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a{position:relative;display:block;padding-right:35px;color:#000000}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a:hover{text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a>span>span{position:absolute;right:0;top:-4px;display:inline-block;width:30px;height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-top:3px;border:1px solid transparent;-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a.fc-title-today>span>span{color:#FFFFFF;background:#D85B4C}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-widget-content{border-left:none}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day.fc-today,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day.fc-today{background-color:#fff1ea}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sat,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sat{background-color:#F9F9F9}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event{padding:3px 5px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;opacity:0.8}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event.fc-event-disabled,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-time,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-time{font-size:10px}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-title,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-title{font-size:12px;font-weight:bold}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-axis,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-axis{border-color:transparent !important}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-bg .fc-day.fc-today.fc-state-highlight{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event{margin:1px 5px 0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-all-day,.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-multi-day{padding:2px 4px 1px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-black .fc-time{color:#000000}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-white .fc-time{color:#FFFFFF}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-time{font-size:10px;font-weight:normal;color:#fff}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-title{font-size:12px}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day{background-color:transparent !important;border-color:transparent !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-color-icon{display:inline-block;width:6px;height:6px;margin:0 5px 0 0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;border:1px solid transparent}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-title{color:#606060}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled .fc-time{color:black}.spinner{height:28px !important}.qtip{z-index:101 !important}.qtip-event{max-width:400px !important}.qtip .qtip-content{padding:9px 14px 0}.qtip .qtip-content div>label{font-weight:bold}.qtip .qtip-content div.buttons{position:relative;top:0;padding:11px 14px;margin:14px -14px 0 !important}.qtip .qtip-content div.buttons .btn{float:none !important}.qtip .qtip-content div.separator{margin-top:5px;padding-top:5px;border-top:1px dotted #e8e8e8}#event-creator{position:absolute;left:-9999px;visibility:hidden}#event-creator.shown{position:relative;left:0;visibility:visible}#event-creator .field{margin:9px 0}#sidebar nav{overflow:visible}div.fc.fc-unthemed .fc-left h2{position:relative;top:3px;font-size:15px}div.fc.fc-unthemed .fc-day-header{font-size:14px} +.alert{padding:7px 14px;margin-bottom:1rem;border:1px solid transparent;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;font-size:14px}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-heading{color:inherit}.alert-link{font-weight:bold}.alert-dismissible{position:relative;padding-right:7px 14px20}.alert-dismissible .close{position:absolute;top:5px;right:10px;color:inherit;font-size:18px}.alert-dismissible .close:before{font-family:Craft, sans-serif;content:'remove';margin-left:2px}.alert-dismissible .close:hover{text-decoration:none}.alert-success{border-color:#d0e9c6;color:#3c763d;background:#dff0d8;background:-moz-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:-webkit-linear-gradient(top, #eef7ea 0%, #dff0d8 100%);background:linear-gradient(to bottom, #eef7ea 0%, #dff0d8 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7ea', endColorstr='#dff0d8',GradientType=0 )}.alert-success hr{border-top-color:#c1e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{border-color:#bcdff1;color:#31708f;background:#d9edf7;background:-moz-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:-webkit-linear-gradient(top, #eef7fb 0%, #d9edf7 100%);background:linear-gradient(to bottom, #eef7fb 0%, #d9edf7 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#eef7fb', endColorstr='#d9edf7',GradientType=0 )}.alert-info hr{border-top-color:#a6d5ec}.alert-info .alert-link{color:#245269}.alert-warning{border-color:#faf2cc;color:#8a6d3b;background:#fcf8e3;background:-moz-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:-webkit-linear-gradient(top, #fefefa 0%, #fcf8e3 100%);background:linear-gradient(to bottom, #fefefa 0%, #fcf8e3 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fefefa', endColorstr='#fcf8e3',GradientType=0 )}.alert-warning hr{border-top-color:#f7ecb5}.alert-warning .alert-link{color:#66512c}.alert-danger{border-color:#ebcccc;color:#a94442;background:#f2dede;background:-moz-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:-webkit-linear-gradient(top, #f9f0f0 0%, #f2dede 100%);background:linear-gradient(to bottom, #f9f0f0 0%, #f2dede 100%);filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9f0f0', endColorstr='#f2dede',GradientType=0 )}.alert-danger hr{border-top-color:#e4b9b9}.alert-danger .alert-link{color:#843534}#qtip-overlay>div{background:rgba(255,255,255,0.75) !important;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=” $value * 100 “)";filter:alpha(opacity=100);zoom:1}.qtip{padding:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 10px 100px rgba(0,0,0,0.5);-moz-box-shadow:0 10px 100px rgba(0,0,0,0.5);box-shadow:0 10px 100px rgba(0,0,0,0.5);border:1px solid transparent}.qtip .qtip-titlebar{padding:11px 14px;background:#FBFCFC;border-bottom:none;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;-webkit-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:0 2px 1px -2px rgba(0,0,0,0.2)}.qtip .qtip-titlebar .qtip-title{font-family:HelveticaNeue-Light, HelveticaNeue, sans-serif;font-size:120%;color:#DA5A47}.qtip .qtip-titlebar .qtip-close{top:50%}.qtip div.buttons{position:relative;top:10px;margin:0px -14px !important;padding:11px 14px 3px;text-align:right;background:#EBEBED;background-image:-webkit-linear-gradient(#ecedef, #e9eaec);background-image:-moz-linear-gradient(#ecedef, #e9eaec);background-image:-ms-linear-gradient(#ecedef, #e9eaec);background-image:-o-linear-gradient(#ecedef, #e9eaec);background-image:linear-gradient(#ecedef, #e9eaec);-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;-webkit-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);-moz-box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2);box-shadow:inset 0 2px 1px -2px rgba(0,0,0,0.2)}.qtip div.buttons a,.qtip div.buttons button{float:right !important;font-family:HelveticaNeue, sans-serif;font-size:12px}.calendar-mini-cal .fc-toolbar .fc-left button,.calendar-mini-cal .fc-toolbar .fc-right button{padding:0}.calendar-mini-cal td{border:none !important}.calendar-mini-cal td.fc-other-month{visibility:hidden !important}.calendar-mini-cal .fc-row.fc-widget-header{border-bottom:1px solid #D8D8D8}.calendar-mini-cal .fc-row.fc-widget-header .fc-day-header{text-align:center;color:#a0a7b1 !important;font-weight:normal;font-size:12px;border:none !important}.calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:3em}.calendar-mini-cal#calendar-mini-cal .fc-basic-view .fc-body .fc-row{min-height:2em}.calendar-mini-cal .fc-bg td{background:none !important}.calendar-mini-cal .fc-row{margin-bottom:1px}.calendar-mini-cal .fc-content-skeleton{position:absolute;left:0;top:0;right:0;bottom:0;padding:0}.calendar-mini-cal .fc-content-skeleton td{cursor:pointer;border-style:solid;border-right:1px solid #fff !important;border-bottom:1px solid #fff !important}.calendar-mini-cal .fc-content-skeleton td.fc-day-top{text-align:center}.calendar-mini-cal .fc-content-skeleton td.fc-day-top span{font-size:13px;float:none !important}.calendar-mini-cal .fc-content-skeleton td.fc-has-event{background-color:#eeeeee;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.calendar-mini-cal .fc-content-skeleton td.fc-today{color:#FFFFFF;background-color:#D85B4C}.calendar-mini-cal .fc-content-skeleton td.fc-today:hover{background-color:#e18176;color:#FFFFFF}.calendar-mini-cal .fc-content-skeleton td:hover{background-color:#d9d9d9;color:#424242}.calendar-mini-cal .fc-content-skeleton>table{height:100%}.calendar-mini-cal#calendar-mini-cal .fc-content-skeleton td{border-right:1px solid #fafafa !important;border-bottom:1px solid #fafafa !important}.calendar-mini-cal .fc-toolbar h2{position:relative;top:4px;font-weight:normal !important;font-size:15px}.calendar-mini-cal .fc-toolbar button.fc-button{background:transparent none;text-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border:none}.calendar-mini-cal .fc-toolbar button.fc-button,.calendar-mini-cal .fc-toolbar button.fc-button:active{outline:none}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon{width:auto}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon:after{margin:0}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-left-single-arrow:after{content:"←"}.calendar-mini-cal .fc-toolbar button.fc-button .fc-icon.fc-icon-right-single-arrow:after{content:"→"}#sidebar ul.calendar-list li.item{margin-bottom:1px}#sidebar ul.calendar-list li.item>input{display:none}#sidebar ul.calendar-list li.item>label{position:relative;padding-left:20px;cursor:pointer;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#sidebar ul.calendar-list li.item>label>span{position:absolute;left:0;top:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:15px;height:15px;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid white;background:white;text-align:center}#sidebar ul.calendar-list li.item>label>span:before{position:relative;top:-4px;content:"";font-family:Craft, sans-serif;font-size:10px;color:inherit}#sidebar ul.calendar-list li.item>input:checked+label>span:before{content:"check"}#mini-cal-wrapper .s-mini-calendar>table{width:auto}#mini-cal-wrapper .s-mini-calendar>table th{color:#a0a7b1 !important;font-weight:normal;font-size:12px}#mini-cal-wrapper .s-mini-calendar>table td{border:none;padding:1px 1px 0 0}#mini-cal-wrapper .s-mini-calendar>table td a{display:block;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;width:24px;height:24px;padding:3px 4px;font-weight:normal;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}#mini-cal-wrapper .s-mini-calendar>table td a:hover{background-color:#d9d9d9}#mini-cal-wrapper .s-mini-calendar>table td .middot{display:none}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a{background-color:#eeeeee}#mini-cal-wrapper .s-mini-calendar>table td.has_events div a:hover{background-color:#d9d9d9;color:#424242}#mini-cal-wrapper .s-mini-calendar>table td.today div a{background-color:#d65c50;-webkit-border-radius:24px;-moz-border-radius:24px;border-radius:24px}#mini-cal-wrapper .s-mini-calendar>table td.today div a:hover{background-color:#c53c2e;color:#FFF}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button{color:#29323d;background-image:-webkit-linear-gradient(#fff, #fafafa);background-image:-moz-linear-gradient(#fff, #fafafa);background-image:-ms-linear-gradient(#fff, #fafafa);background-image:-o-linear-gradient(#fff, #fafafa);background-image:linear-gradient(#fff, #fafafa);-webkit-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-moz-box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);box-shadow:inset 0 0 0 1px rgba(0,0,20,0.1);-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding:6px 12px;border:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button:active{outline:none}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button.fc-state-hover{background-position:inherit}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon{top:-1px}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow{font-family:Craft, sans-serif}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after,.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{font-size:100%;font-weight:normal;left:0 !important}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-left-single-arrow:after{content:'larr'}.calendar-agenda.fc.fc-unthemed .fc-toolbar .fc-button .fc-icon.fc-icon-right-single-arrow:after{content:'rarr'}.calendar-agenda.fc.fc-unthemed .fc-left h2{font-size:28px}.calendar-agenda.fc.fc-unthemed th,.calendar-agenda.fc.fc-unthemed td,.calendar-agenda.fc.fc-unthemed tbody,.calendar-agenda.fc.fc-unthemed .fc-divider,.calendar-agenda.fc.fc-unthemed .fc-row,.calendar-agenda.fc.fc-unthemed .fc-popover{border-color:#E9E9E9}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container thead,.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-day-header{border:none}.calendar-agenda.fc.fc-unthemed .fc-head .fc-head-container .fc-row{border-bottom:1px solid #D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-body>tr>td.fc-widget-content{border-color:transparent;border-top-color:#D0D0D0}.calendar-agenda.fc.fc-unthemed .fc-day-header{padding:5px 7px;text-align:right;font-size:18px;font-weight:normal;color:#000}.calendar-agenda.fc.fc-unthemed .fc-day-grid .fc-other-month{background-color:#fcfcfc !important}.calendar-agenda.fc.fc-unthemed .fc-day-top{padding:2px}.calendar-agenda.fc.fc-unthemed .fc-day-top>a{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:inline-block;float:right;width:27px;height:27px;padding-top:4px;-webkit-border-radius:25px;-moz-border-radius:25px;border-radius:25px;font-size:16px;color:inherit;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-top>a:hover{cursor:pointer;text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-top.fc-today>a{background-color:#D85B4C;font-weight:bold;color:white}.calendar-agenda.fc.fc-unthemed .fc-day-top .fc-day-number{float:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a{position:relative;display:block;padding-right:35px;color:#000000}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a:hover{text-decoration:none}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a>span>span{position:absolute;right:0;top:-4px;display:inline-block;width:30px;height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding-top:3px;border:1px solid transparent;-webkit-border-radius:30px;-moz-border-radius:30px;border-radius:30px;text-align:center}.calendar-agenda.fc.fc-unthemed .fc-day-header.fc-widget-header>a.fc-title-today>span>span{color:#FFFFFF;background:#D85B4C}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-widget-content{border-left:none}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-day.fc-today,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-day.fc-today{background-color:#fff1ea}.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-month-view .fc-bg .fc-sat,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sun,.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-bg .fc-sat{background-color:#F9F9F9}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event{padding:3px 5px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;opacity:0.8}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-time-grid-event.fc-event-disabled,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-time-grid-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-time,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-time{font-size:10px}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-content .fc-title,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-content .fc-title{font-size:12px;font-weight:bold}.calendar-agenda.fc.fc-unthemed .fc-agendaWeek-view .fc-axis,.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-axis{border-color:transparent !important}.calendar-agenda.fc.fc-unthemed .fc-agendaDay-view .fc-bg .fc-day.fc-today.fc-state-highlight{background-color:#FFFFFE}.calendar-agenda.fc.fc-unthemed .fc-month-view.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event{margin:1px 5px 0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-all-day,.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-multi-day{padding:2px 4px 1px;border:none !important;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-black .fc-time{color:#000000}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-color-white .fc-time{color:#FFFFFF}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-time{font-size:10px;font-weight:normal;color:#fff}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event .fc-title{font-size:12px}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day{background-color:transparent !important;border-color:transparent !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-color-icon{display:inline-block;width:6px;height:6px;margin:0 5px 0 0;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;border:1px solid transparent}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-title{color:#606060}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-single-day .fc-time{color:#929292}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled{opacity:0.3 !important}.calendar-agenda.fc.fc-unthemed td.fc-event-container a.fc-event.fc-event-disabled .fc-time{color:black}.spinner{height:28px !important}.qtip{z-index:101 !important}.qtip-event{max-width:400px !important}.qtip .qtip-content{padding:9px 14px 0}.qtip .qtip-content div>label{font-weight:bold}.qtip .qtip-content div.buttons{position:relative;top:0;padding:11px 14px;margin:14px -14px 0 !important}.qtip .qtip-content div.buttons .btn{float:none !important}.qtip .qtip-content div.separator{margin-top:5px;padding-top:5px;border-top:1px dotted #e8e8e8}#event-creator{position:absolute;left:-9999px;visibility:hidden}#event-creator.shown{position:relative;left:0;visibility:visible}#event-creator .field{margin:9px 0}#sidebar nav{overflow:visible}.ui-datepicker-div{z-index:102 !important}.ui-datepicker{z-index:102 !important}.ui-timepicker-wrapper{z-index:102}div.fc.fc-unthemed .fc-left h2{position:relative;top:3px;font-size:15px}div.fc.fc-unthemed .fc-day-header{font-size:14px} diff --git a/src/Resources/js/src/calendar-fullcalendar-methods.js b/src/Resources/js/src/calendar-fullcalendar-methods.js index 771b4a6..5d6be11 100644 --- a/src/Resources/js/src/calendar-fullcalendar-methods.js +++ b/src/Resources/js/src/calendar-fullcalendar-methods.js @@ -1 +1 @@ -"use strict";function _defineProperty(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}var _slicedToArray=function(){function e(e,a){var n=[],t=!0,r=!1,i=void 0;try{for(var l,d=e[Symbol.iterator]();!(t=(l=d.next()).done)&&(n.push(l.value),!a||n.length!==a);t=!0);}catch(o){r=!0,i=o}finally{try{!t&&d["return"]&&d["return"]()}finally{if(r)throw i}}return n}return function(a,n){if(Array.isArray(a))return a;if(Symbol.iterator in Object(a))return e(a,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),$solspaceCalendar=$("#solspace-calendar"),$solspaceCalendarSpinner=null,_$calendar$data=$calendar.data(),isMultiSite=_$calendar$data.isMultiSite,overlapThreshold=_$calendar$data.overlapThreshold,language=_$calendar$data.language,firstDayOfWeek=_$calendar$data.firstDayOfWeek,renderEvent=function(e,a){if(e.allDay&&a.addClass("fc-event-all-day"),e.end){if(e.multiDay||e.allDay)a.addClass("fc-event-multi-day");else{a.addClass("fc-event-single-day");var n=$("").addClass("fc-color-icon").css("background-color",e.backgroundColor).css("border-color",e.borderColor);$(".fc-content",a).prepend(n)}e.enabled||a.addClass("fc-event-disabled"),a.addClass("fc-color-"+e.textColor),buildEventPopup(e,a)}},today=new moment,renderDay=function(e,a){var n=a.parents(".fc-bg:first").siblings(".fc-content-skeleton").find("thead > tr > td:eq("+a.index()+")"),t=getDayViewLink(e),r=$("").attr("href",t).html(n.html());n.html(r)},renderView=function(e,a){var n=new moment;if("agendaWeek"===e.name){var t=$(".fc-day-header.fc-widget-header",a);t.each(function(){var e=$(this).html(),a=e.split(" ");e=a[0]+" "+a[1]+"";var t=new moment($(this).data("date")),r=getDayViewLink(t),i=$("").attr("href",r).html(e);n.format("YYYYMMDD")===t.format("YYYYMMDD")&&i.addClass("fc-title-today"),$(this).html(i)})}$(".fc-localeButton-button",$solspaceCalendar).addClass("menubtn btn"),"agendaDay"===e.name&&$("thead.fc-head",a).remove()},eventRepositioned=function(e,a,n,t){$.ajax({url:Craft.getCpUrl("calendar/events/api/modify-"+e),type:"post",dataType:"json",data:_defineProperty({eventId:a.id,siteId:a.site.id,isAllDay:a.allDay,startDate:a.start.toISOString(),endDate:a.end?a.end.toISOString():null,deltaSeconds:n.as("seconds")},Craft.csrfTokenName,Craft.csrfTokenValue),success:function(e){e.error?t():a.repeats&&$calendar.fullCalendar("refetchEvents")},error:function(){t()}})},eventDateChange=function(e,a,n){eventRepositioned("date",e,a,n)},eventDurationChange=function(e,a,n){eventRepositioned("duration",e,a,n)},eventClick=function(e){window.location.href=Craft.getCpUrl("calendar/events/"+e.id+"/"+e.site.handle)},getDayViewLink=function(e){if(e.isValid()){var a=e.format("YYYY"),n=e.format("MM"),t=e.format("DD");return Craft.getCpUrl("calendar/view/day/"+a+"/"+n+"/"+t)}return""},getEvents=function(e,a,n,t){getSpinner().fadeIn("fast");var r=$("ul.calendar-list"),i="*";r.length&&(i=$("input:checked",r).map(function(){return $(this).val()}).get().join());var l=$calendar.data(),d=l.currentSiteId;$.ajax({url:Craft.getCpUrl("calendar/month"),data:_defineProperty({dateRangeStart:e.toISOString(),dateRangeEnd:a.toISOString(),calendars:i,siteId:d},Craft.csrfTokenName,Craft.csrfTokenValue),type:"post",dataType:"json",success:function(e){var a=!0,n=!1,r=void 0;try{for(var i,l=e.entries()[Symbol.iterator]();!(a=(i=l.next()).done);a=!0){var d=_slicedToArray(i.value,2),o=d[0],s=d[1];s.allDay&&(e[o].end=moment(s.end).add(2,"s").utc().format())}}catch(c){n=!0,r=c}finally{try{!a&&l["return"]&&l["return"]()}finally{if(n)throw r}}t(e),getSpinner().fadeOut("fast")}})},closeAllQTips=function(){qTipsEnabled=!1,$("div.qtip:visible").qtip("hide")},enableQTips=function(){qTipsEnabled=!0},getSpinner=function(){return $solspaceCalendarSpinner||($solspaceCalendar.find(".fc-right").prepend(''),$solspaceCalendarSpinner=$("#solspace-calendar-spinner")),$solspaceCalendarSpinner}; \ No newline at end of file +"use strict";function _defineProperty(e,a,n){return a in e?Object.defineProperty(e,a,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[a]=n,e}var _slicedToArray=function(){function e(e,a){var n=[],t=!0,r=!1,i=void 0;try{for(var l,d=e[Symbol.iterator]();!(t=(l=d.next()).done)&&(n.push(l.value),!a||n.length!==a);t=!0);}catch(o){r=!0,i=o}finally{try{!t&&d["return"]&&d["return"]()}finally{if(r)throw i}}return n}return function(a,n){if(Array.isArray(a))return a;if(Symbol.iterator in Object(a))return e(a,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),$solspaceCalendar=$("#solspace-calendar"),$solspaceCalendarSpinner=null,_$calendar$data=$calendar.data(),isMultiSite=_$calendar$data.isMultiSite,overlapThreshold=_$calendar$data.overlapThreshold,language=_$calendar$data.language,firstDayOfWeek=_$calendar$data.firstDayOfWeek,renderEvent=function(e,a){if(e.allDay&&a.addClass("fc-event-all-day"),e.end){if(e.multiDay||e.allDay)a.addClass("fc-event-multi-day");else{a.addClass("fc-event-single-day");var n=$("").addClass("fc-color-icon").css("background-color",e.backgroundColor).css("border-color",e.borderColor);$(".fc-content",a).prepend(n)}e.enabled||a.addClass("fc-event-disabled"),a.addClass("fc-color-"+e.textColor),buildEventPopup(e,a)}},today=new moment,renderDay=function(e,a){var n=a.parents(".fc-bg:first").siblings(".fc-content-skeleton").find("thead > tr > td:eq("+a.index()+")"),t=getDayViewLink(e),r=$("").attr("href",t).html(n.html());n.html(r)},renderView=function(e,a){var n=new moment;if("agendaWeek"===e.name){var t=$(".fc-day-header.fc-widget-header",a);t.each(function(){var e=$(this).html(),a=e.split(" ");e=a[0]+" "+a[1]+"";var t=new moment($(this).data("date")),r=getDayViewLink(t),i=$("").attr("href",r).html(e);n.format("YYYYMMDD")===t.format("YYYYMMDD")&&i.addClass("fc-title-today"),$(this).html(i)})}$(".fc-localeButton-button",$solspaceCalendar).addClass("menubtn btn"),"agendaDay"===e.name&&$("thead.fc-head",a).remove()},eventRepositioned=function(e,a,n,t){$.ajax({url:Craft.getCpUrl("calendar/events/api/modify-"+e),type:"post",dataType:"json",data:_defineProperty({eventId:a.id,siteId:a.site.id,isAllDay:a.allDay,startDate:a.start.toISOString(),endDate:a.end?a.end.toISOString():null,deltaSeconds:n.as("seconds")},Craft.csrfTokenName,Craft.csrfTokenValue),success:function(e){e.error?t():a.repeats&&$calendar.fullCalendar("refetchEvents")},error:function(){t()}})},eventDateChange=function(e,a,n){eventRepositioned("date",e,a,n)},eventDurationChange=function(e,a,n){eventRepositioned("duration",e,a,n)},eventClick=function(e){window.location.href=Craft.getCpUrl("calendar/events/"+e.id+"/"+e.site.handle)},getDayViewLink=function(e){if(e.isValid()){var a=e.format("YYYY"),n=e.format("MM"),t=e.format("DD");return Craft.getCpUrl("calendar/view/day/"+a+"/"+n+"/"+t)}return""},getEvents=function(e,a,n,t){getSpinner().fadeIn("fast");var r=$("ul.calendar-list"),i="*";r.length&&(i=$("input:checked",r).map(function(){return $(this).val()}).get().join());var l=$calendar.data(),d=l.currentSiteId;$.ajax({url:Craft.getCpUrl("calendar/month"),data:_defineProperty({rangeStart:e.toISOString(),rangeEnd:a.toISOString(),calendars:i,siteId:d},Craft.csrfTokenName,Craft.csrfTokenValue),type:"post",dataType:"json",success:function(e){var a=!0,n=!1,r=void 0;try{for(var i,l=e.entries()[Symbol.iterator]();!(a=(i=l.next()).done);a=!0){var d=_slicedToArray(i.value,2),o=d[0],s=d[1];s.allDay&&(e[o].end=moment(s.end).add(2,"s").utc().format())}}catch(c){n=!0,r=c}finally{try{!a&&l["return"]&&l["return"]()}finally{if(n)throw r}}t(e),getSpinner().fadeOut("fast")}})},closeAllQTips=function(){qTipsEnabled=!1,$("div.qtip:visible").qtip("hide")},enableQTips=function(){qTipsEnabled=!0},getSpinner=function(){return $solspaceCalendarSpinner||($solspaceCalendar.find(".fc-right").prepend(''),$solspaceCalendarSpinner=$("#solspace-calendar-spinner")),$solspaceCalendarSpinner}; \ No newline at end of file diff --git a/src/Resources/js/src/widget/agenda.js b/src/Resources/js/src/widget/agenda.js index 9fc9518..22e61f9 100644 --- a/src/Resources/js/src/widget/agenda.js +++ b/src/Resources/js/src/widget/agenda.js @@ -1 +1 @@ -"use strict";function initiateAgenda(e){var a=e;a.fullCalendar({defaultView:a.data("view"),nextDayThreshold:"0"+calendarOverlapThreshold+":00:01",fixedWeekCount:!1,eventLimit:3,lang:calendarLocale,views:viewSpecificOptions,firstDay:calendarFirstDayOfWeek,height:500,scrollTime:moment().format("HH:mm:ss"),eventClick:eventClick,eventRender:function(e,a){if(e.allDay&&a.addClass("fc-event-all-day"),e.end){if(e.multiDay||e.allDay)a.addClass("fc-event-multi-day");else{a.addClass("fc-event-single-day");var t=$("").addClass("fc-color-icon").css("background-color",e.backgroundColor).css("border-color",e.borderColor);$(".fc-content",a).prepend(t)}e.enabled||a.addClass("fc-event-disabled"),a.addClass("fc-color-"+e.textColor)}},events:function(e,t,n,l){var r={dateRangeStart:e.toISOString(),dateRangeEnd:t.toISOString(),nonEditable:!0,calendars:a.data("calendars")};r[csrfTokenName]=csrfTokenValue,$.ajax({url:Craft.getCpUrl("calendar/month"),data:r,type:"post",dataType:"json",success:function(e){l(e)}})},customButtons:{refresh:{text:Craft.t("calendar","Refresh"),click:function(){a.fullCalendar("refetchEvents")}}},header:{right:"prev,today,next",left:"title"}})}var viewSpecificOptions={week:{columnFormat:"ddd D",timeFormat:"LT",slotLabelFormat:"LT"},day:{columnFormat:"",timeFormat:"LT",slotLabelFormat:"LT"}}; \ No newline at end of file +"use strict";function _defineProperty(e,a,t){return a in e?Object.defineProperty(e,a,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[a]=t,e}function initiateAgenda(e){var a=e;a.fullCalendar({defaultView:a.data("view"),nextDayThreshold:"0"+calendarOverlapThreshold+":00:01",fixedWeekCount:!1,eventLimit:3,lang:calendarLocale,views:viewSpecificOptions,firstDay:calendarFirstDayOfWeek,height:500,scrollTime:moment().format("HH:mm:ss"),eventClick:eventClick,eventRender:function(e,a){if(e.allDay&&a.addClass("fc-event-all-day"),e.end){if(e.multiDay||e.allDay)a.addClass("fc-event-multi-day");else{a.addClass("fc-event-single-day");var t=$("").addClass("fc-color-icon").css("background-color",e.backgroundColor).css("border-color",e.borderColor);$(".fc-content",a).prepend(t)}e.enabled||a.addClass("fc-event-disabled"),a.addClass("fc-color-"+e.textColor)}},events:function(e,t,n,r){$.ajax({url:Craft.getCpUrl("calendar/month"),data:_defineProperty({rangeStart:e.toISOString(),rangeEnd:t.toISOString(),nonEditable:!0,calendars:a.data("calendars")},Craft.csrfTokenName,Craft.csrfTokenValue),type:"post",dataType:"json",success:function(e){r(e)}})},customButtons:{refresh:{text:Craft.t("calendar","Refresh"),click:function(){a.fullCalendar("refetchEvents")}}},header:{right:"prev,today,next",left:"title"}})}var viewSpecificOptions={week:{columnFormat:"ddd D",timeFormat:"LT",slotLabelFormat:"LT"},day:{columnFormat:"",timeFormat:"LT",slotLabelFormat:"LT"}}; \ No newline at end of file diff --git a/src/Resources/js/src/widget/month.js b/src/Resources/js/src/widget/month.js index d045332..646eb99 100644 --- a/src/Resources/js/src/widget/month.js +++ b/src/Resources/js/src/widget/month.js @@ -1 +1 @@ -"use strict";function _defineProperty(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function updateDayNumberDimensions(e,t){var a=$(".fc-content-skeleton",t);$(".fc-day-number",t).css({textAlign:"center",padding:0,minHeight:a.height()+"px",lineHeight:a.height()+"px"})}var initiateMiniCal=function(e){var t=e,a=$calendar.data(),n=a.overlapThreshold,r=a.firstDayOfWeek;t.fullCalendar({defaultView:"month",nextDayThreshold:"0"+n+":00:01",fixedWeekCount:!1,eventLimit:1,firstDay:r,height:"auto",columnFormat:"dd",viewRender:updateDayNumberDimensions,windowResize:updateDayNumberDimensions,eventClick:eventClick,dayClick:function(e){window.location.href=Craft.getCpUrl("calendar/view/day/"+e.format("YYYY/MM/DD"))},events:function(e,a){$.ajax({url:Craft.getCpUrl("calendar/month"),data:_defineProperty({dateRangeStart:e.toISOString(),dateRangeEnd:a.toISOString(),nonEditable:!0,calendars:t.data("calendars")},Craft.csrfTokenName,Craft.csrfTokenValue),type:"post",dataType:"json",success:function(e){$(".fc-content-skeleton .fc-day-top.fc-has-event").removeClass("fc-has-event");var t=!0,a=!1,n=void 0;try{for(var r,i=e[Symbol.iterator]();!(t=(r=i.next()).done);t=!0)for(var o=r.value,d=moment(o.start).utc(),c=moment(o.end).utc();d.isBefore(c);)$(".fc-content-skeleton .fc-day-top[data-date="+d.utc().format("YYYY-MM-DD")+"]").addClass("fc-has-event"),d.add(1,"days")}catch(l){a=!0,n=l}finally{try{!t&&i["return"]&&i["return"]()}finally{if(a)throw n}}}})},header:{left:"prev",center:"title",right:"next"}})}; \ No newline at end of file +"use strict";function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function updateDayNumberDimensions(e,t){var n=$(".fc-content-skeleton",t);$(".fc-day-number",t).css({textAlign:"center",padding:0,minHeight:n.height()+"px",lineHeight:n.height()+"px"})}var initiateMiniCal=function(e){var t=e,n=$calendar.data(),a=n.overlapThreshold,r=n.firstDayOfWeek;t.fullCalendar({defaultView:"month",nextDayThreshold:"0"+a+":00:01",fixedWeekCount:!1,eventLimit:1,firstDay:r,height:"auto",columnFormat:"dd",viewRender:updateDayNumberDimensions,windowResize:updateDayNumberDimensions,eventClick:eventClick,dayClick:function(e){window.location.href=Craft.getCpUrl("calendar/view/day/"+e.format("YYYY/MM/DD"))},events:function(e,n){$.ajax({url:Craft.getCpUrl("calendar/month"),data:_defineProperty({rangeStart:e.toISOString(),rangeEnd:n.toISOString(),nonEditable:!0,calendars:t.data("calendars")},Craft.csrfTokenName,Craft.csrfTokenValue),type:"post",dataType:"json",success:function(e){$(".fc-content-skeleton .fc-day-top.fc-has-event").removeClass("fc-has-event");var t=!0,n=!1,a=void 0;try{for(var r,i=e[Symbol.iterator]();!(t=(r=i.next()).done);t=!0)for(var o=r.value,d=moment(o.start).utc(),c=moment(o.end).utc();d.isBefore(c);)$(".fc-content-skeleton .fc-day-top[data-date="+d.utc().format("YYYY-MM-DD")+"]").addClass("fc-has-event"),d.add(1,"days")}catch(l){n=!0,a=l}finally{try{!t&&i["return"]&&i["return"]()}finally{if(n)throw a}}}})},header:{left:"prev",center:"title",right:"next"}})}; \ No newline at end of file diff --git a/src/Services/CalendarsService.php b/src/Services/CalendarsService.php index 9894b6c..ce8d0e6 100644 --- a/src/Services/CalendarsService.php +++ b/src/Services/CalendarsService.php @@ -345,25 +345,29 @@ public function saveCalendar(CalendarModel $calendar, bool $runValidation = true ); if (!empty($siteIds)) { - \Craft::$app->getQueue()->push( - new ResaveElements( - [ - 'description' => \Craft::t( - 'app', - 'Resaving {calendar} events', - ['calendar' => $calendar->name] - ), - 'elementType' => Event::class, - 'criteria' => [ - 'siteId' => $siteIds[0], - 'calendarId' => $calendar->id, - 'status' => null, - 'enabledForSite' => false, - 'limit' => null, - ], - ] - ) - ); + // Resave entries for each site + foreach ($allSiteSettings as $siteId => $siteSettings) { + \Craft::$app->getQueue()->push( + new ResaveElements( + [ + 'description' => \Craft::t( + 'app', + 'Resaving {calendar} events ({site})', + ['calendar' => $calendar->name, 'site' => $siteSettings->getSite()->name] + ), + 'elementType' => Event::class, + 'criteria' => [ + 'siteId' => $siteId, + 'calendarId' => $calendar->id, + 'loadOccurrences' => false, + 'status' => null, + 'enabledForSite' => false, + 'limit' => null, + ], + ] + ) + ); + } } } @@ -472,17 +476,17 @@ public function getCalendarSiteSettings(int $calendarId): array $siteSettings = (new Query()) ->select( [ - 'calendar_calendar_sites.id', - 'calendar_calendar_sites.calendarId', - 'calendar_calendar_sites.siteId', - 'calendar_calendar_sites.enabledByDefault', - 'calendar_calendar_sites.hasUrls', - 'calendar_calendar_sites.uriFormat', - 'calendar_calendar_sites.template', + '[[calendar_calendar_sites.id]]', + '[[calendar_calendar_sites.calendarId]]', + '[[calendar_calendar_sites.siteId]]', + '[[calendar_calendar_sites.enabledByDefault]]', + '[[calendar_calendar_sites.hasUrls]]', + '[[calendar_calendar_sites.uriFormat]]', + '[[calendar_calendar_sites.template]]', ] ) - ->from(['{{%calendar_calendar_sites}}']) - ->innerJoin('{{%sites}}', '[[sites.id]] = [[calendar_calendar_sites.siteId]]') + ->from(['{{%calendar_calendar_sites}} calendar_calendar_sites']) + ->innerJoin('{{%sites}} sites', '[[sites.id]] = [[calendar_calendar_sites.siteId]]') ->where(['calendar_calendar_sites.calendarId' => $calendarId]) ->orderBy(['sites.sortOrder' => SORT_ASC]) ->all(); diff --git a/src/Services/EventsService.php b/src/Services/EventsService.php index f10b9ab..204fe16 100644 --- a/src/Services/EventsService.php +++ b/src/Services/EventsService.php @@ -38,6 +38,7 @@ public function getEventById(int $eventId, int $siteId = null): Event { $query = Event::find() ->setAllowedCalendarsOnly(false) + ->enabledForSite(false) ->id($eventId); if (null !== $siteId) { @@ -54,13 +55,13 @@ public function getEventById(int $eventId, int $siteId = null): Event * @param string $site * * @return Event|ElementInterface - * @throws \yii\base\Exception */ public function getEventBySlug(string $slug, string $site = null): Event { return Event::find() ->slug($slug) ->setAllowedCalendarsOnly(false) + ->enabledForSite(false) ->site($site) ->one(); } @@ -200,8 +201,6 @@ public function saveEvent(Event $event, bool $validateContent = true): bool $event->title = \Craft::$app->view->renderObjectTemplate($event->getCalendar()->titleFormat, $event); } - // ElementHelper::setUniqueUri($event); - $saveEvent = new SaveElementEvent($event, $isNewEvent); $this->trigger(self::EVENT_BEFORE_SAVE, $saveEvent); diff --git a/src/elementtypes/Calendar_EventElementType.php b/src/elementtypes/Calendar_EventElementType.php deleted file mode 100755 index adaf513..0000000 --- a/src/elementtypes/Calendar_EventElementType.php +++ /dev/null @@ -1,373 +0,0 @@ - array( - 'label' => Craft::t('All events'), - ), - ); - - foreach (craft()->calendar_calendars->getAllAllowedCalendars() as $calendar) { - $key = 'calendar:' . $calendar->id; - - $sources[$key] = array( - 'label' => $calendar->name, - 'criteria' => array('calendarId' => $calendar->id), - ); - } - - return $sources; - } - - /** - * @param null $source - * - * @return array - */ - public function getAvailableActions($source = null) - { - $deleteAction = craft()->elements->getAction('Delete'); - $deleteAction->setParams( - array( - 'confirmationMessage' => Craft::t('Are you sure you want to delete the selected events?'), - 'successMessage' => Craft::t('Events deleted.'), - ) - ); - $actions[] = $deleteAction; - - $setStatusAction = craft()->elements->getAction('SetStatus'); - $setStatusAction->onSetStatus = function (Event $event) { - if ($event->params['status'] == BaseElementModel::ENABLED) { - // Set a Post Date as well - craft()->db->createCommand()->update( - 'entries', - array('postDate' => DateTimeHelper::currentTimeForDb()), - array('and', array('in', 'id', $event->params['elementIds']), 'postDate is null') - ); - } - }; - $actions[] = $setStatusAction; - - return $actions; - } - - /** - * Returns the attributes that can be shown/sorted by in table views. - * - * @param string|null $source - * - * @return array - */ - public function defineTableAttributes($source = null) - { - $attributes = array( - 'title' => Craft::t('Title'), - 'calendar' => Craft::t('Calendar'), - 'startDate' => Craft::t('Start Date'), - 'endDate' => Craft::t('End Date'), - 'allDay' => Craft::t('All Day'), - 'rrule' => Craft::t('Repeats'), - 'author' => Craft::t('Author'), - 'dateCreated' => Craft::t('Post Date'), - ); - - - // Hide Author from Craft Personal/Client - if (craft()->getEdition() != Craft::Pro) { - unset($attributes['author']); - } - - if (strpos($source, 'calendar:') !== false) { - unset($attributes['calendar']); - } - - return $attributes; - } - - /** - * @inheritDoc IElementType::defineSortableAttributes() - * - * @return array - */ - public function defineSortableAttributes() - { - $sortableAttributes = array( - 'title' => Craft::t('Title'), - 'calendar' => Craft::t('Calendar'), - 'startDate' => Craft::t('Start Date'), - 'endDate' => Craft::t('End Date'), - 'allDay' => Craft::t('All Day'), - 'rrule' => Craft::t('Repeats'), - 'author' => Craft::t('Author'), - 'dateCreated' => Craft::t('Post Date'), - ); - - // Hide Author from Craft Personal/Client - if (craft()->getEdition() != Craft::Pro) { - unset($sortableAttributes['author']); - } - - return $sortableAttributes; - } - - /** - * Returns the table view HTML for a given attribute. - * - * @param BaseElementModel $element - * @param string $attribute - * - * @return string - */ - public function getTableAttributeHtml(BaseElementModel $element, $attribute) - { - /** @var Calendar_EventModel $element */ - switch ($attribute) { - case 'author': { - $author = $element->getAuthor(); - - if ($author) { - return craft()->templates->render( - '_elements/element', - array( - 'element' => $author, - ) - ); - } - - return ''; - } - - case 'calendar': { - return sprintf( - '
%s
', - $element->getCalendar()->color, - $element->getCalendar()->name - ); - } - - case 'startDate': { - return $element->getStartDateUTC()->localeDate(); - } - - case 'endDate': { - return $element->getEndDateUTC()->localeDate(); - } - - case 'allDay': { - return $element->$attribute ? 'Yes' : 'No'; - } - - case 'rrule': { - return $element->repeats() ? 'Yes' : 'No'; - } - - default: { - return parent::getTableAttributeHtml($element, $attribute); - } - } - } - - /** - * Defines any custom element criteria attributes for this element type. - * - * @return array - */ - public function defineCriteriaAttributes() - { - return array( - 'calendar' => AttributeType::Mixed, - 'calendarId' => AttributeType::Mixed, - 'startDate' => AttributeType::Mixed, - 'endDate' => AttributeType::Mixed, - 'dateRangeStart' => AttributeType::DateTime, - 'dateRangeEnd' => AttributeType::DateTime, - 'allDay' => AttributeType::Bool, - 'authorId' => AttributeType::Number, - 'allowedCalendarsOnly' => array(AttributeType::Bool, 'default' => true), - 'order' => array(AttributeType::String, 'default' => 'ce.startDate asc'), - 'loadOccurrences' => array(AttributeType::Bool, 'default' => true), - ); - } - - /** - * Modifies an element query targeting elements of this type. - * - * @param DbCommand $query - * @param ElementCriteriaModel $criteria - * - * @return mixed - */ - public function modifyElementsQuery(DbCommand $query, ElementCriteriaModel $criteria) - { - $query - ->addSelect( - 'ce.calendarId, - cc.name AS calendar, - ce.authorId, - ce.startDate, - ce.endDate, - ce.allDay, - ce.rrule, - ce.freq, - ce.interval, - ce.count, - ce.until, - ce.byDay, - ce.byMonth, - ce.byMonthDay, - ce.byYearDay, - users.username AS author' - ) - ->join('calendar_events ce', 'ce.id = elements.id') - ->leftJoin('users users', 'users.id = ce.authorId') - ->join('calendar_calendars cc', 'cc.id = ce.calendarId'); - - if ($criteria->allowedCalendarsOnly) { - $isAdmin = PermissionsHelper::isAdmin(); - $canManageAll = PermissionsHelper::checkPermission(PermissionsHelper::PERMISSION_EVENTS_FOR_ALL); - - if (!$isAdmin && !$canManageAll) { - $allowedCalendarIds = PermissionsHelper::getNestedPermissionIds( - PermissionsHelper::PERMISSION_EVENTS_FOR - ); - $query->andWhere(DbHelper::parseParam('ce.calendarId', $allowedCalendarIds, $query->params)); - } - } - - if ($criteria->calendarId && $criteria->calendarId != "*") { - $query->andWhere(DbHelper::parseParam('ce.calendarId', $criteria->calendarId, $query->params)); - } - - if ($criteria->calendar && $criteria->calendar != "*") { - $query->andWhere(DbHelper::parseParam('cc.handle', $criteria->calendar, $query->params)); - } - - if ($criteria->startDate) { - $query->andWhere(DbHelper::parseDateParam('ce.startDate', $criteria->startDate, $query->params)); - } - - if ($criteria->dateRangeStart) { - $dateRangeStartUTC = new DateTimeUTC(); - $dateRangeStartUTC->setTimestamp($criteria->dateRangeStart->getTimestamp()); - - $endDateRule = DbHelper::parseParam( - 'ce.endDate', - '>= ' . $dateRangeStartUTC->mySqlDateTime(), - $query->params - ); - $untilRule = DbHelper::parseParam( - 'ce.until', - '>= ' . $dateRangeStartUTC->mySqlDateTime(), - $query->params - ); - - $query->andWhere( - '(ce.rrule IS NULL AND ' . $endDateRule . ') - OR (ce.rrule IS NOT NULL AND ce.until IS NOT NULL AND ' . $untilRule . ') - OR (ce.rrule IS NOT NULL AND ce.until IS NULL) - OR (ce.freq = "' . RecurrenceHelper::SELECT_DATES . '")' - ); - } - - if ($criteria->dateRangeEnd) { - $dateRangeEndUTC = new DateTimeUTC(); - $dateRangeEndUTC->setTimestamp($criteria->dateRangeEnd->getTimestamp()); - - $startDateRule = DbHelper::parseParam( - 'ce.startDate', - '<= ' . $dateRangeEndUTC->mySqlDateTime(), - $query->params - ); - $query->andWhere($startDateRule . ' OR ce.freq = "' . RecurrenceHelper::SELECT_DATES . '"'); - } - - if ($criteria->endDate) { - $query->andWhere(DbHelper::parseDateParam('ce.endDate', $criteria->endDate, $query->params)); - } - - if ($criteria->allDay) { - $query->andWhere(DbHelper::parseParam('ce.allDay', $criteria->allDay, $query->params)); - } - - if ($criteria->authorId) { - $query->andWhere(DbHelper::parseParam('ce.authorId', $criteria->authorId, $query->params)); - } - - return true; - } - - /** - * Populates an element model based on a query result. - * - * @param array $row - * - * @return array - */ - public function populateElementModel($row) - { - return Calendar_EventModel::populateModel($row); - } -} diff --git a/src/fieldtypes/Calendar_EventFieldType.php b/src/fieldtypes/Calendar_EventFieldType.php deleted file mode 100644 index 11b9a8b..0000000 --- a/src/fieldtypes/Calendar_EventFieldType.php +++ /dev/null @@ -1,20 +0,0 @@ -getTableData() as $table) { - $table - ->addField('dateCreated', $this->dateTime()->notNull()->defaultExpression('NOW()')) - ->addField('dateUpdated', $this->dateTime()->notNull()->defaultExpression('NOW()')) - ->addField('uid', $this->char(36)->defaultValue(0)); - - $this->createTable($table->getName(), $table->getFields()); - } - - foreach ($this->getTableData() as $table) { - foreach ($table->getForeignKeys() as $foreignKey) { - $this->addForeignKey( - $foreignKey->generateFullName(), - $table->getName(), - $foreignKey->getColumn(), - $foreignKey->getRefTable(), - $foreignKey->getRefColumn(), - $foreignKey->getOnDelete(), - $foreignKey->getOnUpdate() - ); - } - - foreach ($table->getIndexes() as $index) { - $this->createIndex( - $index->getName(), - $table->getName(), - $index->getColumns(), - $index->isUnique() - ); - } - } - } - - /** - * @inheritdoc - */ - public function safeDown() - { - foreach ($this->getTableData() as $table) { - foreach ($table->getForeignKeys() as $foreignKey) { - $this->dropForeignKey($foreignKey->generateFullName(), $table->getName()); - } - } - - foreach ($this->getTableData() as $table) { - $this->dropTableIfExists($table->getName()); - } - } - - /** - * @return Table[] - */ - private function getTableData(): array + protected function defineTableData(): array { return [ (new Table('calendar_calendars')) diff --git a/src/templates/events/_edit.html b/src/templates/events/_edit.html index d73ed5a..e8a1092 100644 --- a/src/templates/events/_edit.html +++ b/src/templates/events/_edit.html @@ -242,6 +242,15 @@ id: 'enabled' }, statusInput) }} + {% if showSites %} + {{ forms.lightswitchField({ + label: "Enabled for site"|t('app'), + id: 'enabledForSite', + name: 'enabledForSite', + on: event.enabledForSite, + }) }} + {% endif %} +