48 $startAttribute = $savedCalendar->startAttributeName;
49 $endAttribute = $savedCalendar->endAttributeName;
50 Yii::app()->custom->setCalendarItemTitle($calendarItem, $model);
51 $calendarItem->setStartDateTime($model->$startAttribute);
52 if ($endAttribute != null)
54 $calendarItem->setEndDateTime($model->$endAttribute);
56 $calendarItem->setCalendarId($savedCalendar->id);
57 $calendarItem->setModelClass(get_class($model));
58 $calendarItem->setModelId($model->id);
59 $calendarItem->setColor($savedCalendar->color);
60 $calendarItem->setModuleClassName($savedCalendar->moduleClassName);
80 assert(
'is_string($dateRangeType)');
83 return DateTimeUtil::getFirstDayOfAMonthDate();
85 if($dateRangeType == SavedCalendar::DATERANGE_TYPE_WEEK)
89 if($dateRangeType == SavedCalendar::DATERANGE_TYPE_DAY)
102 assert(
'is_string($dateRangeType)');
105 $dateTime =
new DateTime();
106 $dateTime->modify(
'first day of next month');
108 $dateTime->getTimestamp());
110 if($dateRangeType == SavedCalendar::DATERANGE_TYPE_WEEK)
112 $dateTime =
new DateTime(
'Monday next week');
114 $dateTime->getTimestamp());
116 if($dateRangeType == SavedCalendar::DATERANGE_TYPE_DAY)
130 $metadata[
'clauses'] = array(
132 'attributeName' =>
'owner',
133 'relatedAttributeName' =>
'id',
134 'operatorType' =>
'equals',
135 'value' => $user->id,
138 $metadata[
'structure'] =
'1';
154 $mySubscribedCalendarIds = null,
155 $dateRangeType = null,
161 $mySubscribedCalendarIds);
162 if($dateRangeType == null)
167 'myCalendarDateRangeType', $dateRangeType);
169 if($startDate == null)
174 'myCalendarStartDate', $startDate);
181 'myCalendarEndDate', $endDate);
184 $startDate, $endDate, $dateRangeType);
194 $fullCalendarItems = self::processDataProviderAndGetCalendarItems($dataProvider);
195 return self::processCalendarItemsAndAddMoreEventsIfRequired($fullCalendarItems);
204 $modifiedCalendarItems = array();
205 $dateToCalendarItemsCountData = array();
206 $moreEventsItemCreatedByDate = array();
207 foreach ($fullCalendarItems as $key => $fullCalItem)
209 $startDate = date(
'Y-m-d', strtotime($fullCalItem[
'start']));
211 if (isset($dateToCalendarItemsCountData[$startDate])
212 && (count($dateToCalendarItemsCountData[$startDate]) >= CalendarItemsDataProvider::MAXIMUM_CALENDAR_ITEMS_DISPLAYED_FOR_ANY_DATE))
214 if (in_array($startDate, $moreEventsItemCreatedByDate) ===
false)
216 $fullCalItem = self::createMoreEventsCalendarItem($fullCalItem, $key, $fullCalendarItems);
217 $moreEventsItemCreatedByDate[] = $startDate;
224 $fullCalItem[
'start'] = self::getFullCalendarFormattedDateTimeElement($fullCalItem[
'start']);
225 if (isset($fullCalItem[
'end']))
227 $fullCalItem[
'end'] = self::getFullCalendarFormattedDateTimeElement($fullCalItem[
'end']);
229 $dateToCalendarItemsCountData[$startDate][] = $fullCalItem;
230 $modifiedCalendarItems[] = $fullCalItem;
232 return $modifiedCalendarItems;
242 $moreEventsCalItem = array();
243 $moreEventsCalItem[
'title'] = Zurmo::t(
'CalendarsModule',
'More Events..');
244 $moreEventsCalItem[
'start'] = $fullCalItem[
'start'];
245 $moreEventsCalItem[
'end'] = $fullCalItem[
'end'];
246 $moreEventsCalItem[
'color'] =
'#cccccc';
247 $moreEventsCalItem[
'className'] =
'more-events';
248 return $moreEventsCalItem;
259 assert(
'is_array($firstDate)');
260 assert(
'is_array($secondDate)');
261 $firstDateUnixTimestamp = strtotime($firstDate[
'start']);
262 $secondDateUnixTimestamp = strtotime($secondDate[
'start']);
263 return $firstDateUnixTimestamp - $secondDateUnixTimestamp;
273 assert(
'is_string($dateTime)');
277 if (DateTimeUtil::isValidDbFormattedDate($dateTime))
281 $dateTimeObject =
new DateTime();
282 $dateTimeObject->setTimestamp(strtotime($dateTime));
286 $offset = abs($offset);
287 $dateTimeObject->sub(
new DateInterval(
'PT' . $offset .
'S'));
291 $dateTimeObject->add(
new DateInterval(
'PT' . $offset .
'S'));
293 return $dateTimeObject->format(
'c');
305 assert(
'is_string($modelClassName)');
306 assert(
'is_string($attributeName)');
307 $selectDistinct =
false;
310 $selectQueryAdapter->addClause($modelClassName::getTableName(),
'color');
312 $metadata[
'clauses'] = array(
314 'attributeName' => $attributeName,
315 'relatedAttributeName' =>
'id',
316 'operatorType' =>
'equals',
317 'value' => $user->id,
320 $metadata[
'structure'] =
'1';
322 $sql = SQLQueryUtil::makeQuery($modelClassName::getTableName(), $selectQueryAdapter, $joinTablesAdapter, null, null, $where);
323 $records = ZurmoRedBean::getAll($sql);
325 foreach ($records as $record)
327 if ($record[
'color'] != null && $record[
'color'] !=
'')
329 $colors[] = $record[
'color'];
340 return ModalContainerView::ID;
348 $title = Zurmo::t(
'Calendarsmodule',
'Shared Calendars');
349 return ModalView::getAjaxOptionsForModalLink($title, self::getModalContainerId(),
'auto', 600,
350 array(
'my'=>
'center top+25',
'at'=>
'center top+25'), $class =
"''");
361 assert(
'is_string($url)');
362 assert(
'is_string($selector)');
365 $ajaxOptions[
'beforeSend'] =
new CJavaScriptExpression($ajaxOptions[
'beforeSend']);
366 return "$(document).on('click', '{$selector}', function()
372 'beforeSend' : {$ajaxOptions['beforeSend']},
373 'update' : '{$ajaxOptions['update']}',
374 'success': function(html){jQuery('#{$modalId}').html(html)}
387 $searchAttributeData = array();
388 $searchAttributeData[
'clauses'] = array(
390 'attributeName' =>
'user',
391 'relatedAttributeName' =>
'id',
392 'operatorType' =>
'equals',
393 'value' => intval($user->id),
396 $searchAttributeData[
'structure'] =
'1';
413 assert(
'is_array($data)');
414 assert(
'is_string($field)');
415 assert(
'is_string($itemClass)');
416 assert(
'is_string($type)');
417 $itemsContent = null;
418 foreach ($data as $calendarArray)
421 if ($calendarArray[1] ===
true)
427 array(
'value' => $calendarArray[0]->
id,
428 'class' => $itemClass));
429 $color = ZurmoHtml::tag(
'span', array(
'class' =>
'cal-color',
'style' =>
'background:' .
430 $calendarArray[0]->color),
'');
431 if ($type ==
'saved')
433 $label = $calendarArray[0]->name;
434 $options = self::getSavedCalendarOptions($calendarArray[0]->
id);
435 $subscriptionData = null;
439 $savedCalendar = $calendarArray[0]->savedcalendar;
440 $label = $savedCalendar->name;
441 $options = self::getSharedCalendarOptions($calendarArray[0]->
id);
444 $label = ZurmoHtml::tag(
'strong', array(
'class' =>
'cal-name'), $label);
445 $itemsContent .= ZurmoHtml::tag(
'li', array(), $input . $color . $label . $subscriptionData . $options);
447 return ZurmoHtml::tag(
'ul', array(
'class' =>
'calendars-list'), $itemsContent);
457 assert(
'is_int($savedCalendarSubscriptionId)');
458 $elementContent = ZurmoHtml::tag(
'li', array(),
459 ZurmoHtml::link(ZurmoHtml::tag(
'span', array(), Zurmo::t(
'Core',
'Unsubscribe')),
'#',
460 array(
'data-value' => $savedCalendarSubscriptionId,
461 'class' =>
'shared-cal-unsubscribe')));
462 $elementContent = ZurmoHtml::tag(
'ul', array(), $elementContent);
463 $content = ZurmoHtml::tag(
'li', array(
'class' =>
'parent last'),
464 ZurmoHtml::link(
'<span></span>',
'javascript:void(0);') . $elementContent);
465 $content = ZurmoHtml::tag(
'ul', array(
'class' =>
'options-menu edit-row-menu nav'), $content);
476 assert(
'is_int($calendarId)');
477 $editUrl = Yii::app()->createUrl(
'calendars/default/edit', array(
'id' => $calendarId));
478 $editLinkContent = ZurmoHtml::tag(
'li', array(),
479 ZurmoHtml::link(ZurmoHtml::tag(
'span', array(), Zurmo::t(
'Core',
'Edit')), $editUrl,
480 array(
'data-value' => $calendarId,
481 'class' =>
'my-cal-edit')));
482 $deleteLinkContent = ZurmoHtml::tag(
'li', array(),
483 ZurmoHtml::link(ZurmoHtml::tag(
'span', array(), Zurmo::t(
'Core',
'Delete')),
'#',
484 array(
'data-value' => $calendarId,
485 'class' =>
'my-cal-delete')));
486 $elementContent = ZurmoHtml::tag(
'ul', array(), $editLinkContent . $deleteLinkContent);
487 $content = ZurmoHtml::tag(
'li', array(
'class' =>
'parent last'),
488 ZurmoHtml::link(
'<span></span>',
'javascript:void(0);') . $elementContent);
489 $content = ZurmoHtml::tag(
'ul', array(
'class' =>
'options-menu edit-row-menu nav'), $content);
501 'CalendarsModule',
'myCalendarSelections');
503 'CalendarsModule',
'mySubscribedCalendarSelections');
505 'CalendarsModule',
'myCalendarDateRangeType');
507 'CalendarsModule',
'myCalendarStartDate');
509 'CalendarsModule',
'myCalendarEndDate');
511 $mySubscribedCalendarIds,
524 $searchAttributeData = array();
526 $searchAttributeData[
'clauses'] = array(
528 'attributeName' =>
'savedcalendar',
529 'relatedAttributeName' =>
'id',
530 'operatorType' =>
'equals',
531 'value' => intval($subscribedCalendar->id),
534 $searchAttributeData[
'structure'] =
'1';
538 foreach ($models as $model)
540 $users[] = $model->user;
554 $alreadySubscribedUsers = array();
555 foreach ($users as $user)
558 if (!in_array($user->id, $alreadySubscribedUsers))
561 $alreadySubscribedUsers[] = $user->id;
574 $script =
"$(document).on('click', '.mycalendar,.sharedcalendar',
576 $('#calendar').fullCalendar('refetchEvents');
579 $cs = Yii::app()->getClientScript();
580 $cs->registerScript(
'mycalendarselectscript', $script);
592 return CMap::mergeArray($savedCalUsedColors, $sharedCalUsedColors);
602 if($savedCalendar->color == null)
605 self::processAndSaveColor($savedCalendar, $usedColors);
615 if($sharedCalendar->color == null)
618 self::processAndSaveColor($sharedCalendar, $usedColors);
629 assert(
'$calendar instanceof SavedCalendar || $calendar instanceof SavedCalendarSubscription');
630 assert(
'is_array($usedColors)');
631 $availableColors = SavedCalendar::$colorsArray;
632 $filteredColors = array_diff($availableColors, $usedColors);
633 $color = array_shift($filteredColors);
634 $calendar->color = $color;
645 assert(
'is_string($startDate)');
646 assert(
'is_string($endDate)');
647 $url = Yii::app()->createUrl(
'calendars/default/delete');
648 $eventsUrl = Yii::app()->createUrl(
'calendars/default/getEvents');
650 $confirmTitle = Zurmo::t(
'Core',
'Are you sure you want to delete this {modelLabel}?',
651 array(
'{modelLabel}' => Zurmo::t(
'CalendarsModule',
'CalendarsModuleSingularLabel', $params)));
654 $script =
"$(document).on('click', '.my-cal-delete', function()
656 if (!confirm('{$confirmTitle}'))
660 var calId = $(this).data('value');
664 'url' : '{$url}' + '?id=' + calId,
665 beforeSend: function(xhr)
667 $('#my-calendars-list').html('');
668 $(this).makeLargeLoadingSpinner(true, '#my-calendars-list');
670 success : function(data)
672 $('#my-calendars-list').html(data);
673 $(this).makeLargeLoadingSpinner(false, '#my-calendars-list');
674 $('#calendar').fullCalendar('removeEventSource', getCalendarEvents('{$eventsUrl}', 'calendar'));
675 $('#calendar').fullCalendar('addEventSource', getCalendarEvents('{$eventsUrl}', 'calendar'));
683 $cs = Yii::app()->getClientScript();
684 if($cs->isScriptRegistered(
'calDeleteScript', ClientScript::POS_END) ===
false)
686 $cs->registerScript(
'calDeleteScript', $script, ClientScript::POS_END);
697 assert(
'is_string($startDate)');
698 assert(
'is_string($endDate)');
699 $url = Yii::app()->createUrl(
'/calendars/default/unsubscribe');
700 $eventsUrl = Yii::app()->createUrl(
'calendars/default/getEvents');
703 $script =
"$(document).on('click', '.shared-cal-unsubscribe', function(){
708 data : {'id' : $(this).data('value')},
709 beforeSend: function(xhr)
711 $('#shared-calendars-list').html('');
712 $(this).makeLargeLoadingSpinner(true, '#shared-calendars-list');
714 success : function(data)
716 $('#shared-calendars-list').html(data);
717 $(this).makeLargeLoadingSpinner(false, '#shared-calendars-list');
718 $('#calendar').fullCalendar('removeEventSource', getCalendarEvents('{$eventsUrl}', 'calendar'));
719 $('#calendar').fullCalendar('addEventSource', getCalendarEvents('{$eventsUrl}', 'calendar'));
726 $cs = Yii::app()->getClientScript();
727 $cs->registerScript(
'calunsubscribescript', $script, ClientScript::POS_END);
737 $modelClassName = $moduleClassName::getPrimaryModelName();
739 $attributes = $adapter->getAttributes();
740 $selectedAttributes = array();
741 foreach ($attributes as $attribute => $value)
743 if ($value[
'elementType'] ==
'DateTime' || $value[
'elementType'] ==
'Date')
745 $selectedAttributes[$attribute] = $value[
'attributeLabel'];
748 return $selectedAttributes;
759 assert(
'is_string($componentPrefix)');
760 assert(
'is_array($componentFormsData)');
762 $addMethodName =
'add' . $componentPrefix;
763 $componentClassName = $componentPrefix .
'ForReportForm';
765 foreach ($componentFormsData as $componentFormData)
767 $component =
new $componentClassName($moduleClassName,
768 $moduleClassName::getPrimaryModelName(),
771 $component->setAttributes($componentFormData);
772 $report->{$addMethodName}($component);
787 if ($filtersData != null)
794 $savedCalendar->serializedData = serialize($unserializedData);
796 if (!$savedCalendar->save())
811 assert(
'is_string($type)');
812 assert(
'is_array($postData)');
816 $report->setType($type);
824 if (isset($postData[
'SavedCalendar']) && isset($postData[
'SavedCalendar'][
'moduleClassName']))
826 $report->setModuleClassName($postData[
'SavedCalendar'][
'moduleClassName']);
843 $moduleClassNames = array();
844 foreach (self::getCalendarModulesClassNamesCurrentUserHasAccessTo() as $moduleClassName)
846 $label = $moduleClassName::getModuleLabelByTypeAndLanguage(
'Plural');
847 $moduleClassNames[$moduleClassName] = $label;
849 return $moduleClassNames;
857 $moduleClassNames = array();
859 foreach ($modules as $module)
861 if ($module::canShowOnCalendar())
865 $moduleClassNames[] = get_class($module);
869 return $moduleClassNames;
882 $selectedSharedCalendarIds = null,
885 $dateRangeType = null,
892 'myCalendarStartDate', $startDate);
895 'myCalendarEndDate', $endDate);
898 'myCalendarDateRangeType', $dateRangeType);
901 $selectedSharedCalendarIds,
913 $name = Zurmo::t(
'CalendarsModule',
'My Meetings');
914 $mtgCalendar = self::populateSavedCalendar($user, $name,
'MeetingsModule',
'startDateTime',
'endDateTime');
915 $name = Zurmo::t(
'CalendarsModule',
'My Tasks');
916 $taskCalendar = self::populateSavedCalendar($user, $name,
'TasksModule',
'createdDateTime');
917 return array($mtgCalendar, $taskCalendar);
933 $endAttributeName =
'')
936 $savedCalendar->name = $name;
937 $savedCalendar->timeZone = $user->timeZone;
938 $savedCalendar->location =
'Chicago';
939 $savedCalendar->moduleClassName = $moduleClassName;
940 $savedCalendar->startAttributeName = $startAttributeName;
941 $savedCalendar->endAttributeName = $endAttributeName;
942 assert($savedCalendar->save());
944 $filtersData = array(
'filtersStructure' =>
'1',
946 array(
'attributeIndexOrDerivedType' =>
'owner__User',
947 'structurePosition' =>
'1',
948 'operator' =>
'equals',
949 'value' => $user->id,
950 'stringifiedModelForValue' => strval($user),
951 'availableAtRunTime' =>
'0')
955 assert($savedCalendar->save());
956 return $savedCalendar;
976 'filtersStructure' => $report->getFiltersStructure());
977 $model->serializedData = serialize($unserializedData);
981 $model->serializedData = null;
992 $calendarItems = $dataProvider->
getData(
true);
993 $fullCalendarItems = array();
994 for ($k = 0; $k < count($calendarItems); $k++)
996 $fullCalendarItem = array();
997 $calItem = $calendarItems[$k];
998 $fullCalendarItem[
'title'] = $calItem->getTitle();
999 $fullCalendarItem[
'start'] = $calItem->getStartDateTime();
1000 if (!DateTimeUtil::isDateTimeStringNull($calItem->getEndDateTime()))
1002 $fullCalendarItem[
'end'] = $calItem->getEndDateTime();
1006 $fullCalendarItem[
'end'] =
'';
1008 $fullCalendarItem[
'color'] = $calItem->getColor();
1009 $fullCalendarItem[
'modelClass'] = $calItem->getModelClass();
1010 $fullCalendarItem[
'modelId'] = $calItem->getModelId();
1011 $fullCalendarItem[
'calendarId'] = $calItem->getCalendarId();
1012 $fullCalendarItem[
'allDay'] =
true;
1013 $fullCalendarItems[] = $fullCalendarItem;
1015 if (count($fullCalendarItems) > 0)
1019 return $fullCalendarItems;
1029 assert(
'is_array($items)');
1031 foreach ($items as $index => $item)
1033 foreach ($moduleClassNames as $moduleClassName => $label)
1035 if ($moduleClassName::getPrimaryModelName() == $item[
'modelClass'])
1037 $moduleId = $moduleClassName::getDirectoryName();
1038 $item[
'detailsUrl'] = Yii::app()->createUrl($moduleId .
'/default/details', array(
'id' => $item[
'modelId']));
1039 $items[$index] = $item;
static getTomorrowsDate()
static getModelAttributesForSelectedModule($moduleClassName)
static processUserCalendarsAndMakeDataProviderForCombinedView($myCalendarIds=null, $mySubscribedCalendarIds=null, $dateRangeType=null, $startDate=null, $endDate=null)
static resolveReportByWizardPostData(Report $report, $postData, $wizardFormClassName)
static checkBox($name, $checked=false, $htmlOptions=array())
static sortArrayByElementField($compareFunction, $sortFunctionName, &$data, $className)
static processDataProviderAndGetCalendarItems(CalendarItemsDataProvider $dataProvider)
static renderSubscriberImageAndLinkContent(User $user, $imageSize=36, $class=null)
static getUserSubscribedCalendars(User $user)
static makeCalendarItemsList($data, $field, $itemClass, $type)
static getModalContainerId()
static getSavedCalendarOptions($calendarId)
static getTranslationParamsForAllModules()
static setMyCalendarColor(SavedCalendar $savedCalendar, User $user)
static registerSelectCalendarScript($startDate, $endDate)
static setByUserAndModuleName($user, $moduleName, $key, $value, $cache=true)
static getUserSavedCalendars(User $user)
static populateSavedCalendar(User $user, $name, $moduleClassName, $startAttributeName, $endAttributeName= '')
static getCalendarModulesClassNamesCurrentUserHasAccessTo()
static getAvailableModulesForCalendar()
static populateFiltersDataInModel(SavedCalendar $model, $data)
static getStartDate($dateRangeType)
static registerSavedCalendarDeleteScript($startDate, $endDate)
static resolveFiltersStructure($data, Report $report)
static convertDateToDateTimeByTimeZoneOffset($date)
static processAndGetDataProviderForEventsData($selectedMyCalendarIds=null, $selectedSharedCalendarIds=null, $startDate=null, $endDate=null, $dateRangeType=null, $isSticky=true)
static getEndDate($dateRangeType)
static getModuleObjects()
static getDataProviderByDateRangeType($savedCalendarSubscriptions, $startDate, $endDate, $dateRangeType)
static compareCalendarItemsByDateTime($firstDate, $secondDate)
static sanitizeFiltersData($moduleClassName, $reportType, array $filtersData)
static getArrayValue($array, $element, $defaultValue=null)
static processCalendarItemsAndAddMoreEventsIfRequired($fullCalendarItems)
static makeWhere($modelClassName, array $metadata, &$joinTablesAdapter)
static saveCalendarWithSerializedData(Report $report, SavedCalendar $savedCalendar, $wizardFormPostData)
static getCalendarSubscriberData(SavedCalendar $subscribedCalendar)
static makeReportBySavedCalendar(SavedCalendar $savedCalendar)
static makeCalendarItemByModel(RedBeanModel $model, SavedCalendar $savedCalendar)
static resolveReportBySavedCalendarPostData($type, $id=null, $postData)
static createMoreEventsCalendarItem($fullCalItem, $key, $fullCalendarItems)
static populateDetailsUrlForCalendarItems($items)
static getFirstDayOfAWeek($stringTime=null)
static getFullCalendarFormattedDateTimeElement($dateTime)
static loadDefaultCalendars(User $user)
static getSubset(RedBeanModelJoinTablesQueryAdapter $joinTablesAdapter=null, $offset=null, $count=null, $where=null, $orderBy=null, $modelClassName=null, $selectDistinct=false)
static canUserAccessModule($moduleClassName, $user)
static getByUserAndModuleName($user, $moduleName, $key, $cache=true)
static makeComponentFormAndPopulateReportFromData($componentFormsData, Report $report, $componentPrefix)
static getUsedCalendarColorsByUser(User $user, $modelClassName, $attributeName)
static makeByUser(User $user, $selectedCalendarIds=null, $subscribedCalendarIds=null)
static registerCalendarUnsubscriptionScript($startDate, $endDate)
static getSharedCalendarOptions($savedCalendarSubscriptionId)
const DATERANGE_TYPE_MONTH
static getDateRangeType()
static getById($id, $modelClassName=null)
static resolveFilters($data, Report $report, $shouldRemoveOnlyRuntimeFilters=false)
static resolveAjaxOptionsForModalView()
static registerSharedCalendarModalScript($url, $selector)
static getFullCalendarItems(CalendarItemsDataProvider $dataProvider)
static getTimeZoneOffset()
static setSharedCalendarColor(SavedCalendarSubscription $sharedCalendar)
static getUsersSubscribedForCalendar(SavedCalendar $subscribedCalendar)
static getAlreadyUsedColorsByUser(User $user)
static processAndSaveColor($calendar, $usedColors)
static getCalendarItemsDataProvider(User $user)
static resolveAccessCanCurrentUserWriteModel(RedBeanModel $model, $fromAjax=false)