219 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace Zotlabs\Module;
 | |
| 
 | |
| 
 | |
| use App;
 | |
| use Zotlabs\Web\Controller;
 | |
| 
 | |
| require_once('include/conversation.php');
 | |
| require_once('include/bbcode.php');
 | |
| require_once('include/datetime.php');
 | |
| require_once('include/event.php');
 | |
| require_once('include/items.php');
 | |
| require_once('include/html2plain.php');
 | |
| 
 | |
| 
 | |
| class Cal extends Controller {
 | |
| 
 | |
| 	function init() {
 | |
| 		if(observer_prohibited()) {
 | |
| 			return;
 | |
| 		}
 | |
| 	
 | |
| 		if(argc() > 1) {
 | |
| 			$nick = argv(1);
 | |
| 	
 | |
| 			profile_load($nick);
 | |
| 	
 | |
| 			$channelx = channelx_by_nick($nick);
 | |
| 	
 | |
| 			if(! $channelx) {
 | |
| 				notice( t('Channel not found.') . EOL);
 | |
| 				return;
 | |
| 			}
 | |
| 	
 | |
| 			App::$data['channel'] = $channelx;
 | |
| 	
 | |
| 			$observer = App::get_observer();
 | |
| 			App::$data['observer'] = $observer;
 | |
| 	
 | |
| 			$observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
 | |
| 	
 | |
| 			head_set_icon(App::$data['channel']['xchan_photo_s']);
 | |
| 	
 | |
| 			App::$page['htmlhead'] .= "<script> var profile_uid = " . ((App::$data['channel']) ? App::$data['channel']['channel_id'] : 0) . "; </script>" ;
 | |
| 	
 | |
| 		}
 | |
| 	
 | |
| 		return;
 | |
| 	}
 | |
| 	
 | |
| 	
 | |
| 	
 | |
| 	function get() {
 | |
| 	
 | |
| 		if(observer_prohibited()) {
 | |
| 			return;
 | |
| 		}
 | |
| 		
 | |
| 		$channel = App::$data['channel'];
 | |
| 
 | |
| 		// since we don't currently have an event permission - use the stream permission
 | |
| 	
 | |
| 		if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_stream')) {
 | |
| 			notice( t('Permissions denied.') . EOL);
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		nav_set_selected('Calendar');
 | |
| 
 | |
| 		head_add_css('/library/fullcalendar/packages/core/main.min.css');
 | |
| 		head_add_css('/library/fullcalendar/packages/daygrid/main.min.css');
 | |
| 		head_add_css('cdav_calendar.css');
 | |
| 
 | |
| 		head_add_js('/library/fullcalendar/packages/core/main.min.js');
 | |
| 		head_add_js('/library/fullcalendar/packages/daygrid/main.min.js');
 | |
| 
 | |
| 		$sql_extra = permissions_sql($channel['channel_id'], get_observer_hash(), 'event');
 | |
| 
 | |
| 		if(! perm_is_allowed($channel['channel_id'], get_observer_hash(), 'view_contacts') || App::$profile['hide_friends'])
 | |
| 			$sql_extra .= " and etype != 'birthday' ";
 | |
| 	
 | |
| 		$first_day = feature_enabled($channel['channel_id'], 'cal_first_day');
 | |
| 		$first_day = (($first_day) ? $first_day : 0);
 | |
| 	
 | |
| 		$start = '';
 | |
| 		$finish = '';
 | |
| 
 | |
| 		if (argv(2) === 'json') {
 | |
| 			if (x($_GET,'start'))	$start = $_GET['start'];
 | |
| 			if (x($_GET,'end'))	$finish = $_GET['end'];
 | |
| 		}
 | |
| 	
 | |
| 		$start  = datetime_convert('UTC','UTC',$start);
 | |
| 		$finish = datetime_convert('UTC','UTC',$finish);
 | |
| 		$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
 | |
| 		$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
 | |
| 
 | |
| 		if (x($_GET, 'id')) {
 | |
| 			$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
 | |
|                                 from event left join item on item.resource_id = event.event_hash
 | |
| 				where item.resource_type = 'event' and event.uid = %d and event.id = %d $sql_extra limit 1",
 | |
| 				intval($channel['channel_id']),
 | |
| 				intval($_GET['id'])
 | |
| 			);
 | |
| 		}
 | |
| 		else {
 | |
| 			// fixed an issue with "nofinish" events not showing up in the calendar.
 | |
| 			// There's still an issue if the finish date crosses the end of month.
 | |
| 			// Noting this for now - it will need to be fixed here and in Friendica.
 | |
| 			// Ultimately the finish date shouldn't be involved in the query.
 | |
| 			$r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan, item.id as item_id
 | |
| 				from event left join item on event.event_hash = item.resource_id 
 | |
| 				where item.resource_type = 'event' and event.uid = %d and event.uid = item.uid 
 | |
| 				AND (( event.adjust = 0 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' ) 
 | |
| 				OR (  event.adjust = 1 AND ( event.dtend >= '%s' or event.nofinish = 1 ) AND event.dtstart <= '%s' )) 
 | |
| 				$sql_extra",
 | |
| 				intval($channel['channel_id']),
 | |
| 				dbesc($start),
 | |
| 				dbesc($finish),
 | |
| 				dbesc($adjust_start),
 | |
| 				dbesc($adjust_finish)
 | |
| 			);
 | |
| 		}
 | |
| 	
 | |
| 		if($r) {
 | |
| 			xchan_query($r);
 | |
| 			$r = fetch_post_tags($r,true);
 | |
| 			$r = sort_by_date($r);
 | |
| 		}
 | |
| 
 | |
| 		$events = [];
 | |
| 	
 | |
| 		if($r) {
 | |
| 
 | |
| 			foreach($r as $rr) {
 | |
| 
 | |
| 				$tz = get_iconfig($rr, 'event', 'timezone');
 | |
| 				if(! $tz)
 | |
| 					$tz = 'UTC';
 | |
| 
 | |
| 				$start = (($rr['adjust']) ? datetime_convert($tz, date_default_timezone_get(), $rr['dtstart'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtstart'], 'c'));
 | |
| 				if ($rr['nofinish']){
 | |
| 					$end = null;
 | |
| 				} else {
 | |
| 					$end = (($rr['adjust']) ? datetime_convert($tz, date_default_timezone_get(), $rr['dtend'], 'c') : datetime_convert('UTC', 'UTC', $rr['dtend'], 'c'));
 | |
| 				}
 | |
| 
 | |
| 				$html = '';
 | |
| 				if (x($_GET,'id')) {
 | |
| 					$rr['timezone'] = $tz;
 | |
| 					$html = format_event_html($rr);
 | |
| 				}
 | |
| 
 | |
| 				$events[] = array(
 | |
| 					'calendar_id' => 'channel_calendar',
 | |
| 					'rw' => true,
 | |
| 					'id'=>$rr['id'],
 | |
| 					'uri' => $rr['event_hash'],
 | |
| 					'timezone' => $tz,
 | |
| 					'start'=> $start,
 | |
| 					'end' => $end,
 | |
| 					'drop' => $drop,
 | |
| 					'allDay' => (($rr['adjust']) ? 0 : 1),
 | |
| 					'title' => html_entity_decode($rr['summary'], ENT_COMPAT, 'UTF-8'),
 | |
| 					'editable' => $edit ? true : false,
 | |
| 					'item' => $rr,
 | |
| 					'plink' => [$rr['plink'], t('Link to source')],
 | |
| 					'description' => html_entity_decode($rr['description'], ENT_COMPAT, 'UTF-8'),
 | |
| 					'location' => html_entity_decode($rr['location'], ENT_COMPAT, 'UTF-8'),
 | |
| 					'allow_cid' => expand_acl($rr['allow_cid']),
 | |
| 					'allow_gid' => expand_acl($rr['allow_gid']),
 | |
| 					'deny_cid' => expand_acl($rr['deny_cid']),
 | |
| 					'deny_gid' => expand_acl($rr['deny_gid']),
 | |
| 					'html' => $html
 | |
| 				);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if (argv(2) === 'json') {
 | |
| 			echo json_encode($events);
 | |
| 			killme();
 | |
| 		}
 | |
| 			
 | |
| 		if (x($_GET,'id')) {
 | |
| 			$o = replace_macros(get_markup_template("cal_event.tpl"), [
 | |
| 				'$events' => $events
 | |
| 			]);
 | |
| 			echo $o;
 | |
| 			killme();
 | |
| 		}
 | |
| 
 | |
| 		$nick = $channel['channel_address'];
 | |
| 
 | |
| 		$sources = '{
 | |
| 			id: \'channel_calendar\',
 | |
| 			url: \'/cal/' . $nick . '/json/\',
 | |
| 			color: \'#3a87ad\'
 | |
| 		}';
 | |
| 
 | |
| 		$o = replace_macros(get_markup_template("cal_calendar.tpl"), [
 | |
| 			'$sources' => $sources,
 | |
| 			'$lang' => App::$language,
 | |
| 			'$timezone' => date_default_timezone_get(),
 | |
| 			'$first_day' => $first_day,
 | |
| 			'$prev'	=> t('Previous'),
 | |
| 			'$next'	=> t('Next'),
 | |
| 			'$today' => t('Today'),
 | |
| 			'$title' => $title,
 | |
| 			'$dtstart' => $dtstart,
 | |
| 			'$dtend' => $dtend,
 | |
| 			'$nick' => $nick
 | |
| 		]);
 | |
| 
 | |
| 		return $o;
 | |
| 	
 | |
| 	}
 | |
| 	
 | |
| }
 |