Merge branch '1.0.x' of gitorious.org:statusnet/mainline into 1.0.x
This commit is contained in:
		
							
								
								
									
										10
									
								
								lib/util.php
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								lib/util.php
									
									
									
									
									
								
							@@ -1501,16 +1501,18 @@ function common_enqueue_notice($notice)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Broadcast profile updates to remote subscribers.
 | 
			
		||||
 * Legacy function to broadcast profile updates to OMB remote subscribers.
 | 
			
		||||
 *
 | 
			
		||||
 * XXX: This probably needs killing, but there are several bits of code
 | 
			
		||||
 *      that broadcast profile changes that need to be dealt with. AFAIK
 | 
			
		||||
 *      this function is only used for OMB. -z
 | 
			
		||||
 *
 | 
			
		||||
 * Since this may be slow with a lot of subscribers or bad remote sites,
 | 
			
		||||
 * this is run through the background queues if possible.
 | 
			
		||||
 */
 | 
			
		||||
function common_broadcast_profile(Profile $profile)
 | 
			
		||||
{
 | 
			
		||||
    $qm = QueueManager::get();
 | 
			
		||||
    $qm->enqueue($profile, "profile");
 | 
			
		||||
    return true;
 | 
			
		||||
    Event::handle('BroadcastProfile', array($profile));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function common_profile_url($nickname)
 | 
			
		||||
 
 | 
			
		||||
@@ -82,6 +82,7 @@ class EventPlugin extends MicroappPlugin
 | 
			
		||||
        case 'CancelrsvpAction':
 | 
			
		||||
        case 'ShoweventAction':
 | 
			
		||||
        case 'ShowrsvpAction':
 | 
			
		||||
        case 'TimelistAction':
 | 
			
		||||
            include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
 | 
			
		||||
            return false;
 | 
			
		||||
        case 'EventListItem':
 | 
			
		||||
@@ -89,6 +90,7 @@ class EventPlugin extends MicroappPlugin
 | 
			
		||||
        case 'EventForm':
 | 
			
		||||
        case 'RSVPForm':
 | 
			
		||||
        case 'CancelRSVPForm':
 | 
			
		||||
        case 'EventTimeList':
 | 
			
		||||
            include_once $dir . '/'.strtolower($cls).'.php';
 | 
			
		||||
            break;
 | 
			
		||||
        case 'Happening':
 | 
			
		||||
@@ -121,6 +123,8 @@ class EventPlugin extends MicroappPlugin
 | 
			
		||||
        $m->connect('rsvp/:id',
 | 
			
		||||
                    array('action' => 'showrsvp'),
 | 
			
		||||
                    array('id' => '[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}'));
 | 
			
		||||
        $m->connect('main/event/updatetimes',
 | 
			
		||||
                    array('action' => 'timelist'));
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -345,7 +349,7 @@ class EventPlugin extends MicroappPlugin
 | 
			
		||||
 | 
			
		||||
    function onEndShowScripts($action)
 | 
			
		||||
    {
 | 
			
		||||
        $action->inlineScript('$(document).ready(function() { $("#event-startdate").datepicker(); $("#event-enddate").datepicker(); });');
 | 
			
		||||
        $action->script($this->path('event.js'));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    function onEndShowStyles($action)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,3 +6,11 @@
 | 
			
		||||
.event-title { margin-left: 0px; }
 | 
			
		||||
#content .event .entry-title { margin-left: 0px; }
 | 
			
		||||
#content .event .entry-content { margin-left: 0px; }
 | 
			
		||||
.ui-autocomplete {
 | 
			
		||||
    max-height: 100px;
 | 
			
		||||
    overflow-y: auto;
 | 
			
		||||
    /* prevent horizontal scrollbar */
 | 
			
		||||
    overflow-x: hidden;
 | 
			
		||||
    /* add padding to account for vertical scrollbar */
 | 
			
		||||
    padding-right: 20px;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								plugins/Event/event.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								plugins/Event/event.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
$(document).ready(function() {
 | 
			
		||||
 | 
			
		||||
    var today = new Date();
 | 
			
		||||
 | 
			
		||||
    $("#event-startdate").datepicker({
 | 
			
		||||
        // Don't let the user set a crazy start date
 | 
			
		||||
        minDate: today,
 | 
			
		||||
        onClose: function(dateText, picker) {
 | 
			
		||||
            // Don't let the user set a crazy end date
 | 
			
		||||
            var newStartDate = new Date(dateText);
 | 
			
		||||
            var endDate = new Date($("#event-startdate").val());
 | 
			
		||||
            if (endDate < newStartDate) {
 | 
			
		||||
                $("#event-enddate").val(dateText);
 | 
			
		||||
            }
 | 
			
		||||
            if (dateText !== null) {
 | 
			
		||||
                $("#event-enddate").datepicker('option', 'minDate', new Date(dateText));
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        onSelect: function() {
 | 
			
		||||
            var startd = $("#event-startdate").val();
 | 
			
		||||
            var endd = $("#event-enddate").val();
 | 
			
		||||
            var sdate = new Date(startd);
 | 
			
		||||
            var edate = new Date(endd);
 | 
			
		||||
            if (sdate !== edate) {
 | 
			
		||||
                updateTimes();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    $("#event-enddate").datepicker({
 | 
			
		||||
        minDate: today,
 | 
			
		||||
        onSelect: function() {
 | 
			
		||||
            var startd = $("#event-startdate").val();
 | 
			
		||||
            var endd = $("#event-enddate").val();
 | 
			
		||||
            var sdate = new Date(startd);
 | 
			
		||||
            var edate = new Date(endd);
 | 
			
		||||
            if (sdate !== edate) {
 | 
			
		||||
                updateTimes();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    function updateTimes() {
 | 
			
		||||
        var startd = $("#event-startdate").val();
 | 
			
		||||
        var endd = $("#event-enddate").val();
 | 
			
		||||
 | 
			
		||||
        var startt = $("#event-starttime option:selected").val();
 | 
			
		||||
        var endt = $("#event-endtime option:selected").val();
 | 
			
		||||
 | 
			
		||||
        var sdate = new Date(startd + " " + startt);
 | 
			
		||||
        var edate = new Date(endd + " " + endt);
 | 
			
		||||
        var duration = (startd === endd);
 | 
			
		||||
 | 
			
		||||
        $.getJSON($('#timelist_action_url').val(),
 | 
			
		||||
            { start: startt, ajax: true, duration: duration },
 | 
			
		||||
            function(data) {
 | 
			
		||||
                var times = [];
 | 
			
		||||
                $.each(data, function(key, val) {
 | 
			
		||||
                times.push('<option value="' + key + '">' + val + '</option>');
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            $("#event-endtime").html(times.join(''));
 | 
			
		||||
            if (startt < endt) {
 | 
			
		||||
                $("#event-endtime").val(endt).attr("selected", "selected");
 | 
			
		||||
            }
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    $("#event-starttime").change(function(e) {
 | 
			
		||||
        updateTimes();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
@@ -84,6 +84,17 @@ class EventForm extends Form
 | 
			
		||||
    function formData()
 | 
			
		||||
    {
 | 
			
		||||
        $this->out->elementStart('fieldset', array('id' => 'new_event_data'));
 | 
			
		||||
 | 
			
		||||
        // Passing in the URL of the Ajax action that the .js for this form hits
 | 
			
		||||
        // when selecting event start and end times. JavaScript will try to
 | 
			
		||||
        // use a relative path, unless explicitely told where an action is,
 | 
			
		||||
        // and that's a bit difficult to calculate since the event form is on
 | 
			
		||||
        // so many pages with different paths. It might be worth solving this
 | 
			
		||||
        // globally by putting the base site path in the Identifier-URL meta tag
 | 
			
		||||
        // or something similar, so it would be easy to calculate the exact path
 | 
			
		||||
        // for actions and other things in JavaScripts. -z
 | 
			
		||||
        $this->out->hidden('timelist_action_url', common_local_url('timelist'));
 | 
			
		||||
 | 
			
		||||
        $this->out->elementStart('ul', 'form_data');
 | 
			
		||||
 | 
			
		||||
        $this->li();
 | 
			
		||||
@@ -97,49 +108,71 @@ class EventForm extends Form
 | 
			
		||||
        $this->unli();
 | 
			
		||||
 | 
			
		||||
        $this->li();
 | 
			
		||||
 | 
			
		||||
        $today = new DateTime('today');
 | 
			
		||||
        $today->setTimezone(new DateTimeZone(common_timezone()));
 | 
			
		||||
 | 
			
		||||
        $this->out->input('event-startdate',
 | 
			
		||||
                          // TRANS: Field label on event form.
 | 
			
		||||
                          _m('LABEL','Start date'),
 | 
			
		||||
                          null,
 | 
			
		||||
                          $today->format('m/d/Y'),
 | 
			
		||||
                          // TRANS: Field title on event form.
 | 
			
		||||
                          _m('Date the event starts.'),
 | 
			
		||||
                          'startdate');
 | 
			
		||||
        $this->unli();
 | 
			
		||||
 | 
			
		||||
        $this->li();
 | 
			
		||||
        $this->out->input('event-starttime',
 | 
			
		||||
                          // TRANS: Field label on event form.
 | 
			
		||||
                          _m('LABEL','Start time'),
 | 
			
		||||
                          null,
 | 
			
		||||
                          // TRANS: Field title on event form.
 | 
			
		||||
                          _m('Time the event starts.'),
 | 
			
		||||
                          'starttime');
 | 
			
		||||
 | 
			
		||||
        $times = EventTimeList::getTimes();
 | 
			
		||||
 | 
			
		||||
        $this->out->dropdown(
 | 
			
		||||
            'event-starttime',
 | 
			
		||||
            // TRANS: Field label on event form.
 | 
			
		||||
            _m('LABEL','Start time'),
 | 
			
		||||
            $times,
 | 
			
		||||
            // TRANS: Field title on event form.
 | 
			
		||||
            _m('Time the event starts.'),
 | 
			
		||||
            false,
 | 
			
		||||
            null
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        $this->unli();
 | 
			
		||||
 | 
			
		||||
        $this->li();
 | 
			
		||||
        $this->out->input('event-enddate',
 | 
			
		||||
                          // TRANS: Field label on event form.
 | 
			
		||||
                          _m('LABEL','End date'),
 | 
			
		||||
                          null,
 | 
			
		||||
                          $today->format('m/d/Y'),
 | 
			
		||||
                          // TRANS: Field title on event form.
 | 
			
		||||
                          _m('Date the event ends.'),
 | 
			
		||||
                          'enddate');
 | 
			
		||||
        $this->unli();
 | 
			
		||||
 | 
			
		||||
        $this->li();
 | 
			
		||||
        $this->out->input('event-endtime',
 | 
			
		||||
                          // TRANS: Field label on event form.
 | 
			
		||||
                          _m('LABEL','End time'),
 | 
			
		||||
                          null,
 | 
			
		||||
                          // TRANS: Field title on event form.
 | 
			
		||||
                          _m('Time the event ends.'),
 | 
			
		||||
                          'endtime');
 | 
			
		||||
 | 
			
		||||
        // XXX: Initial end time should be at least 30 mins out?  We could do
 | 
			
		||||
        // every 15 minute instead -z
 | 
			
		||||
        $keys   = array_keys($times);
 | 
			
		||||
        $endStr = date('m/d/y', strtotime('now')) . " {$keys[0]}";
 | 
			
		||||
        $end    = new DateTime($endStr);
 | 
			
		||||
        $end->modify('+30');
 | 
			
		||||
 | 
			
		||||
        $this->out->dropdown(
 | 
			
		||||
            'event-endtime',
 | 
			
		||||
            // TRANS: Field label on event form.
 | 
			
		||||
            _m('LABEL','End time'),
 | 
			
		||||
            EventTimeList::getTimes($end->format('c'), true),
 | 
			
		||||
            // TRANS: Field title on event form.
 | 
			
		||||
            _m('Time the event ends.'),
 | 
			
		||||
            false,
 | 
			
		||||
            null
 | 
			
		||||
        );
 | 
			
		||||
        $this->unli();
 | 
			
		||||
 | 
			
		||||
        $this->li();
 | 
			
		||||
        $this->out->input('event-location',
 | 
			
		||||
                          // TRANS: Field label on event form.
 | 
			
		||||
                          _m('LABEL','Location'),
 | 
			
		||||
                          _m('LABEL','Where?'),
 | 
			
		||||
                          null,
 | 
			
		||||
                          // TRANS: Field title on event form.
 | 
			
		||||
                          _m('Event location.'),
 | 
			
		||||
 
 | 
			
		||||
@@ -83,13 +83,33 @@ class EventListItem extends NoticeListItemAdapter
 | 
			
		||||
 | 
			
		||||
        $out->elementEnd('h3'); // VEVENT/H3 OUT
 | 
			
		||||
 | 
			
		||||
        $startDate = strftime("%x", strtotime($event->start_time));
 | 
			
		||||
        $startTime = strftime("%R", strtotime($event->start_time));
 | 
			
		||||
        $now       = new DateTime();
 | 
			
		||||
        $startDate = new DateTime($event->start_time);
 | 
			
		||||
        $endDate   = new DateTime($event->end_time);
 | 
			
		||||
        $userTz    = new DateTimeZone(common_timezone());
 | 
			
		||||
 | 
			
		||||
        $endDate = strftime("%x", strtotime($event->end_time));
 | 
			
		||||
        $endTime = strftime("%R", strtotime($event->end_time));
 | 
			
		||||
        // Localize the time for the observer
 | 
			
		||||
        $now->setTimeZone($userTz);
 | 
			
		||||
        $startDate->setTimezone($userTz);
 | 
			
		||||
        $endDate->setTimezone($userTz);
 | 
			
		||||
 | 
			
		||||
        // FIXME: better dates
 | 
			
		||||
        $thisYear  = $now->format('Y');
 | 
			
		||||
        $startYear = $startDate->format('Y');
 | 
			
		||||
        $endYear   = $endDate->format('Y');
 | 
			
		||||
 | 
			
		||||
        $dateFmt = 'D, F j, '; // e.g.: Mon, Aug 31
 | 
			
		||||
 | 
			
		||||
        if ($startYear != $thisYear || $endYear != $thisYear) {
 | 
			
		||||
            $dateFmt .= 'Y,'; // append year if we need to think about years
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $startDateStr = $startDate->format($dateFmt);
 | 
			
		||||
        $endDateStr = $endDate->format($dateFmt);
 | 
			
		||||
 | 
			
		||||
        $timeFmt = 'g:ia';
 | 
			
		||||
 | 
			
		||||
        $startTimeStr = $startDate->format($timeFmt);
 | 
			
		||||
        $endTimeStr = $endDate->format("{$timeFmt} (T)");
 | 
			
		||||
 | 
			
		||||
        $out->elementStart('div', 'event-times'); // VEVENT/EVENT-TIMES IN
 | 
			
		||||
 | 
			
		||||
@@ -98,16 +118,16 @@ class EventListItem extends NoticeListItemAdapter
 | 
			
		||||
 | 
			
		||||
        $out->element('abbr', array('class' => 'dtstart',
 | 
			
		||||
                                    'title' => common_date_iso8601($event->start_time)),
 | 
			
		||||
                      $startDate . ' ' . $startTime);
 | 
			
		||||
        $out->text(' - ');
 | 
			
		||||
        if ($startDate == $endDate) {
 | 
			
		||||
                      $startDateStr . ' ' . $startTimeStr);
 | 
			
		||||
        $out->text(' – ');
 | 
			
		||||
        if ($startDateStr == $endDateStr) {
 | 
			
		||||
            $out->element('span', array('class' => 'dtend',
 | 
			
		||||
                                        'title' => common_date_iso8601($event->end_time)),
 | 
			
		||||
                          $endTime);
 | 
			
		||||
                          $endTimeStr);
 | 
			
		||||
        } else {
 | 
			
		||||
            $out->element('span', array('class' => 'dtend',
 | 
			
		||||
                                        'title' => common_date_iso8601($event->end_time)),
 | 
			
		||||
                          $endDate . ' ' . $endTime);
 | 
			
		||||
                          $endDateStr . ' ' . $endTimeStr);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $out->elementEnd('div'); // VEVENT/EVENT-TIMES OUT
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										119
									
								
								plugins/Event/eventtimelist.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								plugins/Event/eventtimelist.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * Helper class for calculating and displaying event times
 | 
			
		||||
 *
 | 
			
		||||
 * PHP version 5
 | 
			
		||||
 *
 | 
			
		||||
 * @category Data
 | 
			
		||||
 * @package  StatusNet
 | 
			
		||||
 * @author   Zach Copley <zach@status.net>
 | 
			
		||||
 * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
 | 
			
		||||
 * @link     http://status.net/
 | 
			
		||||
 *
 | 
			
		||||
 * StatusNet - the distributed open-source microblogging tool
 | 
			
		||||
 * Copyright (C) 2011, StatusNet, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *  Class to get fancy times for the dropdowns on the new event form
 | 
			
		||||
 */
 | 
			
		||||
class EventTimeList {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Round up to the nearest half hour
 | 
			
		||||
     *
 | 
			
		||||
     * @param string $time the time to round (date/time string)
 | 
			
		||||
     * @return DateTime    the rounded time
 | 
			
		||||
     */
 | 
			
		||||
    public static function nearestHalfHour($time)
 | 
			
		||||
    {
 | 
			
		||||
        $start = strtotime($time);
 | 
			
		||||
 | 
			
		||||
        $minutes = date('i', $start);
 | 
			
		||||
        $hour = date('H', $start);
 | 
			
		||||
 | 
			
		||||
        if ($minutes >= 30) {
 | 
			
		||||
            $minutes = '00';
 | 
			
		||||
            $hour++;
 | 
			
		||||
        } else {
 | 
			
		||||
            $minutes = '30';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $newTimeStr = date('m/d/y', $start) . " {$hour}:{$minutes}:00";
 | 
			
		||||
        return new DateTime($newTimeStr);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Output a list of times in half-hour intervals
 | 
			
		||||
     *
 | 
			
		||||
     * @param string  $start       Time to start with (date/time string)
 | 
			
		||||
     * @param boolean $duration    Whether to include the duration of the event
 | 
			
		||||
     *                             (from the start)
 | 
			
		||||
     * @return array  $times (UTC time string => localized time string)
 | 
			
		||||
     */
 | 
			
		||||
    public static function getTimes($start = 'now', $duration = false)
 | 
			
		||||
    {
 | 
			
		||||
        $newTime = self::nearestHalfHour($start);
 | 
			
		||||
 | 
			
		||||
        $newTime->setTimezone(new DateTimeZone(common_timezone()));
 | 
			
		||||
        $times = array();
 | 
			
		||||
        $len   = 0;
 | 
			
		||||
 | 
			
		||||
        for ($i = 0; $i < 48; $i++) {
 | 
			
		||||
 | 
			
		||||
            // make sure we store the time as UTC
 | 
			
		||||
            $newTime->setTimezone(new DateTimeZone('UTC'));
 | 
			
		||||
            $utcTime = $newTime->format('H:i:s');
 | 
			
		||||
 | 
			
		||||
            // localize time for user
 | 
			
		||||
            $newTime->setTimezone(new DateTimeZone(common_timezone()));
 | 
			
		||||
            $localTime = $newTime->format('g:ia');
 | 
			
		||||
 | 
			
		||||
            // pretty up the end-time option list a bit
 | 
			
		||||
            if ($duration) {
 | 
			
		||||
                $len += 30;
 | 
			
		||||
                $hours    = $len / 60;
 | 
			
		||||
                // for i18n
 | 
			
		||||
                $hourStr  = _m('hour');
 | 
			
		||||
                $hoursStr = _m('hrs');
 | 
			
		||||
                $minStr   = _m('mins');
 | 
			
		||||
                switch ($hours) {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    $total = " (0 {$minStr})";
 | 
			
		||||
                    break;
 | 
			
		||||
                case .5:
 | 
			
		||||
                    $total = " (30 {$minStr})";
 | 
			
		||||
                    break;
 | 
			
		||||
                case 1:
 | 
			
		||||
                    $total = " (1 {$hourStr})";
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    $total = " ({$hours} " . $hoursStr . ')';
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                $localTime .= $total;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            $times[$utcTime] = $localTime;
 | 
			
		||||
            $newTime->modify('+30min'); // 30 min intervals
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return $times;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -52,8 +52,8 @@ class NeweventAction extends Action
 | 
			
		||||
    protected $title       = null;
 | 
			
		||||
    protected $location    = null;
 | 
			
		||||
    protected $description = null;
 | 
			
		||||
    protected $startTime  = null;
 | 
			
		||||
    protected $endTime    = null;
 | 
			
		||||
    protected $startTime   = null;
 | 
			
		||||
    protected $endTime     = null;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the title of the action
 | 
			
		||||
@@ -89,67 +89,78 @@ class NeweventAction extends Action
 | 
			
		||||
            $this->checkSessionToken();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        $this->title       = $this->trimmed('title');
 | 
			
		||||
        try {
 | 
			
		||||
 | 
			
		||||
        if (empty($this->title)) {
 | 
			
		||||
            // TRANS: Client exception thrown when trying to post an event without providing a title.
 | 
			
		||||
            throw new ClientException(_m('Title required.'));
 | 
			
		||||
        }
 | 
			
		||||
            $this->title = $this->trimmed('title');
 | 
			
		||||
 | 
			
		||||
        $this->location    = $this->trimmed('location');
 | 
			
		||||
        $this->url         = $this->trimmed('url');
 | 
			
		||||
        $this->description = $this->trimmed('description');
 | 
			
		||||
            if (empty($this->title)) {
 | 
			
		||||
                // TRANS: Client exception thrown when trying to post an event without providing a title.
 | 
			
		||||
                throw new ClientException(_m('Title required.'));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        $startDate = $this->trimmed('startdate');
 | 
			
		||||
            $this->location    = $this->trimmed('location');
 | 
			
		||||
            $this->url         = $this->trimmed('url');
 | 
			
		||||
            $this->description = $this->trimmed('description');
 | 
			
		||||
 | 
			
		||||
        if (empty($startDate)) {
 | 
			
		||||
            // TRANS: Client exception thrown when trying to post an event without providing a start date.
 | 
			
		||||
            throw new ClientException(_m('Start date required.'));
 | 
			
		||||
        }
 | 
			
		||||
            $startDate = $this->trimmed('startdate');
 | 
			
		||||
 | 
			
		||||
        $startTime = $this->trimmed('starttime');
 | 
			
		||||
            if (empty($startDate)) {
 | 
			
		||||
                // TRANS: Client exception thrown when trying to post an event without providing a start date.
 | 
			
		||||
                throw new ClientException(_m('Start date required.'));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if (empty($startTime)) {
 | 
			
		||||
            $startTime = '00:00';
 | 
			
		||||
        }
 | 
			
		||||
            $startTime = $this->trimmed('event-starttime');
 | 
			
		||||
 | 
			
		||||
        $endDate   = $this->trimmed('enddate');
 | 
			
		||||
            if (empty($startTime)) {
 | 
			
		||||
                $startTime = '00:00';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if (empty($endDate)) {
 | 
			
		||||
            // TRANS: Client exception thrown when trying to post an event without providing an end date.
 | 
			
		||||
            throw new ClientException(_m('End date required.'));
 | 
			
		||||
        }
 | 
			
		||||
            $endDate   = $this->trimmed('enddate');
 | 
			
		||||
 | 
			
		||||
        $endTime   = $this->trimmed('endtime');
 | 
			
		||||
            if (empty($endDate)) {
 | 
			
		||||
                // TRANS: Client exception thrown when trying to post an event without providing an end date.
 | 
			
		||||
                throw new ClientException(_m('End date required.'));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if (empty($endTime)) {
 | 
			
		||||
            $endTime = '00:00';
 | 
			
		||||
        }
 | 
			
		||||
            $endTime   = $this->trimmed('event-endtime');
 | 
			
		||||
 | 
			
		||||
        $start = $startDate . ' ' . $startTime;
 | 
			
		||||
            if (empty($endTime)) {
 | 
			
		||||
                $endTime = '00:00';
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        common_debug("Event start: '$start'");
 | 
			
		||||
            $start = $startDate . ' ' . $startTime;
 | 
			
		||||
 | 
			
		||||
        $end = $endDate . ' ' . $endTime;
 | 
			
		||||
            common_debug("Event start: '$start'");
 | 
			
		||||
 | 
			
		||||
        common_debug("Event start: '$end'");
 | 
			
		||||
            $end = $endDate . ' ' . $endTime;
 | 
			
		||||
 | 
			
		||||
        $this->startTime = strtotime($start);
 | 
			
		||||
        $this->endTime   = strtotime($end);
 | 
			
		||||
            common_debug("Event start: '$end'");
 | 
			
		||||
 | 
			
		||||
        if ($this->startTime == 0) {
 | 
			
		||||
            // TRANS: Client exception thrown when trying to post an event with a date that cannot be processed.
 | 
			
		||||
            // TRANS: %s is the data that could not be processed.
 | 
			
		||||
            throw new Exception(sprintf(_m('Could not parse date "%s".'),
 | 
			
		||||
                                        $start));
 | 
			
		||||
        }
 | 
			
		||||
            $this->startTime = strtotime($start);
 | 
			
		||||
            $this->endTime   = strtotime($end);
 | 
			
		||||
 | 
			
		||||
            if ($this->startTime == 0) {
 | 
			
		||||
                // TRANS: Client exception thrown when trying to post an event with a date that cannot be processed.
 | 
			
		||||
                // TRANS: %s is the data that could not be processed.
 | 
			
		||||
                throw new ClientException(sprintf(_m('Could not parse date "%s".'),
 | 
			
		||||
                                            $start));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        if ($this->endTime == 0) {
 | 
			
		||||
            // TRANS: Client exception thrown when trying to post an event with a date that cannot be processed.
 | 
			
		||||
            // TRANS: %s is the data that could not be processed.
 | 
			
		||||
            throw new Exception(sprintf(_m('Could not parse date "%s".'),
 | 
			
		||||
                                        $end));
 | 
			
		||||
            if ($this->endTime == 0) {
 | 
			
		||||
                // TRANS: Client exception thrown when trying to post an event with a date that cannot be processed.
 | 
			
		||||
                // TRANS: %s is the data that could not be processed.
 | 
			
		||||
                throw new ClientException(sprintf(_m('Could not parse date "%s".'),
 | 
			
		||||
                                            $end));
 | 
			
		||||
            }
 | 
			
		||||
        } catch (ClientException $ce) {
 | 
			
		||||
            if ($this->boolean('ajax')) {
 | 
			
		||||
                $this->outputAjaxError($ce->getMessage());
 | 
			
		||||
                return false;
 | 
			
		||||
            } else {
 | 
			
		||||
                $this->error = $ce->getMessage();
 | 
			
		||||
                $this->showPage();
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
@@ -220,9 +231,13 @@ class NeweventAction extends Action
 | 
			
		||||
            RSVP::saveNew($profile, $event, RSVP::POSITIVE);
 | 
			
		||||
 | 
			
		||||
        } catch (ClientException $ce) {
 | 
			
		||||
            $this->error = $ce->getMessage();
 | 
			
		||||
            $this->showPage();
 | 
			
		||||
            return;
 | 
			
		||||
            if ($this->boolean('ajax')) {
 | 
			
		||||
                $this->outputAjaxError($ce->getMessage());
 | 
			
		||||
            } else {
 | 
			
		||||
                $this->error = $ce->getMessage();
 | 
			
		||||
                $this->showPage();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($this->boolean('ajax')) {
 | 
			
		||||
@@ -242,6 +257,23 @@ class NeweventAction extends Action
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // @todo factor this out into a base class
 | 
			
		||||
    function outputAjaxError($msg)
 | 
			
		||||
    {
 | 
			
		||||
        header('Content-Type: text/xml;charset=utf-8');
 | 
			
		||||
        $this->xw->startDocument('1.0', 'UTF-8');
 | 
			
		||||
        $this->elementStart('html');
 | 
			
		||||
        $this->elementStart('head');
 | 
			
		||||
        // TRANS: Page title after an AJAX error occurs
 | 
			
		||||
        $this->element('title', null, _('Ajax Error'));
 | 
			
		||||
        $this->elementEnd('head');
 | 
			
		||||
        $this->elementStart('body');
 | 
			
		||||
        $this->element('p', array('id' => 'error'), $msg);
 | 
			
		||||
        $this->elementEnd('body');
 | 
			
		||||
        $this->elementEnd('html');
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Show the event form
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										106
									
								
								plugins/Event/timelist.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								plugins/Event/timelist.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
<?php
 | 
			
		||||
/**
 | 
			
		||||
 * StatusNet - the distributed open-source microblogging tool
 | 
			
		||||
 * Copyright (C) 2011, StatusNet, Inc.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU Affero General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 3 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU Affero General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Affero General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * @category  Event
 | 
			
		||||
 * @package   StatusNet
 | 
			
		||||
 * @author    Zach Copley <zach@status.net>
 | 
			
		||||
 * @copyright 2011 StatusNet, Inc.
 | 
			
		||||
 * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
 | 
			
		||||
 * @link      http://status.net/
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
if (!defined('STATUSNET')) {
 | 
			
		||||
    exit(1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Callback handler to populate end time dropdown
 | 
			
		||||
 */
 | 
			
		||||
class TimelistAction extends Action {
 | 
			
		||||
 | 
			
		||||
    private $start;
 | 
			
		||||
    private $duration;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Get ready
 | 
			
		||||
     *
 | 
			
		||||
     * @param array $args misc. arguments
 | 
			
		||||
     *
 | 
			
		||||
     * @return boolean true
 | 
			
		||||
     */
 | 
			
		||||
    function prepare($args) {
 | 
			
		||||
        parent::prepare($args);
 | 
			
		||||
        $this->start = $this->arg('start');
 | 
			
		||||
        $this->duration = $this->boolean('duration', false);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Handle input and ouput something
 | 
			
		||||
     *
 | 
			
		||||
     * @param array $args $_REQUEST arguments
 | 
			
		||||
     *
 | 
			
		||||
     * @return void
 | 
			
		||||
     */
 | 
			
		||||
    function handle($args)
 | 
			
		||||
    {
 | 
			
		||||
        parent::handle($args);
 | 
			
		||||
 | 
			
		||||
        if (!common_logged_in()) {
 | 
			
		||||
            // TRANS: Error message displayed when trying to perform an action that requires a logged in user.
 | 
			
		||||
            $this->clientError(_('Not logged in.'));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!empty($this->start)) {
 | 
			
		||||
            $times = EventTimeList::getTimes($this->start, $this->duration);
 | 
			
		||||
        } else {
 | 
			
		||||
            $this->clientError(_m('Unexpected form submission.'));
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($this->boolean('ajax')) {
 | 
			
		||||
            header('Content-Type: application/json; charset=utf-8');
 | 
			
		||||
            print json_encode($times);
 | 
			
		||||
        } else {
 | 
			
		||||
            $this->clientError(_m('This action is AJAX only.'));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Override the regular error handler to show something more
 | 
			
		||||
     * ajaxy
 | 
			
		||||
     *
 | 
			
		||||
     * @param string $msg   error message
 | 
			
		||||
     * @param int    $code  error code
 | 
			
		||||
     */
 | 
			
		||||
    function clientError($msg, $code = 400) {
 | 
			
		||||
        if ($this->boolean('ajax')) {
 | 
			
		||||
            header('Content-Type: application/json; charset=utf-8');
 | 
			
		||||
            print json_encode(
 | 
			
		||||
                array(
 | 
			
		||||
                    'success' => false,
 | 
			
		||||
                    'code'    => $code,
 | 
			
		||||
                    'message' => $msg
 | 
			
		||||
                )
 | 
			
		||||
            );
 | 
			
		||||
        } else {
 | 
			
		||||
            parent::clientError($msg, $code);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -369,6 +369,18 @@ class OMBPlugin extends Plugin
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Broadcast a profile over OMB
 | 
			
		||||
     *
 | 
			
		||||
     * @param Profile $profile to broadcast
 | 
			
		||||
     * @return false
 | 
			
		||||
     */
 | 
			
		||||
    function onBroadcastProfile($profile) {
 | 
			
		||||
        $qm = QueueManager::get();
 | 
			
		||||
        $qm->enqueue($profile, "profile");
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Plugin version info
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1171,9 +1171,19 @@ td.entity_profile {
 | 
			
		||||
    width: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#event-startdate, #event-starttime, #event-enddate, #event-endtime {
 | 
			
		||||
    width: 120px;
 | 
			
		||||
label[for=event-starttime], label[for=event-endtime] {
 | 
			
		||||
    display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#event-starttime, #event-endtime {
 | 
			
		||||
    margin-top:  -1px;
 | 
			
		||||
    margin-bottom:  -1px;
 | 
			
		||||
    height: 2em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#event-startdate, #event-enddate {
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    width: 120px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Limited-scope specific styles */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user