Version 4.1.19
This commit is contained in:
1 parent
28bd025b35
commit
2bd5025018
2674 files changed
+233518
-77766
No files matched your search
@@ -3,7 +3,7 @@
|
||||
* @brief Calendar Application Class
|
||||
* @author <a href=''>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2013 Invision Power Services, Inc.
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version
|
||||
@@ -30,7 +30,7 @@ class _Application extends \IPS\Application
|
||||
if( \IPS\Request::i()->member )
|
||||
{
|
||||
$member = \IPS\Member::load( \IPS\Request::i()->member );
|
||||
if( \IPS\Request::i()->key != md5( ( $member->members_pass_hash ?: $member->email ) . $member->members_pass_salt ) )
|
||||
if( !\IPS\Login::compareHashes( md5( ( $member->members_pass_hash ?: $member->email ) . $member->members_pass_salt ), (string) \IPS\Request::i()->key ) )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2L217/1', 404, '' );
|
||||
}
|
||||
@@ -77,11 +77,18 @@ class _Application extends \IPS\Application
|
||||
/* Are we viewing a specific calendar only? */
|
||||
if( \IPS\Request::i()->id )
|
||||
{
|
||||
$calendar = \IPS\calendar\Calendar::load( \IPS\Request::i()->id );
|
||||
|
||||
if ( !$calendar->can( 'view' ) )
|
||||
try
|
||||
{
|
||||
throw new \OutOfRangeException;
|
||||
$calendar = \IPS\calendar\Calendar::load( \IPS\Request::i()->id );
|
||||
|
||||
if ( !$calendar->can( 'view', $member ) )
|
||||
{
|
||||
throw new \OutOfRangeException;
|
||||
}
|
||||
}
|
||||
catch( \OutOfRangeException $e )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2L217/3', 404, '' );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +99,7 @@ class _Application extends \IPS\Application
|
||||
$where[] = array( 'event_calendar_id=?', $calendar->id );
|
||||
}
|
||||
|
||||
foreach( \IPS\calendar\Event::getItemsWithPermission( $where, 'event_lastupdated DESC', 500, 'read', NULL, 0, $member ) as $event )
|
||||
foreach( \IPS\calendar\Event::getItemsWithPermission( $where, 'event_lastupdated DESC', 500, 'read', \IPS\Content\Hideable::FILTER_AUTOMATIC, 0, $member ) as $event )
|
||||
{
|
||||
$feed->addEvent( $event );
|
||||
}
|
||||
@@ -136,7 +143,7 @@ class _Application extends \IPS\Application
|
||||
$endDate = $_today->adjust( "+" . \IPS\Settings::i()->calendar_rss_feed_days . " days" );
|
||||
}
|
||||
|
||||
foreach ( \IPS\calendar\Event::retrieveEvents( $_today, $endDate, NULL, NULL, FALSE ) as $event )
|
||||
foreach ( \IPS\calendar\Event::retrieveEvents( $_today, $endDate, NULL, NULL, FALSE, $member ) as $event )
|
||||
{
|
||||
$document->addItem( $event->title, $event->url(), $event->content, $event->nextOccurrence( $_today, 'startDate' ), $event->id );
|
||||
}
|
||||
@@ -144,4 +151,37 @@ class _Application extends \IPS\Application
|
||||
/* @note application/rss+xml is not a registered IANA mime-type so we need to stick with text/xml for RSS */
|
||||
\IPS\Output::i()->sendOutput( $document->asXML(), 200, 'text/xml' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Default front navigation
|
||||
*
|
||||
* @code
|
||||
|
||||
// Each item...
|
||||
array(
|
||||
'key' => 'Example', // The extension key
|
||||
'app' => 'core', // [Optional] The extension application. If ommitted, uses this application
|
||||
'config' => array(...), // [Optional] The configuration for the menu item
|
||||
'title' => 'SomeLangKey', // [Optional] If provided, the value of this language key will be copied to menu_item_X
|
||||
'children' => array(...), // [Optional] Array of child menu items for this item. Each has the same format.
|
||||
)
|
||||
|
||||
return array(
|
||||
'rootTabs' => array(), // These go in the top row
|
||||
'browseTabs' => array(), // These go under the Browse tab on a new install or when restoring the default configuraiton; or in the top row if installing the app later (when the Browse tab may not exist)
|
||||
'browseTabsEnd' => array(), // These go under the Browse tab after all other items on a new install or when restoring the default configuraiton; or in the top row if installing the app later (when the Browse tab may not exist)
|
||||
'activityTabs' => array(), // These go under the Activity tab on a new install or when restoring the default configuraiton; or in the top row if installing the app later (when the Activity tab may not exist)
|
||||
)
|
||||
* @endcode
|
||||
* @return array
|
||||
*/
|
||||
public function defaultFrontNavigation()
|
||||
{
|
||||
return array(
|
||||
'rootTabs' => array(),
|
||||
'browseTabs' => array( array( 'key' => 'Calendar' ) ),
|
||||
'browseTabsEnd' => array(),
|
||||
'activityTabs' => array()
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Calendar Events Comments API
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 8 Dec 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\calendar\api;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calendar Events Comments API
|
||||
*/
|
||||
class _comments extends \IPS\Content\Api\CommentController
|
||||
{
|
||||
/**
|
||||
* Class
|
||||
*/
|
||||
protected $class = 'IPS\calendar\Event\Comment';
|
||||
|
||||
/**
|
||||
* GET /calendar/comments
|
||||
* Get list of comments
|
||||
*
|
||||
* @apiparam string calendars Comma-delimited list of calendar IDs
|
||||
* @apiparam string authors Comma-delimited list of member IDs - if provided, only topics started by those members are returned
|
||||
* @apiparam int locked If 1, only comments from events which are locked are returned, if 0 only unlocked
|
||||
* @apiparam int hidden If 1, only comments which are hidden are returned, if 0 only not hidden
|
||||
* @apiparam int featured If 1, only comments from events which are featured are returned, if 0 only not featured
|
||||
* @apiparam string sortBy What to sort by. Can be 'date', 'title' or leave unspecified for ID
|
||||
* @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc'
|
||||
* @apiparam int page Page number
|
||||
* @return \IPS\Api\PaginatedResponse<IPS\calendar\Event\Comment>
|
||||
*/
|
||||
public function GETindex()
|
||||
{
|
||||
return $this->_list( array(), 'calendars' );
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /calendar/comments/{id}
|
||||
* View information about a specific comment
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 2L297/1 INVALID_ID The comment ID does not exist
|
||||
* @return \IPS\calendar\Event\Comment
|
||||
*/
|
||||
public function GETitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
return new \IPS\Api\Response( 200, \IPS\calendar\Event\Comment::load( $id )->apiOutput() );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L297/1', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /calendar/comments
|
||||
* Create a comment
|
||||
*
|
||||
* @reqapiparam int event The ID number of the event the comment is for
|
||||
* @reqapiparam int author The ID number of the member making the comment (0 for guest)
|
||||
* @apiparam string author_name If author is 0, the guest name that should be used
|
||||
* @reqapiparam string content The comment content as HTML (e.g. "<p>This is a comment.</p>")
|
||||
* @apiparam datetime date The date/time that should be used for the comment date. If not provided, will use the current date/time
|
||||
* @apiparam string ip_address The IP address that should be stored for the comment. If not provided, will use the IP address from the API request
|
||||
* @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator)
|
||||
* @throws 2L297/3 INVALID_ID The comment ID does not exist
|
||||
* @throws 1L297/4 NO_AUTHOR The author ID does not exist
|
||||
* @throws 1L297/5 NO_CONTENT No content was supplied
|
||||
* @return \IPS\calendar\Event\Comment
|
||||
*/
|
||||
public function POSTindex()
|
||||
{
|
||||
/* Get topic */
|
||||
try
|
||||
{
|
||||
$event = \IPS\calendar\Event::load( \IPS\Request::i()->event );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L297/3', 403 );
|
||||
}
|
||||
|
||||
/* Get author */
|
||||
if ( \IPS\Request::i()->author )
|
||||
{
|
||||
$author = \IPS\Member::load( \IPS\Request::i()->author );
|
||||
if ( !$author->member_id )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_AUTHOR', '1L297/4', 404 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$author = new \IPS\Member;
|
||||
$author->name = \IPS\Request::i()->author_name;
|
||||
}
|
||||
|
||||
/* Check we have a post */
|
||||
if ( !\IPS\Request::i()->content )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_CONTENT', '1L297/5', 403 );
|
||||
}
|
||||
|
||||
/* Do it */
|
||||
return $this->_create( $event, $author );
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /calendar/comments/{id}
|
||||
* Edit a comment
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @apiparam int author The ID number of the member making the comment (0 for guest)
|
||||
* @apiparam string author_name If author is 0, the guest name that should be used
|
||||
* @apiparam string content The comment content as HTML (e.g. "<p>This is a comment.</p>")
|
||||
* @apiparam int hidden 1/0 indicating if the topic should be hidden
|
||||
* @throws 2L297/6 INVALID_ID The comment ID does not exist
|
||||
* @throws 1L297/7 NO_AUTHOR The author ID does not exist
|
||||
* @return \IPS\calendar\Event\Comment
|
||||
*/
|
||||
public function POSTitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
/* Load */
|
||||
$comment = \IPS\calendar\Event\Comment::load( $id );
|
||||
|
||||
/* Do it */
|
||||
try
|
||||
{
|
||||
return $this->_edit( $comment );
|
||||
}
|
||||
catch ( \InvalidArgumentException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_AUTHOR', '1L297/7', 400 );
|
||||
}
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L297/6', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /calendar/comments/{id}
|
||||
* Deletes a comment
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 2L297/2 INVALID_ID The comment ID does not exist
|
||||
* @return void
|
||||
*/
|
||||
public function DELETEitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\calendar\Event\Comment::load( $id )->delete();
|
||||
|
||||
return new \IPS\Api\Response( 200, NULL );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L297/2', 404 );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,503 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Calendar Events API
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 8 Dec 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\calendar\api;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calendar Events API
|
||||
*/
|
||||
class _events extends \IPS\Content\Api\ItemController
|
||||
{
|
||||
/**
|
||||
* Class
|
||||
*/
|
||||
protected $class = 'IPS\calendar\Event';
|
||||
|
||||
/**
|
||||
* GET /calendar/events
|
||||
* Get list of events
|
||||
*
|
||||
* @apiparam string calendars Comma-delimited list of calendar IDs
|
||||
* @apiparam string authors Comma-delimited list of member IDs - if provided, only events started by those members are returned
|
||||
* @apiparam int locked If 1, only events which are locked are returned, if 0 only unlocked
|
||||
* @apiparam int hidden If 1, only events which are hidden are returned, if 0 only not hidden
|
||||
* @apiparam int featured If 1, only events which are featured are returned, if 0 only not featured
|
||||
* @apiparam string sortBy What to sort by. Can be 'date' for creation date, 'title' or leave unspecified for ID
|
||||
* @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc'
|
||||
* @apiparam int page Page number
|
||||
* @return \IPS\Api\PaginatedResponse<IPS\calendar\Event>
|
||||
*/
|
||||
public function GETindex()
|
||||
{
|
||||
/* Where clause */
|
||||
$where = array();
|
||||
|
||||
/* Return */
|
||||
return $this->_list( $where, 'calendars' );
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /calendar/events/{id}
|
||||
* View information about a specific event
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 1F294/1 INVALID_ID The event ID does not exist
|
||||
* @return \IPS\calendar\Event
|
||||
*/
|
||||
public function GETitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
return $this->_view( $id );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L296/1', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /calendar/events
|
||||
* Create an event
|
||||
*
|
||||
* @reqapiparam int calendar The ID number of the calendar the event should be created in
|
||||
* @reqapiparam int author The ID number of the member creating the event (0 for guest)
|
||||
* @reqapiparam string title The event title
|
||||
* @reqapiparam string description The description as HTML (e.g. "<p>This is an event.</p>")
|
||||
* @reqapiparam datetime start The event start date/time
|
||||
* @apiparam datetime end The event end date/time
|
||||
* @apiparam string recurrence If this event recurs, the ICS recurrence definition
|
||||
* @apiparam bool rsvp If this event accepts RSVPs
|
||||
* @apiparam int rsvpLimit The number of RSVPs the event is limited to
|
||||
* @apiparam \IPS\GeoLocation location The location where the event is taking place
|
||||
* @apiparam string prefix Prefix tag
|
||||
* @apiparam string tags Comma-separated list of tags (do not include prefix)
|
||||
* @apiparam datetime date The date/time that should be used for the event/post post date. If not provided, will use the current date/time
|
||||
* @apiparam string ip_address The IP address that should be stored for the event/post. If not provided, will use the IP address from the API request
|
||||
* @apiparam int locked 1/0 indicating if the event should be locked
|
||||
* @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator)
|
||||
* @apiparam int featured 1/0 indicating if the event should be featured
|
||||
* @throws 1L296/6 NO_CALENDAR The calendar ID does not exist
|
||||
* @throws 1L296/7 NO_AUTHOR The author ID does not exist
|
||||
* @throws 1L296/8 NO_TITLE No title was supplied
|
||||
* @throws 1L296/9 NO_DESC No description was supplied
|
||||
* @throws 1L296/A INVALID_START The start date is invalid
|
||||
* @throws 1L296/B INVALID_END The end date is invalid
|
||||
* @return \IPS\calendar\Event
|
||||
*/
|
||||
public function POSTindex()
|
||||
{
|
||||
/* Get calendar */
|
||||
try
|
||||
{
|
||||
$calendar = \IPS\calendar\Calendar::load( \IPS\Request::i()->calendar );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_CALENDAR', '1L296/6', 400 );
|
||||
}
|
||||
|
||||
/* Get author */
|
||||
if ( \IPS\Request::i()->author )
|
||||
{
|
||||
$author = \IPS\Member::load( \IPS\Request::i()->author );
|
||||
if ( !$author->member_id )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_AUTHOR', '1L296/7', 400 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$author = new \IPS\Member;
|
||||
}
|
||||
|
||||
/* Check we have a title and a description */
|
||||
if ( !\IPS\Request::i()->title )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_TITLE', '1L296/8', 400 );
|
||||
}
|
||||
if ( !\IPS\Request::i()->description )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_DESC', '1L296/9', 400 );
|
||||
}
|
||||
|
||||
/* Validate dates */
|
||||
try
|
||||
{
|
||||
new \IPS\DateTime( \IPS\Request::i()->start );
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_START', '1L296/A', 400 );
|
||||
}
|
||||
if ( isset( \IPS\Request::i()->end ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
new \IPS\DateTime( \IPS\Request::i()->end );
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_END', '1L296/B', 400 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Do it */
|
||||
return new \IPS\Api\Response( 201, $this->_create( $calendar, $author )->apiOutput() );
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /calendar/events/{id}
|
||||
* Edit an event
|
||||
*
|
||||
* @reqapiparam int calendar The ID number of the calendar the event should be created in
|
||||
* @reqapiparam int author The ID number of the member creating the event (0 for guest)
|
||||
* @reqapiparam string title The event title
|
||||
* @reqapiparam string description The description as HTML (e.g. "<p>This is an event.</p>")
|
||||
* @reqapiparam datetime start The event start date/time
|
||||
* @apiparam datetime end The event end date/time
|
||||
* @apiparam string recurrence If this event recurs, the ICS recurrence definition
|
||||
* @apiparam bool rsvp If this event accepts RSVPs
|
||||
* @apiparam int rsvpLimit The number of RSVPs the event is limited to
|
||||
* @apiparam \IPS\GeoLocation location The location where the event is taking place
|
||||
* @apiparam string prefix Prefix tag
|
||||
* @apiparam string tags Comma-separated list of tags (do not include prefix)
|
||||
* @apiparam datetime date The date/time that should be used for the event/post post date. If not provided, will use the current date/time
|
||||
* @apiparam string ip_address The IP address that should be stored for the event/post. If not provided, will use the IP address from the API request
|
||||
* @apiparam int locked 1/0 indicating if the event should be locked
|
||||
* @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator)
|
||||
* @apiparam int featured 1/0 indicating if the event should be featured
|
||||
* @throws 1L296/I INVALID_ID The event ID is invalid
|
||||
* @throws 1L296/D NO_CALENDAR The calendar ID does not exist
|
||||
* @throws 1L296/E NO_AUTHOR The author ID does not exist
|
||||
* @throws 1L296/G INVALID_START The start date is invalid
|
||||
* @throws 1L296/H INVALID_END The end date is invalid
|
||||
* @return \IPS\calendar\Event
|
||||
*/
|
||||
public function POSTitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
$event = \IPS\calendar\Event::load( $id );
|
||||
|
||||
/* New calendar */
|
||||
if ( isset( \IPS\Request::i()->calendar ) and \IPS\Request::i()->calendar != $event->forum_id )
|
||||
{
|
||||
try
|
||||
{
|
||||
$newCalendar = \IPS\calendar\Calendar::load( \IPS\Request::i()->calendar );
|
||||
$event->move( $newCalendar );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_CALENDAR', '1L296/D', 400 );
|
||||
}
|
||||
}
|
||||
|
||||
/* New author */
|
||||
if ( isset( \IPS\Request::i()->author ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
$member = \IPS\Member::load( \IPS\Request::i()->author );
|
||||
if ( !$member->member_id )
|
||||
{
|
||||
throw new \OutOfRangeException;
|
||||
}
|
||||
|
||||
$event->changeAuthor( $member );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_AUTHOR', '1L296/E', 400 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Validate dates */
|
||||
if ( isset( \IPS\Request::i()->start ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
new \IPS\DateTime( \IPS\Request::i()->start );
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_START', '1L296/G', 400 );
|
||||
}
|
||||
}
|
||||
if ( isset( \IPS\Request::i()->end ) )
|
||||
{
|
||||
try
|
||||
{
|
||||
new \IPS\DateTime( \IPS\Request::i()->end );
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_END', '1L296/H', 400 );
|
||||
}
|
||||
}
|
||||
|
||||
/* Everything else */
|
||||
$this->_createOrUpdate( $event );
|
||||
|
||||
/* Save and return */
|
||||
$event->save();
|
||||
return new \IPS\Api\Response( 200, $event->apiOutput() );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '1L296/D', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /calendar/events/{id}/comments
|
||||
* Get comments on an event
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @apiparam int hidden If 1, only comments which are hidden are returned, if 0 only not hidden
|
||||
* @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc'
|
||||
* @apiparam int page Page number
|
||||
* @throws 2L296/2 INVALID_ID The event ID does not exist
|
||||
* @return \IPS\Api\PaginatedResponse<IPS\calendar\Event\Comment>
|
||||
*/
|
||||
public function GETitem_comments( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
return $this->_comments( $id, 'IPS\calendar\Event\Comment' );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L296/2', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /calendar/events/{id}/reviews
|
||||
* Get reviews on an event
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @apiparam int hidden If 1, only comments which are hidden are returned, if 0 only not hidden
|
||||
* @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc'
|
||||
* @apiparam int page Page number
|
||||
* @throws 2L296/3 INVALID_ID The event ID does not exist
|
||||
* @return \IPS\Api\PaginatedResponse<IPS\calendar\Event\Review>
|
||||
*/
|
||||
public function GETitem_reviews( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
return $this->_comments( $id, 'IPS\calendar\Event\Review' );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L296/3', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /calendar/events/{id}/rsvps
|
||||
* Get RSVPs on an event
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 2L296/3 INVALID_ID The event ID does not exist
|
||||
* @return array
|
||||
* @apiresponse [\IPS\Member] attending Members that have confirmed they are attending the event
|
||||
* @apiresponse [\IPS\Member] notAttending Members that have confirmed they are not attending the event
|
||||
* @apiresponse [\IPS\Member] maybeAttending Members that have said they may attend the event
|
||||
*/
|
||||
public function GETitem_rsvps( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
$event = \IPS\calendar\Event::load( $id );
|
||||
$attendees = $event->attendees();
|
||||
return new \IPS\Api\Response( 200, array(
|
||||
'attending' => array_values( array_map( function( $member ) {
|
||||
return $member->apiOutput();
|
||||
}, $attendees[1] ) ),
|
||||
'notAttending' => array_values( array_map( function( $member ) {
|
||||
return $member->apiOutput();
|
||||
}, $attendees[0] ) ),
|
||||
'maybeAttending' => array_values( array_map( function( $member ) {
|
||||
return $member->apiOutput();
|
||||
}, $attendees[2] ) ),
|
||||
) );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L296/4', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* PUT /calendar/events/{id}/rsvps/{member_id}
|
||||
* RSVP a member to an event
|
||||
*
|
||||
* @reqapiparam int response 0 = Not attending; 1 = attending; 2 = maybe attending
|
||||
* @param int $id Event ID NUmber
|
||||
* @param int $memberId Member ID NUmber
|
||||
* @throws 2L296/J INVALID_ID The event ID does not exist
|
||||
* @return void
|
||||
*/
|
||||
public function PUTitem_rsvps( $id, $memberId )
|
||||
{
|
||||
if ( !isset( \IPS\Request::i()->response ) or !in_array( (int) \IPS\Request::i()->response, range( 0, 2 ) ) )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_RESPONSE', '1L296/L', 400 );
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$event = \IPS\calendar\Event::load( $id );
|
||||
|
||||
try
|
||||
{
|
||||
$member = \IPS\Member::load( $memberId );
|
||||
if ( !$member->member_id )
|
||||
{
|
||||
throw new \OutOfRangeException;
|
||||
}
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_MEMBER', '2L296/K', 404 );
|
||||
}
|
||||
|
||||
\IPS\Db::i()->delete( 'calendar_event_rsvp', array( 'rsvp_event_id=? AND rsvp_member_id=?', $event->id, $member->member_id ) );
|
||||
|
||||
\IPS\Db::i()->insert( 'calendar_event_rsvp', array(
|
||||
'rsvp_event_id' => $event->id,
|
||||
'rsvp_member_id' => $member->member_id,
|
||||
'rsvp_date' => time(),
|
||||
'rsvp_response' => (int) \IPS\Request::i()->response
|
||||
) );
|
||||
|
||||
return new \IPS\Api\Response( 200, NULL );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_EVENT', '2L296/J', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /calendar/events/{id}/rsvps/{member_id}
|
||||
* Remove a member from RSVP list
|
||||
*
|
||||
* @param int $id Event ID NUmber
|
||||
* @param int $memberId Member ID NUmber
|
||||
* @return void
|
||||
*/
|
||||
public function DELETEitem_rsvps( $id, $memberId )
|
||||
{
|
||||
\IPS\Db::i()->delete( 'calendar_event_rsvp', array( 'rsvp_event_id=? AND rsvp_member_id=?', intval( $id ), intval( $memberId ) ) );
|
||||
return new \IPS\Api\Response( 200, NULL );
|
||||
}
|
||||
|
||||
/**
|
||||
* Create or update event
|
||||
*
|
||||
* @param \IPS\Content\Item $item The item
|
||||
* @return \IPS\Content\Item
|
||||
*/
|
||||
protected function _createOrUpdate( \IPS\Content\Item $item )
|
||||
{
|
||||
/* Start/End date */
|
||||
$startDate = new \IPS\DateTime( \IPS\Request::i()->start );
|
||||
$item->start_date = $startDate->format( 'Y-m-d H:i' );
|
||||
$item->end_date = NULL;
|
||||
if ( isset( \IPS\Request::i()->end ) )
|
||||
{
|
||||
$endDate = new \IPS\DateTime( \IPS\Request::i()->end );
|
||||
$item->end_date = $endDate->format( 'Y-m-d H:i' );
|
||||
}
|
||||
else
|
||||
{
|
||||
$item->all_day = 1;
|
||||
}
|
||||
|
||||
/* Recurrence */
|
||||
if ( isset( \IPS\Request::i()->recurrence ) )
|
||||
{
|
||||
$item->recurring = \IPS\Request::i()->recurrence;
|
||||
}
|
||||
|
||||
/* Description */
|
||||
$item->content = \IPS\Request::i()->description;
|
||||
|
||||
/* RSVP */
|
||||
if ( isset( \IPS\Request::i()->rsvp ) )
|
||||
{
|
||||
$item->rsvp = intval( \IPS\Request::i()->rsvp );
|
||||
if ( $item->rsvp and isset( \IPS\Request::i()->rsvpLimit ) and \IPS\Request::i()->rsvpLimit )
|
||||
{
|
||||
$item->rsvp_limit = \IPS\Request::i()->rsvpLimit;
|
||||
}
|
||||
else
|
||||
{
|
||||
$item->rsvp_limit = -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Location */
|
||||
if ( isset( \IPS\Request::i()->location ) )
|
||||
{
|
||||
if ( \IPS\Request::i()->location )
|
||||
{
|
||||
$location = \IPS\GeoLocation::buildFromJson( json_encode( \IPS\Request::i()->location ) );
|
||||
if ( !$location->lat or !$location->long )
|
||||
{
|
||||
try
|
||||
{
|
||||
$location->getLatLong();
|
||||
}
|
||||
catch ( \Exception $e ) {}
|
||||
}
|
||||
$item->location = json_encode( $location );
|
||||
}
|
||||
}
|
||||
|
||||
/* Pass up */
|
||||
return parent::_createOrUpdate( $item );
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /calendar/events/{id}
|
||||
* Delete a event
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 2L296/5 INVALID_ID The event ID does not exist
|
||||
* @return void
|
||||
*/
|
||||
public function DELETEitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\calendar\Event::load( $id )->delete();
|
||||
|
||||
return new \IPS\Api\Response( 200, NULL );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L296/5', 404 );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Calendar Events Reviews API
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 8 Dec 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\calendar\api;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calendar Events Reviews API
|
||||
*/
|
||||
class _reviews extends \IPS\Content\Api\CommentController
|
||||
{
|
||||
/**
|
||||
* Class
|
||||
*/
|
||||
protected $class = 'IPS\calendar\Event\Review';
|
||||
|
||||
/**
|
||||
* GET /calendar/reviews
|
||||
* Get list of reviews
|
||||
*
|
||||
* @apiparam string calendars Comma-delimited list of calendar IDs
|
||||
* @apiparam string authors Comma-delimited list of member IDs - if provided, only topics started by those members are returned
|
||||
* @apiparam int locked If 1, only reviews from events which are locked are returned, if 0 only unlocked
|
||||
* @apiparam int hidden If 1, only reviews which are hidden are returned, if 0 only not hidden
|
||||
* @apiparam int featured If 1, only reviews from events which are featured are returned, if 0 only not featured
|
||||
* @apiparam string sortBy What to sort by. Can be 'date', 'title' or leave unspecified for ID
|
||||
* @apiparam string sortDir Sort direction. Can be 'asc' or 'desc' - defaults to 'asc'
|
||||
* @apiparam int page Page number
|
||||
* @return \IPS\Api\PaginatedResponse<IPS\calendar\Event\Review>
|
||||
*/
|
||||
public function GETindex()
|
||||
{
|
||||
return $this->_list( array(), 'calendars' );
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /calendar/reviews/{id}
|
||||
* View information about a specific review
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 2L298/1 INVALID_ID The review ID does not exist
|
||||
* @return \IPS\calendar\Event\Review
|
||||
*/
|
||||
public function GETitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
return new \IPS\Api\Response( 200, \IPS\calendar\Event\Review::load( $id )->apiOutput() );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L298/1', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /calendar/reviews
|
||||
* Create a review
|
||||
*
|
||||
* @reqapiparam int event The ID number of the event the review is for
|
||||
* @reqapiparam int author The ID number of the member making the review (0 for guest)
|
||||
* @apiparam string author_name If author is 0, the guest name that should be used
|
||||
* @reqapiparam string content The review content as HTML (e.g. "<p>This is a review.</p>")
|
||||
* @apiparam datetime date The date/time that should be used for the review date. If not provided, will use the current date/time
|
||||
* @apiparam string ip_address The IP address that should be stored for the review. If not provided, will use the IP address from the API request
|
||||
* @apiparam int hidden 0 = unhidden; 1 = hidden, pending moderator approval; -1 = hidden (as if hidden by a moderator)
|
||||
* @reqapiparam int rating Star rating
|
||||
* @throws 2L298/2 INVALID_ID The forum ID does not exist
|
||||
* @throws 1L298/3 NO_AUTHOR The author ID does not exist
|
||||
* @throws 1L298/4 NO_CONTENT No content was supplied
|
||||
* @throws 1L298/8 INVALID_RATING The rating is not a valid number up to the maximum rating
|
||||
* @return \IPS\calendar\Event\Review
|
||||
*/
|
||||
public function POSTindex()
|
||||
{
|
||||
/* Get topic */
|
||||
try
|
||||
{
|
||||
$event = \IPS\calendar\Event::load( \IPS\Request::i()->event );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L298/2', 403 );
|
||||
}
|
||||
|
||||
/* Get author */
|
||||
if ( \IPS\Request::i()->author )
|
||||
{
|
||||
$author = \IPS\Member::load( \IPS\Request::i()->author );
|
||||
if ( !$author->member_id )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_AUTHOR', '1L298/3', 404 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$author = new \IPS\Member;
|
||||
$author->name = \IPS\Request::i()->author_name;
|
||||
}
|
||||
|
||||
/* Check we have a post */
|
||||
if ( !\IPS\Request::i()->content )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_CONTENT', '1L298/4', 403 );
|
||||
}
|
||||
|
||||
/* Check we have a rating */
|
||||
if ( !\IPS\Request::i()->rating or !in_array( (int) \IPS\Request::i()->rating, range( 1, \IPS\Settings::i()->reviews_rating_out_of ) ) )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_RATING', '1L298/8', 403 );
|
||||
}
|
||||
|
||||
/* Do it */
|
||||
return $this->_create( $event, $author );
|
||||
}
|
||||
|
||||
/**
|
||||
* POST /calendar/reviews/{id}
|
||||
* Edit a review
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @apiparam int author The ID number of the member making the review (0 for guest)
|
||||
* @apiparam string author_name If author is 0, the guest name that should be used
|
||||
* @apiparam string content The review content as HTML (e.g. "<p>This is a review.</p>")
|
||||
* @apiparam int hidden 1/0 indicating if the topic should be hidden
|
||||
* @apiparam int rating Star rating
|
||||
* @throws 2L298/5 INVALID_ID The review ID does not exist
|
||||
* @throws 1L298/6 NO_AUTHOR The author ID does not exist
|
||||
* @throws 1L298/9 INVALID_RATING The rating is not a valid number up to the maximum rating
|
||||
* @return \IPS\calendar\Event\Review
|
||||
*/
|
||||
public function POSTitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
/* Load */
|
||||
$comment = \IPS\calendar\Event\Review::load( $id );
|
||||
|
||||
/* Check */
|
||||
if ( isset( \IPS\Request::i()->rating ) and !in_array( (int) \IPS\Request::i()->rating, range( 1, \IPS\Settings::i()->reviews_rating_out_of ) ) )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_RATING', '1L298/9', 403 );
|
||||
}
|
||||
/* Do it */
|
||||
try
|
||||
{
|
||||
return $this->_edit( $comment );
|
||||
}
|
||||
catch ( \InvalidArgumentException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'NO_AUTHOR', '1L298/6', 400 );
|
||||
}
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L298/5', 404 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DELETE /calendar/reviews/{id}
|
||||
* Deletes a review
|
||||
*
|
||||
* @param int $id ID Number
|
||||
* @throws 2L298/7 INVALID_ID The review ID does not exist
|
||||
* @return void
|
||||
*/
|
||||
public function DELETEitem( $id )
|
||||
{
|
||||
try
|
||||
{
|
||||
\IPS\calendar\Event\Review::load( $id )->delete();
|
||||
|
||||
return new \IPS\Api\Response( 200, NULL );
|
||||
}
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
throw new \IPS\Api\Exception( 'INVALID_ID', '2L298/7', 404 );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1 +1,288 @@
|
||||
{"app=calendar&module=calendars&controller=calendars":{"lang_key":"menu__calendar_calendars_calendars","restriction":"calendars_manage","keywords":["calendars"]},"app=calendar&module=calendars&controller=settings&searchResult=form_calendar_default_view":{"lang_key":"calendar_default_view","restriction":"settings_manage","keywords":["calendar layout"]},"app=calendar&module=calendars&controller=settings&searchResult=form_calendar_date_format":{"lang_key":"calendar_date_format","restriction":"settings_manage","keywords":["calendar date format"]},"app=calendar&module=calendars&controller=settings&searchResult=form_show_bday_calendar":{"lang_key":"show_bday_calendar","restriction":"settings_manage","keywords":["birthdays"]},"app=calendar&module=calendars&controller=settings&searchResult=form_ipb_calendar_mon":{"lang_key":"ipb_calendar_mon","restriction":"settings_manage","keywords":["monday","sunday","calendar start"]},"app=calendar&module=calendars&controller=settings&searchResult=form_calendar_rss_feed":{"lang_key":"calendar_rss_feed","restriction":"settings_manage","keywords":["calendar rss","events rss"]},"app=calendar&module=calendars&controller=ical":{"lang_key":"menu__calendar_calendars_ical","restriction":"calendar_feeds_manage","keywords":["iCal","calendar export","iCalendar","feeds"]}}
|
||||
{
|
||||
"app=calendar&module=calendars&controller=calendars": {
|
||||
"lang_key": "menu__calendar_calendars_calendars",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"calendars",
|
||||
"календарь"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&do=form": {
|
||||
"lang_key": "menu__calendar_calendars_calendars",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"edit calendar",
|
||||
"изменить календарь"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&do=permissions": {
|
||||
"lang_key": "menu__calendar_calendars_calendars",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"calendar permissions",
|
||||
"доступы календаря",
|
||||
"разрешения календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=cal_comment_moderate": {
|
||||
"lang_key": "cal_comment_moderate",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"approved",
|
||||
"comments must be approved",
|
||||
"require approval",
|
||||
"одобрено",
|
||||
"требует одобрения",
|
||||
"комментарии должны быть одобрены"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_1_cal_allow_comments": {
|
||||
"lang_key": "cal_allow_comments",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"allow comments",
|
||||
"comments",
|
||||
"разрешить комментарии",
|
||||
"комментарии"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_1_cal_allow_reviews": {
|
||||
"lang_key": "cal_allow_reviews",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"allow reviews",
|
||||
"reviews",
|
||||
"отзывы",
|
||||
"разрешить отзывы"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_1_cal_color": {
|
||||
"lang_key": "cal_color",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"calendar color",
|
||||
"цвет календаря",
|
||||
"цвет"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_1_cal_moderate": {
|
||||
"lang_key": "cal_moderate",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"approve",
|
||||
"approve event",
|
||||
"event",
|
||||
"одобрить",
|
||||
"событие",
|
||||
"одобрить событие"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_1_cal_title": {
|
||||
"lang_key": "cal_title",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"calendar name",
|
||||
"calendar title",
|
||||
"название календаря",
|
||||
"заголовок календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_new_cal_allow_comments": {
|
||||
"lang_key": "cal_allow_comments",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"allow comments",
|
||||
"разрешить комментарии"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_new_cal_allow_reviews": {
|
||||
"lang_key": "cal_allow_reviews",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"allow reviews",
|
||||
"reviews",
|
||||
"отзывы",
|
||||
"разрешить отзывы"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_new_cal_color": {
|
||||
"lang_key": "cal_color",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"calendar color",
|
||||
"цвет календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_new_cal_moderate": {
|
||||
"lang_key": "cal_moderate",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"approve event",
|
||||
"event approve",
|
||||
"events",
|
||||
"события",
|
||||
"одобрить событие"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=calendars&searchResult=form_new_cal_title": {
|
||||
"lang_key": "cal_title",
|
||||
"restriction": "calendars_manage",
|
||||
"keywords": [
|
||||
"calendar title",
|
||||
"название календаря",
|
||||
"имя календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical": {
|
||||
"lang_key": "menu__calendar_calendars_ical",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"calendar export",
|
||||
"feeds",
|
||||
"iCal",
|
||||
"iCalendar",
|
||||
"экспорт календаря",
|
||||
"ленты"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=add&searchResult=form_feed_allow_rsvp": {
|
||||
"lang_key": "feed_allow_rsvp",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"enable rsvp",
|
||||
"rsvp",
|
||||
"просьба ответить",
|
||||
"запрос ответа"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=add&searchResult=form_feed_calendar_id": {
|
||||
"lang_key": "feed_calendar_id",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"calendar",
|
||||
"календарь"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=add&searchResult=form_feed_member_id": {
|
||||
"lang_key": "feed_member_id",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"member",
|
||||
"пользователь"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=add&searchResult=form_feed_title": {
|
||||
"lang_key": "feed_title",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"add icalendar",
|
||||
"feed title",
|
||||
"iCalendar feed",
|
||||
"название ленты"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=add&searchResult=form_feed_url": {
|
||||
"lang_key": "feed_url",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"feed url",
|
||||
"icalendar url",
|
||||
"адрес ленты"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=upload&searchResult=form_feed_calendar_id": {
|
||||
"lang_key": "feed_calendar_id",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"calendar",
|
||||
"календарь"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=upload&searchResult=form_feed_file": {
|
||||
"lang_key": "feed_file",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"iCalendar file"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=ical&do=upload&searchResult=form_feed_member_id": {
|
||||
"lang_key": "feed_member_id",
|
||||
"restriction": "calendar_feeds_manage",
|
||||
"keywords": [
|
||||
"member",
|
||||
"пользователь"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings": {
|
||||
"lang_key": "menu__calendar_calendars_settings",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"calendar settings",
|
||||
"настройки календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings&searchResult=calendar_rss_feed_days": {
|
||||
"lang_key": "calendar_rss_feed_days",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"days",
|
||||
"feed days",
|
||||
"forthcoming days",
|
||||
"number of days",
|
||||
"RSS Feed",
|
||||
"rss лента",
|
||||
"дней",
|
||||
"количество дней"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings&searchResult=form_calendar_date_format": {
|
||||
"lang_key": "calendar_date_format",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"calendar date format",
|
||||
"формат даты",
|
||||
"дата календаря",
|
||||
"дата в календаре"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings&searchResult=form_calendar_default_view": {
|
||||
"lang_key": "calendar_default_view",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"calendar layout",
|
||||
"макет календаря",
|
||||
"дизайн календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings&searchResult=form_calendar_rss_feed": {
|
||||
"lang_key": "calendar_rss_feed",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"calendar rss",
|
||||
"events rss",
|
||||
"rss событий",
|
||||
"rss календаря"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings&searchResult=form_ipb_calendar_mon": {
|
||||
"lang_key": "ipb_calendar_mon",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"calendar start",
|
||||
"monday",
|
||||
"sunday",
|
||||
"начало недели",
|
||||
"понедельник",
|
||||
"воскресенье"
|
||||
]
|
||||
},
|
||||
"app=calendar&module=calendars&controller=settings&searchResult=form_show_bday_calendar": {
|
||||
"lang_key": "show_bday_calendar",
|
||||
"restriction": "settings_manage",
|
||||
"keywords": [
|
||||
"birthdays",
|
||||
"день рождения",
|
||||
"дни рождения"
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<emails><template><template_app>calendar</template_app><template_name>digests__item</template_name><template_content_html><![CDATA[<tr style='border-bottom: 1px solid #eeeeee'>
|
||||
<emails><template><template_app>calendar</template_app><template_name>notification_new_content</template_name><template_content_html><![CDATA[
|
||||
{{if $content->author()->member_id}}
|
||||
{$email->language->addToStack("email_new_calevent", FALSE, array( 'sprintf' => array( $content->author()->url(), $content->author()->name, $content->indefiniteArticle( $email->language ), $content->url(), $content->mapped('title'), $content->fixedDateTimeDescription( $email->language ) ) ) )}
|
||||
{{else}}
|
||||
{$email->language->addToStack("email_new_calevent_guest", FALSE, array( 'sprintf' => array( $content->author()->name, $content->indefiniteArticle( $email->language ), $content->url(), $content->mapped('title'), $content->fixedDateTimeDescription( $email->language ) ) ) )}
|
||||
{{endif}}
|
||||
|
||||
<br />
|
||||
<br />
|
||||
|
||||
<table width='100%' cellpadding='0' cellspacing='0' border='0'>
|
||||
<tr>
|
||||
<td dir='{dir}' width='40' valign='top' class='hidePhone' style='width: 0; max-height: 0; overflow: hidden; float: left;'>
|
||||
<img src='{$content->author()->get_photo( true, true )}' width='40' height='40' style='border: 1px solid #777777; vertical-align: middle;'>
|
||||
</td>
|
||||
<td dir='{dir}' width='30' valign='top' class='hidePhone' style='width: 0; max-height: 0; overflow: hidden; float: left;'>
|
||||
<br />
|
||||
<span style='display: block; width: 0px; height: 0px; border-width: 15px; border-color: transparent #f9f9f9 transparent transparent; border-style: solid'></span>
|
||||
</td>
|
||||
<td dir='{dir}' valign='top' style='background: #f9f9f9;'>
|
||||
<table width='100%' cellpadding='10' cellspacing='0' border='0'>
|
||||
<tr>
|
||||
<td dir='{dir}'>
|
||||
<table width='100%' cellpadding='5' cellspacing='0' border='0'>
|
||||
<tr>
|
||||
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; line-height: 1.5; font-size: 14px; color: #8d8d8d">
|
||||
{$email->language->addToStack("email_posted_in", FALSE, array( 'sprintf' => array( $content->container()->_title ) ) )}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td dir='{dir}' style="font-family: 'Helvetica Neue', helvetica, sans-serif; line-height: 1.5; font-size: 14px;">
|
||||
{$email->parseTextForEmail( $content->content(), $email->language )|raw}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td dir='{dir}'>
|
||||
<a href='{$content->url()}' style="color: #ffffff; font-family: 'Helvetica Neue', helvetica, sans-serif; text-decoration: none; font-size: 14px; background: {setting="email_color"}; line-height: 32px; padding: 0 10px; display: inline-block; border-radius: 3px;">{$email->language->addToStack("go_to_this_x", FALSE, array( 'sprintf' => array( mb_strtolower( $email->language->addToStack( $content::$title, FALSE ) ) ) ) )}</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br /><br />
|
||||
<em style='color: #8c8c8c'>— {setting="board_name"}</em>]]></template_content_html><template_data>$content, $email</template_data><template_content_plaintext><![CDATA[{$email->language->addToStack("email_new_calevent_plain", FALSE, array( 'sprintf' => array( $content->author()->name, $content->indefiniteArticle( $email->language ), $content->mapped( 'title' ), $content->fixedDateTimeDescription( $email->language ) ) ) )}
|
||||
|
||||
{$email->language->addToStack("go_to_this_x", FALSE, array( 'sprintf' => array( mb_strtolower( $email->language->addToStack( $content::$title, FALSE ) ) ) ) )}: {$content->url()}
|
||||
|
||||
-- {setting="board_name"}]]></template_content_plaintext></template><template><template_app>calendar</template_app><template_name>digests__item</template_name><template_content_html><![CDATA[<tr style='border-bottom: 1px solid #eeeeee'>
|
||||
<td dir='{dir}' width='120' valign='top' align='center'>
|
||||
<table width='120' cellpadding='10' cellspacing='0' border='0' bgcolor='#fafafa'>
|
||||
<tr>
|
||||
@@ -39,7 +90,7 @@
|
||||
</p>
|
||||
|
||||
<div style='font-family: "Helvetica Neue", helvetica, sans-serif; line-height: 22px; margin-top: 5px; margin-bottom: 5px'>
|
||||
{$email->parseTextForEmail( $event->content() )|raw}
|
||||
{$email->parseTextForEmail( $event->content(), $email->language )|raw}
|
||||
</div>
|
||||
|
||||
{{if $event->rsvp}}
|
||||
@@ -49,11 +100,11 @@
|
||||
{{if count( $attendees[1] )}}
|
||||
{{foreach $attendees[1] as $idx => $attendee}}
|
||||
{{if $idx < 10}}
|
||||
<img src="{$attendee->photo}" width="32" height="32" style="border: 1px solid #000; vertical-align: middle;">
|
||||
<img src="{$attendee->get_photo( true, true )}" width="32" height="32" style="border: 1px solid #000; vertical-align: middle;">
|
||||
{{endif}}
|
||||
{{endforeach}}
|
||||
{{if count( $attendees[1] ) > 10}}
|
||||
<span style="font-size: 13px; font-family: 'Helvetica Neue', helvetica, sans-serif; color: #8c8c8c">{$email->language->addToStack("and_x_more", FALSE, array( 'sprintf' => array( count( $attendees[1] ) - 10 ) ) )}</span>
|
||||
<span style="font-size: 13px; font-family: 'Helvetica Neue', helvetica, sans-serif; color: #8c8c8c">{$email->language->addToStack("and_x_more", FALSE, array( 'pluralize' => array( count( $attendees[1] ) - 10 ) ) )}</span>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
</div>
|
||||
@@ -63,7 +114,7 @@
|
||||
{{if $event->container()->allow_reviews or $event->container()->allow_comments}}
|
||||
<p style='font-family: "Helvetica Neue", helvetica, sans-serif; margin: 0; font-size: 13px; margin-bottom: 15px'>
|
||||
{{if $event->container()->allow_reviews}}
|
||||
{{foreach range( 1, 5 ) as $i}}{{if $i <= $event->averageReviewRating()}}<img src='{resource="email/rating_on.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{else}}<img src='{resource="email/rating_off.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{endif}}{{endforeach}}
|
||||
{{foreach range( 1, 5 ) as $i}}{{if $i <= $event->averageReviewRating()}}<img src='{resource="email/rating_on.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{elseif ( $i - 0.5 ) <= $event->averageReviewRating()}}<img src='{resource="email/rating_half.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{else}}<img src='{resource="email/rating_off.png" location="interface" app="core"}' width='14' height='13' style='vertical-align: middle; margin-right: 2px'>{{endif}}{{endforeach}}
|
||||
{{endif}}
|
||||
{{if $event->container()->allow_comments}}
|
||||
|
||||
@@ -81,12 +132,12 @@
|
||||
<table width='100' cellpadding='0' cellspacing='0' border='0' bgcolor='#ffffff' style='border: 1px solid #cccccc;'>
|
||||
<tr>
|
||||
<td dir='{dir}' align='center' style="color: #a93848; font-size: 18px; line-height: 30px; text-transform: uppercase; font-family: 'Helvetica Neue', helvetica, sans-serif; font-weight: bold; padding-top: 5px;">
|
||||
{$comment->item()->nextOccurrence( $today, 'startDate' )->monthNameShort}
|
||||
{$comment->item()->nextOccurrence( \IPS\calendar\Date::getDate(), 'startDate' )->monthNameShort}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td dir='{dir}' align='center' style="color: #333333; line-height: 40px; font-size: 44px; font-family: 'Helvetica Neue', helvetica, sans-serif; font-weight: 300; padding-bottom: 10px">
|
||||
{$comment->item()->nextOccurrence( $today, 'startDate' )->mday}
|
||||
{$comment->item()->nextOccurrence( \IPS\calendar\Date::getDate(), 'startDate' )->mday}
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -109,7 +160,7 @@
|
||||
{{endif}}
|
||||
</p>
|
||||
<div style='font-family: "Helvetica Neue", helvetica, sans-serif; line-height: 22px; margin-top: 10px; margin-bottom: 10px; border-left: 3px solid #8c8c8c; padding-left: 15px; font-size: 14px; margin-left: 15px'>
|
||||
{$email->parseTextForEmail( $comment->content() )|raw}
|
||||
{$email->parseTextForEmail( $comment->content(), $email->language )|raw}
|
||||
</div>
|
||||
|
||||
</td>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{
|
||||
"calendar_calendar_1": "Community Calendar"
|
||||
"calendar_calendar_1": "Календарь сообщества"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<javascript app="calendar">
|
||||
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="101012" javascript_position="1000050"><![CDATA[/**
|
||||
* IPS Social Suite 4
|
||||
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.main.js" javascript_type="controller" javascript_version="101093" javascript_position="1000050"><![CDATA[/**
|
||||
* IPS Community Suite 4
|
||||
* (c) 2013 Invision Power Services - http://www.invisionpower.com
|
||||
*
|
||||
* ips.browse.main.js - Calendar main browsing controller
|
||||
@@ -60,6 +60,9 @@
|
||||
return;
|
||||
}
|
||||
|
||||
// Track page view
|
||||
ips.utils.analytics.trackPageView( state.url );
|
||||
|
||||
this._updateView( state.url, state.title )
|
||||
},
|
||||
|
||||
@@ -109,8 +112,8 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="101012" javascript_position="1000050"><![CDATA[/**
|
||||
* IPS Social Suite 4
|
||||
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/browse" javascript_name="ips.browse.monthView.js" javascript_type="controller" javascript_version="101093" javascript_position="1000050"><![CDATA[/**
|
||||
* IPS Community Suite 4
|
||||
* (c) 2013 Invision Power Services - http://www.invisionpower.com
|
||||
*
|
||||
* ips.browse.monthView.js - Month view controller
|
||||
@@ -251,8 +254,8 @@
|
||||
}
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="101012" javascript_position="1000100"><![CDATA[/**
|
||||
* IPS Social Suite 4
|
||||
<file javascript_app="calendar" javascript_location="front" javascript_path="controllers/submit" javascript_name="ips.submit.dates.js" javascript_type="controller" javascript_version="101093" javascript_position="1000100"><![CDATA[/**
|
||||
* IPS Community Suite 4
|
||||
* (c) 2013 Invision Power Services - http://www.invisionpower.com
|
||||
*
|
||||
* ips.submit.dates.js - Helper for date selection enhancements
|
||||
@@ -442,37 +445,6 @@
|
||||
// Update the dates
|
||||
this.scope.find('[data-role="dateSummary"]').html( this._dateSummary() );
|
||||
},
|
||||
|
||||
/**
|
||||
* Get date object from input
|
||||
*
|
||||
* @param {object} input Input element
|
||||
* @returns {object} Date object
|
||||
*/
|
||||
_getDate: function(input) {
|
||||
/* jQuery UI Polyfill needs to be changed into the correct format */
|
||||
if( !ips.utils.time.supportsHTMLDate() ) {
|
||||
/* If it has been initiated, we can use the getDate method */
|
||||
try {
|
||||
var thisDate = input.datepicker( "getDate" );
|
||||
|
||||
if( _.isNull( thisDate ) )
|
||||
{
|
||||
thisDate = new Date( input.attr('value') );
|
||||
}
|
||||
|
||||
return thisDate;
|
||||
}
|
||||
/* If it hasn't we can pull the 'value' attribute which can't have been changed yet. Not .val() as that will be in the wrong format */
|
||||
catch(err) {
|
||||
return new Date( input.attr('value') );
|
||||
}
|
||||
}
|
||||
/* Actual HTML5 input always returns .val() in the correct YYYY-MM-DD format */
|
||||
else {
|
||||
return new Date( input.val() );
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Builds a summary of the selected dates/times
|
||||
@@ -481,32 +453,26 @@
|
||||
*/
|
||||
_dateSummary: function () {
|
||||
// Build start date
|
||||
var startDate = this._getDate( this.scope.find('input[name="event_dates[start_date]"]') );
|
||||
var startDate = ips.utils.time.getDateFromInput( this.scope.find('input[name="event_dates[start_date]"]') );
|
||||
var singleDay = this.scope.find('#check_single_day');
|
||||
var allDay = this.scope.find('#check_all_day');
|
||||
|
||||
// If there's no start time, then abandon showing any summary for now
|
||||
if( !ips.utils.time.isValidDateObj( startDate ) || startDate.getFullYear() < 1900 ) {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
// We need to add the offset to ensure the day stays correct
|
||||
if( !ips.utils.time.supportsHTMLDate() ){
|
||||
startDate.setTime( startDate.getTime() - new Date().getTimezoneOffset()*60000 );
|
||||
}
|
||||
ips.utils.time.removeTimezone( startDate );
|
||||
|
||||
var startDateString = ips.utils.time.localeDateString( startDate, { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC' } );
|
||||
|
||||
var startTime = this._getTime( this.scope.find('input[name="event_dates[start_time]"]').val() );
|
||||
var endTime = this._getTime( this.scope.find('input[name="event_dates[end_time]"]').val() );
|
||||
var endDate = this._getDate( this.scope.find('input[name="event_dates[end_date]"]') );
|
||||
var endDate = ips.utils.time.getDateFromInput( this.scope.find('input[name="event_dates[end_date]"]') );
|
||||
var endDateString = '';
|
||||
|
||||
// If we have a valid end date...
|
||||
if( !singleDay.is(':checked') && ips.utils.time.isValidDateObj( endDate ) ){
|
||||
if( !ips.utils.time.supportsHTMLDate() ){
|
||||
endDate.setTime( endDate.getTime() - new Date().getTimezoneOffset()*60000 );
|
||||
}
|
||||
ips.utils.time.removeTimezone( endDate );
|
||||
endDateString = ips.utils.time.localeDateString( endDate, { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC' } );
|
||||
}
|
||||
|
||||
@@ -570,7 +536,7 @@
|
||||
endString = ips.pluralize( ips.getString( 'x_times' ), occurrences );
|
||||
}
|
||||
} else if( this.scope.find('#event_repeat_end_ondate').is(':checked') ){
|
||||
var dateObj = this._getDate( this.scope.find('input[name="event_dates[repeat_end_date]"]') );
|
||||
var dateObj = ips.utils.time.getDateFromInput( this.scope.find('input[name="event_dates[repeat_end_date]"]') );
|
||||
|
||||
if( ips.utils.time.isValidDateObj( dateObj ) && dateObj.getFullYear() > 1900 ){ // > 1900 just so it doesn't start updating on year 19 etc.
|
||||
endString = ips.getString('until', { date: ips.utils.time.localeDateString( dateObj, { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' } ) } );
|
||||
@@ -649,6 +615,7 @@
|
||||
});
|
||||
}(jQuery, _));]]></file>
|
||||
<order app="global" path="/dev/js//framework/">templates
|
||||
common/ips.loader.js
|
||||
common/ui
|
||||
common/utils
|
||||
common
|
||||
@@ -662,6 +629,4 @@ app.js</order>
|
||||
<order app="global" path="/dev/js//library//jquery">jquery.js
|
||||
jquery.history.js
|
||||
jquery.transform.js</order>
|
||||
<order app="global" path="/dev/js//library//xregexp">xregexp-all.js
|
||||
xregexp-lookbehind.js</order>
|
||||
</javascript>
|
||||
@@ -1,11 +1,14 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<language>
|
||||
<app key="calendar" version="101012">
|
||||
<app key="calendar" version="101093">
|
||||
<word key="__app_calendar" js="0">Calendar</word>
|
||||
<word key="frontnavigation_calendar" js="0">Calendar</word>
|
||||
<word key="__indefart_calendar_event_comment" js="0">a comment on a calendar event</word>
|
||||
<word key="__indefart_calendar_event" js="0">a calendar event</word>
|
||||
<word key="__indefart_calendar_event_review" js="0">a review on a calendar event</word>
|
||||
<word key="__defart_calendar_event_comment" js="0">comment on a calendar event</word>
|
||||
<word key="__defart_calendar_event" js="0">calendar event</word>
|
||||
<word key="__defart_calendar_event_review" js="0">review on a calendar event</word>
|
||||
<word key="calendar_event_container" js="0">calendar</word>
|
||||
<word key="menu__calendar_calendars" js="0">Calendar</word>
|
||||
<word key="menu__calendar_calendars_calendars" js="0">Calendars</word>
|
||||
@@ -16,7 +19,11 @@
|
||||
<word key="module__calendar_events" js="0">Events</word>
|
||||
<word key="event" js="0">Event</word>
|
||||
<word key="editor__calendar_Events" js="0">Calendar Events</word>
|
||||
<word key="editor__calendar_Calendar" js="0">Calendars</word>
|
||||
<word key="acp_search_title_calendar_Calendars" js="0">Calendars</word>
|
||||
<word key="calendar_event_pl_lc" js="0">calendar events</word>
|
||||
<word key="search_contextual_item_calendars" js="0">This Calendar</word>
|
||||
<word key="search_contextual_item_calendar_event" js="0">This Event</word>
|
||||
<word key="r__calendars" js="0">Calendars</word>
|
||||
<word key="r__calendars_manage" js="0">Can manage calendars?</word>
|
||||
<word key="r__calendars_add" js="0">Can add calendars?</word>
|
||||
@@ -36,6 +43,7 @@
|
||||
<word key="ipb_calendar_mon" js="0">Start calendar on Monday</word>
|
||||
<word key="ipb_calendar_mon_desc" js="0">By default, the calendar will use Sunday as the start day for each week. You can use this setting to start the calendar on Monday instead.</word>
|
||||
<word key="calendar_rss_feed" js="0">Enable upcoming events RSS feed</word>
|
||||
<word key="calendar_rss_feed_desc" js="0"><![CDATA[Only content that is available to guests will be shown. For more options, create a <a href='{internal.app=core&module=discovery&controller=rss}'>Custom RSS Feed</a>]]></word>
|
||||
<word key="calendar_rss_feed_days" js="0">Number of forthcoming days to include in the feed</word>
|
||||
<word key="acplogs__calendar_settings" js="0">Updated calendar settings</word>
|
||||
<word key="calendar_default_view" js="0">Default layout</word>
|
||||
@@ -44,7 +52,7 @@
|
||||
<word key="cal_df_week" js="0">Current week</word>
|
||||
<word key="cal_df_day" js="0">Current day</word>
|
||||
<word key="cal_df_stream" js="0">Stream of upcoming events</word>
|
||||
<word key="filestorage__calendar_Events" js="0">IP.Calendar Event Cover Photos</word>
|
||||
<word key="filestorage__calendar_Events" js="0">Calendar Event Cover Photos</word>
|
||||
<word key="calendar_df_locale" js="0">Use default date formatting</word>
|
||||
<word key="calendar_df_d_sm_y" js="0">DD MMM YYYY (Example: 01 Jan 2000)</word>
|
||||
<word key="calendar_df_d_lm_y" js="0">DD Month YYYY (Example: 01 January 2000)</word>
|
||||
@@ -139,13 +147,14 @@
|
||||
<word key="cal_week_title" js="0">%s %s %s - %s %s %s</word>
|
||||
<word key="cal_week_title_wb" js="0">w/b %s %s %s</word>
|
||||
<word key="cal_month_day" js="0">%s %s, %s</word>
|
||||
<word key="cal_month_day_noyear" js="0">%s %s</word>
|
||||
<word key="all_calendars" js="0">All Calendars</word>
|
||||
<word key="create_event" js="0">Create Event</word>
|
||||
<word key="select_calendar" js="0">Select Calendar</word>
|
||||
<word key="add_event" js="0">Add event</word>
|
||||
<word key="previous_month" js="0">Prev Month</word>
|
||||
<word key="next_month" js="0">Next Month</word>
|
||||
<word key="day" js="0">Day</word>
|
||||
<word key="yesterday" js="0">Yesterday</word>
|
||||
<word key="tomorrow" js="0">Tomorrow</word>
|
||||
<word key="prev_day" js="0">Prev Day</word>
|
||||
<word key="next_day" js="0">Next Day</word>
|
||||
@@ -158,12 +167,15 @@
|
||||
<word key="error_bad_date" js="0">The date you requested appears to be invalid</word>
|
||||
<word key="birthdays_today" js="0">{# [1:birthday][?:birthdays]} today</word>
|
||||
<word key="birthdays_count" js="0">{# [1:birthday][?:birthdays]}</word>
|
||||
<word key="birthdays_view_all" js="0">View all</word>
|
||||
<word key="calendar_event" js="0">Event</word>
|
||||
<word key="calendar_event_comment" js="0">Event Comment</word>
|
||||
<word key="calendar_event_review" js="0">Event Review</word>
|
||||
<word key="calendar_event_pl" js="0">Events</word>
|
||||
<word key="calendar_event_comment_pl" js="0">Event Comments</word>
|
||||
<word key="calendar_event_comment_pl_lc" js="0">event comments</word>
|
||||
<word key="calendar_event_review_pl" js="0">Event Reviews</word>
|
||||
<word key="calendar_event_review_pl_lc" js="0">event reviews</word>
|
||||
<word key="event_review_count" js="0"><![CDATA[<span id='reviewCount'>{#}</span> {!# [1:Review][?:Reviews]}]]></word>
|
||||
<word key="event_comment_count" js="0"><![CDATA[<span id='commentCount'>{#}</span> {!# [1:Comment][?:Comments]}]]></word>
|
||||
<word key="event_rsvp_attendees_list" js="0">{# [1:user has][?:users have]} RSVPed{!#[0: ][?:, including]}</word>
|
||||
@@ -174,12 +186,13 @@
|
||||
<word key="event_calendar_id" js="0">Calendar</word>
|
||||
<word key="event_container" js="0">Calendar</word>
|
||||
<word key="event_title" js="0">Title</word>
|
||||
<word key="event_ip_address" js="0">IP Address</word>
|
||||
<word key="event_tags" js="0">Tags</word>
|
||||
<word key="event_content" js="0">Description</word>
|
||||
<word key="event_dates" js="0">Date</word>
|
||||
<word key="rsvp" js="0">RSVP</word>
|
||||
<word key="event_rsvp" js="0">Request RSVP</word>
|
||||
<word key="event_rsvp_desc" js="0">Members who are allowed to RSVP for events will be asked to do so and will be able to see the list of members who have RSVP'd for this event</word>
|
||||
<word key="event_rsvp_desc" js="0">Members who are allowed to RSVP for events will be asked to do so and will be able to see the list of members who have RSVP'd for this event. For recurring events, responses apply to all occurrences.</word>
|
||||
<word key="event_to" js="0">to</word>
|
||||
<word key="event_all_day" js="0">This is an all day event</word>
|
||||
<word key="event_repeat" js="0">Repeat</word>
|
||||
@@ -205,11 +218,11 @@
|
||||
<word key="event_auto_follow" js="0"></word>
|
||||
<word key="event_auto_follow_suffix" js="0">Notify me when other comments are posted</word>
|
||||
<word key="event_rsvp_limit" js="0">RSVP Limit</word>
|
||||
<word key="event_rsvp_limit_desc" js="0">Once the limit is reached, no further attendees will be allowed to RSVP for this event</word>
|
||||
<word key="event_rsvp_limit_desc" js="0">Once the limit is reached, no further attendees will be allowed to RSVP for this event.</word>
|
||||
<word key="event_cover_photo" js="0">Cover Photo</word>
|
||||
<word key="event_location" js="0">Location</word>
|
||||
<word key="event_album" js="0">Album</word>
|
||||
<word key="event_album_desc" js="0">You can link an album from the Gallery to this event which will show the images on the event page and cause information about the event to be displayed on the album page</word>
|
||||
<word key="event_album_desc" js="0">You can link an album from the Gallery to this event which will show the images on the event page and cause information about the event to be displayed on the album page.</word>
|
||||
<word key="submit_event_start" js="0">Event Start</word>
|
||||
<word key="submit_event_end" js="0">Event End</word>
|
||||
<word key="submit_event_summary" js="0">Summary</word>
|
||||
@@ -258,6 +271,7 @@
|
||||
<word key="rsvp_attendees" js="0">Going</word>
|
||||
<word key="rsvp_maybe_attendees" js="0">Maybe</word>
|
||||
<word key="rsvp_notgoing_attendees" js="0">Declined</word>
|
||||
<word key="event_address" js="0">Event Address</word>
|
||||
<word key="no_rsvps_yet" js="0">No one is attending yet.</word>
|
||||
<word key="no_decline_rsvps_yet" js="0">No one has declined yet.</word>
|
||||
<word key="no_maybe_rsvps_yet" js="0">No one has said they might go yet.</word>
|
||||
@@ -270,22 +284,22 @@
|
||||
<word key="rsvp_download" js="0">Download guest list</word>
|
||||
<word key="event_rsvp_attendees_other" js="0">Other Responses</word>
|
||||
<word key="recur_human_yearly" js="0">This event repeats every year %s</word>
|
||||
<word key="recur_human_yearly_multi" js="0">This event repeats every %s years %s</word>
|
||||
<word key="recur_human_yearly_multi" js="0">This event repeats every {# [?:years]} %s</word>
|
||||
<word key="recur_human_monthly" js="0">This event repeats every month %s</word>
|
||||
<word key="recur_human_monthly_multi" js="0">This event repeats every %s months %s</word>
|
||||
<word key="recur_human_monthly_multi" js="0">This event repeats every {# [?:months]} %s</word>
|
||||
<word key="recur_human_weekly" js="0">This event repeats every week %s</word>
|
||||
<word key="recur_human_weekly_multi" js="0">This event repeats every %s weeks %s</word>
|
||||
<word key="recur_human_weekly_multi" js="0">This event repeats every {# [?:weeks]} %s</word>
|
||||
<word key="recur_human_weekly_days" js="0">This event repeats every week on %s %s</word>
|
||||
<word key="recur_human_weekly_multi_days" js="0">This event repeats every %s weeks on %s %s</word>
|
||||
<word key="recur_human_weekly_multi_days" js="0">This event repeats every {# [?:weeks]} on %s %s</word>
|
||||
<word key="recur_human_daily" js="0">This event repeats every day %s</word>
|
||||
<word key="recur_human_daily_multi" js="0">This event repeats every %s days %s</word>
|
||||
<word key="recur_human_daily_multi" js="0">This event repeats every {# [?:days]} %s</word>
|
||||
<word key="recur_human__forever" js="0">forever</word>
|
||||
<word key="recur_human__occurrences" js="0">for {# [1:occurrence][?:occurrences]}</word>
|
||||
<word key="recur_human__until" js="0">until %s</word>
|
||||
<word key="event_rss_feed_off" js="0">This RSS feed is currently unavailable</word>
|
||||
<word key="event_rss_feed_off_admin" js="0">The calendar RSS feed is currently disabled in the admin control panel</word>
|
||||
<word key="event_attendees" js="0">Attendees for %s</word>
|
||||
<word key="rsvp_limit_info" js="0">{# [1:user][?:users]} out of a total limit of %s have RSVPed for this event</word>
|
||||
<word key="rsvp_limit_info" js="0">{# [1:user has][?:users have]} RSVPed for this event. A total of %s can RSVP.</word>
|
||||
<word key="rsvp_limit_nomaybe" js="0">You may only indicate you are going or not going when an event has a limit specified</word>
|
||||
<word key="no_event_review" js="0">You do not have permission to review events</word>
|
||||
<word key="task_BAD_CONTENT" js="0">The iCalendar feed %s is not correctly formatted in a recognized iCalendar format</word>
|
||||
@@ -312,12 +326,12 @@
|
||||
<word key="auto_hide_desc" js="0">Hide this block when there are no results to display</word>
|
||||
<word key="days_ahead" js="0">Number of days to show</word>
|
||||
<word key="maximum_count" js="0">Number of events</word>
|
||||
<word key="view_this_event" js="0">View %s</word>
|
||||
<word key="view_this_event" js="0">View the event %s</word>
|
||||
<word key="block_todaysBirthdays" js="0">Today's Birthdays</word>
|
||||
<word key="block_todaysBirthdays_desc" js="0">Shows birthdays from today</word>
|
||||
<word key="no_members_birthday_today" js="0">No users celebrating today</word>
|
||||
<word key="no_upcoming_events" js="0">No upcoming events found</word>
|
||||
<word key="member_age" js="0">(%s years old)</word>
|
||||
<word key="member_age" js="0">({# [1:year][?:years]} old)</word>
|
||||
<word key="block_recentReviews" js="0">Recent Event Reviews</word>
|
||||
<word key="block_recentReviews_desc" js="0">Display the most recent reviews</word>
|
||||
<word key="no_recent_reviews" js="0">No recent reviews found</word>
|
||||
@@ -366,13 +380,20 @@
|
||||
<word key="timezone_offset_12.75" js="0">[GMT + 12:45] Chatham Islands Time</word>
|
||||
<word key="timezone_offset_13" js="0">[GMT + 13] Phoenix Islands Time</word>
|
||||
<word key="timezone_offset_14" js="0">[GMT + 14] Line Island Time</word>
|
||||
<word key="task__icalendar" js="0">Checks iCalendar feeds for new events and imports into IP.Calendar.</word>
|
||||
<word key="digest_area_calendar" js="0">Events</word>
|
||||
<word key="digest_area_event" js="0">Event</word>
|
||||
<word key="task__icalendar" js="0">Checks iCalendar feeds for new events and imports into Calendar.</word>
|
||||
<word key="digest_area_calendar_calendar" js="0">Events</word>
|
||||
<word key="digest_area_calendar_event" js="0">Event</word>
|
||||
<word key="x_created_event_in" js="0">%s posted an event in %s</word>
|
||||
<word key="x_commented_event" js="0">%s commented on an event</word>
|
||||
<word key="digest_event_on" js="0">Event on</word>
|
||||
<word key="digest_users_going" js="0">{# [1:user][?:users]} going</word>
|
||||
<word key="mailsub__calendar_notification_new_content" js="0"><![CDATA[{$content->mapped("title")|raw}]]></word>
|
||||
<word key="email_new_calevent_plain" js="0">%s has posted %s, %s, for %s</word>
|
||||
<word key="email_new_calevent" js="0"><![CDATA[<a href='%s'>%s</a> has posted %s, <a href='%s'>%s</a>, for %s]]></word>
|
||||
<word key="email_new_calevent_guest" js="0"><![CDATA[%s (Guest) has posted %s, <a href='%s'>%s</a>, for %s]]></word>
|
||||
<word key="__api_calendar_events" js="0">Events</word>
|
||||
<word key="__api_calendar_comments" js="0">Comments</word>
|
||||
<word key="__api_calendar_reviews" js="0">Reviews</word>
|
||||
<word key="x_daily" js="1">{# [1:day][?:days]}</word>
|
||||
<word key="x_weekly" js="1">{# [1:week][?:weeks]}</word>
|
||||
<word key="x_monthly" js="1">{# [1:month][?:months]}</word>
|
||||
|
||||
@@ -0,0 +1,422 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<language>
|
||||
<app key="calendar" version="101093">
|
||||
<word key_rus="Календарь" key="__app_calendar" js="0">Calendar</word>
|
||||
<word key_rus="Календарь" key="frontnavigation_calendar" js="0">Calendar</word>
|
||||
<word key_rus="комментарий события" key="__indefart_calendar_event_comment" js="0">a comment on a calendar event</word>
|
||||
<word key_rus="событие календаря" key="__indefart_calendar_event" js="0">a calendar event</word>
|
||||
<word key_rus="отзыв на событие" key="__indefart_calendar_event_review" js="0">a review on a calendar event</word>
|
||||
<word key_rus="комментарий к событию календаря" key="__defart_calendar_event_comment" js="0">comment on a calendar event</word>
|
||||
<word key_rus="событие календаря" key="__defart_calendar_event" js="0">calendar event</word>
|
||||
<word key_rus="отзыв к событию календаря" key="__defart_calendar_event_review" js="0">review on a calendar event</word>
|
||||
<word key_rus="календарь" key="calendar_event_container" js="0">calendar</word>
|
||||
<word key_rus="Календарь" key="menu__calendar_calendars" js="0">Calendar</word>
|
||||
<word key_rus="Календари" key="menu__calendar_calendars_calendars" js="0">Calendars</word>
|
||||
<word key_rus="Ленты iCalendar" key="menu__calendar_calendars_ical" js="0">iCalendar Feeds</word>
|
||||
<word key_rus="Настройки" key="menu__calendar_calendars_settings" js="0">Settings</word>
|
||||
<word key_rus="Календарь" key="module__calendar_calendar" js="0">Calendar</word>
|
||||
<word key_rus="Календари" key="module__calendar_calendars" js="0">Calendars</word>
|
||||
<word key_rus="События" key="module__calendar_events" js="0">Events</word>
|
||||
<word key_rus="Событие" key="event" js="0">Event</word>
|
||||
<word key_rus="События календаря" key="editor__calendar_Events" js="0">Calendar Events</word>
|
||||
<word key_rus="Календари" key="editor__calendar_Calendar" js="0">Calendars</word>
|
||||
<word key_rus="Календари" key="acp_search_title_calendar_Calendars" js="0">Calendars</word>
|
||||
<word key_rus="событие календаря" key="calendar_event_pl_lc" js="0">calendar events</word>
|
||||
<word key_rus="Этот календарь" key="search_contextual_item_calendars" js="0">This Calendar</word>
|
||||
<word key_rus="Это событие" key="search_contextual_item_calendar_event" js="0">This Event</word>
|
||||
<word key_rus="Календари" key="r__calendars" js="0">Calendars</word>
|
||||
<word key_rus="Можно управлять календарями?" key="r__calendars_manage" js="0">Can manage calendars?</word>
|
||||
<word key_rus="Можно добавлять календари?" key="r__calendars_add" js="0">Can add calendars?</word>
|
||||
<word key_rus="Можно редактировать календари?" key="r__calendars_edit" js="0">Can edit calendars?</word>
|
||||
<word key_rus="Можно упарвлять разрешениями календаря?" key="r__calendars_permissions" js="0">Can manage calendar permissions?</word>
|
||||
<word key_rus="Можно удалять календари?" key="r__calendars_delete" js="0">Can delete calendars?</word>
|
||||
<word key_rus="Ленты iCalendar" key="r__ical" js="0">iCalendar Feeds</word>
|
||||
<word key_rus="Можно управлять импортом лент iCalendar?" key="r__calendar_feeds_manage" js="0">Can manage iCalendar feed imports?</word>
|
||||
<word key_rus="Можно добавлять импорт лент iCalendar?" key="r__calendar_feeds_add" js="0">Can add iCalendar feed imports?</word>
|
||||
<word key_rus="Можно редактировать импорт лент iCalendar?" key="r__calendar_feeds_edit" js="0">Can edit iCalendar feed imports?</word>
|
||||
<word key_rus="Можно удалять импорт лент iCalendar?" key="r__calendar_feeds_delete" js="0">Can delete iCalendar feed imports?</word>
|
||||
<word key_rus="Просмотр календаря: %s" key="loc_calendar_viewing_calendar" js="0">Viewing Calendar: %s</word>
|
||||
<word key_rus="Просмотр календаря" key="loc_calendar_viewing_calendar_all" js="0">Viewing Calendar</word>
|
||||
<word key_rus="Просмотр события: %s" key="loc_calendar_viewing_event" js="0">Viewing Event: %s</word>
|
||||
<word key_rus="Показать дни рождения в календаре" key="show_bday_calendar" js="0">Show birthdays on calendar</word>
|
||||
<word key_rus="Если включено, календарь будет показывать количество дней рождения пользователей за каждый день и отобразит список празднующих пользователей при просмотре даты." key="show_bday_calendar_desc" js="0">When enabled, the calendar will show the number of member birthdays for each day and will list member birthdays when viewing a date.</word>
|
||||
<word key_rus="Начать календарь с понедельника" key="ipb_calendar_mon" js="0">Start calendar on Monday</word>
|
||||
<word key_rus="По умолчанию, календарь будет использовать воскресенье в качестве дня начала недели. Вы можете использовать этот параметр для начала календаря с понедельника." key="ipb_calendar_mon_desc" js="0">By default, the calendar will use Sunday as the start day for each week. You can use this setting to start the calendar on Monday instead.</word>
|
||||
<word key_rus="Включить RSS-ленту предстоящих событий" key="calendar_rss_feed" js="0">Enable upcoming events RSS feed</word>
|
||||
<word key_rus="Будет отображён контент, доступный для гостей. Для получения дополнительных возможностей, создайте <a href='{internal.app=core&module=discovery&controller=rss}'>Пользовательскую RSS ленту</a>" key="calendar_rss_feed_desc" js="0"><![CDATA[Only content that is available to guests will be shown. For more options, create a <a href='{internal.app=core&module=discovery&controller=rss}'>Custom RSS Feed</a>]]></word>
|
||||
<word key_rus="Количество предстоящих дней событий для включения в ленту" key="calendar_rss_feed_days" js="0">Number of forthcoming days to include in the feed</word>
|
||||
<word key_rus="Настройки календаря обновлены" key="acplogs__calendar_settings" js="0">Updated calendar settings</word>
|
||||
<word key_rus="Стандартный шаблон" key="calendar_default_view" js="0">Default layout</word>
|
||||
<word key_rus="Эта настройка позволяет вам настраивать стандартный шаблон главной страницы календаря. Пользователи могут переопределить стандартный вид, если захотят." key="calendar_default_view_desc" js="0">This setting allows you to control the default layout of the calendar homepage. Users can override the default view if they wish.</word>
|
||||
<word key_rus="Текущий месяц" key="cal_df_month" js="0">Current month</word>
|
||||
<word key_rus="Текущая неделя" key="cal_df_week" js="0">Current week</word>
|
||||
<word key_rus="Текущий день" key="cal_df_day" js="0">Current day</word>
|
||||
<word key_rus="Лента предстоящих событий" key="cal_df_stream" js="0">Stream of upcoming events</word>
|
||||
<word key_rus="Обложки событий календаря" key="filestorage__calendar_Events" js="0">Calendar Event Cover Photos</word>
|
||||
<word key_rus="Использовать стандартное форматирование даты" key="calendar_df_locale" js="0">Use default date formatting</word>
|
||||
<word key_rus="ДД МММ ГГГГ (Пример: 01 Янв 2015)" key="calendar_df_d_sm_y" js="0">DD MMM YYYY (Example: 01 Jan 2000)</word>
|
||||
<word key_rus="ДД Месяц ГГГГ (Пример: 01 Январь 2015)" key="calendar_df_d_lm_y" js="0">DD Month YYYY (Example: 01 January 2000)</word>
|
||||
<word key_rus="МММ ДД, ГГГГ (Пример: Янв 01, 2015)" key="calendar_df_sm_d_y" js="0">MMM DD, YYYY (Example: Jan 01, 2000)</word>
|
||||
<word key_rus="Месяц ДД, ГГГГ (Пример: Январь 01, 2015)" key="calendar_df_lm_d_y" js="0">Month DD, YYYY (Example: January 01, 2000)</word>
|
||||
<word key_rus="Или укажите другой формат" key="calendar_custom_df" js="0">Or specify a custom date format</word>
|
||||
<word key_rus="Формат даты для мероприятий" key="calendar_date_format" js="0">Date format for events</word>
|
||||
<word key_rus="Пользовательский формат даты" key="calendar_date_format_custom" js="0">Custom date format</word>
|
||||
<word key_rus="Вы можете использовать любой <a href='http://php.net/strftime' target='_blank'>PHP формат</a> для отображения дат в календаре" key="calendar_date_format_custom_desc" js="0"><![CDATA[You can use any <a href='http://php.net/strftime' target='_blank'>PHP strftime</a> options to specify a custom format for dates in calendar]]></word>
|
||||
<word key_rus="Вы должны выбрать предопределенный формат даты или указать пользовательский" key="calendar_no_date_format" js="0">You must either choose a predefined date format or specify a custom date format</word>
|
||||
<word key_rus="Календари" key="calendars" js="0">Calendars</word>
|
||||
<word key_rus="Календарь" key="calendars_sg" js="0">Calendar</word>
|
||||
<word key_rus="Настройки" key="calendar_settings" js="0">Settings</word>
|
||||
<word key_rus="Разрешения" key="calendar_permissions" js="0">Permissions</word>
|
||||
<word key_rus="Модерация" key="calendar_moderation" js="0">Moderation</word>
|
||||
<word key_rus="Название" key="cal_title" js="0">Name</word>
|
||||
<word key_rus="События должны быть одобрены?" key="cal_moderate" js="0">Events must be approved?</word>
|
||||
<word key_rus="Комментарии должны быть одобрены?" key="cal_comment_moderate" js="0">Comments must be approved?</word>
|
||||
<word key_rus="Разрешить комментарии?" key="cal_allow_comments" js="0">Allow comments?</word>
|
||||
<word key_rus="Разрешить отзывы?" key="cal_allow_reviews" js="0">Allow reviews?</word>
|
||||
<word key_rus="Отзывы должны быть одобрены?" key="cal_review_moderate" js="0">Reviews must be approved?</word>
|
||||
<word key_rus="" key="calperm_perm__label" js="0"></word>
|
||||
<word key_rus="Просмотр календаря" key="calperm_perm__view" js="0">See Calendar</word>
|
||||
<word key_rus="Просмотр событий" key="calperm_perm__read" js="0">View Events</word>
|
||||
<word key_rus="Добавление событий" key="calperm_perm__add" js="0">Add Events</word>
|
||||
<word key_rus="Комментирование" key="calperm_perm__reply" js="0">Comment</word>
|
||||
<word key_rus="Запрашивать RSVP" key="calperm_perm__askrsvp" js="0">Request RSVP</word>
|
||||
<word key_rus="RSVP" key="calperm_perm__rsvp" js="0">RSVP</word>
|
||||
<word key_rus="Отзыв" key="calperm_perm__review" js="0">Review</word>
|
||||
<word key_rus="Цвет" key="cal_color" js="0">Color</word>
|
||||
<word key_rus="Добавить календарь" key="add_calendar" js="0">Add Calendar</word>
|
||||
<word key_rus="Изменить календарь" key="edit_calendar" js="0">Edit Calendar</word>
|
||||
<word key_rus="Календарь" key="modperms__core_Content_calendar_Event" js="0">Calendar</word>
|
||||
<word key_rus="Календари" key="calendar_calendars" js="0">Calendars</word>
|
||||
<word key_rus="Можно закреплять события?" key="can_pin_calendar_event" js="0">Can pin events?</word>
|
||||
<word key_rus="Можно откреплять события?" key="can_unpin_calendar_event" js="0">Can unpin events?</word>
|
||||
<word key_rus="Можно устанавливать события популярными?" key="can_feature_calendar_event" js="0">Can feature events?</word>
|
||||
<word key_rus="Можно устанавливать события непопулярными?" key="can_unfeature_calendar_event" js="0">Can unfeature events?</word>
|
||||
<word key_rus="Можно перемещать события?" key="can_move_calendar_event" js="0">Can move events?</word>
|
||||
<word key_rus="Можно блокировать события?" key="can_lock_calendar_event" js="0">Can lock events?</word>
|
||||
<word key_rus="Можно разблокировать события?" key="can_unlock_calendar_event" js="0">Can unlock events?</word>
|
||||
<word key_rus="Можно комментировать закрытые события?" key="can_reply_to_locked_calendar_event" js="0">Can comment on locked events?</word>
|
||||
<word key_rus="Можно редактировать события?" key="can_edit_calendar_event" js="0">Can edit events?</word>
|
||||
<word key_rus="Можно скрывать события?" key="can_hide_calendar_event" js="0">Can hide events?</word>
|
||||
<word key_rus="Можно показывать события?" key="can_unhide_calendar_event" js="0">Can unhide events?</word>
|
||||
<word key_rus="Можно просматривать скрытые события?" key="can_view_hidden_calendar_event" js="0">Can view hidden events?</word>
|
||||
<word key_rus="Можно удалять события?" key="can_delete_calendar_event" js="0">Can delete events?</word>
|
||||
<word key_rus="Можно редактировать комментарии?" key="can_edit_calendar_event_comment" js="0">Can edit comments?</word>
|
||||
<word key_rus="Можно скрывать комментарии?" key="can_hide_calendar_event_comment" js="0">Can hide comments?</word>
|
||||
<word key_rus="Можно показывать комментарии?" key="can_unhide_calendar_event_comment" js="0">Can unhide comments?</word>
|
||||
<word key_rus="Можно просматривать скрытые комментарии?" key="can_view_hidden_calendar_event_comment" js="0">Can view hidden comments?</word>
|
||||
<word key_rus="Можно удалять комментарии?" key="can_delete_calendar_event_comment" js="0">Can delete comments?</word>
|
||||
<word key_rus="Можно редактировать отзывы?" key="can_edit_calendar_event_review" js="0">Can edit reviews?</word>
|
||||
<word key_rus="Можно скрывать отзывы?" key="can_hide_calendar_event_review" js="0">Can hide reviews?</word>
|
||||
<word key_rus="Можно показывать отзывы?" key="can_unhide_calendar_event_review" js="0">Can unhide reviews?</word>
|
||||
<word key_rus="Можно просматривать скрытые отзывы?" key="can_view_hidden_calendar_event_review" js="0">Can view hidden reviews?</word>
|
||||
<word key_rus="Можно удалять отзывы?" key="can_delete_calendar_event_review" js="0">Can delete reviews?</word>
|
||||
<word key_rus="Импорт ленты iCalendar" key="ical_title" js="0">iCalendar Feed Imports</word>
|
||||
<word key_rus="Заголовок" key="ical_feed_title" js="0">Title</word>
|
||||
<word key_rus="Добавлено" key="ical_feed_added" js="0">Added</word>
|
||||
<word key_rus="Последнее обновление" key="ical_feed_lastupdated" js="0">Last Updated</word>
|
||||
<word key_rus="Календарь" key="ical_feed_calendar_id" js="0">Calendar</word>
|
||||
<word key_rus="URL" key="ical_feed_url" js="0">URL</word>
|
||||
<word key_rus="Добавить ленту iCalendar" key="calendar_feeds_add" js="0">Add iCalendar Feed</word>
|
||||
<word key_rus="Загрузить файл iCalendar" key="calendar_feeds_upload" js="0">Upload iCalendar File</word>
|
||||
<word key_rus="Импорт новых событий" key="update_ical" js="0">Import new events</word>
|
||||
<word key_rus="Название" key="feed_title" js="0">Name</word>
|
||||
<word key_rus="URL" key="feed_url" js="0">URL</word>
|
||||
<word key_rus="URL должен начинаться с http://, https:// или webcal://" key="feed_url_desc" js="0">The URL should start with http://, https:// or webcal://</word>
|
||||
<word key_rus="Пользователь" key="feed_member_id" js="0">Member</word>
|
||||
<word key_rus="События, импортированные этой лентой, будут созданы под именем этого пользователя" key="feed_member_id_desc" js="0">Events from this feed will be created by this member</word>
|
||||
<word key_rus="Календарь" key="feed_calendar_id" js="0">Calendar</word>
|
||||
<word key_rus="Выберите календарь, в который будут сохранены события, импортированные этой лентой" key="feed_calendar_id_desc" js="0">Select the calendar that events from this feed will be saved to</word>
|
||||
<word key_rus="Включить RSVP" key="feed_allow_rsvp" js="0">Enable RSVP</word>
|
||||
<word key_rus="Если включено, RSVP будет активирован для всех событий, импортированных этой лентой" key="feed_allow_rsvp_desc" js="0">If enabled, RSVP will be enabled for all events imported from this feed</word>
|
||||
<word key_rus="Загружен файл iCalendar (%s событий импортировано и %s пропущено)" key="acplog__ical_uploaded" js="0">Uploaded an iCalendar file (%s events imported and %s events skipped)</word>
|
||||
<word key_rus="Добавлена %s лента iCalendar" key="acplog__icalfeed_created" js="0">Added %s iCalendar feed</word>
|
||||
<word key_rus="Изменена %s лента iCalendar" key="acplog__icalfeed_updated" js="0">Edited %s iCalendar feed</word>
|
||||
<word key_rus="События iCalendar импортированы" key="feed_uploaded" js="0">iCalendar Events Imported</word>
|
||||
<word key_rus="Обновлена лента iCalendar (%s событий импортировано и %s пропущено)" key="acplog__icalfeed_refreshed" js="0">Refreshed iCalendar feed (%s events imported and %s events skipped)</word>
|
||||
<word key_rus="Обновлена лента iCalendar" key="feed_refreshed" js="0">iCalendar Feed Refreshed</word>
|
||||
<word key_rus="Файл iCalendar" key="feed_file" js="0">iCalendar File</word>
|
||||
<word key_rus="Файлы iCalendar обычно имеют расширение .ics" key="feed_file_desc" js="0">iCalendar files usually have a .ics extension</word>
|
||||
<word key_rus="Мы не смогли найти эту ленту iCalendar" key="feed_not_found" js="0">We could not find that iCalendar feed</word>
|
||||
<word key_rus="Лента iCalendar %s удалена" key="acplog__icalfeed_deleted" js="0">%s iCalendar feed deleted</word>
|
||||
<word key_rus="Хранение событий" key="keep_events" js="0">Keep Events</word>
|
||||
<word key_rus="Вы можете выбрать события для удаления, которые были импортированы этой лентой" key="keep_events_desc" js="0">You can choose to remove events that were imported from this feed</word>
|
||||
<word key_rus="Лента является недопустимой, т.к. отсутствует контент для импорта" key="ical_error_NO_CONTENT" js="0">The feed appears to be invalid because no content was returned</word>
|
||||
<word key_rus="Лента является недопустимой, т.к. контент не соответствует ожидаемому формату" key="ical_error_BAD_CONTENT" js="0">The feed appears to be invalid because content not matching the expected format was returned</word>
|
||||
<word key_rus="%s %s" key="cal_month_title" js="0">%s %s</word>
|
||||
<word key_rus="Лента событий для %s %s" key="cal_month_stream_title" js="0">Event stream for %s %s</word>
|
||||
<word key_rus="%s %s %s - %s %s %s" key="cal_week_title" js="0">%s %s %s - %s %s %s</word>
|
||||
<word key_rus="w/b %s %s %s" key="cal_week_title_wb" js="0">w/b %s %s %s</word>
|
||||
<word key_rus="%s %s, %s" key="cal_month_day" js="0">%s %s, %s</word>
|
||||
<word key_rus="%s %s" key="cal_month_day_noyear" js="0">%s %s</word>
|
||||
<word key_rus="Все календари" key="all_calendars" js="0">All Calendars</word>
|
||||
<word key_rus="Создать событие" key="create_event" js="0">Create Event</word>
|
||||
<word key_rus="Выбрать календарь" key="select_calendar" js="0">Select Calendar</word>
|
||||
<word key_rus="Добавить событие" key="add_event" js="0">Add event</word>
|
||||
<word key_rus="Предыдущий месяц" key="previous_month" js="0">Prev Month</word>
|
||||
<word key_rus="Следующий месяц" key="next_month" js="0">Next Month</word>
|
||||
<word key_rus="День" key="day" js="0">Day</word>
|
||||
<word key_rus="Завтра" key="tomorrow" js="0">Tomorrow</word>
|
||||
<word key_rus="Предыдущий день" key="prev_day" js="0">Prev Day</word>
|
||||
<word key_rus="Следующий день" key="next_day" js="0">Next Day</word>
|
||||
<word key_rus="Лента событий" key="event_stream" js="0">Event Stream</word>
|
||||
<word key_rus="Лента" key="event_stream_short" js="0">Stream</word>
|
||||
<word key_rus="Предыдущая неделя" key="previous_week" js="0">Prev Week</word>
|
||||
<word key_rus="Следующая неделя" key="next_week" js="0">Next Week</word>
|
||||
<word key_rus="Событий, запланированных на этот день, нет" key="no_events_today" js="0">No events scheduled today</word>
|
||||
<word key_rus="Событий, запланированных на этот месяц, нет" key="no_events_month" js="0">No events scheduled this month</word>
|
||||
<word key_rus="Дата недействительна" key="error_bad_date" js="0">The date you requested appears to be invalid</word>
|
||||
<word key_rus="Сегодня {# [*1:день рождения][*2:дня рождения][*3:дня рождения][*4:дня рождения][11:дней рождений][12:дней рождений][13:дней рождений][14:дней рождений][?:дней рождений]}" key="birthdays_today" js="0">{# [1:birthday][?:birthdays]} today</word>
|
||||
<word key_rus="{# [*1:день рождения][*2:дня рождения][*3:дня рождения][*4:дня рождения][11:дней рождений][12:дней рождений][13:дней рождений][14:дней рождений][?:дней рождений]}" key="birthdays_count" js="0">{# [1:birthday][?:birthdays]}</word>
|
||||
<word key_rus="Посмотреть все" key="birthdays_view_all" js="0">View all</word>
|
||||
<word key_rus="Событие" key="calendar_event" js="0">Event</word>
|
||||
<word key_rus="Комментарий события" key="calendar_event_comment" js="0">Event Comment</word>
|
||||
<word key_rus="Отзыв о событии" key="calendar_event_review" js="0">Event Review</word>
|
||||
<word key_rus="События" key="calendar_event_pl" js="0">Events</word>
|
||||
<word key_rus="Комментарии события" key="calendar_event_comment_pl" js="0">Event Comments</word>
|
||||
<word key_rus="комментарии события" key="calendar_event_comment_pl_lc" js="0">event comments</word>
|
||||
<word key_rus="Отзывы о событии" key="calendar_event_review_pl" js="0">Event Reviews</word>
|
||||
<word key_rus="отзывы календаря" key="calendar_event_review_pl_lc" js="0">event reviews</word>
|
||||
<word key_rus="<span id='reviewCount'>{#}</span> {!# [*1:Отзыв][*2:Отзыва][*3:Отзыва][*4:Отзыва][11:Отзывов][12:Отзывов][13:Отзывов][14:Отзывов][?:Отзывов]}" key="event_review_count" js="0"><![CDATA[<span id='reviewCount'>{#}</span> {!# [1:Review][?:Reviews]}]]></word>
|
||||
<word key_rus="<span id='commentCount'>{#}</span> {!# [*1:Комментарий][*2:Комментария][*3:Комментария][*4:Комментария][11:Комментариев][12:Комментариев][13:Комментариев][14:Комментариев][?:Комментариев]}" key="event_comment_count" js="0"><![CDATA[<span id='commentCount'>{#}</span> {!# [1:Comment][?:Comments]}]]></word>
|
||||
<word key_rus="{# [*1:пользователь имеет][*2:пользователя имеют][*3:пользователя имеют][*4:пользователя имеют][11:пользователей имеют][12:пользователей имеют][13:пользователей имеют][14:пользователей имеют][?:пользователей имеют]} приглашения (RSVP){!#[0: ][?:, в том числе]}" key="event_rsvp_attendees_list" js="0">{# [1:user has][?:users have]} RSVPed{!#[0: ][?:, including]}</word>
|
||||
<word key_rus="Предстоящие события" key="calendar_rss_title" js="0">Upcoming Events</word>
|
||||
<word key_rus="Добавить событие" key="submit_event" js="0">Submit an event</word>
|
||||
<word key_rus="С '%s'" key="with_calendar" js="0">With '%s'</word>
|
||||
<word key_rus="Со всеми Календарями" key="with_all_calendars" js="0">With All Calendars</word>
|
||||
<word key_rus="Календарь" key="event_calendar_id" js="0">Calendar</word>
|
||||
<word key_rus="Календарь" key="event_container" js="0">Calendar</word>
|
||||
<word key_rus="Заголовок" key="event_title" js="0">Title</word>
|
||||
<word key_rus="IP-адрес" key="event_ip_address" js="0">IP Address</word>
|
||||
<word key_rus="Теги" key="event_tags" js="0">Tags</word>
|
||||
<word key_rus="Описание" key="event_content" js="0">Description</word>
|
||||
<word key_rus="Дата" key="event_dates" js="0">Date</word>
|
||||
<word key_rus="RSVP" key="rsvp" js="0">RSVP</word>
|
||||
<word key_rus="Требовать RSVP" key="event_rsvp" js="0">Request RSVP</word>
|
||||
<word key_rus="Пользователи, которым разрешено отвечать на приглашения (RSVP) на события, будет предложено сделать это и смогут увидеть список пользователей, кто уже ответил на приглашение на это событие. Для повторяющихся событий, ответы применяются ко всем вхождениям." key="event_rsvp_desc" js="0">Members who are allowed to RSVP for events will be asked to do so and will be able to see the list of members who have RSVP'd for this event. For recurring events, responses apply to all occurrences.</word>
|
||||
<word key_rus="до" key="event_to" js="0">to</word>
|
||||
<word key_rus="Это событие продлится весь день" key="event_all_day" js="0">This is an all day event</word>
|
||||
<word key_rus="Повтор" key="event_repeat" js="0">Repeat</word>
|
||||
<word key_rus="Изменить часовой пояс" key="change_timezone" js="0">Change the time zone</word>
|
||||
<word key_rus="Часовой пояс события" key="event_timezone" js="0">Event Time Zone</word>
|
||||
<word key_rus="Повторы:" key="event_rpm_repeats" js="0">Repeats:</word>
|
||||
<word key_rus="Ежедневно" key="event_rpm_repeats_daily" js="0">Daily</word>
|
||||
<word key_rus="Еженедельно" key="event_rpm_repeats_weekly" js="0">Weekly</word>
|
||||
<word key_rus="Ежемесячно" key="event_rpm_repeats_monthly" js="0">Monthly</word>
|
||||
<word key_rus="Ежегодно" key="event_rpm_repeats_yearly" js="0">Yearly</word>
|
||||
<word key_rus="Повторять каждые:" key="event_rpm_repeatevery" js="0">Repeat every:</word>
|
||||
<word key_rus="дней" key="event_rpm_repeatevery_day" js="0">days</word>
|
||||
<word key_rus="недели" key="event_rpm_repeatevery_week" js="0">weeks</word>
|
||||
<word key_rus="месяцев" key="event_rpm_repeatevery_month" js="0">months</word>
|
||||
<word key_rus="лет" key="event_rpm_repeatevery_year" js="0">years</word>
|
||||
<word key_rus="Повтор на:" key="event_rpm_repeaton" js="0">Repeat on:</word>
|
||||
<word key_rus="Событие на один день" key="event_single_day" js="0">Single day event</word>
|
||||
<word key_rus="Окончание:" key="event_rpm_ends" js="0">Ends:</word>
|
||||
<word key_rus="Никогда" key="event_rpm_ends_never" js="0">Never</word>
|
||||
<word key_rus="После" key="event_rpm_ends_afterx" js="0">After</word>
|
||||
<word key_rus="прошедших событий" key="event_rpm_ends_occurrencesx" js="0">occurrences</word>
|
||||
<word key_rus="В" key="event_rpm_ends_date" js="0">On</word>
|
||||
<word key_rus="" key="event_auto_follow" js="0"></word>
|
||||
<word key_rus="Сообщать мне при публикации комментариев" key="event_auto_follow_suffix" js="0">Notify me when other comments are posted</word>
|
||||
<word key_rus="Лимит RSVP" key="event_rsvp_limit" js="0">RSVP Limit</word>
|
||||
<word key_rus="Как только лимит достигнут, дальнейшие участники не будут допущены к RSVP этого события." key="event_rsvp_limit_desc" js="0">Once the limit is reached, no further attendees will be allowed to RSVP for this event.</word>
|
||||
<word key_rus="Обложка" key="event_cover_photo" js="0">Cover Photo</word>
|
||||
<word key_rus="Местонахождение" key="event_location" js="0">Location</word>
|
||||
<word key_rus="Альбом" key="event_album" js="0">Album</word>
|
||||
<word key_rus="Вы можете связать альбом из Галереи с этим событием, который отобразит изображения на странице события и вызовет информацию об этом событии на странице альбома." key="event_album_desc" js="0">You can link an album from the Gallery to this event which will show the images on the event page and cause information about the event to be displayed on the album page.</word>
|
||||
<word key_rus="Событие начинается" key="submit_event_start" js="0">Event Start</word>
|
||||
<word key_rus="Событие заканчивается" key="submit_event_end" js="0">Event End</word>
|
||||
<word key_rus="Суммируем" key="submit_event_summary" js="0">Summary</word>
|
||||
<word key_rus="Это событие повторяется" key="submit_event_repeats_check" js="0">This event repeats</word>
|
||||
<word key_rus="Повторы" key="submit_event_repeats" js="0">Repeats</word>
|
||||
<word key_rus="удалить" key="submit_event_remove_repeat" js="0">remove</word>
|
||||
<word key_rus="Добавить событие" key="add_cal_event_header" js="0">Add Calendar Event</word>
|
||||
<word key_rus="Перейти" key="calendar_jump" js="0">Go</word>
|
||||
<word key_rus="Сегодня" key="calendar_jump_today" js="0">Go to today</word>
|
||||
<word key_rus="Перейти к..." key="jump_to_placeholder" js="0">Jump to...</word>
|
||||
<word key_rus="Перейти к" key="jump_to" js="0">Jump to</word>
|
||||
<word key_rus="Сегодняшние события" key="events_happening_today" js="0">Events happening today</word>
|
||||
<word key_rus="ВЕСЬ<br>ДЕНЬ" key="day_view_all_day" js="0"><![CDATA[ALL<br>DAY]]></word>
|
||||
<word key_rus="Вы пойдёте" key="you_are_going" js="0">You are going</word>
|
||||
<word key_rus="Вы посетите это событие" key="you_are_going_to_this" js="0">You are going to this event</word>
|
||||
<word key_rus="Вы не собираетесь посещать это событие" key="you_are_not_going_to_this" js="0">You are not going to this event</word>
|
||||
<word key_rus="Подтвердить участие" key="confirm_attendance" js="0">Confirm attendance</word>
|
||||
<word key_rus="Популярные события" key="featured_events" js="0">Featured Events</word>
|
||||
<word key_rus="Пожалуйста, выберите дату завершения после даты начала события" key="end_date_before_start" js="0">Please select an end date after the event start date</word>
|
||||
<word key_rus="Указанная дата начала неверна" key="invalid_start_date" js="0">The provided start date is not valid</word>
|
||||
<word key_rus="Указанная дата завершения события неверна" key="invalid_end_date" js="0">The provided end date is not valid</word>
|
||||
<word key_rus="Сохранить" key="event__save" js="0">Save</word>
|
||||
<word key_rus="Удалить событие" key="calendar_delete_title" js="0">Delete this event</word>
|
||||
<word key_rus="%s %s" key="blurb_date_with_time" js="0">%s %s</word>
|
||||
<word key_rus="%s - %s в %s" key="blurb_start_and_end" js="0">%s - %s in %s</word>
|
||||
<word key_rus="%s в %s" key="blurb_start_only" js="0">%s in %s</word>
|
||||
<word key_rus="Скачать событие" key="download_ical" js="0">Download Event</word>
|
||||
<word key_rus="Скачать это событие в качестве файла iCal" key="download_ical_title" js="0">Download this event as an iCal file</word>
|
||||
<word key_rus="О событии" key="event_details" js="0">Event details</word>
|
||||
<word key_rus="Событие создал %s" key="event_created_by" js="0">Event created by %s</word>
|
||||
<word key_rus="Ваш рейтинг" key="event_rating_value" js="0">Your Rating</word>
|
||||
<word key_rus="Ваш отзыв" key="event_review_text" js="0">Your Review</word>
|
||||
<word key_rus="Добавить отзыв..." key="event__review_placeholder" js="0">Add a review...</word>
|
||||
<word key_rus="Добавить комментарий..." key="event__comment_placeholder" js="0">Add a comment...</word>
|
||||
<word key_rus="Добавить комментарий" key="event_submit_comment" js="0">Submit Comment</word>
|
||||
<word key_rus="Участники" key="event_rsvp_attendees" js="0">Attendees</word>
|
||||
<word key_rus="Пожаловаться" key="report_event" js="0">Report Event</word>
|
||||
<word key_rus="Изменить" key="calendar_edit_details" js="0">Edit Details</word>
|
||||
<word key_rus="Изменить детали этого события" key="calendar_edit_details_title" js="0">Edit this event's details</word>
|
||||
<word key_rus="Управление" key="manage_event" js="0">Manage Event</word>
|
||||
<word key_rus="Это событие ещё не одобрено и видно только для модераторов." key="event_pending_approval" js="0">This event is not yet approved and is only visible to staff.</word>
|
||||
<word key_rus="Покинуть событие" key="rsvp_leave_event" js="0">Leave event</word>
|
||||
<word key_rus="Пойду" key="rsvp_attend_event" js="0">Going</word>
|
||||
<word key_rus="Может быть" key="rsvp_maybe_event" js="0">Maybe</word>
|
||||
<word key_rus="Не пойду" key="rsvp_notgoing_event" js="0">Not going</word>
|
||||
<word key_rus="Пойду" key="rsvp_attendees" js="0">Going</word>
|
||||
<word key_rus="Может быть" key="rsvp_maybe_attendees" js="0">Maybe</word>
|
||||
<word key_rus="Отказаться" key="rsvp_notgoing_attendees" js="0">Declined</word>
|
||||
<word key_rus="Адрес события" key="event_address" js="0">Event Address</word>
|
||||
<word key_rus="Никто пока ещё не собирается." key="no_rsvps_yet" js="0">No one is attending yet.</word>
|
||||
<word key_rus="Никто еще не отказался." key="no_decline_rsvps_yet" js="0">No one has declined yet.</word>
|
||||
<word key_rus="Пока ещё никто не сообщил, что может пойти" key="no_maybe_rsvps_yet" js="0">No one has said they might go yet.</word>
|
||||
<word key_rus="Лимит RSVP достигнут" key="rsvp_limit_reached" js="0">RSVP limit reached</word>
|
||||
<word key_rus="Вы не можете отправлять приглашения (RSVP) на это событие" key="rsvp_error" js="0">You do not have permission to RSVP for this event</word>
|
||||
<word key_rus="Ваше имя было удалено из списка приглашенных на это событие" key="rsvp_not_going" js="0">Your name has been removed from the guest list for this event</word>
|
||||
<word key_rus="Ваше имя было добавлено в список приглашённых гостей" key="rsvp_selection_yes" js="0">Your name has been added to the guest list</word>
|
||||
<word key_rus="Жаль, что Вы не сможете сделать это" key="rsvp_selection_no" js="0">It's too bad you won't be able to make it to the event!</word>
|
||||
<word key_rus="Ваше имя было добавлено в" key="rsvp_selection_maybe" js="0">Your name has been added to the maybe list</word>
|
||||
<word key_rus="Скачать список гостей" key="rsvp_download" js="0">Download guest list</word>
|
||||
<word key_rus="Другие ответы" key="event_rsvp_attendees_other" js="0">Other Responses</word>
|
||||
<word key_rus="Это событие повторяется каждый год %s" key="recur_human_yearly" js="0">This event repeats every year %s</word>
|
||||
<word key_rus="Это событие повторяется {!# [*1:каждый # год][*2:каждые # года][*3:каждые # года][*4:каждые # года][11:каждые # лет][12:каждые # лет][13:каждые # лет][14:каждые # лет][?:# лет]} %s" key="recur_human_yearly_multi" js="0">This event repeats every {# [?:years]} %s</word>
|
||||
<word key_rus="Это событие повторяется каждый месяц %s" key="recur_human_monthly" js="0">This event repeats every month %s</word>
|
||||
<word key_rus="Это событие повторяется {!# [*1:каждый # месяц][*2:каждые # месяца][*3:каждые # месяца][*4:каждые # месяца][11:каждые # месяцев][12:каждые # месяцев][13:каждые # месяцев][14:каждые # месяцев][?:# месяцев]} %s" key="recur_human_monthly_multi" js="0">This event repeats every {# [?:months]} %s</word>
|
||||
<word key_rus="Это событие повторяется каждую неделю %s" key="recur_human_weekly" js="0">This event repeats every week %s</word>
|
||||
<word key_rus="Это событие повторяется {!# [*1:каждую # неделю][*2:каждые # недели][*3:каждые # недели][*4:каждые # недели][11:каждые # недель][12:каждые # недель][13:каждые # недель][14:каждые # недель][?:# недель]} %s" key="recur_human_weekly_multi" js="0">This event repeats every {# [?:weeks]} %s</word>
|
||||
<word key_rus="Это событие повторяется каждую неделю в %s %s" key="recur_human_weekly_days" js="0">This event repeats every week on %s %s</word>
|
||||
<word key_rus="Это событие повторяется {!# [*1:каждую # неделю][*2:каждые # недели][*3:каждые # недели][*4:каждые # недели][11:каждые # недель][12:каждые # недель][13:каждые # недель][14:каждые # недель][?:# недель]} в %s %s" key="recur_human_weekly_multi_days" js="0">This event repeats every {# [?:weeks]} on %s %s</word>
|
||||
<word key_rus="Это событие повторяется каждый день %s" key="recur_human_daily" js="0">This event repeats every day %s</word>
|
||||
<word key_rus="Это событие повторяется {!# [*1:каждый # день][*2:каждые # дня][*3:каждые # дня][*4:каждые # дня][11:каждые # дней][12:каждые # дней][13:каждые # дней][14:каждые # дней][?:# дней]} %s" key="recur_human_daily_multi" js="0">This event repeats every {# [?:days]} %s</word>
|
||||
<word key_rus="навсегда" key="recur_human__forever" js="0">forever</word>
|
||||
<word key_rus="на {# [*1:случай][*2:случая][*3:случая][*4:случая][11:случаев][12:случаев][13:случаев][14:случаев][?:случаев]}" key="recur_human__occurrences" js="0">for {# [1:occurrence][?:occurrences]}</word>
|
||||
<word key_rus="до %s" key="recur_human__until" js="0">until %s</word>
|
||||
<word key_rus="Эта RSS лента сейчас недоступна" key="event_rss_feed_off" js="0">This RSS feed is currently unavailable</word>
|
||||
<word key_rus="RSS лента календаря отключена в админцентре" key="event_rss_feed_off_admin" js="0">The calendar RSS feed is currently disabled in the admin control panel</word>
|
||||
<word key_rus="Участники на %s" key="event_attendees" js="0">Attendees for %s</word>
|
||||
<word key_rus="{# [*1:пользователь приглашен][*2:пользователя приглашены][*3:пользователя приглашены][*4:пользователя приглашены][11:пользователей приглашены][12:пользователей приглашены][13:пользователей приглашены][14:пользователей приглашены][?:пользователей приглашены]} на это мероприятие. Общее количество %s." key="rsvp_limit_info" js="0">{# [1:user has][?:users have]} RSVPed for this event. A total of %s can RSVP.</word>
|
||||
<word key_rus="Когда на событие закончился лимит гостей, вы можете только указать, пойдёте или нет" key="rsvp_limit_nomaybe" js="0">You may only indicate you are going or not going when an event has a limit specified</word>
|
||||
<word key_rus="У вас нет прав на написание отзыва событию" key="no_event_review" js="0">You do not have permission to review events</word>
|
||||
<word key_rus="Лента iCalendar %s неправильно отформатирована в распознаваемый формат" key="task_BAD_CONTENT" js="0">The iCalendar feed %s is not correctly formatted in a recognized iCalendar format</word>
|
||||
<word key_rus="Лента iCalendar %s не предоставила ни одного события для продолжения" key="task_NO_CONTENT" js="0">The iCalendar feed %s did not return any events to process</word>
|
||||
<word key_rus="Подписаться на ленту iCalendar" key="subscribe_webcal" js="0">Subscribe to iCalendar feed</word>
|
||||
<word key_rus="Скачать экспорт iCalendar" key="download_webcal" js="0">Download iCalendar export</word>
|
||||
<word key_rus="Календарь" key="calendar_id" js="0">Calendar</word>
|
||||
<word key_rus="Это событие закрыто, но вам разрешено добавлять новые комментарии." key="event_locked_can_comment" js="0">This event is locked, but your permissions allow you to add new comments.</word>
|
||||
<word key_rus="Это событие закрыто для комментариев." key="event_locked_cannot_comment" js="0">This event is now closed to further comments.</word>
|
||||
<word key_rus="Изображения с этого события" key="event_images" js="0">Images from this event</word>
|
||||
<word key_rus="Переместить событие" key="event_move_title" js="0">Move this event</word>
|
||||
<word key_rus="Популярное событие" key="feature_title_event" js="0">Feature this event</word>
|
||||
<word key_rus="Непопулярное событие" key="unfeature_title_event" js="0">Unfeature this event</word>
|
||||
<word key_rus="Закрепить событие" key="pin_title_event" js="0">Pin this event</word>
|
||||
<word key_rus="Открепить событие" key="unpin_title_event" js="0">Unpin this event</word>
|
||||
<word key_rus="Скрыть событие" key="hide_title_event" js="0">Hide this event</word>
|
||||
<word key_rus="Показать событие" key="unhide_title_event" js="0">Unhide this event</word>
|
||||
<word key_rus="Заблокировать событие" key="lock_title_event" js="0">Lock this event</word>
|
||||
<word key_rus="Разблокировать событие" key="unlock_title_event" js="0">Unlock this event</word>
|
||||
<word key_rus="Одобрить событие" key="approve_title_event" js="0">Approve this event</word>
|
||||
<word key_rus="Предстоящие события" key="block_upcomingEvents" js="0">Upcoming Events</word>
|
||||
<word key_rus="Показывает предстоящие события" key="block_upcomingEvents_desc" js="0">Shows upcoming calendar events</word>
|
||||
<word key_rus="Автоматически скрывать блок" key="auto_hide" js="0">Automatically hide block</word>
|
||||
<word key_rus="Скрыть этот блок, когда нет результатов для отображения" key="auto_hide_desc" js="0">Hide this block when there are no results to display</word>
|
||||
<word key_rus="Количество дней для отображения" key="days_ahead" js="0">Number of days to show</word>
|
||||
<word key_rus="Количество событий" key="maximum_count" js="0">Number of events</word>
|
||||
<word key_rus="Просмотр события %s" key="view_this_event" js="0">View the event %s</word>
|
||||
<word key_rus="Сегодняшние дни рождения" key="block_todaysBirthdays" js="0">Today's Birthdays</word>
|
||||
<word key_rus="Отображает сегодняшние дни рождения" key="block_todaysBirthdays_desc" js="0">Shows birthdays from today</word>
|
||||
<word key_rus="Празднующих сегодня пользователей нет" key="no_members_birthday_today" js="0">No users celebrating today</word>
|
||||
<word key_rus="Предстоящих событий не найдено" key="no_upcoming_events" js="0">No upcoming events found</word>
|
||||
<word key_rus="({# [*1:год][*2:года][*3:года][*4:года][11:лет][12:лет][13:лет][14:лет][?:лет]})" key="member_age" js="0">({# [1:year][?:years]} old)</word>
|
||||
<word key_rus="Последние отзывы" key="block_recentReviews" js="0">Recent Event Reviews</word>
|
||||
<word key_rus="Отображает последние отзывы" key="block_recentReviews_desc" js="0">Display the most recent reviews</word>
|
||||
<word key_rus="Отзывов не найдено" key="no_recent_reviews" js="0">No recent reviews found</word>
|
||||
<word key_rus="Календари" key="announce_calendars" js="0">Calendars</word>
|
||||
<word key_rus="Количество отзывов для отображения" key="review_count" js="0">Number of reviews to show</word>
|
||||
<word key_rus="Календарь" key="widget_calendar" js="0">Calendar</word>
|
||||
<word key_rus="Событие календаря" key="embed_calendar_event" js="0">Calendar Event</word>
|
||||
<word key_rus="{# [*1:пользователь][*2:пользователя][*3:пользователя][*4:пользователя][11:пользователей][12:пользователей][13:пользователей][14:пользователей][?:пользователей]} собирается" key="x_users_going" js="0">{# [1:user][?:users]} going</word>
|
||||
<word key_rus="GMT %s" key="timezone_offset_short" js="0">GMT %s</word>
|
||||
<word key_rus="[GMT - 12] Остров Бейкер, Аляска, США" key="timezone_offset_-12" js="0">[GMT - 12] Baker Island Time</word>
|
||||
<word key_rus="[GMT - 11] Часовой пояс САМОА (SST)" key="timezone_offset_-11" js="0">[GMT - 11] Samoa Standard Time</word>
|
||||
<word key_rus="[GMT - 10] Поясное время Гавай (HAST)" key="timezone_offset_-10" js="0">[GMT - 10] Hawaii Standard Time</word>
|
||||
<word key_rus="[GMT - 9:30] Папеэте, Французская Полинезия" key="timezone_offset_-9.5" js="0">[GMT - 9:30] Marquesas Islands Time</word>
|
||||
<word key_rus="[GMT - 9] Поясное время Аляски (AKST)" key="timezone_offset_-9" js="0">[GMT - 9] Alaska Standard Time</word>
|
||||
<word key_rus="[GMT - 8] Тихоокеанское поясное время (PST)" key="timezone_offset_-8" js="0">[GMT - 8] Pacific Standard Time</word>
|
||||
<word key_rus="[GMT - 7] Часовой пояс западной части США (MST)" key="timezone_offset_-7" js="0">[GMT - 7] Mountain Standard Time</word>
|
||||
<word key_rus="[GMT - 6] Центральное поясное время (CST)" key="timezone_offset_-6" js="0">[GMT - 6] Central Standard Time</word>
|
||||
<word key_rus="[GMT - 5] Североамериканское восточное время (EST)" key="timezone_offset_-5" js="0">[GMT - 5] Eastern Standard Time</word>
|
||||
<word key_rus="[GMT - 4:30] Поясное время Венесуэлы (VST)" key="timezone_offset_-4.5" js="0">[GMT - 4:30] Venezuelan Standard Time</word>
|
||||
<word key_rus="[GMT - 4] Атлантическое поясное время (AST)" key="timezone_offset_-4" js="0">[GMT - 4] Atlantic Standard Time</word>
|
||||
<word key_rus="[GMT - 3:30] Поясное время Ньюфаундленд(NST)" key="timezone_offset_-3.5" js="0">[GMT - 3:30] Newfoundland Standard Time</word>
|
||||
<word key_rus="[GMT - 3] время Бразилиа (BRT)" key="timezone_offset_-3" js="0">[GMT - 3] Brasília time</word>
|
||||
<word key_rus="[GMT - 2] время Fernando de Noronha - Пернамбуку, Бразилия (BRT)" key="timezone_offset_-2" js="0">[GMT - 2] Fernando de Noronha Time</word>
|
||||
<word key_rus="[GMT - 1] Стандартное время восточной Гренландии (EGT)" key="timezone_offset_-1" js="0">[GMT - 1] Eastern Greenland Time</word>
|
||||
<word key_rus="[GMT] Среднее время по Гринвичу (GMT)" key="timezone_offset_0" js="0">[GMT] Greenwich Mean Time</word>
|
||||
<word key_rus="[GMT + 1] Центральноевропейское время (CET)" key="timezone_offset_1" js="0">[GMT + 1] Central European Time</word>
|
||||
<word key_rus="[GMT + 2] Восточноевропейское время (EET)" key="timezone_offset_2" js="0">[GMT + 2] Eastern European Time</word>
|
||||
<word key_rus="[GMT + 3] Время восточной Африки (EAT)" key="timezone_offset_3" js="0">[GMT + 3] Eastern African Time</word>
|
||||
<word key_rus="[GMT + 3:30] Поясное время Ирана (IRST)" key="timezone_offset_3.5" js="0">[GMT + 3:30] Iran Standard Time</word>
|
||||
<word key_rus="[GMT + 4] Стандартное время Персидского залива (GST)" key="timezone_offset_4" js="0">[GMT + 4] Gulf Standard Time</word>
|
||||
<word key_rus="[GMT + 4:30] Время Афганистана (AFT)" key="timezone_offset_4.5" js="0">[GMT + 4:30] Afghanistan Time</word>
|
||||
<word key_rus="[GMT + 5] Поясное время Пакистана (PST)" key="timezone_offset_5" js="0">[GMT + 5] Pakistan Standard Time</word>
|
||||
<word key_rus="[GMT + 5:30] Индийское поясное время (IST)" key="timezone_offset_5.5" js="0">[GMT + 5:30] Indian Standard Time</word>
|
||||
<word key_rus="[GMT + 5:45] Поясное время Непала (NPT)" key="timezone_offset_5.75" js="0">[GMT + 5:45] Nepal Time</word>
|
||||
<word key_rus="[GMT + 6] Время Бангладеш ((BDT))" key="timezone_offset_6" js="0">[GMT + 6] Bangladesh Time</word>
|
||||
<word key_rus="[GMT + 6:30] Время Мьянма (MMT)" key="timezone_offset_6.5" js="0">[GMT + 6:30] Myanmar Time</word>
|
||||
<word key_rus="[GMT + 7] Время Индокитая (ICT)" key="timezone_offset_7" js="0">[GMT + 7] Indochina Time</word>
|
||||
<word key_rus="[GMT + 8] Поясное время Китая (CST)" key="timezone_offset_8" js="0">[GMT + 8] Chinese Standard Time</word>
|
||||
<word key_rus="[GMT + 9] Часовой пояс Японии (JST)" key="timezone_offset_9" js="0">[GMT + 9] Japan Standard Time</word>
|
||||
<word key_rus="[GMT + 9:30] Стандартное время центральной Австралии (ACST)" key="timezone_offset_9.5" js="0">[GMT + 9:30] Australian Central Standard Time</word>
|
||||
<word key_rus="[GMT + 10] Стандартное время восточной Австралии (AEST)" key="timezone_offset_10" js="0">[GMT + 10] Australian Eastern Standard Time</word>
|
||||
<word key_rus="[GMT + 10:30] Стандартное время Лорд-Хау (LHST)" key="timezone_offset_10.5" js="0">[GMT + 10:30] Lord Howe Standard Time</word>
|
||||
<word key_rus="[GMT + 11] Часовой пояс в Соломоновы о-ва (SIT)" key="timezone_offset_11" js="0">[GMT + 11] Solomon Island Time</word>
|
||||
<word key_rus="[GMT + 11:30] время Остров Норфолк (NFT)" key="timezone_offset_11.5" js="0">[GMT + 11:30] Norfolk Island Time</word>
|
||||
<word key_rus="[GMT + 12] время Новой Зеландии (NZST)" key="timezone_offset_12" js="0">[GMT + 12] New Zealand Time</word>
|
||||
<word key_rus="[GMT + 12:45] Время Чатем Айлендс, Новая Зеландия (CHAST)" key="timezone_offset_12.75" js="0">[GMT + 12:45] Chatham Islands Time</word>
|
||||
<word key_rus="[GMT + 13] Время островов Феникс (PIT)" key="timezone_offset_13" js="0">[GMT + 13] Phoenix Islands Time</word>
|
||||
<word key_rus="[GMT + 14] Время острово Лайн (LIT)" key="timezone_offset_14" js="0">[GMT + 14] Line Island Time</word>
|
||||
<word key_rus="Проверка лент iCalendar на новые события и импорты в Календарь." key="task__icalendar" js="0">Checks iCalendar feeds for new events and imports into Calendar.</word>
|
||||
<word key_rus="События" key="digest_area_calendar_calendar" js="0">Events</word>
|
||||
<word key_rus="Событие" key="digest_area_calendar_event" js="0">Event</word>
|
||||
<word key_rus="%s опубликовал событие в %s" key="x_created_event_in" js="0">%s posted an event in %s</word>
|
||||
<word key_rus="%s прокомментировал событие" key="x_commented_event" js="0">%s commented on an event</word>
|
||||
<word key_rus="Событие на" key="digest_event_on" js="0">Event on</word>
|
||||
<word key_rus="{# [*1:пользователь][*2:пользователя][*3:пользователя][*4:пользователя][11:пользователей][12:пользователей][13:пользователей][14:пользователей][?:пользователей]} собираются посетить" key="digest_users_going" js="0">{# [1:user][?:users]} going</word>
|
||||
<word key_rus="{$content->mapped('title')|raw}" key="mailsub__calendar_notification_new_content" js="0"><![CDATA[{$content->mapped("title")|raw}]]></word>
|
||||
<word key_rus="%s отправил %s, %s, для %s" key="email_new_calevent_plain" js="0">%s has posted %s, %s, for %s</word>
|
||||
<word key_rus="<a href='%s'>%s</a> отправил %s, <a href='%s'>%s</a>, для %s" key="email_new_calevent" js="0"><![CDATA[<a href='%s'>%s</a> has posted %s, <a href='%s'>%s</a>, for %s]]></word>
|
||||
<word key_rus="%s (Гость) отправил %s, <a href='%s'>%s</a>, для %s" key="email_new_calevent_guest" js="0"><![CDATA[%s (Guest) has posted %s, <a href='%s'>%s</a>, for %s]]></word>
|
||||
<word key_rus="События" key="__api_calendar_events" js="0">Events</word>
|
||||
<word key_rus="Комментарии" key="__api_calendar_comments" js="0">Comments</word>
|
||||
<word key_rus="Отзывы" key="__api_calendar_reviews" js="0">Reviews</word>
|
||||
<word key_rus="{# [*1:день][*2:дня][*3:дня][*4:дня][11:дней][12:дней][13:дней][14:дней][?:дней]}" key="x_daily" js="1">{# [1:day][?:days]}</word>
|
||||
<word key_rus="{# [*1:неделя][*2:недели][*3:недели][*4:недели][11:недель][12:недель][13:недель][14:недель][?:недель]}" key="x_weekly" js="1">{# [1:week][?:weeks]}</word>
|
||||
<word key_rus="{# [*1:месяц][*2:месяца][*3:месяца][*4:месяца][11:месяцев][12:месяцев][13:месяцев][14:месяцев][?:месяцев]}" key="x_monthly" js="1">{# [1:month][?:months]}</word>
|
||||
<word key_rus="{# [*1:год][*2:года][*3:года][*4:года][11:лет][12:лет][13:лет][14:лет][?:лет]}" key="x_yearly" js="1">{# [1:year][?:years]}</word>
|
||||
<word key_rus="Каждые {{period}}" key="every_x" js="1">Every {{period}}</word>
|
||||
<word key_rus="{# [*1:раз][*2:раза][*3:раза][*4:раза][11:раз][12:раз][13:раз][14:раз][?:раз]}" key="x_times" js="1">{# [1:time][?:times]}</word>
|
||||
<word key_rus="до {{date}}" key="until" js="1">until {{date}}</word>
|
||||
<word key_rus="Каждые {{interval}}, {{endAfter}}" key="with_end" js="1">{{interval}}, {{endAfter}}</word>
|
||||
<word key_rus="Понедельник" key="MO" js="1">Monday</word>
|
||||
<word key_rus="Вторник" key="TU" js="1">Tuesday</word>
|
||||
<word key_rus="Среда" key="WE" js="1">Wednesday</word>
|
||||
<word key_rus="Четверг" key="TH" js="1">Thursday</word>
|
||||
<word key_rus="Пятница" key="FR" js="1">Friday</word>
|
||||
<word key_rus="Суббота" key="SA" js="1">Saturday</word>
|
||||
<word key_rus="Воскресенье" key="SU" js="1">Sunday</word>
|
||||
<word key_rus="на {{first}}" key="one_day" js="1">on {{first}}</word>
|
||||
<word key_rus="на {{days}} и {{last}}" key="multiple_day" js="1">on {{days}} and {{last}}</word>
|
||||
<word key_rus="{{week}} {{days}}" key="week_string" js="1">{{week}} {{days}}</word>
|
||||
<word key_rus="Не повторять" key="doesnt_repeat" js="1">Doesn't repeat</word>
|
||||
<word key_rus="<strong>{{startDate}}</strong>, c <strong>{{startTime}}</strong> до <strong>{{endTime}}</strong>" key="single_not_allday" js="1"><![CDATA[On <strong>{{startDate}}</strong>, from <strong>{{startTime}}</strong> to <strong>{{endTime}}</strong>]]></word>
|
||||
<word key_rus="<strong>{{startDate}}</strong> (весь день)" key="single_allday" js="1"><![CDATA[<strong>{{startDate}}</strong> (all day)]]></word>
|
||||
<word key_rus="С <strong>{{startDate}}</strong> в <strong>{{startTime}}</strong> до <strong>{{endDate}}</strong> в <strong>{{endTime}}</strong>" key="not_single_not_allday" js="1"><![CDATA[From <strong>{{startDate}}</strong> at <strong>{{startTime}}</strong> until <strong>{{endDate}}</strong> at <strong>{{endTime}}</strong>]]></word>
|
||||
<word key_rus="С <strong>{{startDate}}</strong> до <strong>{{endDate}}</strong>" key="not_single_allday" js="1"><![CDATA[From <strong>{{startDate}}</strong> to <strong>{{endDate}}</strong>]]></word>
|
||||
<word key_rus="(укажите время)" key="select_time" js="1">(select time)</word>
|
||||
</app>
|
||||
</language>
|
||||
@@ -193,10 +193,10 @@
|
||||
"comment": "",
|
||||
"decimals": null,
|
||||
"default": "0",
|
||||
"length": 8,
|
||||
"length": 20,
|
||||
"name": "comment_mid",
|
||||
"type": "MEDIUMINT",
|
||||
"unsigned": false,
|
||||
"type": "BIGINT",
|
||||
"unsigned": true,
|
||||
"values": [],
|
||||
"zerofill": false
|
||||
},
|
||||
@@ -404,10 +404,10 @@
|
||||
"comment": "",
|
||||
"decimals": null,
|
||||
"default": "0",
|
||||
"length": 11,
|
||||
"length": 20,
|
||||
"name": "rsvp_member_id",
|
||||
"type": "INT",
|
||||
"unsigned": false,
|
||||
"type": "BIGINT",
|
||||
"unsigned": true,
|
||||
"values": [],
|
||||
"zerofill": false
|
||||
},
|
||||
@@ -511,9 +511,9 @@
|
||||
"comment": "",
|
||||
"decimals": null,
|
||||
"default": "0",
|
||||
"length": 8,
|
||||
"length": 20,
|
||||
"name": "event_member_id",
|
||||
"type": "MEDIUMINT",
|
||||
"type": "BIGINT",
|
||||
"unsigned": true,
|
||||
"values": [],
|
||||
"zerofill": false
|
||||
@@ -1047,8 +1047,7 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"collation": "utf8mb4_unicode_ci",
|
||||
"engine": "InnoDB"
|
||||
"collation": "utf8mb4_unicode_ci"
|
||||
},
|
||||
"calendar_import_feeds": {
|
||||
"name": "calendar_import_feeds",
|
||||
@@ -1144,10 +1143,10 @@
|
||||
"comment": "",
|
||||
"decimals": null,
|
||||
"default": "0",
|
||||
"length": 11,
|
||||
"length": 20,
|
||||
"name": "feed_member_id",
|
||||
"type": "INT",
|
||||
"unsigned": false,
|
||||
"type": "BIGINT",
|
||||
"unsigned": true,
|
||||
"values": [],
|
||||
"zerofill": false
|
||||
},
|
||||
@@ -1357,7 +1356,7 @@
|
||||
"default": "0",
|
||||
"length": 8,
|
||||
"name": "review_mid",
|
||||
"type": "MEDIUMINT",
|
||||
"type": "BIGINT",
|
||||
"unsigned": true,
|
||||
"values": [],
|
||||
"zerofill": false
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
},
|
||||
{
|
||||
"key": "ipb_calendar_mon",
|
||||
"default": "0"
|
||||
"default": "1"
|
||||
},
|
||||
{
|
||||
"key": "show_bday_calendar",
|
||||
|
||||
@@ -1,11 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<theme name="Default" author_name="Invision Power Services, Inc" author_url="http://www.invisionpower.com">
|
||||
<template template_group="browse" template_name="calendarDay" template_data="$calendars, $date, $featured, $birthdays, $events, $tomorrow, $yesterday, $today, $thisCalendar, $jump" template_location="front" template_app="calendar"><![CDATA[
|
||||
<template template_group="browse" template_name="birthday" template_data="$table, $headers, $rows" template_location="front" template_app="calendar"><![CDATA[{{foreach $rows as $row}}
|
||||
<li class='ipsGrid_span6 ipsPhotoPanel ipsPhotoPanel_mini ipsClearfix'>
|
||||
{template="userPhoto" app="core" group="global" params="\IPS\Member::load( $row['member_id'] ), 'mini'"}
|
||||
<div>
|
||||
<h3 class='ipsType_normal ipsType_reset ipsTruncate ipsTruncate_line'>{member="name" id="$row['member_id']"}</h3>
|
||||
<span class='ipsType_light'>
|
||||
{{if $row['bday_year']}}
|
||||
{lang="member_age" pluralize="\IPS\Member::load( $row['member_id'] )->age( \IPS\calendar\Date::getDate( \IPS\Request::i()->y ?: NULL, \IPS\Request::i()->m ?: NULL, \IPS\Request::i()->d ?: NULL ) )"}{{endif}}
|
||||
</span>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}]]></template>
|
||||
<template template_group="browse" template_name="birthdaysTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="calendar"><![CDATA[<div data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table' {{if $table->getPaginationKey() != 'page'}}data-pageParam='{$table->getPaginationKey()}'{{endif}}>
|
||||
|
||||
{{if $table->pages > 1}}
|
||||
<div class="ipsButtonBar ipsPad_half ipsClearfix ipsClear">
|
||||
<div data-role="tablePagination">
|
||||
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
||||
</div>
|
||||
</div>
|
||||
{{endif}}
|
||||
|
||||
|
||||
{{if count( $rows )}}
|
||||
<ol class='ipsGrid ipsGrid_collapsePhone ipsPad ipsClear {{foreach $table->classes as $class}}{$class} {{endforeach}}' id='elTable_{$table->uniqueId}' data-role="tableRows" itemscope itemtype="http://schema.org/ItemList">
|
||||
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
||||
</ol>
|
||||
{{else}}
|
||||
<div class='ipsType_center ipsPad'>
|
||||
<p class='ipsType_large ipsType_light'>{lang="no_rows_in_table"}</p>
|
||||
{{if method_exists( $table, 'container' ) AND $table->container() !== NULL}}
|
||||
{{if $table->container()->can('add')}}
|
||||
<a href='{$table->container()->url()->setQueryString( 'do', 'add' )}' class='ipsButton ipsButton_primary ipsButton_medium'>
|
||||
{lang="submit_first_row"}
|
||||
</a>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
</div>
|
||||
{{endif}}
|
||||
|
||||
{{if $table->pages > 1}}
|
||||
<div class="ipsButtonBar ipsPad_half ipsClearfix ipsClear">
|
||||
<div data-role="tablePagination">
|
||||
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
||||
</div>
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="browse" template_name="calendarDay" template_data="$calendars, $date, $featured, $birthdays, $birthdayCount, $events, $tomorrow, $yesterday, $today, $thisCalendar, $jump" template_location="front" template_app="calendar"><![CDATA[
|
||||
<div class='ipsGrid ipsGrid_collapsePhone ipsPager cCalendarNav ipsSpacer_bottom' data-ipsSticky data-ipsSticky-disableIn='phone'>
|
||||
<div class='ipsGrid_span3 ipsType_left ipsPager_prev'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$yesterday->year}&m={$yesterday->mon}&d={$yesterday->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$yesterday->year}&m={$yesterday->mon}&d={$yesterday->mday}" seoTemplate="calendar_day"}{{endif}}" title='{lang="cal_month_day" sprintf="$yesterday->monthName, $yesterday->mday, $yesterday->year"}' rel='prev' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="prev_day"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{lang="cal_month_day" sprintf="$yesterday->monthName, $yesterday->mday, $yesterday->year"}</span>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$yesterday->year}&m={$yesterday->mon}&d={$yesterday->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$yesterday->year}&m={$yesterday->mon}&d={$yesterday->mday}" seoTemplate="calendar_day"}{{endif}}" title='{lang="cal_month_day" sprintf="$yesterday->monthName, $yesterday->mday, $yesterday->year"}' rel='prev nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="cal_month_day_noyear" sprintf="$yesterday->monthName, $yesterday->mday"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{$yesterday->year}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class='ipsGrid_span6 ipsType_center ipsPad cCalendarNav' data-role='calendarNav'>
|
||||
@@ -18,9 +66,9 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class='ipsGrid_span3 ipsType_right ipsPager_next'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$tomorrow->year}&m={$tomorrow->mon}&d={$tomorrow->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$tomorrow->year}&m={$tomorrow->mon}&d={$tomorrow->mday}" seoTemplate="calendar_day"}{{endif}}" title='{lang="cal_month_day" sprintf="$tomorrow->monthName, $tomorrow->mday, $tomorrow->year"}' rel='next' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="next_day"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{lang="cal_month_day" sprintf="$tomorrow->monthName, $tomorrow->mday, $tomorrow->year"}</span>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$tomorrow->year}&m={$tomorrow->mon}&d={$tomorrow->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$tomorrow->year}&m={$tomorrow->mon}&d={$tomorrow->mday}" seoTemplate="calendar_day"}{{endif}}" title='{lang="cal_month_day" sprintf="$tomorrow->monthName, $tomorrow->mday, $tomorrow->year"}' rel='next nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="cal_month_day_noyear" sprintf="$tomorrow->monthName, $tomorrow->mday"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{$tomorrow->year}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -85,8 +133,8 @@
|
||||
{{if count( $birthdays ) }}
|
||||
</div>
|
||||
<div class='ipsColumn ipsColumn_medium'>
|
||||
{{foreach $birthdays AS $birthday}}
|
||||
<h2 class='ipsType_sectionTitle ipsType_reset'>{lang="birthdays_today" pluralize="count( $birthday )"}</h2>
|
||||
{{foreach $birthdays AS $bdayDate => $birthday}}
|
||||
<h2 class='ipsType_sectionTitle ipsType_reset'>{lang="birthdays_today" pluralize="$birthdayCount[ $bdayDate ]"}</h2>
|
||||
<ul class='ipsDataList ipsDataList_reducedSpacing'>
|
||||
{{foreach $birthday AS $member}}
|
||||
<li class='ipsDataItem ipsClearfix'>
|
||||
@@ -95,11 +143,16 @@
|
||||
<div>
|
||||
{$member->link()|raw}
|
||||
{{if $member->bday_year}}<br>
|
||||
{lang="member_age" sprintf="$member->age( $date )"}{{endif}}
|
||||
{lang="member_age" pluralize="$member->age( $date )"}{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
{{if count($birthday) < $birthdayCount[ $bdayDate ]}}
|
||||
<li class='ipsDataItem ipsClearfix ipsAreaBackground_light ipsPad ipsPad_half ipsType_center'>
|
||||
<a data-ipsDialog data-ipsDialog-title='{lang="birthdays_today" pluralize="$birthdayCount[ $bdayDate ]"}' data-ipsDialog-size="narrow" href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=day&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$date->mday}&show=birthdays" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=day&y={$date->year}&m={$date->mon}&d={$date->mday}&show=birthdays" seoTemplate="calendar_day"}{{endif}}'>{lang="birthdays_view_all"}</a>
|
||||
</li>
|
||||
{{endif}}
|
||||
</ul>
|
||||
{{endforeach}}
|
||||
</div>
|
||||
@@ -138,9 +191,9 @@
|
||||
{{if ( $thisCalendar AND $thisCalendar->can('add') ) OR ( !$thisCalendar AND \IPS\calendar\Calendar::canOnAny('add') )}}
|
||||
|
||||
{{if $thisCalendar}}
|
||||
<a href='{url="app=calendar&module=calendar&controller=submit&calendar={$thisCalendar->id}" seoTemplate="calendar_submit"}' class='ipsButton ipsButton_important ipsButton_small ipsResponsive_hidePhone ipsResponsive_inlineBlock'>{lang="create_event"}</a>
|
||||
<a href='{url="app=calendar&module=calendar&controller=submit&do=submit&id={$thisCalendar->id}" seoTemplate="calendar_submit"}' class='ipsButton ipsButton_important ipsButton_small ipsResponsive_hidePhone ipsResponsive_inlineBlock'>{lang="create_event"}</a>
|
||||
{{else}}
|
||||
<a href='{url="app=calendar&module=calendar&controller=submit" seoTemplate="calendar_submit"}' class='ipsButton ipsButton_important ipsButton_small ipsResponsive_hidePhone ipsResponsive_inlineBlock'>{lang="create_event"}</a>
|
||||
<a href='{url="app=calendar&module=calendar&controller=submit" seoTemplate="calendar_submit"}' data-ipsdialog data-ipsdialog-title='{lang="event_container"}' data-ipsdialog-size='narrow' class='ipsButton ipsButton_important ipsButton_small ipsResponsive_hidePhone ipsResponsive_inlineBlock'>{lang="create_event"}</a>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
<a href='#elCalendarJump' data-ipsMenu data-ipsMenu-menuID='elCalendarJump' data-ipsMenu-closeOnClick='false' class='ipsButton ipsButton_light ipsButton_small ipsResponsive_showDesktop ipsResponsive_inlineBlock'>{lang="jump_to"} <i class='fa fa-caret-down'></i></a>
|
||||
@@ -164,9 +217,9 @@
|
||||
<hr class='ipsHr'>]]></template>
|
||||
<template template_group="browse" template_name="calendarMonth" template_data="$calendars, $date, $featured, $birthdays, $events, $today, $thisCalendar, $jump, $startDates=array()" template_location="front" template_app="calendar"><![CDATA[<div class='ipsGrid ipsGrid_collapsePhone ipsPager cCalendarNav ipsSpacer_bottom' data-ipsSticky data-ipsSticky-disableIn='phone'>
|
||||
<div class='ipsGrid_span3 ipsType_left ipsPager_prev'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=month&id={$thisCalendar->_id}&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_calmonth" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_month"}{{endif}}" title='{lang="cal_month_title" sprintf="$date->lastMonth('monthName'), $date->lastMonth('year')"}' rel='prev' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="previous_month"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{lang="cal_month_title" sprintf="$date->lastMonth('monthName'), $date->lastMonth('year')"}</span>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=month&id={$thisCalendar->_id}&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_calmonth" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_month"}{{endif}}" title='{lang="cal_month_title" sprintf="$date->lastMonth('monthName'), $date->lastMonth('year')"}' rel='prev nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{$date->lastMonth('monthName')}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{$date->lastMonth('year')}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class='ipsGrid_span6 ipsType_center ipsPad' data-role='calendarNav'>
|
||||
@@ -179,9 +232,9 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class='ipsGrid_span3 ipsType_right ipsPager_next'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=month&id={$thisCalendar->_id}&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_calmonth" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_month"}{{endif}}" title='{lang="cal_month_title" sprintf="$date->nextMonth('monthName'), $date->nextMonth('year')"}' rel='next' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="next_month"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{lang="cal_month_title" sprintf="$date->nextMonth('monthName'), $date->nextMonth('year')"}</span>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=month&id={$thisCalendar->_id}&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_calmonth" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_month"}{{endif}}" title='{lang="cal_month_title" sprintf="$date->nextMonth('monthName'), $date->nextMonth('year')"}' rel='next nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{$date->nextMonth('monthName')}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{$date->nextMonth('year')}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -205,9 +258,9 @@
|
||||
{{endif}}
|
||||
<td class='cCalendar_date{{if $k == 1}} cCalendar_firstDay{{endif}}{{if $today->mysqlDatetime( FALSE ) == $date->year . '-' . $date->mon . '-' . $k }} cCalendar_today{{endif}}{{if isset( $events[ $date->year . '-' . $date->mon . '-' . $k ] )}} cCalendar_hasEvents{{endif}}'>
|
||||
<div>
|
||||
<a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_day"}{{endif}}' class='ipsType_blendLinks cCalendar_dayNumber'>{$k}</a>
|
||||
<a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$k}&view=day" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->year}&m={$date->mon}&d={$k}&view=day" seoTemplate="calendar_day"}{{endif}}' class='ipsType_blendLinks cCalendar_dayNumber'>{$k}</a>
|
||||
{{if ( $thisCalendar AND $thisCalendar->can('add') ) OR ( !$thisCalendar AND \IPS\calendar\Calendar::canOnAny('add') )}}
|
||||
<a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=submit&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_submit"}{{else}}{url="app=calendar&module=calendar&controller=submit&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_submit"}{{endif}}' data-ipsTooltip title='{lang="add_event"}' class='ipsButton ipsButton_verySmall ipsButton_primary cCalendar_miniAddEvent'><i class='ipsType_small fa fa-plus'></i></a>
|
||||
<a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=submit&do=submit&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$k}&view=day" seoTemplate="calendar_submit"}{{else}}{url="app=calendar&module=calendar&controller=submit&y={$date->year}&m={$date->mon}&d={$k}&view=day" seoTemplate="calendar_submit"}{{endif}}' data-ipsTooltip title='{lang="add_event"}' class='ipsButton ipsButton_verySmall ipsButton_primary cCalendar_miniAddEvent'><i class='ipsType_small fa fa-plus'></i></a>
|
||||
{{endif}}
|
||||
{{if isset( $events[ $date->year . '-' . $date->mon . '-' . $k ] )}}
|
||||
<ul class='cEvents_wrapper'>
|
||||
@@ -235,8 +288,8 @@
|
||||
{{endif}}
|
||||
</ul>
|
||||
{{endif}}
|
||||
{{if isset( $birthdays[ $date->mon . $k ] ) AND count( $birthdays[ $date->mon . $k ]) }}
|
||||
<p class='cCalendar_birthdays ipsType_light'><a class='ipsType_blendLinks' href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_day"}{{endif}}'>{lang="birthdays_count" pluralize="count($birthdays[ $date->mon . $k ])"}</a></p>
|
||||
{{if isset( $birthdays[ $date->mon . $k ] ) AND $birthdays[ $date->mon . $k ] }}
|
||||
<p class='cCalendar_birthdays ipsType_light'><a class='ipsType_blendLinks' href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$date->year}&m={$date->mon}&d={$k}" seoTemplate="calendar_day"}{{endif}}'>{lang="birthdays_count" pluralize="$birthdays[ $date->mon . $k ]"}</a></p>
|
||||
{{endif}}
|
||||
</div>
|
||||
</td>
|
||||
@@ -250,9 +303,9 @@
|
||||
<template template_group="browse" template_name="calendarStream" template_data="$calendars, $date, $featured, $events, $thisCalendar, $jump, $pagination" template_location="front" template_app="calendar"><![CDATA[
|
||||
<div class='ipsGrid ipsGrid_collapsePhone ipsPager cCalendarNav ipsSpacer_bottom' data-ipsSticky data-ipsSticky-disableIn='phone'>
|
||||
<div class='ipsGrid_span3 ipsType_left ipsPager_prev'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=stream&id={$thisCalendar->_id}&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_calstream" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=stream&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_stream"}{{endif}}" title='{lang="cal_month_stream_title" sprintf="$date->lastMonth('monthName'), $date->lastMonth('year')"}' rel='prev' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="previous_month"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{lang="cal_month_title" sprintf="$date->lastMonth('monthName'), $date->lastMonth('year')"}</span>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=stream&id={$thisCalendar->_id}&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_calstream" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=stream&y={$date->lastMonth('year')}&m={$date->lastMonth('mon')}" seoTemplate="calendar_stream"}{{endif}}" title='{lang="cal_month_stream_title" sprintf="$date->lastMonth('monthName'), $date->lastMonth('year')"}' rel='prev nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{$date->lastMonth('monthName')}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{$date->lastMonth('year')}</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class='ipsGrid_span6 ipsType_center ipsPad' data-role='calendarNav'>
|
||||
@@ -265,9 +318,9 @@
|
||||
</ul>
|
||||
</div>
|
||||
<div class='ipsGrid_span3 ipsType_right ipsPager_next'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=stream&id={$thisCalendar->_id}&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_calstream" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=stream&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_stream"}{{endif}}" title='{lang="cal_month_stream_title" sprintf="$date->nextMonth('monthName'), $date->nextMonth('year')"}' rel='next' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="next_month"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{lang="cal_month_title" sprintf="$date->nextMonth('monthName'), $date->nextMonth('year')"}</span>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=stream&id={$thisCalendar->_id}&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_calstream" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=stream&y={$date->nextMonth('year')}&m={$date->nextMonth('mon')}" seoTemplate="calendar_stream"}{{endif}}" title='{lang="cal_month_stream_title" sprintf="$date->nextMonth('monthName'), $date->nextMonth('year')"}' rel='next nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{$date->nextMonth('monthName')}</span>
|
||||
<span class='ipsPager_title ipsType_light'>{$date->nextMonth('year')}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@@ -284,7 +337,7 @@
|
||||
<div class='ipsList_reset' data-role='patchworkList'>
|
||||
{{foreach $events as $event}}
|
||||
<div data-role='patchworkItem'>
|
||||
{template="eventBlock" app="calendar" group="view" params="$event, $date, FALSE, array( 240, 185 ), TRUE"}
|
||||
{template="eventBlock" app="calendar" group="view" params="$event, $date, TRUE, array( 240, 185 ), TRUE"}
|
||||
</div>
|
||||
{{endforeach}}
|
||||
</div>
|
||||
@@ -302,7 +355,7 @@
|
||||
<template template_group="browse" template_name="calendarWeek" template_data="$calendars, $date, $featured, $birthdays, $events, $nextWeek, $lastWeek, $days, $today, $thisCalendar, $jump, $startDates=array()" template_location="front" template_app="calendar"><![CDATA[
|
||||
<div class='ipsGrid ipsGrid_collapsePhone ipsPager cCalendarNav ipsSpacer_bottom' data-ipsSticky data-ipsSticky-disableIn='phone'>
|
||||
<div class='ipsGrid_span3 ipsType_left ipsPager_prev'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=week&id={$thisCalendar->_id}&w={$lastWeek->year}-{$lastWeek->mon}-{$lastWeek->mday}" seoTemplate="calendar_calweek" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=week&w={$lastWeek->year}-{$lastWeek->mon}-{$lastWeek->mday}" seoTemplate="calendar_week"}{{endif}}" title='{lang="cal_week_title" sprintf="$lastWeek->firstDayOfWeek('monthNameShort'), $lastWeek->firstDayOfWeek('mday'), $lastWeek->firstDayOfWeek('year'), $lastWeek->lastDayOfWeek('monthNameShort'), $lastWeek->lastDayOfWeek('mday'), $lastWeek->lastDayOfWeek('year')"}' rel='prev' data-action='changeView'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=week&id={$thisCalendar->_id}&w={$lastWeek->year}-{$lastWeek->mon}-{$lastWeek->mday}" seoTemplate="calendar_calweek" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=week&w={$lastWeek->year}-{$lastWeek->mon}-{$lastWeek->mday}" seoTemplate="calendar_week"}{{endif}}" title='{lang="cal_week_title" sprintf="$lastWeek->firstDayOfWeek('monthNameShort'), $lastWeek->firstDayOfWeek('mday'), $lastWeek->firstDayOfWeek('year'), $lastWeek->lastDayOfWeek('monthNameShort'), $lastWeek->lastDayOfWeek('mday'), $lastWeek->lastDayOfWeek('year')"}' rel='prev nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="previous_week"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>
|
||||
<span class='ipsResponsive_inline ipsResponsive_hidePhone'>
|
||||
@@ -320,15 +373,15 @@
|
||||
<li><a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=month&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}" seoTemplate="calendar_calmonth" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=month&y={$date->year}&m={$date->mon}" seoTemplate="calendar_month"}{{endif}}' title='{lang="cal_month_title" sprintf="$date->monthName, $date->year"}' class='ipsButton ipsButton_light ipsButton_verySmall' data-action='changeView'>{lang="month"}</a></li>
|
||||
<li><a href='#' class='ipsButton ipsButton_primary ipsButton_verySmall' title='{lang="cal_week_title" sprintf="$date->firstDayOfWeek('monthNameShort'), $date->firstDayOfWeek('mday'), $date->firstDayOfWeek('year'), $date->lastDayOfWeek('monthNameShort'), $date->lastDayOfWeek('mday'), $date->lastDayOfWeek('year')"}' data-action='changeView'>{lang="week"}</a></li>
|
||||
{{if in_array( $today, $days )}}
|
||||
<li><a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=day&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$today->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=day&y={$date->year}&m={$date->mon}&d={$today->mday}" seoTemplate="calendar_day"}{{endif}}' title='{lang="cal_month_day" sprintf="$date->monthName, $today->mday, $date->year"}' class='ipsButton ipsButton_light ipsButton_verySmall' data-action='changeView'>{lang="day"}</a></li>
|
||||
<li><a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=day&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d={$today->mday}&view=day" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=day&y={$date->year}&m={$date->mon}&d={$today->mday}&view=day" seoTemplate="calendar_day"}{{endif}}' title='{lang="cal_month_day" sprintf="$date->monthName, $today->mday, $date->year"}' class='ipsButton ipsButton_light ipsButton_verySmall' data-action='changeView'>{lang="day"}</a></li>
|
||||
{{else}}
|
||||
<li><a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=day&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d=1" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=day&y={$date->year}&m={$date->mon}&d=1" seoTemplate="calendar_day"}{{endif}}' title='{lang="cal_month_day" sprintf="$date->monthName, $date->mday, $date->year"}' class='ipsButton ipsButton_light ipsButton_verySmall' data-action='changeView'>{lang="day"}</a></li>
|
||||
<li><a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=day&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}&d=1&view=day" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=day&y={$date->year}&m={$date->mon}&d=1&view=day" seoTemplate="calendar_day"}{{endif}}' title='{lang="cal_month_day" sprintf="$date->monthName, $date->mday, $date->year"}' class='ipsButton ipsButton_light ipsButton_verySmall' data-action='changeView'>{lang="day"}</a></li>
|
||||
{{endif}}
|
||||
<li><a href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=stream&id={$thisCalendar->_id}&y={$date->year}&m={$date->mon}" seoTemplate="calendar_calstream" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=stream&y={$date->year}&m={$date->mon}" seoTemplate="calendar_stream"}{{endif}}' title='{lang="cal_month_stream_title" sprintf="$date->monthName, $date->year"}' class='ipsButton ipsButton_light ipsButton_verySmall' data-action='changeView'><span class='ipsResponsive_hidePhone ipsResponsive_inline'>{lang="event_stream"}</span><span class='ipsResponsive_showPhone ipsResponsive_inline'>{lang="event_stream_short"}</span></a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class='ipsGrid_span3 ipsType_right ipsPager_next'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=week&id={$thisCalendar->_id}&w={$nextWeek->year}-{$nextWeek->mon}-{$nextWeek->mday}" seoTemplate="calendar_calweek" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=week&w={$nextWeek->year}-{$nextWeek->mon}-{$nextWeek->mday}" seoTemplate="calendar_week"}{{endif}}" title='{lang="cal_week_title" sprintf="$nextWeek->firstDayOfWeek('monthNameShort'), $nextWeek->firstDayOfWeek('mday'), $nextWeek->firstDayOfWeek('year'), $nextWeek->lastDayOfWeek('monthNameShort'), $nextWeek->lastDayOfWeek('mday'), $nextWeek->lastDayOfWeek('year')"}' rel='next' data-action='changeView'>
|
||||
<a href="{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&view=week&id={$thisCalendar->_id}&w={$nextWeek->year}-{$nextWeek->mon}-{$nextWeek->mday}" seoTemplate="calendar_calweek" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&view=week&w={$nextWeek->year}-{$nextWeek->mon}-{$nextWeek->mday}" seoTemplate="calendar_week"}{{endif}}" title='{lang="cal_week_title" sprintf="$nextWeek->firstDayOfWeek('monthNameShort'), $nextWeek->firstDayOfWeek('mday'), $nextWeek->firstDayOfWeek('year'), $nextWeek->lastDayOfWeek('monthNameShort'), $nextWeek->lastDayOfWeek('mday'), $nextWeek->lastDayOfWeek('year')"}' rel='next nofollow' data-action='changeView'>
|
||||
<span class='ipsPager_type ipsType_normal'>{lang="next_week"}</span>
|
||||
<span class='ipsPager_title ipsType_light'>
|
||||
<span class='ipsResponsive_inline ipsResponsive_hidePhone'>
|
||||
@@ -348,7 +401,7 @@
|
||||
<li class='ipsColumns ipsColumns_collapsePhone ipsBox'>
|
||||
<div class='ipsColumn ipsColumn_wide ipsAreaBackground_light cCalendarWeek_day {{if $today->year == $day->year AND $today->mon == $day->mon AND $today->mday == $day->mday}} cCalendar_today{{endif}}'>
|
||||
<div class='ipsPad'>
|
||||
<h2 class='ipsType_sectionHead'><strong><a class='ipsType_blendLinks' href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$day->year}&m={$day->mon}&d={$day->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$day->year}&m={$day->mon}&d={$day->mday}" seoTemplate="calendar_day"}{{endif}}'>{$day->dayName}</a></strong></h2>
|
||||
<h2 class='ipsType_sectionHead'><strong><a class='ipsType_blendLinks' href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$day->year}&m={$day->mon}&d={$day->mday}&view=day" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$day->year}&m={$day->mon}&d={$day->mday}&view=day" seoTemplate="calendar_day"}{{endif}}'>{$day->dayName}</a></strong></h2>
|
||||
<p class='ipsType_reset ipsType_light ipsType_uppercase'>{lang="cal_month_day" sprintf="$day->monthName, $day->mday, $day->year"}</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -382,8 +435,8 @@
|
||||
{{else}}
|
||||
<span class='ipsType_light ipsType_medium'>{lang="no_events_today"}</span>
|
||||
{{endif}}
|
||||
{{if isset( $birthdays[ $day->mon . $day->mday ] ) AND count( $birthdays[ $day->mon . $day->mday ] ) }}
|
||||
<p class='cCalendar_birthdays ipsType_light'><a class='ipsType_blendLinks' href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$day->year}&m={$day->mon}&d={$day->mday}" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$day->year}&m={$day->mon}&d={$day->mday}" seoTemplate="calendar_day"}{{endif}}'>{lang="birthdays_today" pluralize="count($birthdays[ $day->mon . $day->mday ])"}</a></p>
|
||||
{{if isset( $birthdays[ $day->mon . $day->mday ] ) AND $birthdays[ $day->mon . $day->mday ] }}
|
||||
<p class='cCalendar_birthdays ipsType_light'><a class='ipsType_blendLinks' href='{{if $thisCalendar}}{url="app=calendar&module=calendar&controller=view&id={$thisCalendar->_id}&y={$day->year}&m={$day->mon}&d={$day->mday}&view=day" seoTemplate="calendar_calday" seoTitle="$thisCalendar->title_seo"}{{else}}{url="app=calendar&module=calendar&controller=view&y={$day->year}&m={$day->mon}&d={$day->mday}&view=day" seoTemplate="calendar_day"}{{endif}}'>{lang="birthdays_today" pluralize="$birthdays[ $day->mon . $day->mday ]"}</a></p>
|
||||
{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -400,7 +453,11 @@
|
||||
|
||||
<ul class="ipsToolList ipsToolList_horizontal ipsResponsive_showPhone ipsResponsive_block ipsClearfix ipsSpacer_top">
|
||||
{{if ( $thisCalendar AND $thisCalendar->can('add') ) OR ( !$thisCalendar AND \IPS\calendar\Calendar::canOnAny('add') )}}
|
||||
<li><a href='{url="app=calendar&module=calendar&controller=submit" seoTemplate="calendar_submit"}' class='ipsButton ipsButton_important ipsButton_normal ipsButton_fullWidth'>{lang="create_event"}</a></li>
|
||||
{{if $thisCalendar}}
|
||||
<li><a href='{url="app=calendar&module=calendar&controller=submit&calendar={$thisCalendar->id}" seoTemplate="calendar_submit"}' class='ipsButton ipsButton_important ipsButton_normal ipsButton_fullWidth'>{lang="create_event"}</a></li>
|
||||
{{else}}
|
||||
<li><a href='{url="app=calendar&module=calendar&controller=submit" seoTemplate="calendar_submit"}' class='ipsButton ipsButton_important ipsButton_normal ipsButton_fullWidth'>{lang="create_event"}</a></li>
|
||||
{{endif}}
|
||||
<li><a href='#elCalendarJump' data-ipsMenu data-ipsMenu-menuID='elCalendarJump' data-ipsMenu-closeOnClick='false' class='ipsButton ipsButton_light ipsButton_fullWidth ipsButton_normal'>{lang="jump_to"} <i class='fa fa-caret-down'></i></a></li>
|
||||
{{endif}}
|
||||
</ul>
|
||||
@@ -486,11 +543,11 @@
|
||||
{{endif}}
|
||||
{{if $event->container()->allow_reviews}}
|
||||
<li>
|
||||
<span itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
|
||||
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
|
||||
<meta itemprop='ratingValue' content='{$event->averageReviewRating()}'>
|
||||
<meta itemprop='reviewCount' content='{$event->reviews}'>
|
||||
{template="rating" group="global" location="front" app="core" params="'small', $event->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of"}
|
||||
</span>
|
||||
{template="rating" group="global" location="front" app="core" params="'small', $event->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $event->memberReviewRating()"}
|
||||
</div>
|
||||
</li>
|
||||
{{endif}}
|
||||
{{if $event->container()->allow_comments}}
|
||||
@@ -505,7 +562,7 @@
|
||||
{{foreach $rows as $row}}
|
||||
{{$idField = $row::$databaseColumnId;}}
|
||||
<li class="ipsDataItem ipsDataItem_responsivePhoto {{if $row->unread()}}ipsDataItem_unread{{endif}} {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsDataItem_{$row->tableClass()}{{endif}} {{if $row->hidden()}}ipsModerated{{endif}}" data-controller='core.front.system.manageFollowed' data-followID='{$row->_followData['follow_area']}-{$row->_followData['follow_rel_id']}'>
|
||||
<div class='ipsDataItem_generic ipsDataItem_size2'>
|
||||
<div class='ipsDataItem_generic ipsDataItem_size2 ipsDataItem_imageColumn'>
|
||||
{{if $row->nextOccurrence( \IPS\calendar\Date::getDate(), 'startDate' )}}
|
||||
<time datetime='{$row->nextOccurrence( \IPS\calendar\Date::getDate(), 'startDate' )->mysqlDatetime()}' class='ipsCalendarDate ipsCalendarDate_large'>
|
||||
<span class='ipsCalendarDate_month'>{$row->nextOccurrence( \IPS\calendar\Date::getDate(), 'startDate' )->monthNameShort}</span>
|
||||
@@ -519,7 +576,7 @@
|
||||
{{endif}}
|
||||
</div>
|
||||
<div class='ipsDataItem_main ipsPos_middle'>
|
||||
<h4 class='ipsDataItem_title ipsType_break ipsType_normal'>
|
||||
<h4 class='ipsDataItem_title ipsContained_container'>
|
||||
{{if $row->mapped('locked')}}
|
||||
<i class="fa fa-lock"></i>
|
||||
{{endif}}
|
||||
@@ -541,12 +598,14 @@
|
||||
{{endif}}
|
||||
|
||||
{{if $row->prefix()}}
|
||||
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
|
||||
<span>{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}</span>
|
||||
{{endif}}
|
||||
|
||||
<a href='{$row->url()}'>
|
||||
{{if $row->mapped('title')}}{wordbreak="$row->mapped('title')"}{{else}}<em class="ipsType_light">{lang="content_deleted"}</em>{{endif}}
|
||||
</a>
|
||||
<div class='ipsType_break ipsContained'>
|
||||
<a href='{$row->url()}'>
|
||||
{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}<em class="ipsType_light">{lang="content_deleted"}</em>{{endif}}
|
||||
</a>
|
||||
</div>
|
||||
</h4>
|
||||
<div class='ipsDataItem_meta ipsType_light ipsType_blendLinks' data-ipsTruncate data-ipsTruncate-size='2 lines' data-ipsTruncate-type='remove'>
|
||||
{{if method_exists( $row, 'tableDescription' )}}
|
||||
@@ -558,11 +617,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='ipsDataItem_generic ipsDataItem_size1 ipsType_center ipsType_large'>
|
||||
<div class='ipsDataItem_generic ipsDataItem_size1 ipsType_center ipsType_large cFollowedContent_anon'>
|
||||
<span class='ipsBadge ipsBadge_icon ipsBadge_new {{if !$row->_followData['follow_is_anon']}}ipsHide{{endif}}' data-role='followAnonymous' data-ipsTooltip title='{lang="follow_is_anon"}'><i class='fa fa-eye-slash'></i></span>
|
||||
</div>
|
||||
|
||||
<div class='ipsDataItem_generic ipsDataItem_size6'>
|
||||
<div class='ipsDataItem_generic ipsDataItem_size6 cFollowedContent_info'>
|
||||
<ul class='ipsList_reset'>
|
||||
<li title='{lang="follow_when"}' data-role='followDate'><i class='fa fa-clock-o'></i> {datetime="$row->_followData['follow_added']"}</li>
|
||||
<li title='{lang="follow_how"}' data-role='followFrequency'>
|
||||
@@ -575,7 +634,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class='ipsDataItem_generic ipsDataItem_size6 ipsType_center'>
|
||||
<div class='ipsDataItem_generic ipsDataItem_size6 ipsType_center cFollowedContent_manage'>
|
||||
{template="manageFollow" group="system" app="core" params="$row->_followData['follow_app'], $row->_followData['follow_area'], $row->_followData['follow_rel_id']"}
|
||||
</div>
|
||||
|
||||
@@ -632,9 +691,11 @@
|
||||
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
|
||||
{{endif}}
|
||||
|
||||
<a href='{$row->url()}' class='ipsType_break' {{if $row->tableHoverUrl}}data-ipsHover{{endif}}>
|
||||
{{if $row->mapped('title')}}{wordbreak="$row->mapped('title')"}{{else}}<em class="ipsType_light">{lang="content_deleted"}</em>{{endif}}
|
||||
</a>
|
||||
<div class='ipsType_break ipsContained'>
|
||||
<a href='{$row->url()}' class='ipsTruncate ipsTruncate_line' {{if $row->tableHoverUrl}}data-ipsHover{{endif}}>
|
||||
{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}<em class="ipsType_light">{lang="content_deleted"}</em>{{endif}}
|
||||
</a>
|
||||
</div>
|
||||
</h4>
|
||||
<div class='ipsDataItem_meta ipsType_light ipsType_blendLinks'>
|
||||
{$row->eventBlurb()|raw}
|
||||
@@ -656,7 +717,7 @@
|
||||
{{endif}}
|
||||
{{endforeach}}
|
||||
{{if count( $attendees[1] ) > 5}}
|
||||
<li class='ipsType_light'>{lang="and_x_more" sprintf="count( $attendees[1] ) - 5"}</li>
|
||||
<li class='ipsType_light'>{lang="and_x_more" pluralize="count( $attendees[1] ) - 5"}</li>
|
||||
{{endif}}
|
||||
</ul>
|
||||
{{endif}}
|
||||
@@ -664,30 +725,14 @@
|
||||
{{if count( $row->tags() )}}
|
||||
<ul class='ipsTags ipsList_inline'>
|
||||
{{foreach $row->tags() as $tag}}
|
||||
<li><a href="{url="app=core&module=search&controller=search&do=tags&tag={$tag}" seoTemplate="tags"}">{$tag}</a></li>
|
||||
<li><a href="{url="app=core&module=search&controller=search&tags={$tag}" seoTemplate="tags"}">{$tag}</a></li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
{{endif}}
|
||||
</div>
|
||||
<div class='ipsDataItem_generic ipsDataItem_size8'>
|
||||
{{if $row->container()->allow_reviews}}
|
||||
<ul class='ipsList_inline ipsClearfix ipsRating ipsRating_large'>
|
||||
{{foreach range( 1, 5 ) as $i}}
|
||||
<li class='{{if $row->rating >= $i}}ipsRating_on{{else}}ipsRating_off{{endif}}'>
|
||||
<i class='fa fa-star'></i>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
|
||||
<span class='ipsType_normal'>
|
||||
{{if $row->reviews}}
|
||||
<a href='{$row->url()->setQueryString( 'tab', 'reviews' )->setFragment('replies')}'>
|
||||
{{endif}}
|
||||
{lang="num_reviews" pluralize="$row->reviews"}
|
||||
{{if $row->reviews}}
|
||||
</a>
|
||||
{{endif}}
|
||||
</span>
|
||||
{template="rating" group="global" location="front" app="core" params="'large', $row->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $row->memberReviewRating()"} <span class='ipsType_normal ipsType_light'>({lang="num_reviews" pluralize="$row->reviews"})</span>
|
||||
{{endif}}
|
||||
{{if $row->container()->allow_comments}}
|
||||
<p class='ipsType_normal'>
|
||||
@@ -745,7 +790,7 @@
|
||||
{template="rating" app="core" params="'medium', $reviewRating" group="global"}
|
||||
{{endif}}
|
||||
{{if trim( $indexData['index_content'] ) !== ''}}
|
||||
<div class='ipsType_richText ipsType_break ipsType_medium ipsSpacer_top ipsSpacer_half' {{if !( \IPS\Dispatcher::i()->application->directory == 'core' and \IPS\Dispatcher::i()->module and \IPS\Dispatcher::i()->module->key == 'search' )}}data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='3 lines'{{else}}data-searchable data-findTerm{{endif}}>
|
||||
<div class='ipsType_richText ipsType_break ipsType_medium ipsSpacer_top ipsSpacer_half' {{if !( \IPS\Dispatcher::i()->application->directory == 'core' and \IPS\Dispatcher::i()->module and \IPS\Dispatcher::i()->module->key == 'search' )}}data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='3 lines' data-ipsTruncate-watch='false'{{else}}data-searchable data-findTerm{{endif}}>
|
||||
{$indexData['index_content']|raw}
|
||||
</div>
|
||||
{{endif}}
|
||||
@@ -780,7 +825,7 @@
|
||||
</strong>
|
||||
|
||||
{{if trim( $indexData['index_content'] ) !== ''}}
|
||||
<div class='ipsSpacer_top ipsSpacer_half ipsType_richText ipsType_break ipsType_medium' {{if !( \IPS\Dispatcher::i()->application->directory == 'core' and \IPS\Dispatcher::i()->module and \IPS\Dispatcher::i()->module->key == 'search' )}}data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='2 lines'{{else}}data-searchable data-findTerm{{endif}}>
|
||||
<div class='ipsSpacer_top ipsSpacer_half ipsType_richText ipsType_break ipsType_medium' {{if !( \IPS\Dispatcher::i()->application->directory == 'core' and \IPS\Dispatcher::i()->module and \IPS\Dispatcher::i()->module->key == 'search' )}}data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='2 lines' data-ipsTruncate-watch='false'{{else}}data-searchable data-findTerm{{endif}}>
|
||||
{$indexData['index_content']|raw}
|
||||
</div>
|
||||
{{endif}}
|
||||
@@ -810,9 +855,9 @@
|
||||
{{endif}}
|
||||
{{if $item->author()->member_id != \IPS\Member::loggedIn()->member_id}}
|
||||
{{if $item->author()->members_bitoptions['bw_is_spammer']}}
|
||||
<li class='ipsMenu_item' data-ipsMenuValue='spamFlagButton'><a href='{url="app=core&module=system&controller=moderation&id={$item->author()->member_id}&s=0" seoTemplate="flag_as_spammer" seoTitle="$item->author()->members_seo_name" csrf="true"}' data-confirm data-confirmSubMessage="{lang="spam_unflag_confirm"}">{lang="spam_unflag"}</a></li>
|
||||
<li class='ipsMenu_item' data-ipsMenuValue='spamFlagButton'><a href='{url="app=core&module=system&controller=moderation&do=flagAsSpammer&id={$item->author()->member_id}&s=0" seoTemplate="flag_as_spammer" seoTitle="$item->author()->members_seo_name" csrf="true"}' data-confirm data-confirmSubMessage="{lang="spam_unflag_confirm"}">{lang="spam_unflag"}</a></li>
|
||||
{{else}}
|
||||
<li class='ipsMenu_item' data-ipsMenuValue='spamFlagButton'><a href='{url="app=core&module=system&controller=moderation&id={$item->author()->member_id}&s=1" seoTemplate="flag_as_spammer" seoTitle="$item->author()->members_seo_name" csrf="true"}' data-confirm>{lang="spam_flag"}</a></li>
|
||||
<li class='ipsMenu_item' data-ipsMenuValue='spamFlagButton'><a href='{url="app=core&module=system&controller=moderation&do=flagAsSpammer&id={$item->author()->member_id}&s=1" seoTemplate="flag_as_spammer" seoTitle="$item->author()->members_seo_name" csrf="true"}' data-confirm>{lang="spam_flag"}</a></li>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
<li class="ipsMenu_item"><a href='{url="app=core&module=messaging&controller=messenger&do=compose&to={$item->author()->member_id}" seoTemplate="messenger_compose"}' data-ipsDialog data-ipsDialog-title='{lang="compose_new"}' data-ipsDialog-remoteSubmit data-ipsDialog-flashMessage="{lang="message_sent"}">{lang="message_send"}</a></li>
|
||||
@@ -853,6 +898,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
]]></template>
|
||||
<template template_group="submit" template_name="calendarSelector" template_data="$form" template_location="front" template_app="calendar"><![CDATA[<div class='ipsPad'>
|
||||
{$form|raw}
|
||||
</div>]]></template>
|
||||
<template template_group="submit" template_name="datesForm" template_data="$name, $value, $timeZones, $error=''" template_location="front" template_app="calendar"><![CDATA[
|
||||
<div data-controller='calendar.front.submit.dates' id='eventDateSelection' class='ipsAreaBackground_light ipsPad'>
|
||||
@@ -865,19 +914,25 @@
|
||||
<div class='ipsPad'>
|
||||
<div class='cCalendarSubmit_field'>
|
||||
<i class='fa fa-calendar'></i>
|
||||
<input type="date" data-summaryControl name="event_dates[start_date]" value="{{if $value['start_date'] instanceof \IPS\DateTime}}{$value['start_date']->format('Y-m-d')}{{else}}{$value['start_date']}{{endif}}" data-preferredFormat="{{if $value['start_date'] instanceof \IPS\DateTime}}{$value['start_date']->fullYearLocaleDate()}{{else}}{$value['start_date']}{{endif}}" required aria-required='true' class="ipsField_short" data-control="date" placeholder='{expression="mb_strtoupper( str_replace( 'y', 'yy', \IPS\Member::loggedIn()->language()->preferredDateFormat() ) )"}'>
|
||||
<input type="date" data-summaryControl name="event_dates[start_date]" value="{{if $value['start_date'] instanceof \IPS\DateTime}}{$value['start_date']->format('Y-m-d')}{{else}}{$value['start_date']}{{endif}}" data-preferredFormat="{{if $value['start_date'] instanceof \IPS\DateTime}}{$value['start_date']->fullYearLocaleDate()}{{else}}{$value['start_date']}{{endif}}" required aria-required='true' class="ipsField_short" data-control="date" placeholder='{expression="str_replace( array( 'YYYY', 'MM', 'DD' ), array( \IPS\Member::loggedIn()->language()->addToStack('_date_format_yyyy'), \IPS\Member::loggedIn()->language()->addToStack('_date_format_mm'), \IPS\Member::loggedIn()->language()->addToStack('_date_format_dd') ), str_replace( 'Y', 'YY', \IPS\Member::loggedIn()->language()->preferredDateFormat() ) )"}'>
|
||||
</div>
|
||||
<div class='cCalendarSubmit_field' id='start_time_wrap'>
|
||||
<i class='fa fa-clock-o'></i>
|
||||
<input name="event_dates[start_time]" id="start_time" type="time" size='12' class="ipsField_short" placeholder="HH:MM" step='60' min='00:00' value="{$value['start_time']}">
|
||||
<input name="event_dates[start_time]" id="start_time" type="time" size='12' class="ipsField_short" placeholder="{lang="_time_format_hhmm"}" step='60' min='00:00' value="{$value['start_time']}">
|
||||
</div>
|
||||
<br><br>
|
||||
<ul class='ipsList_inline'>
|
||||
<li>
|
||||
<input type="checkbox" role="checkbox" name="event_dates[single_day]" {{if isset($value['single_day']) AND $value['single_day']}}checked aria-checked='true'{{endif}} value="1" id="check_single_day"> <label for='check_single_day'>{lang="event_single_day"}</label>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type="checkbox" role="checkbox" name="event_dates[single_day]" {{if isset($value['single_day']) AND $value['single_day']}}checked aria-checked='true'{{endif}} value="1" id="check_single_day">
|
||||
<span></span>
|
||||
</span> <label for='check_single_day'>{lang="event_single_day"}</label>
|
||||
</li>
|
||||
<li>
|
||||
<input type="checkbox" role="checkbox" name="event_dates[all_day]" {{if isset($value['all_day']) AND $value['all_day']}}checked aria-checked='true'{{endif}} value="1" id="check_all_day"> <label for='check_all_day'>{lang="event_all_day"}</label>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type="checkbox" role="checkbox" name="event_dates[all_day]" {{if isset($value['all_day']) AND $value['all_day']}}checked aria-checked='true'{{endif}} value="1" id="check_all_day">
|
||||
<span></span>
|
||||
</span> <label for='check_all_day'>{lang="event_all_day"}</label>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@@ -890,11 +945,11 @@
|
||||
<div class='ipsPad'>
|
||||
<div class='cCalendarSubmit_field' id='event_end_date_wrap'>
|
||||
<i class='fa fa-calendar'></i>
|
||||
<input type="date" name="event_dates[end_date]" value="{{if $value['end_date'] instanceof \IPS\DateTime}}{$value['end_date']->format('Y-m-d')}{{else}}{$value['end_date']}{{endif}}" data-preferredFormat="{{if $value['end_date'] instanceof \IPS\DateTime}}{$value['end_date']->fullYearLocaleDate()}{{else}}{{if $value['start_date'] instanceof \IPS\DateTime}}{$value['start_date']->fullYearLocaleDate()}{{else}}{$value['end_date']}{{endif}}{{endif}}" class="ipsField_short" data-control="date" id="event_end_date" placeholder='{expression="mb_strtoupper( str_replace( 'y', 'yy', \IPS\Member::loggedIn()->language()->preferredDateFormat() ) )"}'>
|
||||
<input type="date" name="event_dates[end_date]" value="{{if $value['end_date'] instanceof \IPS\DateTime}}{$value['end_date']->format('Y-m-d')}{{else}}{$value['end_date']}{{endif}}" data-preferredFormat="{{if $value['end_date'] instanceof \IPS\DateTime}}{$value['end_date']->fullYearLocaleDate()}{{else}}{{if $value['start_date'] instanceof \IPS\DateTime}}{$value['start_date']->fullYearLocaleDate()}{{else}}{$value['end_date']}{{endif}}{{endif}}" class="ipsField_short" data-control="date" id="event_end_date" placeholder='{expression="mb_strtoupper( str_replace( 'Y', 'YY', \IPS\Member::loggedIn()->language()->preferredDateFormat() ) )"}'>
|
||||
</div>
|
||||
<div class='cCalendarSubmit_field' id='end_time_wrap'>
|
||||
<i class='fa fa-clock-o'></i>
|
||||
<input name="event_dates[end_time]" id="end_time" type="time" size='12' class="ipsField_short" placeholder="HH:MM" step='60' min='00:00' value="{$value['end_time']}">
|
||||
<input name="event_dates[end_time]" id="end_time" type="time" size='12' class="ipsField_short" placeholder="{lang="_time_format_hhmm"}" step='60' min='00:00' value="{$value['end_time']}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -907,7 +962,10 @@
|
||||
<span data-role='dateSummary'></span>
|
||||
</p>
|
||||
<p class='ipsType_normal' id='elRepeatRow_hidden'>
|
||||
<input type='checkbox' role='checkbox' name='event_dates[event_repeat]' value='1' id="elRepeatCb" {{if isset($value['event_repeat']) AND $value['event_repeat']}}checked aria-checked='true'{{endif}}> <label for='elRepeatCb'>{lang="submit_event_repeats_check"}</label>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type='checkbox' role='checkbox' name='event_dates[event_repeat]' value='1' id="elRepeatCb" {{if isset($value['event_repeat']) AND $value['event_repeat']}}checked aria-checked='true'{{endif}}>
|
||||
<span></span>
|
||||
</span> <label for='elRepeatCb'>{lang="submit_event_repeats_check"}</label>
|
||||
</p>
|
||||
<div id='elRepeatRow_shown' class='ipsJS_hide'>
|
||||
<br>
|
||||
@@ -959,7 +1017,10 @@
|
||||
<ul class='ipsFieldRow_content ipsList_reset'>
|
||||
{{foreach \IPS\calendar\Date::getDayNames() as $day }}
|
||||
<li class='ipsFieldRow_inlineCheckbox'>
|
||||
<input type="checkbox" role="checkbox" name="event_dates[repeat_freq_on_{$day['ical']}]" value="1" id="check_repeat_freq_on_{$day['ical']}" data-iCal='{$day['ical']}' {{if ( isset( $value['repeat_freq_on_' . $day['ical'] ] ) AND $value['repeat_freq_on_' . $day['ical'] ] )}}checked aria-checked='true'{{endif}}> <label for="check_repeat_freq_on_{$day['ical']}">{$day['abbreviated']}</label>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type="checkbox" role="checkbox" name="event_dates[repeat_freq_on_{$day['ical']}]" value="1" id="check_repeat_freq_on_{$day['ical']}" data-iCal='{$day['ical']}' {{if ( isset( $value['repeat_freq_on_' . $day['ical'] ] ) AND $value['repeat_freq_on_' . $day['ical'] ] )}}checked aria-checked='true'{{endif}}>
|
||||
<span></span>
|
||||
</span> <label for="check_repeat_freq_on_{$day['ical']}">{$day['abbreviated']}</label>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>
|
||||
@@ -968,19 +1029,28 @@
|
||||
<span class='ipsFieldRow_label' for=''>{lang="event_rpm_ends"}</span>
|
||||
<ul class='ipsFieldRow_content ipsField_fieldList'>
|
||||
<li>
|
||||
<input type='radio' name='event_dates[repeat_end]' id='event_repeat_end_never' value='never'{{if !$value['repeat_end_occurrences'] AND !$value['repeat_end_date']}} checked{{endif}}>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type='radio' name='event_dates[repeat_end]' id='event_repeat_end_never' value='never'{{if !$value['repeat_end_occurrences'] AND !$value['repeat_end_date']}} checked{{endif}}>
|
||||
<span></span>
|
||||
</span>
|
||||
<div class='ipsField_fieldList_content'>
|
||||
<label for="event_repeat_end_never">{lang="event_rpm_ends_never"}</label>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<input type='radio' name='event_dates[repeat_end]' id='event_repeat_end_afterx' value='after'{{if $value['repeat_end_occurrences']}} checked{{endif}}>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type='radio' name='event_dates[repeat_end]' id='event_repeat_end_afterx' value='after'{{if $value['repeat_end_occurrences']}} checked{{endif}}>
|
||||
<span></span>
|
||||
</span>
|
||||
<div class='ipsField_fieldList_content'>
|
||||
<label for="event_repeat_end_afterx">{lang="event_rpm_ends_afterx"}</label> <input type='number' name='event_dates[repeat_end_occurrences]' class='cCalendar_shortInput' size='4' min='1' value='{$value['repeat_end_occurrences']}'> {lang="event_rpm_ends_occurrencesx"}
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<input type='radio' name='event_dates[repeat_end]' id='event_repeat_end_ondate' value='date'{{if $value['repeat_end_date']}} checked{{endif}}>
|
||||
<span class='ipsCustomInput'>
|
||||
<input type='radio' name='event_dates[repeat_end]' id='event_repeat_end_ondate' value='date'{{if $value['repeat_end_date']}} checked{{endif}}>
|
||||
<span></span>
|
||||
</span>
|
||||
<div class='ipsField_fieldList_content'>
|
||||
<label for="event_repeat_end_ondate">{lang="event_rpm_ends_date"}</label> <input type='date' name='event_dates[repeat_end_date]' class='cCalendar_shortInput' size='10' value='{{if $value['repeat_end_date'] instanceof \IPS\calendar\Date}}{$value['repeat_end_date']->mysqlDatetime( FALSE )}{{endif}}'>
|
||||
</div>
|
||||
@@ -1077,7 +1147,7 @@
|
||||
</ul>
|
||||
{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="view" template_name="comments" template_data="$event" template_location="front" template_app="calendar"><![CDATA[<div class='' data-controller='core.front.core.commentFeed' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-baseURL='{$event->url()}' {{if $event->isLastPage()}}data-lastPage{{endif}} data-feedID='event-{$event->id}' id='comments'>
|
||||
<template template_group="view" template_name="comments" template_data="$event" template_location="front" template_app="calendar"><![CDATA[<div class='' data-controller='core.front.core.commentFeed, core.front.core.ignoredComments' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-baseURL='{$event->url()}' {{if $event->isLastPage()}}data-lastPage{{endif}} data-feedID='event-{$event->id}' id='comments'>
|
||||
{{if $event->commentPageCount() > 1}}
|
||||
{$event->commentPagination( array( 'tab' ) )|raw}
|
||||
<br><br>
|
||||
@@ -1126,9 +1196,9 @@
|
||||
{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="view" template_name="coverPhotoOverlay" template_data="$event" template_location="front" template_app="calendar"><![CDATA[<div class='cEvent_details'>
|
||||
<h1 class='ipsType_pageTitle ipsTruncate ipsTruncate_line'>
|
||||
<h1 class='ipsType_pageTitle ipsContained_container ipsTruncate ipsTruncate_line'>
|
||||
{{if $event->prefix()}}
|
||||
{template="prefix" group="global" app="core" params="$event->prefix( TRUE ), $event->prefix()"}
|
||||
<span>{template="prefix" group="global" app="core" params="$event->prefix( TRUE ), $event->prefix()"}</span>
|
||||
{{endif}}
|
||||
|
||||
{{if $event->locked()}}<i class='fa fa-lock'></i> {{endif}}
|
||||
@@ -1146,8 +1216,15 @@
|
||||
<span class="ipsBadge ipsBadge_icon ipsBadge_positive" data-ipsTooltip title='{lang="featured"}'><i class='fa fa-star'></i></span>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
|
||||
<span itemprop='name'>{$event->title}</span>
|
||||
{{if $event->canEdit()}}
|
||||
<div class='ipsType_break ipsContained' data-controller="core.front.core.moderation">
|
||||
<span itemprop='name' data-role="editableTitle" title='{lang="click_hold_edit"}'>{$event->title}</span>
|
||||
</div>
|
||||
{{else}}
|
||||
<div class='ipsType_break ipsContained'>
|
||||
<span itemprop='name' class="">{$event->title}</span>
|
||||
</div>
|
||||
{{endif}}
|
||||
</h1>
|
||||
<p class='ipsType_normal ipsType_reset'>
|
||||
<time itemprop='startDate' content='{expression="$event->_start_date->format( 'Y-m-d' )"}'>
|
||||
@@ -1182,7 +1259,7 @@
|
||||
<img src='{$event->author()->photo}' class="ipsUserPhoto ipsUserPhoto_mini" alt=''>
|
||||
</div>
|
||||
<div class='ipsColumn ipsColumn_fluid'>
|
||||
<h2 class='ipsType_pageTitle'><a href='{$event->url()}' title='{$event->title}'>{truncate="$event->title" length="18"}{{if $event->hidden() === 1}} <span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span>{{endif}}</a></h2>
|
||||
<h2 class='ipsType_pageTitle ipsType_blendLinks'><a href='{$event->url()}' title='{$event->title}'>{truncate="$event->title" length="18"}{{if $event->hidden() === 1}} <span class="ipsBadge ipsBadge_icon ipsBadge_warning" data-ipsTooltip title='{lang="pending_approval"}'><i class='fa fa-warning'></i></span>{{endif}}</a></h2>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1190,7 +1267,7 @@
|
||||
<div class='ipsPad ipsClearfix'>
|
||||
<h3 class='ipsType_reset'>
|
||||
{{$startDate = $event->nextOccurrence( $date, 'startDate' );}}
|
||||
{{if $revertToFirst AND $startDate->mon > $date->mon}}
|
||||
{{if $revertToFirst AND $startDate AND $startDate->mon > $date->mon}}
|
||||
{{$startDate = $event->nextOccurrence( \IPS\calendar\Date::getDate( $date->year, $date->mon, 1 ), 'startDate' );}}
|
||||
{{endif}}
|
||||
{{if $startDate}}
|
||||
@@ -1257,14 +1334,21 @@
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ul>]]></template>
|
||||
<template template_group="view" template_name="eventSidebar" template_data="$event, $attendees, $tabId=''" template_location="front" template_app="calendar"><![CDATA[
|
||||
<template template_group="view" template_name="eventSidebar" template_data="$event, $attendees, $tabId='', $address=NULL" template_location="front" template_app="calendar"><![CDATA[
|
||||
{{if $event->map( 250, 250 )}}
|
||||
<div class='ipsPad_half ipsType_center ipsAreaBackground'>
|
||||
{$event->map( 250, 250 )|raw}
|
||||
</div>
|
||||
<br>
|
||||
{{endif}}
|
||||
|
||||
{{if $address}}
|
||||
<div class='ipsPad_half ipsAreaBackground'>
|
||||
<h3 class='ipsType_minorHeading'>
|
||||
<strong>{lang="event_address"}</strong>
|
||||
</h3>
|
||||
{$address|raw}
|
||||
</div>
|
||||
{{endif}}
|
||||
{{if $event->rsvp }}
|
||||
{template="rsvpControls" group="view" params="$event, $attendees"}
|
||||
<br>
|
||||
@@ -1343,14 +1427,14 @@
|
||||
|
||||
{{if count($attendees[0]) OR count($attendees[1]) OR count($attendees[2]) }}
|
||||
<div class='ipsPad_half ipsType_center ipsType_medium ipsAreaBackground_light'>
|
||||
<a href='{$event->url('downloadRsvp')}' class=''><i class='fa fa-arrow-circle-o-down'></i> {lang="rsvp_download"}</a>
|
||||
<a href='{$event->url('downloadRsvp')->csrf()}' class='' rel="noindex, nofollow" ><i class='fa fa-arrow-circle-o-down'></i> {lang="rsvp_download"}</a>
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
{{endif}}]]></template>
|
||||
<template template_group="view" template_name="reviews" template_data="$event" template_location="front" template_app="calendar"><![CDATA[<div data-controller='core.front.core.commentFeed' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-baseURL='{$event->url()}' {{if $event->isLastPage('reviews')}}data-lastPage{{endif}} data-feedID='event-{$event->id}-reviews' id='reviews'>
|
||||
{{if $event->canReview()}}
|
||||
<template template_group="view" template_name="reviews" template_data="$event" template_location="front" template_app="calendar"><![CDATA[<div data-controller='core.front.core.commentFeed' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-commentsType='reviews' data-baseURL='{$event->url()}' {{if $event->isLastPage('reviews')}}data-lastPage{{endif}} data-feedID='event-{$event->id}-reviews' id='reviews'>
|
||||
{{if $event->reviewForm()}}
|
||||
{{if $event->locked()}}
|
||||
<strong class='ipsType_warning'><i class='fa fa-info-circle'></i> {lang="item_locked_can_review"}</strong>
|
||||
{{endif}}
|
||||
@@ -1358,34 +1442,42 @@
|
||||
{$event->reviewForm()|raw}
|
||||
</div>
|
||||
{{else}}
|
||||
{{if $event->locked()}}
|
||||
{template="commentUnavailable" group="forms" location="front" app="core" params="'item_locked_cannot_comment'"}
|
||||
{{if $event->hasReviewed()}}
|
||||
<!-- Already reviewed -->
|
||||
{{elseif $event->locked()}}
|
||||
{template="commentUnavailable" group="forms" location="front" app="core" params="'item_locked_cannot_review'"}
|
||||
{{elseif \IPS\Member::loggedin()->restrict_post}}
|
||||
{template="commentUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment', \IPS\Member::loggedIn()->restrict_post"}
|
||||
{{if \IPS\Member::loggedIn()->restrict_post == -1}}
|
||||
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment'"}
|
||||
{{else}}
|
||||
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment', \IPS\Member::loggedIn()->warnings(5,NULL,'rpa'), \IPS\Member::loggedIn()->restrict_post"}
|
||||
{{endif}}
|
||||
{{elseif \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings']}}
|
||||
{template="reviewUnavailable" group="forms" location="front" app="core" params="'unacknowledged_warning_cannot_post', \IPS\Member::loggedIn()->warnings( 1, FALSE )"}
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
{{if count( $event->reviews() )}}
|
||||
<hr class='ipsHr'>
|
||||
<div class="ipsClearfix">
|
||||
{{if !$event->hasReviewed()}}<hr class='ipsHr'>{{endif}}
|
||||
<div class="ipsClearfix ipsSpacer_bottom">
|
||||
{{if $event->reviewPageCount() > 1}}
|
||||
<div class="ipsPos_left">
|
||||
<div class="ipsPos_left ipsResponsive_noFloat">
|
||||
{$event->reviewPagination( array( 'tab', 'sort' ) )|raw}
|
||||
</div>
|
||||
{{endif}}
|
||||
<div class="ipsClearfix ipsResponsive_showDesktop ipsPos_right">
|
||||
<ul class="ipsButtonRow ipsPos_left ipsClearfix">
|
||||
<li data-action="tableFilter" data-filter="helpful">
|
||||
<div class="ipsClearfix ipsPos_right ipsResponsive_hidePhone">
|
||||
<ul class="ipsButtonRow ipsClearfix">
|
||||
<li data-action="tableFilter">
|
||||
<a href="{$event->url()->setQueryString( array( 'tab' => 'reviews', 'page' => 1, 'sort' => 'helpful' ) )}" class="{{if !isset( request.sort ) or request.sort != 'newest'}}ipsButtonRow_active{{endif}}" data-action="filterClick">{lang="most_helpful"}</a>
|
||||
</li>
|
||||
<li data-action="tableFilter" data-filter="newest">
|
||||
<li data-action="tableFilter">
|
||||
<a href="{$event->url()->setQueryString( array( 'tab' => 'reviews', 'page' => 1, 'sort' => 'newest' ) )}" class="{{if isset( request.sort ) and request.sort == 'newest'}}ipsButtonRow_active{{endif}}" data-action="filterClick">{lang="newest"}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<div data-role='commentFeed' data-controller='core.front.core.moderation'>
|
||||
<form action="{$event->url()->setQueryString( 'do', 'multimodReview' )}" method="post" data-ipsPageAction data-role='moderationTools'>
|
||||
<form action="{$event->url()->csrf()->setQueryString( 'do', 'multimodReview' )}" method="post" data-ipsPageAction data-role='moderationTools'>
|
||||
{{$reviewCount=0; $timeLastRead = $event->timeLastRead(); $lined = FALSE;}}
|
||||
{{foreach $event->reviews() as $review}}
|
||||
{{if !$lined and $timeLastRead and $timeLastRead->getTimestamp() < $review->mapped('date')}}
|
||||
@@ -1400,8 +1492,9 @@
|
||||
</form>
|
||||
</div>
|
||||
{{if $event->reviewPageCount() > 1}}
|
||||
<hr class='ipsHr'>
|
||||
{$event->reviewPagination( array( 'tab', 'sort' ) )|raw}
|
||||
<div>
|
||||
{$event->reviewPagination( array( 'tab', 'sort' ) )|raw}
|
||||
</div>
|
||||
{{endif}}
|
||||
{{elseif !$event->canReview()}}
|
||||
<p class="ipsType_normal ipsType_light ipsType_reset" data-role="noReviews">{lang="no_reviews"}</p>
|
||||
@@ -1423,14 +1516,14 @@
|
||||
<ul class="ipsToolList ipsToolList_vertical">
|
||||
{{if isset( $attendees[2][ \IPS\Member::loggedIn()->member_id ] )}}
|
||||
<li>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'yes' )}' class='ipsButton ipsButton_important ipsButton_fullWidth'>{lang="rsvp_attend_event"}</a>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'yes' )->csrf()}' class='ipsButton ipsButton_important ipsButton_fullWidth'>{lang="rsvp_attend_event"}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'no' )}' class='ipsButton ipsButton_veryLight ipsButton_fullWidth ipsButton_verySmall'>{lang="rsvp_notgoing_event"}</a>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'no' )->csrf()}' class='ipsButton ipsButton_veryLight ipsButton_fullWidth ipsButton_verySmall'>{lang="rsvp_notgoing_event"}</a>
|
||||
</li>
|
||||
{{else}}
|
||||
<li class='ipsType_center'>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'leave' )}' class=''>{lang="rsvp_leave_event"}</a>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'leave' )->csrf()}' class=''>{lang="rsvp_leave_event"}</a>
|
||||
</li>
|
||||
{{endif}}
|
||||
</ul>
|
||||
@@ -1441,16 +1534,16 @@
|
||||
<div class='ipsMessage ipsMessage_info'>{lang="rsvp_limit_reached"}</div>
|
||||
{{else}}
|
||||
{{if $event->rsvp_limit > 0}}<div class='ipsMessage ipsMessage_info'>{lang="rsvp_limit_info" pluralize="count($attendees[1])" sprintf="$event->rsvp_limit"}</div>{{endif}}
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'yes' )}' class='ipsButton ipsButton_important ipsButton_fullWidth'>{lang="rsvp_attend_event"}</a>
|
||||
<a href='{$event->url('rsvp')->setQueryString( 'action', 'yes' )->csrf()}' class='ipsButton ipsButton_important ipsButton_fullWidth'>{lang="rsvp_attend_event"}</a>
|
||||
<br>
|
||||
<div class='ipsGrid'>
|
||||
{{if $event->rsvp_limit == -1}}<div class='ipsGrid_span6'><a href='{$event->url('rsvp')->setQueryString( 'action', 'maybe' )}' class='ipsButton ipsButton_primary ipsButton_fullWidth ipsButton_verySmall'>{lang="rsvp_maybe_event"}</a></div>{{endif}}
|
||||
<div class='ipsGrid_span{{if $event->rsvp_limit == -1}}6{{else}}12{{endif}}'><a href='{$event->url('rsvp')->setQueryString( 'action', 'no' )}' class='ipsButton ipsButton_primary ipsButton_fullWidth ipsButton_verySmall'>{lang="rsvp_notgoing_event"}</a></div>
|
||||
{{if $event->rsvp_limit == -1}}<div class='ipsGrid_span6'><a href='{$event->url('rsvp')->setQueryString( 'action', 'maybe' )->csrf()}' class='ipsButton ipsButton_primary ipsButton_fullWidth ipsButton_verySmall'>{lang="rsvp_maybe_event"}</a></div>{{endif}}
|
||||
<div class='ipsGrid_span{{if $event->rsvp_limit == -1}}6{{else}}12{{endif}}'><a href='{$event->url('rsvp')->setQueryString( 'action', 'no' )->csrf()}' class='ipsButton ipsButton_primary ipsButton_fullWidth ipsButton_verySmall'>{lang="rsvp_notgoing_event"}</a></div>
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
{{endif}}]]></template>
|
||||
<template template_group="view" template_name="view" template_data="$event, $commentsAndReviews, $attendees" template_location="front" template_app="calendar"><![CDATA[<div itemscope itemtype="http://schema.org/Event">
|
||||
<template template_group="view" template_name="view" template_data="$event, $commentsAndReviews, $attendees, $address=NULL" template_location="front" template_app="calendar"><![CDATA[<div itemscope itemtype="http://schema.org/Event">
|
||||
<header class='ipsClearfix ipsSpacer_bottom'>
|
||||
<div id="elEventHeader">{$event->coverPhoto()|raw}</div>
|
||||
<div id='elEventHeader_details' class='ipsClearfix ipsAreaBackground ipsPad'>
|
||||
@@ -1462,11 +1555,11 @@
|
||||
{lang="event_created_by" htmlsprintf="$event->author()->link( $event->warningRef() )"}
|
||||
</p>
|
||||
{{if $event->container()->allow_reviews}}
|
||||
<span itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
|
||||
<div itemprop="aggregateRating" itemscope itemtype="http://schema.org/AggregateRating">
|
||||
<meta itemprop='ratingValue' content='{$event->averageReviewRating()}'>
|
||||
<meta itemprop='reviewCount' content='{$event->reviews}'>
|
||||
{template="rating" group="global" location="front" app="core" params="'large', $event->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of"} <span class='ipsType_medium ipsType_light'>({lang="num_reviews" pluralize="$event->reviews"})</span>
|
||||
</span>
|
||||
{template="rating" group="global" location="front" app="core" params="'large', $event->averageReviewRating(), \IPS\Settings::i()->reviews_rating_out_of, $event->memberReviewRating()"} <span class='ipsType_medium ipsType_light'>({lang="num_reviews" pluralize="$event->reviews"})</span>
|
||||
</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
@@ -1490,7 +1583,7 @@
|
||||
<div class='ipsColumns ipsColumns_collapsePhone'>
|
||||
<aside class='ipsColumn ipsColumn_wide'>
|
||||
<div class='ipsAreaBackground_light'>
|
||||
{template="eventSidebar" group="view" params="$event, $attendees, 'Mob'"}
|
||||
{template="eventSidebar" group="view" params="$event, $attendees, 'Mob', $address"}
|
||||
</div>
|
||||
</aside>
|
||||
<div class='ipsColumn ipsColumn_fluid'>
|
||||
@@ -1509,13 +1602,13 @@
|
||||
{{endif}}
|
||||
<h2 class='ipsType_sectionHead ipsSpacer_bottom'>{lang="event_details"}</h2>
|
||||
|
||||
{{if count( $event->tags() )}}
|
||||
{template="tags" group="global" app="core" params="$event->tags()"}
|
||||
{{if count( $event->tags() ) OR ( $event->canEdit() AND $event::canTag( NULL, $event->container() ) )}}
|
||||
{template="tags" group="global" app="core" params="$event->tags(), FALSE, FALSE, ( $event->canEdit() AND $event::canTag( NULL, $event->container() ) ) ? $event->url() : NULL"}
|
||||
<br>
|
||||
{{endif}}
|
||||
<div class='ipsComment_content ipsType_medium'>
|
||||
<div class='ipsClear ipsType_normal ipsType_richText ipsType_break'>
|
||||
{$event->content|raw}
|
||||
{$event->content()|raw}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1541,7 +1634,7 @@
|
||||
<a href='#elEventActions_menu' id='elEventActions' class='ipsButton ipsButton_light ipsButton_verySmall ipsButton_fullWidth' data-ipsMenu>{lang="manage_event"} <i class='fa fa-caret-down'></i></a>
|
||||
<ul id='elEventActions_menu' class='ipsMenu ipsMenu_auto ipsHide'>
|
||||
{{if $event->canEdit()}}
|
||||
<li class='ipsMenu_item'><a href='{$event->url()->csrf()->setQueryString( array( 'do' => 'edit' ) )}' title='{lang="calendar_edit_details_title"}'>{lang="calendar_edit_details"}</a></li>
|
||||
<li class='ipsMenu_item'><a href='{$event->url()->csrf()->setQueryString( array( 'do' => 'edit' ) )}' title="{lang="calendar_edit_details_title"}">{lang="calendar_edit_details"}</a></li>
|
||||
{{endif}}
|
||||
{{if $event->canFeature()}}
|
||||
<li class='ipsMenu_item'><a href='{$event->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'feature' ) )}' title='{lang="feature_title_event"}'>{lang="feature"}</a></li>
|
||||
@@ -1581,7 +1674,7 @@
|
||||
</li>
|
||||
{{endif}}
|
||||
|
||||
<li><a href='{$event->url('download')}' title='{lang="download_ical_title"}' class='ipsButton ipsButton_link ipsButton_verySmall ipsButton_fullWidth'>{lang="download_ical"}</a></li>
|
||||
<li><a href='{$event->url('download')}' rel="noindex, nofollow" title='{lang="download_ical_title"}' class='ipsButton ipsButton_link ipsButton_verySmall ipsButton_fullWidth'>{lang="download_ical"}</a></li>
|
||||
</ul>
|
||||
|
||||
<div class='ipsResponsive_showPhone ipsResponsive_block'>
|
||||
@@ -1628,8 +1721,8 @@
|
||||
<div class='ipsDataItem_icon'>
|
||||
{template="userPhoto" app="core" group="global" params="$review->author(), 'tiny'"}
|
||||
</div>
|
||||
<div class='ipsDataItem_main ipsType_break'>
|
||||
<a href="{$review->item()->url()}" title='{lang="view_this_event" sprintf="$review->item()->title"}'>{wordbreak="$review->item()->title"}</a><br>
|
||||
<div class='ipsDataItem_main ipsType_break ipsContained'>
|
||||
<a href="{$review->item()->url()}" title='{lang="view_this_event" sprintf="$review->item()->title"}' class='ipsTruncate ipsTruncate_line'>{$review->item()->title}</a><br>
|
||||
<span class='ipsType_light ipsType_medium'>{lang="byline_nodate" htmlsprintf="$review->author()->link()"}</span><br>
|
||||
{template="rating" group="global" location="front" app="core" params="'small', $review->rating, \IPS\Settings::i()->reviews_rating_out_of"}
|
||||
<span class='ipsType_small ipsType_reset'><time datetime="{$review->mapped('date')}" itemprop="dtreviewed">{datetime="$review->mapped('date')" norelative="true"}</time></span>
|
||||
@@ -1649,10 +1742,10 @@
|
||||
<div class='ipsDataItem_icon'>
|
||||
{template="userPhoto" app="core" group="global" params="$review->author(), 'tiny'"}
|
||||
</div>
|
||||
<div class='ipsDataItem_main ipsType_break'>
|
||||
<a href="{$review->item()->url()}" title='{lang="view_this_event" sprintf="$review->item()->title"}'>{wordbreak="$review->item()->title"}</a><br>
|
||||
<div class='ipsDataItem_main ipsType_break ipsContained'>
|
||||
<a href="{$review->item()->url()}" title='{lang="view_this_event" sprintf="$review->item()->title"}' class='ipsTruncate ipsTruncate_line'>{$review->item()->title}</a><br>
|
||||
<span class='ipsType_light ipsType_medium'>{lang="byline_nodate" htmlsprintf="$review->author()->link()"}</span>, <span class='ipsType_small ipsType_reset ipsType_light'><time datetime="{$review->mapped('date')}" itemprop="dtreviewed">{datetime="$review->mapped('date')" norelative="true"}</time></span><br>
|
||||
<div class='ipsType_medium ipsType_richText' data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='2 lines'>
|
||||
<div class='ipsType_medium ipsType_richText' data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='2 lines' data-ipsTruncate-watch='false'>
|
||||
{template="rating" group="global" location="front" app="core" params="'small', $review->rating, \IPS\Settings::i()->reviews_rating_out_of"} {$review->truncated()|raw}
|
||||
</div>
|
||||
</div>
|
||||
@@ -1664,40 +1757,41 @@
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="widgets" template_name="todaysBirthdays" template_data="$members, $orientation='vertical'" template_location="front" template_app="calendar"><![CDATA[<h3 class='ipsType_reset ipsWidget_title'>{lang="block_todaysBirthdays"}</h3>
|
||||
<div class='ipsWidget_inner'>
|
||||
<template template_group="widgets" template_name="todaysBirthdays" template_data="$members, $count, $today, $orientation='vertical'" template_location="front" template_app="calendar"><![CDATA[<h3 class='ipsType_reset ipsWidget_title'>{lang="block_todaysBirthdays"}</h3>
|
||||
<div class='ipsWidget_inner {{if $orientation == 'vertical'}}ipsPad{{else}}ipsPad_half{{endif}}'>
|
||||
{{if $orientation == 'vertical'}}
|
||||
<div class='ipsPad_half'>
|
||||
{{if !empty($members) }}
|
||||
<ol class='ipsDataList ipsDataList_reducedSpacing'>
|
||||
{{foreach $members as $member}}
|
||||
<li class='ipsDataItem'>
|
||||
<div class='ipsDataItem_main ipsPhotoPanel ipsPhotoPanel_tiny ipsClearfix'>
|
||||
{template="userPhoto" app="core" group="global" params="$member, 'tiny'"}
|
||||
<div>
|
||||
{$member->link()|raw}
|
||||
{{if $member->bday_year}}<br><span class='ipsType_light'>{lang="member_age" sprintf="$member->age()"}</span>{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ol>
|
||||
{{else}}
|
||||
<div class='ipsType_light ipsPad_half ipsType_center'>{lang="no_members_birthday_today"}</div>
|
||||
{{endif}}
|
||||
</div>
|
||||
{{else}}
|
||||
{{if !empty($members) }}
|
||||
<ol class='ipsList_inline ipsList_noSpacing'>
|
||||
{{foreach $members as $idx => $member}}
|
||||
<li>
|
||||
{$member->link()|raw} {{if $member->bday_year}} <span class='ipsType_light'>{lang="member_age" sprintf="$member->age()"}</span>{{endif}}{{if $idx != count( $members ) - 1}},{{endif}}
|
||||
<ol class='ipsDataList ipsDataList_reducedSpacing'>
|
||||
{{foreach $members as $member}}
|
||||
<li class='ipsDataItem'>
|
||||
<div class='ipsDataItem_main ipsPhotoPanel ipsPhotoPanel_tiny ipsClearfix'>
|
||||
{template="userPhoto" app="core" group="global" params="$member, 'tiny'"}
|
||||
<div>
|
||||
{$member->link()|raw}
|
||||
{{if $member->bday_year}}<br><span class='ipsType_light'>{lang="member_age" pluralize="$member->age()"}</span>{{endif}}
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ol>
|
||||
{{else}}
|
||||
<div class='ipsType_light ipsPad_half ipsType_center'>{lang="no_members_birthday_today"}</div>
|
||||
{{endif}}
|
||||
{{else}}
|
||||
{{if !empty($members) }}
|
||||
<ol class='ipsList_inline ipsList_noSpacing'>
|
||||
{{foreach $members as $idx => $member}}
|
||||
<li>
|
||||
{$member->link()|raw} {{if $member->bday_year}} <span class='ipsType_light'>{lang="member_age" pluralize="$member->age()"}</span>{{endif}}{{if $idx != count( $members ) - 1}},{{endif}}
|
||||
</li>
|
||||
{{endforeach}}
|
||||
</ol>
|
||||
{{else}}
|
||||
<div class='ipsType_light ipsPad_half ipsType_center'>{lang="no_members_birthday_today"}</div>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
{{if $count > count($members)}}
|
||||
<a data-ipsDialog data-ipsDialog-title='{lang="birthdays_today" pluralize="$count"}' data-ipsDialog-size="narrow" href='{url="app=calendar&module=calendar&controller=view&view=day&y={$today->year}&m={$today->mon}&d={$today->mday}&show=birthdays" seoTemplate="calendar_day"}'>{lang="birthdays_view_all"}</a>
|
||||
{{endif}}
|
||||
</div>]]></template>
|
||||
<template template_group="widgets" template_name="upcomingEvents" template_data="$events, $today, $orientation='vertical'" template_location="front" template_app="calendar"><![CDATA[<h3 class='ipsType_reset ipsWidget_title'>{lang="block_upcomingEvents"}</h3>
|
||||
@@ -1708,18 +1802,27 @@
|
||||
{{if !empty( $events ) }}
|
||||
<ul class='ipsDataList ipsDataList_reducedSpacing'>
|
||||
{{foreach $events as $event}}
|
||||
<li class='ipsDataItem'>
|
||||
<li class='ipsDataItem ipsClearfix'>
|
||||
<div class='ipsDataItem_icon cCalendar_date_overlay'>
|
||||
<time datetime='{$event->nextOccurrence( $today, 'startDate' )->mysqlDatetime()}' class='ipsCalendarDate'>
|
||||
<span class='ipsCalendarDate_month'>{$event->nextOccurrence( $today, 'startDate' )->monthNameShort}</span>
|
||||
<span class='ipsCalendarDate_date'>{$event->nextOccurrence( $today, 'startDate' )->mday}</span>
|
||||
</time>
|
||||
{{if $event->nextOccurrence( $today, 'startDate' )}}
|
||||
<time datetime='{$event->nextOccurrence( $today, 'startDate' )->mysqlDatetime()}' class='ipsCalendarDate'>
|
||||
<span class='ipsCalendarDate_month'>{$event->nextOccurrence( $today, 'startDate' )->monthNameShort}</span>
|
||||
<span class='ipsCalendarDate_date'>{$event->nextOccurrence( $today, 'startDate' )->mday}</span>
|
||||
</time>
|
||||
{{else}}
|
||||
<time datetime='{$event->lastOccurrence( 'startDate' )->mysqlDatetime()}' class='ipsCalendarDate'>
|
||||
<span class='ipsCalendarDate_month'>{$event->lastOccurrence( 'startDate' )->monthNameShort}</span>
|
||||
<span class='ipsCalendarDate_date'>{$event->lastOccurrence( 'startDate' )->mday}</span>
|
||||
</time>
|
||||
{{endif}}
|
||||
</div>
|
||||
<div class='ipsDataItem_main ipsType_break ipsContained'>
|
||||
<div class='ipsDataItem_main cWidgetComments'>
|
||||
{{if $event->container()->allow_comments && $orientation == 'vertical'}}
|
||||
<div class="ipsCommentCount ipsPos_right {{if $event->comments === 0}}ipsFaded{{endif}}" data-ipsTooltip title='{lang="replies_number" pluralize="$event->comments"}'>{expression="$event->comments"}</div>
|
||||
{{endif}}
|
||||
{{if $event->unread()}}<span class="ipsItemStatus ipsItemStatus_tiny"><i class="fa fa-circle"></i></span> <strong>{{endif}}<a href="{$event->url()}" title='{lang="view_this_event" sprintf="$event->title"}'>{$event->title}</a>{{if $event->unread()}}</strong>{{endif}}<br>
|
||||
<div class='ipsType_break ipsContained'>
|
||||
<a href="{$event->url()}" title='{lang="view_this_event" sprintf="$event->title"}'>{$event->title}</a>
|
||||
</div>
|
||||
<strong class='ipsType_small'>
|
||||
{{if $event->nextOccurrence( $today, 'startDate' )}}
|
||||
{$event->nextOccurrence( $today, 'startDate' )->calendarDate()}{{if !$event->all_day}} {$event->nextOccurrence( $today, 'startDate' )->localeTime( FALSE )} {{endif}}
|
||||
@@ -1741,15 +1844,8 @@
|
||||
{{if $event->container()->allow_comments && $orientation == 'horizontal'}}
|
||||
<span class="{{if $event->comments === 0}}ipsFaded{{endif}}" data-ipsTooltip title='{lang="replies_number" pluralize="$event->comments"}'><i class='fa fa-comment'></i> {expression="$event->comments"}</span>
|
||||
{{endif}}
|
||||
{{if $event->rsvp}}
|
||||
{{$attendees = $event->attendees();}}
|
||||
<i class='fa fa-user'></i> {lang="x_users_going" pluralize="count( $attendees[1] )"}
|
||||
{{if isset( $attendees[1][ \IPS\Member::loggedIn()->member_id ] )}}
|
||||
{{if $orientation == 'vertical'}}<br>{{else}} {{endif}}<strong class='ipsType_success'><i class='fa fa-check-circle'></i> {lang="you_are_going"}</strong>
|
||||
{{endif}}
|
||||
{{endif}}
|
||||
{{if $orientation == 'horizontal'}}
|
||||
<div class='ipsType_medium ipsType_richText' data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='2 lines'>
|
||||
<div class='ipsType_medium ipsType_richText' data-ipsTruncate data-ipsTruncate-type='remove' data-ipsTruncate-size='2 lines' data-ipsTruncate-watch='false'>
|
||||
{$event->truncated()|raw}
|
||||
</div>
|
||||
{{endif}}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
{
|
||||
"31007": "3.1.4",
|
||||
"32000": "3.2.0 Beta 1",
|
||||
"32001": "3.2.0 Beta 2",
|
||||
"32003": "3.2.0",
|
||||
@@ -68,5 +69,79 @@
|
||||
"101009": "4.1.0 Beta 10",
|
||||
"101010": "4.1.0",
|
||||
"101011": "4.1.1",
|
||||
"101012": "4.1.2"
|
||||
"101012": "4.1.2",
|
||||
"101013": "4.1.3",
|
||||
"101014": "4.1.3.1",
|
||||
"101015": "4.1.3.2",
|
||||
"101016": "4.1.4",
|
||||
"101017": "4.1.4.1",
|
||||
"101018": "4.1.5",
|
||||
"101019": "4.1.5.1",
|
||||
"101020": "4.1.5.2",
|
||||
"101021": "4.1.6",
|
||||
"101022": "4.1.6.1",
|
||||
"101023": "4.1.7",
|
||||
"101024": "4.1.8",
|
||||
"101025": "4.1.8.1",
|
||||
"101026": "4.1.9",
|
||||
"101027": "4.1.10",
|
||||
"101028": "4.1.11",
|
||||
"101029": "4.1.11.1",
|
||||
"101030": "4.1.12",
|
||||
"101031": "4.1.12.1",
|
||||
"101032": "4.1.12.2",
|
||||
"101033": "4.1.12.3",
|
||||
"101034": "4.1.13 Beta 1",
|
||||
"101035": "4.1.13 Beta 2",
|
||||
"101036": "4.1.13",
|
||||
"101037": "4.1.13",
|
||||
"101038": "4.1.13.1",
|
||||
"101040": "4.1.13.2",
|
||||
"101041": "4.1.13.2",
|
||||
"101042": "4.1.14 Beta 1",
|
||||
"101043": "4.1.14 Beta 2",
|
||||
"101044": "4.1.14 Beta 3",
|
||||
"101045": "4.1.14 Beta 4",
|
||||
"101046": "4.1.14 Beta 5",
|
||||
"101049": "4.1.14 Beta 6",
|
||||
"101050": "4.1.14 Beta 7",
|
||||
"101051": "4.1.14 RC",
|
||||
"101052": "4.1.14",
|
||||
"101053": "4.1.14.1",
|
||||
"101054": "4.1.14.2",
|
||||
"101055": "4.1.14.3",
|
||||
"101056": "4.1.15",
|
||||
"101057": "4.1.15 Beta 1",
|
||||
"101058": "4.1.15 Beta 2",
|
||||
"101059": "4.1.15 Beta 2a",
|
||||
"101060": "4.1.15 Beta 3",
|
||||
"101061": "4.1.15",
|
||||
"101062": "4.1.15",
|
||||
"101063": "4.1.15",
|
||||
"101064": "4.1.16 Beta 1",
|
||||
"101065": "4.1.16 Beta 2",
|
||||
"101066": "4.1.16 Beta 3",
|
||||
"101067": "4.1.16 Beta 4",
|
||||
"101068": "4.1.16 Beta 5",
|
||||
"101069": "4.1.16",
|
||||
"101070": "4.1.16.1",
|
||||
"101071": "4.1.17 Beta 1",
|
||||
"101072": "4.1.17 Beta 1a",
|
||||
"101073": "4.1.17 Beta 1b",
|
||||
"101074": "4.1.17 Beta 2",
|
||||
"101075": "4.1.17 Beta 3",
|
||||
"101076": "4.1.17 Beta 3",
|
||||
"101077": "4.1.17",
|
||||
"101078": "4.1.17.1",
|
||||
"101079": "4.1.18 Beta 1",
|
||||
"101082": "4.1.18 Beta 1b",
|
||||
"101083": "4.1.18 Beta 2",
|
||||
"101084": "4.1.18 Beta 3",
|
||||
"101085": "4.1.18",
|
||||
"101088": "4.1.18.1",
|
||||
"101089": "4.1.18.2",
|
||||
"101090": "4.1.19 Beta 1",
|
||||
"101091": "4.1.19 Beta 2",
|
||||
"101092": "4.1.19 Beta 3",
|
||||
"101093": "4.1.19"
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Announcements Extension: Calendar
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 29 Apr 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Content Router extension: Calendar
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 7 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Create Menu Extension
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 23 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -30,10 +30,15 @@ class _Event
|
||||
* @return array
|
||||
*/
|
||||
public function getItems()
|
||||
{
|
||||
{
|
||||
if ( \IPS\calendar\Calendar::canOnAny( 'add' ) )
|
||||
{
|
||||
return array( 'event' => array( 'link' => \IPS\Http\Url::internal( "app=calendar&module=calendar&controller=submit&_new=1", 'front', 'calendar_submit' ) ) );
|
||||
return array( 'event' => array(
|
||||
'link' => \IPS\Http\Url::internal( "app=calendar&module=calendar&controller=submit&_new=1", 'front', 'calendar_submit' ),
|
||||
'extraData' => array( 'data-ipsDialog' => true, 'data-ipsDialog-size' => "narrow", ),
|
||||
'title' => 'select_calendar'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return array();
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Editor Extension: Event text
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 7 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -45,7 +45,7 @@ class _Calendar
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Permission check for attachments
|
||||
*
|
||||
@@ -53,9 +53,10 @@ class _Calendar
|
||||
* @param int|null $id1 Primary ID
|
||||
* @param int|null $id2 Secondary ID
|
||||
* @param string|null $id3 Arbitrary data
|
||||
* @param array $attachment The attachment data
|
||||
* @return bool
|
||||
*/
|
||||
public function attachmentPermissionCheck( $member, $id1, $id2, $id3 )
|
||||
public function attachmentPermissionCheck( $member, $id1, $id2, $id3, $attachment )
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief File Storage Extension: Events
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 13 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Front Navigation Extension: Calendar
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 23 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -35,13 +35,13 @@ class _Calendar extends \IPS\core\FrontNavigation\FrontNavigationAbstract
|
||||
}
|
||||
|
||||
/**
|
||||
* Can access?
|
||||
* Can the currently logged in user access the content this item links to?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function canView()
|
||||
public function canAccessContent()
|
||||
{
|
||||
return parent::canView() and \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'calendar', 'calendar' ) );
|
||||
return \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'calendar', 'calendar' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief ACP Live Search Extension
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 08 Apr 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -73,4 +73,14 @@ class _Calendars
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is default for current page?
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isDefault()
|
||||
{
|
||||
return \IPS\Dispatcher::i()->application->directory == 'calendar';
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Member Sync
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 7 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief Notification Options
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Community Suite
|
||||
* @since 20 May 2016
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\calendar\extensions\core\Notifications;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Notification Options
|
||||
*/
|
||||
class _Events
|
||||
{
|
||||
/**
|
||||
* Get configuration
|
||||
*
|
||||
* @param \IPS\Member|null $member The member
|
||||
* @return array
|
||||
*/
|
||||
public function getConfiguration( $member )
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse notification: new_content
|
||||
*
|
||||
* @param \IPS\Notification\Inline $notification The notification
|
||||
* @return array
|
||||
* @code
|
||||
return array(
|
||||
'title' => "Mark has replied to A Topic", // The notification title
|
||||
'url' => new \IPS\Http\Url( ... ), // The URL the notification should link to
|
||||
'content' => "Lorem ipsum dolar sit", // [Optional] Any appropriate content. Do not format this like an email where the text
|
||||
// explains what the notification is about - just include any appropriate content.
|
||||
// For example, if the notification is about a post, set this as the body of the post.
|
||||
'author' => \IPS\Member::load( 1 ), // [Optional] The user whose photo should be displayed for this notification
|
||||
);
|
||||
* @endcode
|
||||
*/
|
||||
public function parse_new_content( $notification )
|
||||
{
|
||||
$item = $notification->item;
|
||||
if ( !$item )
|
||||
{
|
||||
throw new \OutOfRangeException;
|
||||
}
|
||||
|
||||
return array(
|
||||
'title' => \IPS\Member::loggedIn()->language()->addToStack( 'notification__new_content', FALSE, array( 'sprintf' => array( $item->author()->name, mb_strtolower( $item->indefiniteArticle() ), $item->container()->_title, $item->mapped('title') ) ) ),
|
||||
'url' => $notification->item->url(),
|
||||
'content' => $notification->item->content(),
|
||||
'author' => $notification->item->author(),
|
||||
'unread' => (bool) ( $item->unread() )
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief Permissions
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 16 Apr 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Calendars
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief iCalendar feed management
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 19 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -104,7 +104,7 @@ class _ical extends \IPS\Dispatcher\Controller
|
||||
'hotkey' => 'r'
|
||||
) );
|
||||
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'calendar', 'ical', 'calendar_feeds_edit' ) )
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'calendar', 'calendars', 'calendar_feeds_edit' ) )
|
||||
{
|
||||
$return['edit'] = array(
|
||||
'icon' => 'pencil',
|
||||
@@ -114,7 +114,7 @@ class _ical extends \IPS\Dispatcher\Controller
|
||||
);
|
||||
}
|
||||
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'calendar', 'ical', 'calendar_feeds_delete' ) )
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'calendar', 'calendars', 'calendar_feeds_delete' ) )
|
||||
{
|
||||
$return['delete'] = array(
|
||||
'icon' => 'times-circle',
|
||||
@@ -128,7 +128,7 @@ class _ical extends \IPS\Dispatcher\Controller
|
||||
};
|
||||
|
||||
/* Root buttons */
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'calendar', 'ical', 'calendar_feeds_add' ) )
|
||||
if ( \IPS\Member::loggedIn()->hasAcpRestriction( 'calendar', 'calendars', 'calendar_feeds_add' ) )
|
||||
{
|
||||
$table->rootButtons = array(
|
||||
'add' => array(
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Settings
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief View Event Controller
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 14 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -44,7 +44,7 @@ class _event extends \IPS\Content\Controller
|
||||
|
||||
if ( !$this->event->canView( \IPS\Member::loggedIn() ) )
|
||||
{
|
||||
\IPS\Output::i()->error( 'node_error', '2L179/1', 404, '' );
|
||||
\IPS\Output::i()->error( 'node_error', '2L179/1', 403, '' );
|
||||
}
|
||||
|
||||
if ( $this->event->cover_photo )
|
||||
@@ -106,10 +106,17 @@ class _event extends \IPS\Content\Controller
|
||||
|
||||
/* Online User Location */
|
||||
\IPS\Session::i()->setLocation( $this->event->url(), $this->event->onlineListPermissions(), 'loc_calendar_viewing_event', array( $this->event->title => FALSE ) );
|
||||
|
||||
/* Address */
|
||||
$address = NULL;
|
||||
if ( $this->event->location )
|
||||
{
|
||||
$address = \IPS\GeoLocation::buildFromjson( $this->event->location )->toString();
|
||||
}
|
||||
|
||||
/* Display */
|
||||
//\IPS\Output::i()->sidebar['contextual'] = \IPS\Theme::i()->getTemplate( 'view' )->eventSidebar( $this->event, $attendees );
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'view' )->view( $this->event, $commentsAndReviews, $attendees );
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'view' )->view( $this->event, $commentsAndReviews, $attendees, $address );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,12 +148,13 @@ class _event extends \IPS\Content\Controller
|
||||
}
|
||||
|
||||
/**
|
||||
* Download file - Show terms and file selection
|
||||
* Download event as ICS
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function download()
|
||||
{
|
||||
|
||||
$feed = new \IPS\calendar\Icalendar\ICSParser;
|
||||
$feed->addEvent( $this->event );
|
||||
|
||||
@@ -167,6 +175,8 @@ class _event extends \IPS\Content\Controller
|
||||
*/
|
||||
protected function downloadRsvp()
|
||||
{
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
$output = \IPS\Theme::i()->getTemplate( 'view' )->attendees( $this->event );
|
||||
\IPS\Member::loggedIn()->language()->parseOutputForDisplay( $output );
|
||||
\IPS\Output::i()->sendOutput( \IPS\Theme::i()->getTemplate( 'global', 'core' )->blankTemplate( $output ) );
|
||||
@@ -184,6 +194,8 @@ class _event extends \IPS\Content\Controller
|
||||
\IPS\Output::i()->error( 'rsvp_error', '2L179/3', 403, '' );
|
||||
}
|
||||
|
||||
\IPS\Session::i()->csrfCheck();
|
||||
|
||||
/* We delete either way at this point, because even if we select a different action we have to remove any existing RSVP preference */
|
||||
\IPS\Db::i()->delete( 'calendar_event_rsvp', array( 'rsvp_event_id=? AND rsvp_member_id=?', $this->event->id, (int) \IPS\Member::loggedIn()->member_id ) );
|
||||
|
||||
@@ -221,7 +233,7 @@ class _event extends \IPS\Content\Controller
|
||||
}
|
||||
|
||||
/* And we have to actually check the limit */
|
||||
if( count( $this->event->attendees[1] ) >= $this->event->rsvp_limit )
|
||||
if( $_go == \IPS\calendar\Event::RSVP_YES and count( $this->event->attendees( \IPS\calendar\Event::RSVP_YES ) ) >= $this->event->rsvp_limit )
|
||||
{
|
||||
\IPS\Output::i()->error( 'rsvp_limit_reached', '3L179/5', 403, '' );
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Submit Event Controller
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 8 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -25,34 +25,78 @@ if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
class _submit extends \IPS\Dispatcher\Controller
|
||||
{
|
||||
/**
|
||||
* Submit Event
|
||||
* Choose Calendar
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function manage()
|
||||
{
|
||||
$form = new \IPS\Helpers\Form( 'select_calendar', 'continue' );
|
||||
$form->class = 'ipsForm_vertical ipsForm_noLabels';
|
||||
$form->add( new \IPS\Helpers\Form\Node( 'calendar', NULL, TRUE, array(
|
||||
'url' => \IPS\Http\Url::internal( 'app=calendar&module=calendar&controller=submit', 'front', 'calendar_submit' ),
|
||||
'class' => 'IPS\calendar\Calendar',
|
||||
'permissionCheck' => 'add',
|
||||
'forceOwner' => \IPS\Member::loggedIn(),
|
||||
) ) );
|
||||
|
||||
/* Are we creating an event for a specific day? If yes, pass the values to the form */
|
||||
if( \IPS\Request::i()->y AND \IPS\Request::i()->m AND \IPS\Request::i()->d )
|
||||
{
|
||||
$form->hiddenValues['y'] = \IPS\Request::i()->y;
|
||||
$form->hiddenValues['m'] = \IPS\Request::i()->m;
|
||||
$form->hiddenValues['d'] = \IPS\Request::i()->d;
|
||||
}
|
||||
|
||||
if ( $values = $form->values() )
|
||||
{
|
||||
$url = \IPS\Http\Url::internal( 'app=calendar&module=calendar&controller=submit&do=submit', 'front', 'calendar_submit' )->setQueryString( 'id', $values['calendar']->_id );
|
||||
|
||||
if( isset( $values['y'], $values['m'], $values['d'] ) )
|
||||
{
|
||||
$url = $url->setQueryString( 'd', $values['d'] )->setQueryString( 'm', $values['m'] )->setQueryString( 'y', $values['y'] );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->redirect( $url );
|
||||
}
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack( 'submit_event' );
|
||||
\IPS\Output::i()->sidebar['enabled'] = FALSE;
|
||||
\IPS\Output::i()->breadcrumb[] = array( NULL, \IPS\Member::loggedIn()->language()->addToStack( 'add_cal_event_header' ) );
|
||||
|
||||
$calendar = NULL;
|
||||
if ( isset( \IPS\Request::i()->calendar ) )
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'submit' )->calendarSelector( $form );
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit Event
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function submit()
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
$calendar = \IPS\calendar\Calendar::loadAndCheckPerms( \IPS\Request::i()->calendar );
|
||||
}
|
||||
catch ( \OutOfRangeException $e ) { }
|
||||
$calendar = \IPS\calendar\Calendar::loadAndCheckPerms( \IPS\Request::i()->id );
|
||||
}
|
||||
$form = \IPS\calendar\Event::create( $calendar );
|
||||
|
||||
if ( \IPS\calendar\Event::moderateNewItems( \IPS\Member::loggedIn() ) )
|
||||
catch ( \OutOfRangeException $e )
|
||||
{
|
||||
$form = \IPS\Theme::i()->getTemplate( 'forms', 'core' )->modQueueMessage( \IPS\Member::loggedIn()->warnings( 5, NULL, 'mq' ), \IPS\Member::loggedIn()->mod_posts ) . $form;
|
||||
\IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=calendar&module=calendar&controller=submit', 'front', 'calendar_submit' ) );
|
||||
}
|
||||
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_submit.js', 'calendar', 'front' ) );
|
||||
$form = \IPS\calendar\Event::create( $calendar );
|
||||
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'submit' )->submitPage( $form->customTemplate( array( call_user_func_array( array( \IPS\Theme::i(), 'getTemplate' ), array( 'submit', 'calendar' ) ), 'submitForm' ) ) );
|
||||
|
||||
if ( \IPS\calendar\Event::moderateNewItems( \IPS\Member::loggedIn() ) )
|
||||
{
|
||||
\IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'forms', 'core' )->modQueueMessage( \IPS\Member::loggedIn()->warnings( 5, NULL, 'mq' ), \IPS\Member::loggedIn()->mod_posts ) . \IPS\Output::i()->output;
|
||||
}
|
||||
|
||||
/* Display */
|
||||
\IPS\Output::i()->title = \IPS\Member::loggedIn()->language()->addToStack( 'submit_event' );
|
||||
\IPS\Output::i()->sidebar['enabled'] = FALSE;
|
||||
\IPS\Output::i()->breadcrumb[] = array( NULL, \IPS\Member::loggedIn()->language()->addToStack( 'add_cal_event_header' ) );
|
||||
\IPS\Output::i()->jsFiles = array_merge( \IPS\Output::i()->jsFiles, \IPS\Output::i()->js( 'front_submit.js', 'calendar', 'front' ) );
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Calendar Views
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 23 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -75,7 +75,7 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
|
||||
if( $this->_calendar !== NULL AND $this->_calendar->_id )
|
||||
{
|
||||
\IPS\Output::i()->contextualSearchOptions[ \IPS\Member::loggedIn()->language()->addToStack( 'search_contextual_item', FALSE, array( 'sprintf' => array( \IPS\Member::loggedIn()->language()->addToStack( 'calendar' ) ) ) ) ] = array( 'type' => 'calendar_event', 'nodes' => $this->_calendar->_id );
|
||||
\IPS\Output::i()->contextualSearchOptions[ \IPS\Member::loggedIn()->language()->addToStack( 'search_contextual_item_calendars' ) ] = array( 'type' => 'calendar_event', 'nodes' => $this->_calendar->_id );
|
||||
}
|
||||
|
||||
$this->_today = \IPS\calendar\Date::getDate();
|
||||
@@ -111,7 +111,7 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
else
|
||||
{
|
||||
\IPS\Session::i()->setLocation( \IPS\Http\Url::internal( 'app=calendar', 'front', 'view' ), array(), 'loc_calendar_viewing_calendar_all' );
|
||||
\IPS\Session::i()->setLocation( \IPS\Http\Url::internal( 'app=calendar', 'front', 'calendar' ), array(), 'loc_calendar_viewing_calendar_all' );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
|
||||
/* Get birthdays */
|
||||
$birthdays = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays() : array();
|
||||
$birthdays = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays( FALSE, TRUE ) : array();
|
||||
|
||||
/* Get the events within this range */
|
||||
$events = \IPS\calendar\Event::retrieveEvents(
|
||||
@@ -220,7 +220,7 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
}
|
||||
|
||||
/* Get birthdays */
|
||||
$birthdays = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays() : array();
|
||||
$birthdays = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays( FALSE, TRUE ) : array();
|
||||
|
||||
/* Get the events within this range */
|
||||
$events = \IPS\calendar\Event::retrieveEvents(
|
||||
@@ -291,21 +291,31 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
$tomorrow = $date->adjust( '+1 day' );
|
||||
$yesterday = $date->adjust( '-1 day' );
|
||||
|
||||
if( $date->mon == 2 AND $date->year == 2014 AND $date->mday == 12 AND \IPS\Request::i()->event == 'easter' )
|
||||
/* Get birthdays */
|
||||
if( isset( \IPS\Request::i()->show ) AND \IPS\Request::i()->show == 'birthdays' AND \IPS\Settings::i()->show_bday_calendar )
|
||||
{
|
||||
\IPS\Output::i()->sendHeader( base64_decode( "Q29udGVudC10eXBlOiBpbWFnZS9qcGVn" ) );
|
||||
\IPS\Output::i()->sendHeader( base64_decode( "Q29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT1lYXN0ZXIuanBn" ) );
|
||||
$table = new \IPS\Helpers\Table\Db( 'core_members', \IPS\Request::i()->url()->setQueryString('show', 'birthdays'), $date->getBirthdaysWhere( TRUE ) );
|
||||
$table->sortBy = 'name';
|
||||
$table->sortDirection = 'asc';
|
||||
$table->tableTemplate = array( \IPS\Theme::i()->getTemplate( 'browse', 'calendar', 'front' ), 'birthdaysTable' );
|
||||
$table->rowsTemplate = array( \IPS\Theme::i()->getTemplate( 'browse', 'calendar', 'front' ), 'birthday' );
|
||||
|
||||
print $this->_event();
|
||||
exit;
|
||||
\IPS\Output::i()->output = $table;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get birthdays */
|
||||
$birthdays = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays( TRUE ) : array();
|
||||
$birthdayCount = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays( TRUE, TRUE ) : array();
|
||||
$birthdays = ( $this->_calendar === NULL OR count( $calendars ) == 1 ) ? $date->getBirthdays( TRUE, FALSE ) : array();
|
||||
|
||||
/* Get the events within this range */
|
||||
$events = \IPS\calendar\Event::retrieveEvents( $date, $date, $this->_calendar );
|
||||
|
||||
/* If there are no events, tell search engines not to index the page but do NOT tell them not to follow links */
|
||||
if( count($events) === 0 )
|
||||
{
|
||||
\IPS\Output::i()->metaTags['robots'] = 'noindex';
|
||||
}
|
||||
|
||||
$dayEvents = array_fill( 0, 23, array() );
|
||||
$dayEvents['allDay'] = array();
|
||||
$dayEvents['count'] = 0;
|
||||
@@ -338,7 +348,7 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
|
||||
/* Display */
|
||||
/* @see http://community.invisionpower.com/4bugtrack/follow-button-adds-meta-title-and-link-tags-r3209/ */
|
||||
$output = \IPS\Theme::i()->getTemplate( 'browse' )->calendarDay( $calendars, $date, $featured, $birthdays, $dayEvents, $tomorrow, $yesterday, $this->_today, $this->_calendar, $jump );
|
||||
$output = \IPS\Theme::i()->getTemplate( 'browse' )->calendarDay( $calendars, $date, $featured, $birthdays, $birthdayCount, $dayEvents, $tomorrow, $yesterday, $this->_today, $this->_calendar, $jump );
|
||||
|
||||
if( \IPS\Request::i()->isAjax() )
|
||||
{
|
||||
@@ -463,12 +473,6 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
|
||||
if ( \IPS\Member::loggedIn()->member_id )
|
||||
{
|
||||
if ( !\IPS\Member::loggedIn()->members_pass_salt )
|
||||
{
|
||||
\IPS\Member::loggedIn()->members_pass_salt = \IPS\Member::loggedIn()->generateSalt();
|
||||
\IPS\Member::loggedIn()->save();
|
||||
}
|
||||
|
||||
$key = md5( ( \IPS\Member::loggedIn()->members_pass_hash ?: \IPS\Member::loggedIn()->email ) . \IPS\Member::loggedIn()->members_pass_salt );
|
||||
|
||||
if( $this->_calendar )
|
||||
@@ -518,103 +522,4 @@ class _view extends \IPS\Dispatcher\Controller
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an event
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function _event()
|
||||
{
|
||||
return base64_decode( "/9j/4AAQSkZJRgABAgAAZABkAAD/7AARRHVja3kAAQAEAAAAFAAA/+4ADkFkb2JlAGTAAAAAAf/bAIQAEg4ODhAOFRAQFR4UERQeIxoVFRojIhkZGhkZIiceIyEhIx4nJy4wMzAuJz4+QUE+PkFBQUFBQUFBQUFBQUFBQQEUFBQW" .
|
||||
"GRYbFxcbGhYaFhohGh0dGiExISEkISExPi0nJycnLT44OzMzMzs4QUE+PkFBQUFBQUFBQUFBQUFBQUFB/8AAEQgBgwK8AwEiAAIRAQMRAf/EAJsAAQEAAwEBAQAAAAAAAAAAAAABAgMGBAUHAQEBAQEBAAAAAAAAAAAAAAAAAQMCBBAAAgEBBgIGCAQGAw" .
|
||||
"EAAwEAAAERAiExQVEDBBITYXGBkTIFodEiQlIzFBWxYiNTwXKSQyQ0ggYW8OHxwmMRAQABAgMHAgYCAwEAAAAAAAABEQJREhMhMUFhcTIDUhSBkSJCM0NygvBiBKH/2gAMAwEAAhEDEQA/AOPAM9OGmLYrKzNGMCDckiwjvT5pnaIZYN3ChCGnzMzTBYZt" .
|
||||
"sFg0uZna7SzUZlsGkZ2KrrVxVq6ixZYsJYNKF1JZc/VzZHr6jvbFghE0YXUli66nmSWZwiwi6SZ5a7RabIQhF0kzy1wxDNsIQoGkZ5aoYhm2EIQ0jPLVDLws22CwaUGaWrhYirM2iwulBnlrh5oQ8zZYBowZ5a4eaHC8zYC6MJnlr4WOB5myUJQ0oM8tfA" .
|
||||
"8xwdJtlCwulBnlq4OkvAs/QZzYVsaVqZ5a+BZjlrMzkSXRtM8sOX0l5azLImwujameU5azY5azZZHEXRtTPcx5a6Ry10l4i8Q0rcDPdix5dPSXl09I4hxWl0rcDNdicujJjl0E4rBxF0rcEzXYsuXQTl0ZDiJxTA0rcDNdivLom4nLoyHEOMulbgma7E5d" .
|
||||
"Pw+kq06PhROIcQ07cCs4qqKPhReGj4UY8Q4rBp24FZxZcNHwocNPwox4hxFyW4FZZOlZLuHCsqe4xm8cRMluBWWcLJdxVGSNfEWZdhcsYG1sdTkcVWZnr7evRdCq9+lVUtZM9VPlG8dHFw2tSqZtg5pZyXa8LdWLEv4jdutrVt6aHW/arU8OR5eIsRbMJt" .
|
||||
"bLcxLzNfEExlgZpuLy34muQ2KRgM+0WZsw4ipzcKQM8BcfX8s8lr3K5mtNOnFh4/MPL9XZ6kVKaH4ajmLrJuy7Kuss73ksEqDXIk6pDlnYVxKNfEG7grZKFhrkSBskSYJy4R9jT8j16tutSUqqrk3gc3XRbv4kRM7nypHEfTfkW7i+lvrPm6+hq6Fbo1FF" .
|
||||
"Qi62d0wtJhJDZqkSVDWfsM8cno1H7LPOZz32/F1wlsdxdJ3kZKGY+PfDu5vk+jt9rRTt3utdex7lPxM+XxHQaSW78o5em51dO104m1+yI67XMPBTvdPiirRo4Loi00alNOrrOnb0vhb9lGOlp0vV4NVvTzbR9vb7Cjb1atCq4tWrTmh3EmYtN75FWy3NNL" .
|
||||
"r4ZpV7VsGGlt9XVngVivbsR7/Ka9ajduiqeBytRO437+il7Odtbp06lXFw9dgzTWn/AKU2VfK1dvraTSrpam7pNtHl+6rUqjCWfQ2mtQvL1Vufc1FwT12m3ToelvK90q+LatN1NOb1dBM07SkPKtKPLNTipXHTVEo8lGw3NalU4SlNsdR9DQrpr2OvV7vM" .
|
||||
"T7JL5jVq7fWWto0Sq0uCu+LMBEzWY5j5GpoamnSq6rE3HSa5Jq6lddbqr8Tcswk0ojZIkwkSWg2SSTCS8QGciTDiEiis5LJrkSEZyXiNcsSVWxMSa5EsDZJJMJZJCNkiTXIko2SJNaYlgbJsHEa5YlgbJsJxGEkko2cQ4jVIkqUZyOI1yJYKNk2DiNckkq" .
|
||||
"UbOIcRrliQUbOInEayyCjORxGABRnxDiMAKlGfFaJMAKlGciTWJBRskcRgBUozkcRgBVaNnFYxxGvAEKNnEVVWmsAdNToae509rqakwtNqzHgZ6t3vadtSnwt6kpJT7J8nSevX5bpVbdvmaVbVl8M1UaG/19xRVrqppNS3gYZaztnZFdjroy861XVuKE7H" .
|
||||
"TQp7bT5fEerzOvj3mo8nw/02HjNbdlsdHPFlxBVGBUdCyOIxBBnxH0/KFs6ten6httuKaUrJ6T5R6dlXTRudOupxSmm2c3Vm2Vje7Dfeb6OwdOnwuptSkrEkXX3O13Gwevq0zpNT0nN+d7rR3G4oq0quJKmGz0Vb7bfaFocf6seE88eLZbMVrM7XWbe+Ru" .
|
||||
"KtHm1cmeXhN5p4gyHpcLxFdVxiALxDiIArJVNHvW+31WgtJcXCrU1J89H09DzjV0dJadOnQ0lEtWnF0btmYhr09XfutQ65npPd55qTpaCqjmx7Roq893MRTRRT0pHzdbX1Nat16jmpnMWzN0TMRFFmYpRr4hJCGiJW7DUbKrjWZT3wvBsZjTeZ1XswpvMf" .
|
||||
"Hvh3czN233Ott9RV6VTpqRpKeuldjN9N+bamo069LTdXxum0+hqbbX3OtTWtV010pRXYqX/LBzhnzdVXVOzpOZsw2FXQ6u23dVM8+lKp8LhJPtgw23l+40VUtPXS4nEXp9Z8DmV3cT7yrV1FdU+8mScY+RV917bj3mjo7rWVVLlqleyrDZpVbvQ3T0lopb" .
|
||||
"duKlHsunOTnXXU3LbnM2PdbmqngepU6cpE+OeRV9qvS49fX09pqqjRTXs4WmPDu9PSq06NeVQm4cYdZ8NV1K5tF5lebtLk5hXVVVU6qnNTvZiAd0ApCwKABAFAAAooCwxDFAGIhjhZaIAvC8hwvIUWrEGXC8icNWRaIgLwvIcLyFCqAvDVNw4KshQqgMuC" .
|
||||
"rIcFWQoVYkM+CrInLryLRKwwBly64uHKryLQrDAGfLqyHLqyFCsMGQ2cuuLhyq8hRKw1gz5deReVUKSVhrBs5VQ5VQpJWMWsGzlVDlVQKSVhrBt5NU4E5VQpJWGsGzlVF5NRKSVjFrBs5VQ5NRaSVhrBt5LzHJ6SUkzQ1A28npHJ6RSTNDUU2cp5l5TzLS" .
|
||||
"TNDUU2cp5jlxiKJmgo1tXTUUVulPBMy+o1379XeRafSXl2kyxgZmttu13kg28tZl5azLQzQ0QVXm3loctTeSi5oaYEG7lLMctChmhqCNvLpHAhQrDWINvAshwIUKtMCDdwIcCIVaRBv5dI4KciUMzRBYN3BTkThWQoVaoLBt4UOFZAq0wINvCshwrIFWmC" .
|
||||
"G50onCiFXnruNZ6NRLhNBlP5LXddkttXifWY6a9pmVXiZNLxsx8fdHV3fxbuFDhWRmkbtLbaupRXXQpp0/F2nt2Q89Xn4VkOFZHufl25VdFLptrp4qeo8vC0IpJta+EQj06O01dZVuhSqFxPqNXC8i7EqwjoHCZ8LvgcLxLQqw4bRBvo2+pXp1alK9mi1m" .
|
||||
"Doqi4bCrCCxDMuG83bbbV7jWWlR4nd2DZBV5oRYPXr7SrRVtVNTbupcmOlttTUVbpXgXE0NlKjzqm24cMGx0tOHlieh7HXW3e4ajTlQNkFXkdN4i89r8u1lovVmm7i4J9qMzzU0OqpUq+qxIRSd3A2tcJqcg1ee/U8t1NPSdfFTU1HFTS5dPWNTy3Xo0nq" .
|
||||
"OHCTqpT9qnrFbcTa8MfgImk9dez1dPRp16o4arFmXT2OrXtqtdQqaVjey1jHkbXki/qCVq6jOLV0oxS8JaJVi1Yhiukya9ldYS8JaJVilcTDqZlF3WWLH1loVR3rrI1Z2mxpWGMWPoYoVSPER2szi/qI1ZZkKFUaUtdAi7qM4t7CRcWiVYRZ2iIgyj2e0R" .
|
||||
"YusUKseG/rDVr6jJrxFi3sFCrBKzsJFq6jYlZ2EStQKtcWdpYtZlw2dpXTa0KFWEXldNqM48Q4bUCrXFk9Ialdpnw2dpWrLMwVYcN5IuNjpUskRAKtcSyxeZpWki8FWMXFRnBIsIVYQVq0yixiAVYRYEjKLAKFUgkWmcSxAKsYIlYZwSLCFWMFgyStCQWr" .
|
||||
"GBCMsQkQqxLwoygRBBhAaMsBAVgMDKCQCqBosAKhSoQQSBBlAwIMRBkIIMYEFgBWMEM4ICrFohkSCDRreE8+B6dbwnmwMp/Jb0d/bLbV4mNL5parzHT+aefx746tb+PR6kfT8prpWvVpVeHVpdNt2aPnJGScWq898xWKPLE0l0NW4oejrVNp1aTdFP8ALV" .
|
||||
"YY10bZ6UOlcuE5hfifAmq1TfeXiriJcZGelhLrO6Sh8L3FMULRWm+XUotsPLqamjXVXoumhULTTTSU8UHxeOuIliXngWPFxqmfk+9qUbd7dKmlOjhTTsv67zLW09u6KHWqaaFVT7Li7oaOfmqImwrqbiWXSn1Gfk6CvidOtTVwU6TSVDUXSXX5GnoVVRTU" .
|
||||
"9N0um6GsYRz3FVETYOJuLewaW3eZ+T7G70tCnS4dGlOvdNOn8tOXeefy5Lb+YUqtr2ZTc2XHjq3GpU6G6vAop6INfE25bttOosmkxM70zbaw+tt9xo6u6iqimm/haxfae2l0KutUular03e1fNhzivWZkm7LST4q8SL3t8xu0uN0vW4Xx8PoLo6ifl+vTV" .
|
||||
"VbNPCmeB2q12lSu6UdZNkRzqldr6tOk9LaOqmqmvV1Kbap8NOSR4K9tXpamkqmk60n1TmalNlryMnVW2qqm6nN7ZYtmOO8m6vB9XVoo2+jwaVSrmHq1tqXGCM9bU0lVr69OoqqdajhopV8nxsUFNhzp81zcnro1KPoqdOpy1qTGMQe76rY6mnq0p1U/p8N" .
|
||||
"NFkdh8ZJ9zKl7RZ8cTx41TNLCPCErKehmceF9JIs7TRywav6wlYuhmyyX1ksjtKMHYu0rvqM3c10khe0NiMWrOqCunxFs4X1oyi/pAwi3sEez2Gapc9hVRVFhRrx7CJWUm3gqlWYWkVFVljvyCNcWOcyRYus28uuHY7xy6+G535DYMHT4glb2Gzgq9qx9x" .
|
||||
"OGqV7LuyGwa0vwKl4TNU1T4XdkFS1w2Ndg2DCLH1hr2mZxVwt8LvyDpfFc8MAMI8RUrUZ8LmqxxGQVNUqxjYNbXs9oiV2mx6dUXYjl1RdiNg1tXki43cuqXYOTVNLgmwq0RaWLGbeVVxWL0jl1w7Mc0KwVaoh9giztNr0658PpJy64jh9KA1NWdpYt7DPg" .
|
||||
"r4bsc0Xgrl2fgBriURqw2PTri78A9OuLgNcWiGbeXVkOXVBFq1RmDbyqhyn0CsFWrElhu5TzRHpO+URWqBBs5dWaHLeaAwtKZcurNDl1JYEWrBokGzlub0VabvkhVqgG3lrMctTf6ArShBt5f5vQOWs/QQa4CRs5dt/oHL6fQBrtEG3l9PoHL6fQRWqBBt" .
|
||||
"5fSOBEGoG3gXSOWpxCtMEg3cum+0OinpINEBo3cFPSY8FPSB49fwnn909e5ppVFk3nk90yn8trSOyWx3l0fnoe8i6ajcI8/j3x1a37p6PdTw2WIyVNvhPb5dpUVVVOpS6YjtPqcNOR7ZvpNKPJTm5/htXsl4X8PoOhVNOSMlTTkianIpzc5wuPCu4Kl2ey" .
|
||||
"u46ThU3IcKyQ1OUGXm5yHK9ldw4X8K7jpOGnJDhWSLqcoMvOXOcNTfhXcFRV8KvyOidKyQ4VkNTlBl5y57gqjwLuHKrnwruOh4VkThWQ1Jwgy85fBWlVZ7GORVoajuom3I+7w2np29K4biXeWYitIW2yJnfLm1tdW7lu/IyW017I0nZfZgdWqVkb9OlZWw" .
|
||||
"ZT/wBM+mGmjGMuO+i3Nn6VWfhwL9Hubf0ar7PZO1hWWEhWE91d6YNGMZcZ9JuJ+VV/SFs91+1VfPhdx2cIRaPdXemDRjGXG/SbrDSrvssYW03jqnl1x/KzsklYVD3V2EGjbjLjVtN3+3Xfky/Rbxpxp1X2WHYIqsge5uwg0bcZch9Fu7f06u4LYbxr5dVr" .
|
||||
"ssOvw7QsB7q/CDRtxlyX27eOf03bcPtm9lvluHYdasB6x7q/CDQt5uT+1b2I5TtuL9s3sv8ATeWB1d0E9Y91fhaaFvNyv2vfftuy+1BeV75KOW+9HV5ge6vwg0bOblPte+TX6bsvtRPte+/bed6uOsavGK6h7nycjQs5uT+17639N23Woq8q3zUPTdrzR1" .
|
||||
"UWILAe58nI0LOblvtW9t9jovL9p3s+C5ZnUesuY9z5ORoWc3LLyjeq3gwzzMl5PvLFwqFbedPgSLewe58nI0LObmfs+8iISnpL9m3jbuXadLkFex7nycjRswc19m3drstsvL9l3edNnSdHFnaV3snufJjBo2YOb+ybuImm228fZN27JpzvZ0mQxQ9x5MYN" .
|
||||
"GzBzX2Td2uaLell+ybuy2izpZ0cWdoeI9x5MTRswc2vI93MzQ8b2Psm8zoc9LOkwxF0E9x5MV0bMHN/ZN3Lc0d7L9j3UX0950WZese48mJo2YOd+xbmxOqnvL9j1/ipOhi0mA9x5MV0bMHwPsWq4TrpH2LUdjrR9/EImv5MTSswfA+xV2/qLuKvIaruau4" .
|
||||
"+7FhcbBr+TE0rMHwfsNT/uruH2Kr91f0n3SRYTW8nqXTswfDfkNUfNX9P/AOSfYav3vQfdgYk1vJ6jTswfC+wP91dxfsP/APrYug+5iQa3k9Urp24PifYceb6CryGjHVfcfawBNXyeqTJbhD4q8i0v3KmZfY9Be/VafXeBMRq3+qVyW4Q+X9l2yxqL9l2q" .
|
||||
"V9R9MNE1L/VJktwh837Ptcn3lXlG0m5959DEDUv9Urltwh4PtOzjw29YflOz+D0s9+IxJnv9UmWMIeFeU7KZ4PSx9q2XwelnuITPdjK5Ywh4X5Xsvg9LH2vZ/B6We4QM92MmWMHh+2bP4PSy/bdpHg9J7ATNdjJSMHi+3bT4C/b9p+2j1kGa7GVpGDy/Qb" .
|
||||
"X4EfM808v0tPT5umuGL0fcZ4PNX/h19a/Etl92aNvFzdEUnY4/d+BdZ5PdPZvF7PaeP3T1T+W3oxjsltV6Cs10RXov9+nrR57N8dW1+74Oh8tVtb6EfTwPmeWPxI+oj1Xd0vLG6FSKkEZRJypALBQIIMoJDAxgRYZRYCjGItIZNYgqMYR6durDzwenb3M4" .
|
||||
"v7Xdm96EjdpmFJsovPPLdp1tSvnaejQ+F1JtvqJXr1aFKWo+Ny7VZYbdTRprdNVqrpfs1LA11bOipy6nxWpucyRQavrEtZ40OhOldNRl9bTNFKpdVVU2fymz6PSlO2UlSn1GS2tCqVVrqplT/MNg0Vb3i029Oltqni/lJTvVRpUPUtbpTqdmJt+i01TwqU" .
|
||||
"rnDvRHsdF+y5iEo6i7Bs0tZ6jhUtJWSeWjVrarqqqq9l1Ky6Ee2jTVCcYsxWjQqKqFdU3PaBpe64aG1S2qEqm3kyU7mmaqlLVlj/MbuRp8NVOFSSfURbbTShSrreobB56tzqc/T4VY1VKmywzW94qZppvXE0zbRttKlqpXqUv+V5PpNKIUqLL8C7Bq191q" .
|
||||
"VadT0lZTEvGT1p+z3GqrbaVU3w4lTfBviE0SQzI/4FvYasAP+BMipW9hMgJh2hYMru7Qrl1hB3PrGL6g3eLJ7AEWdgm1dQVzGKAkXGSvZMEVXsDF49ZcWIvZYtdmAEvgO8sXCPaAxw6hFrLFnaMWBLIJZYZRYSLgqXoWSIsLiAx7CYFxJZBAxIizeRAIsG" .
|
||||
"IwGLAEwMsDF3ACYlxGAExJJcRgFCMuKZCCdAxGIiZAgd5UhFvUBBBcCYEExLiEAqAuAAhCkAQQpCKgKRoDE8Hmv+nV1r8T6B8/zb/Uq6Wjqzujq5u7ZchvPD2nk9w9W8uXWeb3D1z+WOjCOyVV6Mn8+mc0YrAzq+bR1o89u9tfuff8tf6jXQfWR8jy1frf" .
|
||||
"8WfYR6r+55Y3QyRt09Omqltu1KxGpG2ipUt9Kg4mtNjqN7KiihpS3xPBFp0pqiS6ddCpyqeIorppcxNt/Qc7drrZsFo0uHS7HKZK6KVSqqbVc5M1q00wkrE5faY1108PDSrJkRU2Gnp01J8VmC6xRoqqmqfEri83hSVKuzLzlMpWtyx9RsYV6VNOkn72Jo" .
|
||||
"rspcHpr1OJOx32Gk6trxczTgw0uBr2q0meql6NCfDqJnlelQ7YN220NNuqUc3xNK1d2zFdzfo6nFXCfEsz10YmrToooiFBuSvMJapVXFfBi7ZMVrUNNtxbFvQNSiqqpVUxKWJgtDNq1P0jYNnNpbaTlq8x59Lo4occUE5NjtvSQ5EaNWnN9s+kbAp3FNTi" .
|
||||
"IznoM3qUeLiUGt7aluq2+mCfTQ1VNqc/wLsGdGvp1UzKVtxlzKE2pUmujbcKqUzIe2XE3PTA2DZzaLXKglOtQ08LYMadvFU8VqtWRhVtW59q9y+0bEbnqUW24x2mOvq8uI95xaR6P6nFglZ1mT03Xwuq+m0bAWqo9q/oJp69Ncq5y13Er0aarZjBko0FS1" .
|
||||
"bKpba7S7Bs42tRUw4avMVqN1cDUSnFpm6U6qXkjGnSqpmrilucCC11umGlPaavqboViSdXRJsq0+OmlN2q+y8xegm5bvhNZwXYK9T9TlxY1Mkp1lVqcvC+eozq006+J4KO8wW3opr5imyyOsbBHrRU1Fk8Mlp1anXVS6YhSukr0U63VbnHSZ8tOpu2aqYY" .
|
||||
"Gla7Slr2W+GcTOjVdVVKasqTaItvTN7dKtS6TOjSSdLluLENg11azWoqfdmG+lmv6qpU1tr2lVFKN70NNp2WtzOJittpqp2P/wDY2DZQ3VRxPG0yx7BTTw08KwuLiQTINWlyGKAxwLmCvEDFXDIruJkFTAuIwEQwJiMCuZJkQTMIttpAGQzEXDMAlYTAsQ" .
|
||||
"AITApHcAI7kXAZEVMSFxAExGAGABEKR3ALYIUk4ECETAuACnQRlIAwBSASQVkZBCMoCsT53m/+r2n0WfM84f8Ajr+b+B1Z3W9XN3bLkt5geb3D0b29Hn9w9c/lhj+uVVyMtSyulmKuRdTxUnmt3trtzofLPmT+Vn2EfI8us1EfXR6797yW7mSMkiIyRwoZ" .
|
||||
"EKFIBQBiDLrBUSCQZSQCM3ba9mo37fE5v7Xdnc9VKNiMVdBksDzy2URcMiRcRQpErSqAikwkRcPdKDxA9Q9QDHsDxEqwvqAnqGPYJ/ATcETBl9RFEXhYdRVW2UFJFFlpQJkXAllglWgIvGD6y2WkzAZhXqSzb2FTtQGKKsAnaVOxBEw7S4iVD6xNsAR4lV" .
|
||||
"/YG7xKkCZFyJN1pampVoGLuLF5MCypYUwJbKFjQV4EtgsWixCwCYgWWgCfgMy4MkqGQMUMy5EmwAToK2SbgIzTry1Sk8brpN02MlSpqSTUgeKiupVrhmEnKdptq3D4qYxie03cNKiEHRTMx1EotXnetWlMXtrqglWtW6X7sUzOZ6WqYhrsJw0NXXBdjzV8" .
|
||||
"VWnoxLbvtjAtWpXptUJXRKvvPTFMdVxi6aW04npJQq83P1m6bvabXcSrUrbSudn4nrinK4kU5Cg1aerVXXwxbT4jD2XXW9R3OzqN9NCpbiZbllhNy1aB5q9apPhpuu9BjTrai4VhCvxk9TSytELIUHnWrqXvGYXUYPUrmipubG2sj19gSWRCrzU6uo6uHp" .
|
||||
"Vp6UVJLAIAQpAJYQpAIz5fnP8Ar0/zfwPqM+V538ij+b+B14++OqXdsuS3l9Jo9w3bzxI1e4eufyx/nBj+uUVyMtX3WYq7tMtTw0nmt3trtz7/AJe/1aen1H2j4nl883S6fUfcPXfv+DyW7viqRlASKjh0qRQikESEFKUSBBRAEJBlYGEYm/b4mmDdt/E+" .
|
||||
"ol/bLqzuetKWZJEStMzzy3SF6RC9JWrxmQSFkElKMmT1lEhBJF9Yi0Aku9ESVhlkRT3ASLEWPwGAQQIlcVYCwAlaFgLAlcVTKwRb2j1h3gSA1eX1h4hEhSIVpYfoGYCLewKHBcewKbAIr8Bgiq8ZAIvI7ytO0uIEi8eouYxAxwRXehFwdjQEYi8esRawI7" .
|
||||
"oEOUXAYqYAxwK1aILiwqQrSRcXMmKAmDDVgwDIJiMCkwAMO8YlxAxBbYGIGIm0rRGRUwBYHWBiVgYgQQCgY4gqGAGIKCKgGBQIQrIAIZEIIQoxAxPk+d/Io/m/gfWZ8fzv5VC6Tvx98dUv7ZcnvPEjV7hs3njRh7h6Z/NH+cGX62Cu7TPU8FJgru0z1Plo" .
|
||||
"89u9rdufd8s8el/9gfeSPgeW+LT6kdAj1374/i8kcerJFIrjJHCiMosCKRQCCwBAVIQBAWCOxSUR2G3bv231GqjirdisPRpaddL4mrDm6YpMOrYmtXpTMlaaVq+0k1BvX8DCWwXMvqIQTsKJvDxANCLRmCiRcWPxHrACPxCwED1gMh24iPxGYCLgVk9ZQ9" .
|
||||
"Yd4zDVoEzGZXiMwJiMyrAuPYBMUCrAesBiRXXFx7S+sIkXhpleIYCLyRaixeIuAkWIrVpMEVgYxZ2iL5FgzkB7oi1DAivCmF4xdoi4WSwJmJFloxAmF4YsgoEd5jgjLG8NWIghJtKxaBLAxFhQMSODPExwIqAsWhgSCYlV5MwARYsIBAUNEVCRYXAASAGA" .
|
||||
"JAEAAyFBBCFZAqHxvPH7NHafZPieee51M78XfDi/tlye7+Yuoxj2DLd/M7CR7B6Z/NH+cGf656NauNlfy0a1czZX8o88b2s7n2vLnbp9SOiRzXl1q0utfidKj13fb/F5I4/yZIyRiZpGbpSpEV5kAARUQQQigonURqUZADTymnNNTXUbNPTqqqh6jgyNmh" .
|
||||
"4iXbpdWzNYbNPbU0vilvrPSsCIyRhLZFgVYFIQSCv+AACABgUS20uZC+oBiPWA8QIV4jMNAGTMRYIvKGYZcSMBmX1BgAsBiMi4gRYFiwLAesIYjDtKTAoZhlDIpmRF9QyAmXWV3oYIPACYPrDmWBiwI7iWyVxwgCYIZgkdQB4iLewNXh3kEwKTArAmZLS5" .
|
||||
"iywCJDMDMCZDMsWogExDuFgaCpiGXEjyIEWkKQAQowAlwxAxAjDKyYkUxIygCABgQFIRUABBD4Xnv9vqf8D7rPg+fX6fUzXxd8OPJ2y5XdfN7BHsE3PzTL3Df90OPs+DSrmbKvlGtXM2P5LMI3tJ3Pr+WOzS61+J0yOX8ru030r8TqVceq7db/F5Y33fyZ" .
|
||||
"IyRikZJHCskWwhlBBIKIAUEFEASCQZQTEqJBs0fH2GDRs0fGiXbpW3fD1oyRgjO0wluswMyQXMgSJdgi4FBYEmwW+kQAT/AAASsEOwBIuAcgMwPULbCiYFzCTEAPUMAkMAhAxQSLFwESuLFxI6S4oAI/EkXFi8CtEixhr/AOksXgIvI0WCNXAZR+BErhAx" .
|
||||
"QCLA1cIDVoVMO0ZiLH1iLwDuJiLIJCkBghnYMhYAmy4O8kKBCALATaIuEJEB4jImYhSATJ0iBAFxIItIwAwJBYCmJMQLCATAQIsAEEIYgMQItJBAYECAoQQIAEiwsEgAMACCEZSBUZ8Dz7xUdTPvs57z1/qUroNPD3w48nbLltx802e4a9f5rNv9s2/b8X" .
|
||||
"H2T0edXM2/2maVibl8pmMb2k7n0/LLKdNnVU3I5Py1/p0nW0+FHqu7bf4vLG+7qzRkjGDJIzVYMgUKQCjECDAoAnSQywAGLM9LxoxMtP5itE7pW3fD1ozRiusyRg2B6i2DtIIgMAUGMS5jECAABAFgWADILAZAokFi4pMgiZFiwLAuAVAsAsBIDAqwJgVY" .
|
||||
"BDAZj1jMKWjMrGDCHqIx6hkFX1EyGPYMrAgUmAxCnrJmMO0PGwA7h6iO64AXBE7xbYTsAuBGMLi52EEtsAxQ7AILZGA7ACJaVRAYExI7i4jAKnQAAIQoIJgRllQAIALJAQQogggACoMCkYAhSYkEBYIFQAAQ5zz1/rpflR0bOb89/wBj/iv4mvh74ceTtc" .
|
||||
"xrfOZt9w063zmbvcNP2/Fz9k9HmWJtp+XUakbaPlsyje7nc+h5c/00dhQvZXUcd5a/Y7TsqPCn0Hpntt6PN913VkjJESM0cKIyEFIIigoEBUAJBGjIhRrVbqqapRvo061VxHnq0bZpbp6jKnTrdSXG4Yu3bHVtHrerDho3Uu481O2Uy6mz0pQYS1VYAAgh" .
|
||||
"QUogYGAAhQAzCCvAEtL6wIKGJEWABCoDEAgQuABjIZjAIvrJmBmFVh4h3DMIYkdyLiRhVx7CLAoyCJNhSYFxCp6w8R6yMA7hAYAZEKQAMxgLAGJLy2DECYAYAgQQqIAgmBcyBUtgYliwQBjgCggxDvKMQIEgEAIyggxGBSBQhSACFIBSCBBBCGRAqM5nz3" .
|
||||
"/ZX8qOmOY89/2exGvg72fk7XM6vzn1m73DTX819Zv93sNP2/2T7J6PLSbtPwM0q83aXgfUYu53Pb5b4f8AkdnpeCnqOM8su/5HZ6PyqepHqnst6PN913VsSMoCMjNVSLBEZICQWAUgkAogohMSwGBC0eNEMqF7aE7ljfD00mZijKTGWwUBkAFwIBEMBcCh" .
|
||||
"iAUAiAoEYYYgA8B6xAhFAYiFaHeABPWUAPWAEMykzKwo7iZlasIBSPAsEwQRSZCBFwAYokFaAmHaXMkLIPEKMYhqwReAyFyEXMkAVXIPEgggYjEBZAIsJaW4mYC0jkoeAEYKSbgoQoAxDDBAJBSAMCFAEF4AVAUhBAUAQlxQBCGTIQQhQ5CsWct5253T6D" .
|
||||
"qWcp5y/wDKr/8AsDbwd/wZ+Ttc5V819Z6MOw87+a+s9HqOv2f2Pt+Dy03m7S8L6jTTebtG59RlxdcHr8t//o7TbW6NH8qOK8ux6ztdr8jT/lR6Z7LXm+65vRkiIyOFVSUIywIqFEFAxtEFAEJaZEKiFp8S6yMtPiXWJ3LG+HqMoMUZIxlsqkBAgWi0YAoW" .
|
||||
"i2SsmJAtFoBRLYLaGAFpLQUolsBzaXAAS0MBgBmXMACMAINO0WlJjIDAPEYABaMEBgFAsCkyAhXeA7wiEzKXMCORJWQBkR3FeAwCpkUYB2EC2SFtkgEtsFtpSALRaABFIclDAlpLSu8BWLBQQQlpQBCFAAhQFQYlBBiCgDEQUAQhQRUIVgDFnI+cv/L1Ov" .
|
||||
"8Agde0cf5x/uanX/A28Hf8Gfl7XP8A919Z6Mew86+a+s9Hvdhf2R/I+2ejy03m7Rx6jSrzdo3szd8Hq8vftVdZ220X6Gn/ACo4fYeOrrO42n+vR1I9M/jteae656EZIiMjgUyIikUAKQQFSBRiCtAIhF4l1kdVMxiZU3ovBY3vSjNGvjpVkmxGMtlIoKCC" .
|
||||
"AogBYAChYQpAHQAwgAAAAAAQpCg8RmB6gAzAYC20WiWMewBgPUE7B6gBLYGQdyCLaLbATIKpGCsCDFgZgGMwMwHYMAIsApLBkMGQLJIUATIAoEIUgC0AWSFS0FxIAxIUhBAUmAAhQAIUBUBSEEBSACFEBUADIIQpAMTj/OH/AJep1nYs4vzWr/K1Otm3/P" .
|
||||
"3T0Z+Td8Xw6fmHo/udh59Pxno/udg+/wCK/a8qvNuj4malebdHxM4V6dh8yrrO32Vu3o6jh9lZqVnceX/61B6P129Xnnul60ZIxRkjhVRkiItxAKAFQFBURokFDA0V0VqriojtM6dXcKFCtMyLxLrLPNYmWXBr1NTB6aVCjIiMjGWqiACAAAAYGBRAy4EA" .
|
||||
"AYgALQAAyBMgAwGQKAQEgCZlyAELNwIgCiBZIFoBYB3C2wYAUmQyGQAYgO8AJdoGYBsEcFAdBLRZJcCBkMCZAAUWkAYgpMAICjECCAHeFRgYgARouJCCDAAAAAAKS0AACKgKIAhCgCCACDFkMmRhWLOI80c7nU63+J27OG8y/wBjV/mq/E3/AOfunoy8m6" .
|
||||
"HyNLxm/wDvGnS8Zt/unP3OvteZXm7R8ZpRt0fGcunp2fzajt/Lv9WjtOH2r/XqR3Hln+pR2/iej9cdXnnuno9yRURFRwMgRGRFAAAAAAhSMqMWVXoMYg4vSjJGKRkjKWywAgiACSygACSUABIFRGBLACCACkyKyWgAiSUASywWhYFBYAhSAMhJE7ioqBJL" .
|
||||
"IBYDAk3DAKttgJkMgKmG7SFkBKFlpPWJvADMNgAy4EkTYQMikyGAAJsk2gCgSSQBSCQoCWCQGIEkAt7BMQQCFkAQqIUAAAoACCAoAmBDIgEIykIJBCkYVjVccL5k/wBfV63+J3VfhfUcF5jVOtq9bN/+ffd0ZeTg+bo+I2/3jXoeIz/unP3OuDzo26XzDU" .
|
||||
"bNL5hy6ejbfPqO48sf+JR2nDaH+xV1Hb+VOdpSeiPxx/J57u6ej6KMjFGRmKikRSKqAAAAFEIUBGJDJkKPTSZIxRkjKWyoFBBBIADMmIGIFIAigAAEEKQAPWCAUhZJZICQQqAgAyADIAAmMiK8uQBO4skIBkTAKwhRSkBEA8RYAoAyAWQGS2AKS0AAww2E" .
|
||||
"AkMWCQoJDDAgDAABkwAQACAQpMQKIACrAgABAgFIMYEGRIAhMClYGLwIVkIIRlIFa9TwvqOB379utnfavgq6mfn29ftVno8H3dGXk4PHt/EZf3e0m38Qn9XtM+Lvg0mzT+YazOjx9xB6NH/YfUdr5S/8VHE6f+wdl5PV/jHoj8f9mN3d8H1kzJM1pmaZmM" .
|
||||
"0ymCZkmBkCEkgyDMWxJRSBkZUR1JXltZqrpq4uKm1mVOtrL3UJ3bFij1qqlXmac3Hla1qsEeihNUwZS1ZlMQRVJIxAQBBgBSBhlAAIAJIADDJIm8Ckd4kjvAoIAGAyIVYAATIsgC5GKvLkAkIhcQFgkEAsiSACyJIMwKCYACggkC5AmQAAYgCggkAAAoQE" .
|
||||
"AAAAUjBBUCFChUQoAoBAAAAFEAQjLBAJBGikZFYsxZkzFgatZ/p1PJM/P967amd9uHGjW/ys/P8AeO2rrPR4N1zK/fDz7e8n9ztLt8TH3zPi74NZnR4zAyp8RBvpca513k1X6LXUcen+sjq/Jav0ql1G9v4/7Mru74PtpmxM0U1SbEzly2yWTXJeIitkiT" .
|
||||
"CRxAZySTHiJJRnJJMZDYRkSTHiEg4vZTcZJmtOwyVWBlLdnIMZEkGRBJJAqZTGRNgFbvEmMiUEZSMiSSQKJJJJKKCSJASHgJI2BZDIw8QK8RkQSBfWDGRYBkEySRMDIGJZAoJJJAoJNgkCjMkkbAzwISbBIFkTKJITQFyBJAVQSQEUEEgUSRsSFBcSRNoF" .
|
||||
"ICSQWSkEgUGMlkKpUQswBZKYyXAgpSSAKAiSBSNFIFYkZkYsiMWYsybNbYV594422p/KzgN27aus7zfVf4ur/Kzgd07+s9Hh7bmV++GG3uZr982aHhfUaveMuLvgxKryFxA2J/qJn3fLN/RoLhrueJz8VJysDNamrkbWX2xbMSzutmZrDsl5ttovM15vts" .
|
||||
"zi1qapeZrZHVfHjKZLnaLzja5l+8bXM4vmaw5msSvjxkyX4O1+87X4h942uZxXHrDj1hXx4yZL8Ha/eNr8RPvG1+I4vmaw5msK+PGTJe7X7xtcyfeNrmcXzdYc3VyLm8eMmS52n3ja5j7vtZ8RxfN1chzdbIV8eMpkud6vO9lHjM/vex+M/P1q6uQ5urkc" .
|
||||
"U8WMu/rwh+gfe9j8Zfvexfvn5/zda+BztaLhTxYyv14Q/QPvWx+Mfetj8Z+f87WyHP1shTxYyn14Q/QfvOy+Mn3rZR4zgOfrZE5+rkMvixk+vCH6AvONkrOZJfvOx+M/Pufq5F+o1chl8Xqk+vCH6B942Xxl+8bL4z8++o1ch9RrZDL4vVJ9eEP0H7vsvj" .
|
||||
"H3bZfGfn31GrkPqdXIZfF6pPrwh+g/ddl+4Puuz/cPz/6rVyJ9TqZFy+L1SfXhD9B+6bP9xFfmez/cR+e/VamRfq9TImXx+qSt+D9C+57P9xEfmW0/cR+ffV6mQ+rryLl8fqlK34P0L7ltLf1EF5jtLP1Efnn1deRfq6shl8fqK34P0L7jtP3F3j7htf3V" .
|
||||
"3n579ZXkPrK8hl8fqK34P0P6/au3mU94+u2v7tPefnn1lWTL9bVkxk8fqK3YP0P67a/uU94W+237lMdZ+eLe1dJfrqukZPH6it2D9C+s21n6lPeX6vb/ALlPefnn11XSPrqunvGSz1ma7B+ifVaH7lPeFudH46e8/PPrnmx9fVmxp2eszXel+ifUaL99d4" .
|
||||
"+o0viXefnf19Wb7x9fVm+8advrgzXel+ic/SjxLvHO0/iR+efX1ZsfcKviY07fXBmn0v0Tm6fxLvHN048S7z88+41fEy/ca/iZNO31wZpwfofNos9pd5eZTmfnn3Kv42VeZ6vxsaUeuFzThL9C46cxxrM/Pl5pq/uMv3XW/dY0o9UGacJfoPGhxLM/P15t" .
|
||||
"r/u1F+76/wC7V3jS/wBoM3KXf8Q4jgV5vr/u1d7Ml5xr/uvvY0v9rTPyl3nETiOF+87j9195fvW5/dfeNKfVaZ+Uu5lDiRxH3vcx8wv33dfuE0pxhc/KXbOocRxP33dfuGX33dfuDSnGDPGEu0lFk4tefbr4/wACrz/dfH+A0bsYM8c3ZyWTjV/2HdfEvQ" .
|
||||
"Vf9h3XxIaN3IzxzdlIVRx3/ot1mi/+j3PQNG7kZ4djJeI47/0m56Cr/sm56CaN/Izw7CSycf8A+l3HQF/2XcXxSNG/kZ4dhIk5D/0u4ypL/wCl3OVJNG8zw61sxbOT/wDS6+VJH/2TcZUjRvXPDqmzXUzl3/2PcPCkxf8A2LcZUjRv5GeH3fMK1TtNScmj" .
|
||||
"gtw7+s+nvPNtfc08NTinJHydaqUa225bJrvlzM1lnov2H1GrEUuETEx4u+DEyVwBFblcXuAI7ZrsL3ABTuHcABe4WdHpAIFn5fSLPy+kAqln5fSLPy+kAIWdHpJZ0ekADNRHulUfl9IBBbPy+kWfl9IACz8vpJZ+X0gBFs/L6SOI930gAFH5fSLPy+kAKW" .
|
||||
"fl9JLOj0gALPy+kWdAAE7h3AATuHcAETuHcAA7idwBQ7idwADuJ3ABD+kj/wCIAD+kj/4gAP6R/SABi4/L6Q4/L6QCp8ks/L6RZ+X0gBPkWfl9JLPy+kAHyLPy+kWdHpAKfJLOj0izo9IARO4ABAgBRQAAIABQAA7x3gFQ7x3gBV7x3gBDvHeAPmHeO8Av" .
|
||||
"zDvL3gD5id47wCfMTvD7QAI+0jAAyQxAOHXB/9k=" );
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief 4.0.0 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 30 Oct 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
/**
|
||||
* @brief 4.0.0 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 15 Jan 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief 4.0.0 RC 5 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Blog
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 5 May 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief 4.0.5 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Blog
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 5 May 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
/**
|
||||
* @brief 4.0.12 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 21 Jul 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"1": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_end_date",
|
||||
{
|
||||
"name": "event_end_date",
|
||||
"type": "DATETIME",
|
||||
"length": 0,
|
||||
"decimals": null,
|
||||
"values": [],
|
||||
"allow_null": true,
|
||||
"default": null,
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"zerofill": false,
|
||||
"auto_increment": false,
|
||||
"binary": false
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief 4.1.16 Beta 1 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 30 Sep 2016
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\calendar\setup\upg_101064;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* 4.1.16 Beta 1 Upgrade Code
|
||||
*/
|
||||
class _Upgrade
|
||||
{
|
||||
/**
|
||||
* Fix broken end dates
|
||||
*
|
||||
* @return array If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
|
||||
*/
|
||||
public function step1()
|
||||
{
|
||||
/* At one point we set the default value for an end date field as 0000-00-00 00:00:00, however more recent versions of MySQL and/or
|
||||
STRICT mode does not allow this date, so we changed over to storing NULL instead, which is of course more appropriate. We then
|
||||
attempted to fix these dates in an upgrade routine, however even querying with a value of 0000-00-00 00:00:00 is not allowed with STRICT
|
||||
mode enabled, so it caused errors. This upgrade routine will now reset the end date as we used to, but catch any exceptions and ignore
|
||||
them for people with strict mode enabled. */
|
||||
try
|
||||
{
|
||||
\IPS\Db::i()->update( 'calendar_events', array( 'event_end_date' => NULL ), array( 'event_end_date=?', '0000-00-00 00:00:00' ) );
|
||||
}
|
||||
catch( \Exception $e ){}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom title for this step
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function step1CustomTitle()
|
||||
{
|
||||
return "Fixing incorrectly stored event dates";
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -1,109 +0,0 @@
|
||||
<?php
|
||||
|
||||
$SQL[] = "ALTER TABLE cal_calendars DROP cal_permissions,
|
||||
ADD cal_title_seo VARCHAR( 255 ) NULL DEFAULT NULL,
|
||||
ADD cal_comment_moderate TINYINT( 1 ) NOT NULL DEFAULT '0',
|
||||
ADD cal_rsvp_owner TINYINT( 1 ) NOT NULL DEFAULT '0';";
|
||||
|
||||
$SQL[] = "CREATE TABLE cal_event_ratings (
|
||||
rating_id int(10) NOT NULL auto_increment,
|
||||
rating_eid int(10) NOT NULL default '0',
|
||||
rating_member_id mediumint(8) NOT NULL default '0',
|
||||
rating_value smallint(6) NOT NULL default '0',
|
||||
rating_ip_address varchar(46) NOT NULL,
|
||||
PRIMARY KEY (rating_id),
|
||||
KEY rating_eid (rating_eid,rating_member_id),
|
||||
KEY rating_ip_address (rating_ip_address)
|
||||
);";
|
||||
|
||||
$SQL[] = "CREATE TABLE cal_event_comments (
|
||||
comment_id int(10) NOT NULL auto_increment,
|
||||
comment_eid int(10) NOT NULL default '0',
|
||||
comment_mid mediumint(8) NOT NULL default '0',
|
||||
comment_date int(11) NOT NULL default '0',
|
||||
comment_approved tinyint(1) NOT NULL default '0',
|
||||
comment_text mediumtext,
|
||||
comment_append_edit tinyint(1) NOT NULL default '0',
|
||||
comment_edit_time int(11) NOT NULL default '0',
|
||||
comment_edit_name varchar(255) default NULL,
|
||||
ip_address varchar(46) default NULL,
|
||||
comment_author varchar(255) default NULL,
|
||||
PRIMARY KEY (comment_id),
|
||||
KEY comment_eid (comment_eid),
|
||||
KEY ip_address (ip_address)
|
||||
);";
|
||||
|
||||
$SQL[] = "CREATE TABLE cal_event_rsvp (
|
||||
rsvp_id int(11) NOT NULL auto_increment,
|
||||
rsvp_event_id int(11) NOT NULL default '0',
|
||||
rsvp_member_id int(11) NOT NULL default '0',
|
||||
rsvp_date int(11) NOT NULL default '0',
|
||||
PRIMARY KEY (rsvp_id),
|
||||
KEY rsvp_event_id (rsvp_event_id),
|
||||
KEY rsvp_member_id (rsvp_member_id)
|
||||
);";
|
||||
|
||||
$SQL[] = "CREATE TABLE cal_import_feeds (
|
||||
feed_id int(11) NOT NULL auto_increment,
|
||||
feed_title varchar(255) default NULL,
|
||||
feed_url text,
|
||||
feed_added int(11) NOT NULL default '0',
|
||||
feed_lastupdated int(11) NOT NULL default '0',
|
||||
feed_recache_freq int(11) NOT NULL default '0',
|
||||
feed_calendar_id int(11) NOT NULL default '0',
|
||||
feed_member_id INT NOT NULL DEFAULT '0',
|
||||
feed_next_run INT NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (feed_id),
|
||||
KEY feed_calendar_id (feed_calendar_id),
|
||||
KEY feed_next_run (feed_next_run)
|
||||
);";
|
||||
|
||||
$SQL[] = "CREATE TABLE cal_import_map (
|
||||
import_id int(11) NOT NULL auto_increment,
|
||||
import_feed_id int(11) NOT NULL default '0',
|
||||
import_event_id int(11) NOT NULL default '0',
|
||||
import_guid varchar(255) NOT NULL default '0',
|
||||
PRIMARY KEY (import_id),
|
||||
KEY import_feed_id (import_feed_id),
|
||||
KEY import_event_id (import_event_id),
|
||||
KEY import_guid (import_guid)
|
||||
);";
|
||||
|
||||
|
||||
|
||||
$SQL[] = "RENAME TABLE cal_events TO cal_events_bak;";
|
||||
|
||||
$SQL[] = "CREATE TABLE cal_events (
|
||||
event_id int(10) unsigned NOT NULL auto_increment,
|
||||
event_calendar_id int(10) unsigned NOT NULL default '0',
|
||||
event_member_id mediumint(8) unsigned NOT NULL default '0',
|
||||
event_content mediumtext,
|
||||
event_title varchar(255) NOT NULL default '',
|
||||
event_smilies tinyint(1) NOT NULL default '0',
|
||||
event_comments int NOT NULL default '0',
|
||||
event_rsvp tinyint(1) NOT NULL default '0',
|
||||
event_perms text,
|
||||
event_private tinyint(1) NOT NULL default '0',
|
||||
event_approved tinyint(1) NOT NULL default '0',
|
||||
event_saved int(10) unsigned NOT NULL default '0',
|
||||
event_lastupdated int(10) unsigned NOT NULL default '0',
|
||||
event_recurring int(2) unsigned NOT NULL default '0',
|
||||
event_start_date datetime NOT NULL,
|
||||
event_end_date datetime default NULL,
|
||||
event_title_seo VARCHAR( 255 ) NULL DEFAULT NULL,
|
||||
event_rating_total INT NOT NULL DEFAULT '0',
|
||||
event_rating_hits INT NOT NULL DEFAULT '0',
|
||||
event_rating_avg INT NOT NULL DEFAULT '0',
|
||||
event_attachments INT NOT NULL DEFAULT '0',
|
||||
event_post_key VARCHAR( 32 ) NULL DEFAULT NULL,
|
||||
event_comments_pending INT NOT NULL DEFAULT '0',
|
||||
event_sequence INT NOT NULL DEFAULT '0',
|
||||
PRIMARY KEY (event_id),
|
||||
KEY approved (event_calendar_id , event_approved , event_start_date , event_end_date),
|
||||
KEY event_member_id (event_member_id, event_approved, event_private, event_lastupdated)
|
||||
);";
|
||||
|
||||
$SQL[] = "INSERT INTO cal_events SELECT event_id, event_calendar_id, event_member_id, event_content, event_title, event_smilies, 0, 0, event_perms, event_private, event_approved, event_unixstamp, event_unixstamp,
|
||||
event_recurring, FROM_UNIXTIME(event_unix_from), CASE WHEN event_unix_to > 0 THEN FROM_UNIXTIME(event_unix_to) ELSE NULL END, '', 0, 0, 0, 0, MD5( CONCAT( event_id, event_title ) ), 0, 1 FROM " . \IPS\Db::i()->prefix . "cal_events_bak;";
|
||||
|
||||
$SQL[] = "DROP TABLE cal_events_bak;";
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief 4.0.0 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 24 Oct 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -31,8 +31,26 @@ class _Upgrade
|
||||
*/
|
||||
public function step1()
|
||||
{
|
||||
\IPS\core\Setup\Upgrade::runLegacySql( 'calendar', 32000 );
|
||||
$toRun = \IPS\core\Setup\Upgrade::runManualQueries( array(
|
||||
array(
|
||||
'table' => 'cal_events_bak',
|
||||
'query' => "INSERT INTO " . \IPS\Db::i()->prefix . "cal_events SELECT event_id, event_calendar_id, event_member_id, event_content, event_title, event_smilies, 0, 0, event_perms, event_private, event_approved, event_unixstamp, event_unixstamp,
|
||||
event_recurring, FROM_UNIXTIME(event_unix_from), CASE WHEN event_unix_to > 0 THEN FROM_UNIXTIME(event_unix_to) ELSE NULL END, '', 0, 0, 0, 0, MD5( CONCAT( event_id, event_title ) ), 0, 1 FROM " . \IPS\Db::i()->prefix . "cal_events_bak"
|
||||
),
|
||||
array(
|
||||
'table' => 'cal_events_bak',
|
||||
'query' => "DROP TABLE " . \IPS\Db::i()->prefix . "cal_events_bak"
|
||||
)
|
||||
) );
|
||||
|
||||
if ( count( $toRun ) )
|
||||
{
|
||||
\IPS\core\Setup\Upgrade::adjustMultipleRedirect( array( 1 => 'calendar', 'extra' => array( '_upgradeStep' => 2 ) ) );
|
||||
|
||||
/* Queries to run manually */
|
||||
return array( 'html' => \IPS\Theme::i()->getTemplate( 'forms' )->queries( $toRun, \IPS\Http\Url::internal( 'controller=upgrade' )->setQueryString( array( 'key' => $_SESSION['uniqueKey'], 'mr_continue' => 1, 'mr' => \IPS\Request::i()->mr ) ) ) );
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"1": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"cal_events",
|
||||
{
|
||||
"name": "event_all_day",
|
||||
"type": "tinyint",
|
||||
"length": 1,
|
||||
"allow_null": false,
|
||||
"default": 0
|
||||
}
|
||||
]
|
||||
},
|
||||
"2": {
|
||||
"method": "update",
|
||||
"params": [
|
||||
"cal_events",
|
||||
{
|
||||
"event_all_day": 1
|
||||
},
|
||||
[
|
||||
"TIME(event_start_date)=?",
|
||||
"00:00:00"
|
||||
]
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -1,4 +0,0 @@
|
||||
<?php
|
||||
|
||||
$SQL[] = "ALTER TABLE cal_events ADD event_all_day TINYINT NOT NULL DEFAULT '0';";
|
||||
$SQL[] = "UPDATE cal_events SET event_all_day=1 WHERE TIME(event_start_date) = '00:00:00';";
|
||||
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @brief 4.0.0 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage Calendar
|
||||
* @since 8 October 2015
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
namespace IPS\calendar\setup\upg_32005;
|
||||
|
||||
/* To prevent PHP errors (extending class does not exist) revealing path */
|
||||
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
|
||||
{
|
||||
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* 4.0.0 Upgrade Code
|
||||
*/
|
||||
class _Upgrade
|
||||
{
|
||||
/**
|
||||
* Conversion from 3.0
|
||||
*
|
||||
* @return array If returns TRUE, upgrader will proceed to next step. If it returns any other value, it will set this as the value of the 'extra' GET parameter and rerun this step (useful for loops)
|
||||
*/
|
||||
public function step1()
|
||||
{
|
||||
\IPS\core\Setup\Upgrade::runLegacySql( 'calendar', 32005 );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
@@ -35,41 +35,91 @@
|
||||
]
|
||||
},
|
||||
"6": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_end_date",
|
||||
{
|
||||
"name": "event_end_date",
|
||||
"type": "VARCHAR",
|
||||
"length": 255,
|
||||
"decimals": null,
|
||||
"values": [],
|
||||
"allow_null": true,
|
||||
"default": null,
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"zerofill": false,
|
||||
"auto_increment": false,
|
||||
"binary": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"7": {
|
||||
"method": "update",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_end_date=NULL",
|
||||
"event_end_date='0000-00-00 00:00:00'"
|
||||
]
|
||||
},
|
||||
"8": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_end_date",
|
||||
{
|
||||
"name": "event_end_date",
|
||||
"type": "DATETIME",
|
||||
"length": 0,
|
||||
"decimals": null,
|
||||
"values": [],
|
||||
"allow_null": true,
|
||||
"default": null,
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"zerofill": false,
|
||||
"auto_increment": false,
|
||||
"binary": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"method": "renameTable",
|
||||
"params": [
|
||||
"cal_import_feeds",
|
||||
"calendar_import_feeds"
|
||||
]
|
||||
},
|
||||
"7": {
|
||||
"10": {
|
||||
"method": "renameTable",
|
||||
"params": [
|
||||
"cal_import_map",
|
||||
"calendar_import_map"
|
||||
]
|
||||
},
|
||||
"8": {
|
||||
"11": {
|
||||
"method": "dropIndex",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_content"
|
||||
]
|
||||
},
|
||||
"9": {
|
||||
"12": {
|
||||
"method": "dropIndex",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_title"
|
||||
]
|
||||
},
|
||||
"10": {
|
||||
"13": {
|
||||
"method": "dropIndex",
|
||||
"params": [
|
||||
"calendar_event_comments",
|
||||
"comment_text"
|
||||
]
|
||||
},
|
||||
"11": {
|
||||
"14": {
|
||||
"method": "dropColumn",
|
||||
"params": [
|
||||
"calendar_calendars",
|
||||
@@ -86,14 +136,14 @@
|
||||
]
|
||||
]
|
||||
},
|
||||
"12": {
|
||||
"15": {
|
||||
"method": "dropColumn",
|
||||
"params": [
|
||||
"calendar_import_feeds",
|
||||
"feed_recache_freq"
|
||||
]
|
||||
},
|
||||
"13": {
|
||||
"16": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_calendars",
|
||||
@@ -113,14 +163,14 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"14": {
|
||||
"17": {
|
||||
"method": "update",
|
||||
"params": [
|
||||
"calendar_calendars",
|
||||
"cal_color='#000000'"
|
||||
]
|
||||
},
|
||||
"15": {
|
||||
"18": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_event_comments",
|
||||
@@ -141,7 +191,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"16": {
|
||||
"19": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -161,7 +211,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"17": {
|
||||
"20": {
|
||||
"method": "dropColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -173,7 +223,7 @@
|
||||
]
|
||||
]
|
||||
},
|
||||
"18": {
|
||||
"21": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -193,7 +243,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"19": {
|
||||
"22": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -213,7 +263,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"20": {
|
||||
"23": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -233,7 +283,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"21": {
|
||||
"24": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -254,7 +304,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"22": {
|
||||
"25": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -274,7 +324,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"23": {
|
||||
"26": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -294,7 +344,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"24": {
|
||||
"27": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -314,7 +364,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"25": {
|
||||
"28": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -334,14 +384,14 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"26": {
|
||||
"29": {
|
||||
"method": "dropTable",
|
||||
"params": [
|
||||
"cal_event_ratings",
|
||||
true
|
||||
]
|
||||
},
|
||||
"27": {
|
||||
"30": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_calendars",
|
||||
@@ -361,7 +411,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"28": {
|
||||
"31": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_calendars",
|
||||
@@ -381,7 +431,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"29": {
|
||||
"32": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_calendars",
|
||||
@@ -401,7 +451,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"30": {
|
||||
"33": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -421,7 +471,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"31": {
|
||||
"34": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_import_feeds",
|
||||
@@ -441,7 +491,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"32": {
|
||||
"35": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -461,7 +511,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"33": {
|
||||
"36": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -481,7 +531,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"34": {
|
||||
"37": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_event_rsvp",
|
||||
@@ -501,14 +551,14 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"35": {
|
||||
"38": {
|
||||
"method": "update",
|
||||
"params": [
|
||||
"calendar_event_rsvp",
|
||||
"rsvp_response=1"
|
||||
]
|
||||
},
|
||||
"36": {
|
||||
"39": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -529,28 +579,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"37": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
"event_end_date",
|
||||
{
|
||||
"name": "event_end_date",
|
||||
"type": "DATETIME",
|
||||
"length": 0,
|
||||
"decimals": null,
|
||||
"values": [],
|
||||
"allow_null": true,
|
||||
"default": "0000-00-00 00:00:00",
|
||||
"comment": "",
|
||||
"unsigned": false,
|
||||
"zerofill": false,
|
||||
"auto_increment": false,
|
||||
"binary": false
|
||||
}
|
||||
]
|
||||
},
|
||||
"38": {
|
||||
"40": {
|
||||
"method": "changeColumn",
|
||||
"params": [
|
||||
"calendar_import_feeds",
|
||||
@@ -571,7 +600,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"39": {
|
||||
"41": {
|
||||
"method": "changeIndex",
|
||||
"params": [
|
||||
"calendar_import_feeds",
|
||||
@@ -588,7 +617,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"40": {
|
||||
"42": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
@@ -608,7 +637,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"41": {
|
||||
"43": {
|
||||
"method": "createTable",
|
||||
"params": [
|
||||
{
|
||||
@@ -870,7 +899,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"42": {
|
||||
"44": {
|
||||
"method": "addIndex",
|
||||
"params": [
|
||||
"calendar_event_comments",
|
||||
@@ -886,7 +915,7 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"43": {
|
||||
"45": {
|
||||
"method": "addColumn",
|
||||
"params": [
|
||||
"calendar_events",
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief 4.0.0 Alpha 1 Upgrade Code
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @subpackage Calendar
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @since 8 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
@@ -39,7 +39,6 @@ class _Upgrade
|
||||
\IPS\Db::i()->update( 'calendar_events', "event_recurring=CONCAT( event_recurring, ';UNTIL=', DATE_FORMAT( event_end_date, '%Y%m%dT%k%i%sZ' ) ), event_end_date=NULL", 'event_recurring IS NOT NULL AND event_end_date IS NOT NULL' );
|
||||
|
||||
\IPS\Db::i()->update( 'calendar_events', array( 'event_approved' => 0 ), "event_private=1 or event_perms!='*'" );
|
||||
\IPS\Db::i()->update( 'calendar_events', array( 'event_end_date' => NULL ), array( 'event_end_date=?', '0000-00-00 00:00:00' ) );
|
||||
|
||||
\IPS\Db::i()->dropColumn( 'calendar_events', array( 'event_private', 'event_perms' ) );
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Calendar Node
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -133,11 +133,11 @@ class _Calendar extends \IPS\Node\Model implements \IPS\Node\Permissions
|
||||
{
|
||||
if( !$this->_data['title_seo'] )
|
||||
{
|
||||
$this->title_seo = \IPS\Http\Url::seoTitle( \IPS\Lang::load( \IPS\Lang::defaultLanguage() )->get( 'calendar_calendar_' . $this->id ) );
|
||||
$this->title_seo = \IPS\Http\Url\Friendly::seoTitle( \IPS\Lang::load( \IPS\Lang::defaultLanguage() )->get( 'calendar_calendar_' . $this->id ) );
|
||||
$this->save();
|
||||
}
|
||||
|
||||
return $this->_data['title_seo'] ?: \IPS\Http\Url::seoTitle( \IPS\Lang::load( \IPS\Lang::defaultLanguage() )->get( 'calendar_calendar_' . $this->id ) );
|
||||
return $this->_data['title_seo'] ?: \IPS\Http\Url\Friendly::seoTitle( \IPS\Lang::load( \IPS\Lang::defaultLanguage() )->get( 'calendar_calendar_' . $this->id ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -173,7 +173,7 @@ class _Calendar extends \IPS\Node\Model implements \IPS\Node\Permissions
|
||||
if( isset( $values['cal_title'] ) )
|
||||
{
|
||||
\IPS\Lang::saveCustom( 'calendar', 'calendar_calendar_' . $this->id, $values['cal_title'] );
|
||||
$values['title_seo'] = \IPS\Http\Url::seoTitle( $values['cal_title'][ \IPS\Lang::defaultLanguage() ] );
|
||||
$values['title_seo'] = \IPS\Http\Url\Friendly::seoTitle( $values['cal_title'][ \IPS\Lang::defaultLanguage() ] );
|
||||
|
||||
unset( $values['cal_title'] );
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Calendar-specific date functions
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 30 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -75,6 +75,11 @@ class _Date extends \IPS\DateTime
|
||||
'lm_d_y' => "%B %d, %Y",
|
||||
);
|
||||
|
||||
/**
|
||||
* @brief Cache date objects we've created through getDate()
|
||||
*/
|
||||
protected static $dateObjects = array();
|
||||
|
||||
/**
|
||||
* Creates a new object to represent the requested date
|
||||
*
|
||||
@@ -88,10 +93,10 @@ class _Date extends \IPS\DateTime
|
||||
* @return \IPS\calendar\Date
|
||||
* @throws \InvalidArgumentException
|
||||
*/
|
||||
public static function getDate( $year=NULL, $month=NULL, $day=NULL, $hour=0, $minute=0, $second=0, $offset=0 )
|
||||
public static function getDate( $year=NULL, $month=NULL, $day=NULL, $hour=0, $minute=0, $second=0, $offset=NULL )
|
||||
{
|
||||
/* Get our time zone offset */
|
||||
if ( !$offset and \IPS\Member::loggedIn()->timezone )
|
||||
if ( $offset === NULL and \IPS\Member::loggedIn()->timezone )
|
||||
{
|
||||
$offset = \IPS\DateTime::create()->setTimezone( new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) )->getOffset();
|
||||
}
|
||||
@@ -419,17 +424,18 @@ class _Date extends \IPS\DateTime
|
||||
/**
|
||||
* Return the date for use in calendar (used instead of localeDate() to allow admin to configure)
|
||||
*
|
||||
* @param \IPS\Lang|\IPS\Member|NULL $memberOrLanguage The language or member to use, or NULL for currently logged in member
|
||||
* @return string
|
||||
*/
|
||||
public function calendarDate()
|
||||
public function calendarDate( $memberOrLanguage=NULL )
|
||||
{
|
||||
if( \IPS\Settings::i()->calendar_date_format == -1 AND \IPS\Settings::i()->calendar_date_format_custom )
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->convertString( strftime( \IPS\Settings::i()->calendar_date_format_custom, $this->getTimestamp() + $this->offset ) );
|
||||
return static::determineLanguage( $memberOrLanguage )->convertString( strftime( \IPS\Settings::i()->calendar_date_format_custom, $this->getTimestamp() + $this->offset ) );
|
||||
}
|
||||
elseif( isset( static::$dateFormats[ \IPS\Settings::i()->calendar_date_format ] ) )
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->convertString( strftime( static::$dateFormats[ \IPS\Settings::i()->calendar_date_format ], $this->getTimestamp() + $this->offset ) );
|
||||
return static::determineLanguage( $memberOrLanguage )->convertString( strftime( static::$dateFormats[ \IPS\Settings::i()->calendar_date_format ], $this->getTimestamp() + $this->offset ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -458,10 +464,12 @@ class _Date extends \IPS\DateTime
|
||||
/**
|
||||
* Retrieve the birthdays for the date
|
||||
*
|
||||
* @param bool $day Whether to limit to the current day or not
|
||||
* @param bool $day Whether to limit to the current day or not
|
||||
* @param bool $count Flag to indicate we only need the count
|
||||
* @note When $count is TRUE we return an array of dates => integers (counts), when it is FALSE we return an array of dates => array( member objects )
|
||||
* @return array
|
||||
*/
|
||||
public function getBirthdays( $day=FALSE )
|
||||
public function getBirthdays( $day=FALSE, $count=FALSE )
|
||||
{
|
||||
$birthdays = array();
|
||||
|
||||
@@ -471,10 +479,58 @@ class _Date extends \IPS\DateTime
|
||||
return $birthdays;
|
||||
}
|
||||
|
||||
/* Get where clause */
|
||||
$where = $this->getBirthdaysWhere( $day );
|
||||
|
||||
/* Now, do we just want the count? */
|
||||
if( $count )
|
||||
{
|
||||
$members = \IPS\Db::i()->select( 'COUNT(*) as total, bday_month, bday_day', 'core_members', $where, NULL, NULL, array( 'bday_month', 'bday_day' ) );
|
||||
|
||||
foreach( $members as $member )
|
||||
{
|
||||
$birthdays[ str_pad( $member['bday_month'], 2, 0, STR_PAD_LEFT ) . str_pad( $member['bday_day'], 2, 0, STR_PAD_LEFT ) ] = $member['total'];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$members = \IPS\Db::i()->select( '*', 'core_members', $where, 'name ASC', array( 0, 5 ) );
|
||||
|
||||
if( $members->count() )
|
||||
{
|
||||
foreach( $members as $member )
|
||||
{
|
||||
/* If it's not leap year we do the nice thing and show Feb 29th birthdays on Feb 28th */
|
||||
if( $this->mon == 2 AND !$this->leapYear() AND $member['bday_month'] == 2 AND $member['bday_day'] == 29 )
|
||||
{
|
||||
$member['bday_day'] = 28;
|
||||
}
|
||||
|
||||
$member = \IPS\Member::constructFromData( $member );
|
||||
|
||||
$birthdays[ str_pad( $member->bday_month, 2, 0, STR_PAD_LEFT ) . str_pad( $member->bday_day, 2, 0, STR_PAD_LEFT ) ][] = $member;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $birthdays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the where clause to fetch birthdays
|
||||
*
|
||||
* @param bool $day Whether to limit to the current day or not
|
||||
* @return array
|
||||
*/
|
||||
public function getBirthdaysWhere( $day=FALSE )
|
||||
{
|
||||
/* We always limit by month */
|
||||
$where = array( array( 'bday_month=?', $this->mon ) );
|
||||
|
||||
/* Are we also limiting by day? */
|
||||
if( $day === TRUE )
|
||||
{
|
||||
/* February 29th is special */
|
||||
if( $this->mon == 2 AND $this->mday == 28 AND !$this->leapYear() )
|
||||
{
|
||||
$where[] = array( 'bday_day IN(28,29)' );
|
||||
@@ -485,43 +541,23 @@ class _Date extends \IPS\DateTime
|
||||
}
|
||||
}
|
||||
|
||||
$members = \IPS\DB::i()->select( '*', 'core_members', $where );
|
||||
/* Exclude banned users */
|
||||
$where[] = array( 'temp_ban=?', 0 );
|
||||
|
||||
if( $members->count() )
|
||||
/* Groups with 'g_view_board' off are also 'banned', so factor those in too */
|
||||
$goodGroups = array();
|
||||
|
||||
foreach( \IPS\Member\Group::groups() as $group )
|
||||
{
|
||||
foreach( $members as $member )
|
||||
if( $group->g_view_board )
|
||||
{
|
||||
/* If it's not leap year we do the nice thing and show Feb 29th birthdays on Feb 28th */
|
||||
if( $this->mon == 2 AND !$this->leapYear() AND $member['bday_month'] == 2 AND $member['bday_day'] == 29 )
|
||||
{
|
||||
$member['bday_day'] = 28;
|
||||
}
|
||||
|
||||
$member = \IPS\Member::constructFromData( $member );
|
||||
|
||||
$banned = FALSE;
|
||||
|
||||
if ( $member->temp_ban != 0 )
|
||||
{
|
||||
if ( $member->temp_ban > 0 OR $member->temp_ban == -1 )
|
||||
{
|
||||
$banned = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if( !$member->group['g_view_board'] )
|
||||
{
|
||||
$banned = TRUE;
|
||||
}
|
||||
|
||||
if ( !$banned )
|
||||
{
|
||||
$birthdays[ str_pad( $member->bday_month, 2, 0, STR_PAD_LEFT ) . str_pad( $member->bday_day, 2, 0, STR_PAD_LEFT ) ][] = $member;
|
||||
}
|
||||
$goodGroups[] = $group->g_id;
|
||||
}
|
||||
}
|
||||
|
||||
return $birthdays;
|
||||
$where[] = array( "member_group_id IN(" . implode( ',', $goodGroups ) . ")" );
|
||||
|
||||
return $where;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -735,12 +771,13 @@ class _Date extends \IPS\DateTime
|
||||
/**
|
||||
* Format the time according to the user's locale (without the date)
|
||||
*
|
||||
* @param bool $seconds If TRUE, will include seconds
|
||||
* @param bool $minutes If TRUE, will include minutes
|
||||
* @param bool $seconds If TRUE, will include seconds
|
||||
* @param bool $minutes If TRUE, will include minutes
|
||||
* @param \IPS\Lang|\IPS\Member|NULL $memberOrLanguage The language or member to use, or NULL for currently logged in member
|
||||
* @return string
|
||||
*/
|
||||
public function localeTime( $seconds=TRUE, $minutes=TRUE )
|
||||
public function localeTime( $seconds=TRUE, $minutes=TRUE, $memberOrLanguage=NULL )
|
||||
{
|
||||
return \IPS\Member::loggedIn()->language()->convertString( strftime( $this->localeTimeFormat( $seconds, $minutes ), $this->getTimestamp() + $this->offset ) );
|
||||
return static::determineLanguage( $memberOrLanguage )->convertString( strftime( $this->localeTimeFormat( $seconds, $minutes, $memberOrLanguage ), $this->getTimestamp() + $this->offset ) );
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Event Comment Model
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 7 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -91,7 +91,7 @@ class _Comment extends \IPS\Content\Comment implements \IPS\Content\EditHistory,
|
||||
* @param string|NULL $action Action
|
||||
* @return \IPS\Http\Url
|
||||
*/
|
||||
public function url( $action=NULL )
|
||||
public function url( $action='find' )
|
||||
{
|
||||
return parent::url( $action )->setQueryString( 'tab', 'comments' );
|
||||
}
|
||||
@@ -112,7 +112,7 @@ class _Comment extends \IPS\Content\Comment implements \IPS\Content\EditHistory,
|
||||
* @param array $indexData Data from the search index
|
||||
* @param array $authorData Basic data about the author. Only includes columns returned by \IPS\Member::columnsForPhoto()
|
||||
* @param array $itemData Basic data about the item. Only includes columns returned by item::basicDataColumns()
|
||||
* @param array|NULL $containerData Basic data about the author. Only includes columns returned by container::basicDataColumns()
|
||||
* @param array|NULL $containerData Basic data about the container. Only includes columns returned by container::basicDataColumns()
|
||||
* @param array $reputationData Array of people who have given reputation and the reputation they gave
|
||||
* @param int|NULL $reviewRating If this is a review, the rating
|
||||
* @param string $view 'expanded' or 'condensed'
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Calendar Event Model
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 7 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -169,7 +169,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
public function set_title( $title )
|
||||
{
|
||||
$this->_data['title'] = $title;
|
||||
$this->_data['title_seo'] = \IPS\Http\Url::seoTitle( $title );
|
||||
$this->_data['title_seo'] = \IPS\Http\Url\Friendly::seoTitle( $title );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -181,11 +181,11 @@ class _Event extends \IPS\Content\Item implements
|
||||
{
|
||||
if( !$this->_data['title_seo'] )
|
||||
{
|
||||
$this->title_seo = \IPS\Http\Url::seoTitle( $this->title );
|
||||
$this->title_seo = \IPS\Http\Url\Friendly::seoTitle( $this->title );
|
||||
$this->save();
|
||||
}
|
||||
|
||||
return $this->_data['title_seo'] ?: \IPS\Http\Url::seoTitle( $this->title );
|
||||
return $this->_data['title_seo'] ?: \IPS\Http\Url\Friendly::seoTitle( $this->title );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -234,14 +234,15 @@ class _Event extends \IPS\Content\Item implements
|
||||
|
||||
/* Hold parameters to sprintf() into the language string */
|
||||
$params = array();
|
||||
$pluralize = array();
|
||||
|
||||
/* Figure out the basic language string */
|
||||
$langString = "recur_human_" . $recurringData['event_repeats'];
|
||||
|
||||
if( $recurringData['event_repeat_freq'] > 1 )
|
||||
{
|
||||
$langString = $langString . '_multi';
|
||||
$params[] = $recurringData['event_repeat_freq'];
|
||||
$langString = $langString . '_multi';
|
||||
$pluralize[] = $recurringData['event_repeat_freq'];
|
||||
}
|
||||
|
||||
/* If recurring weekly, take days into account */
|
||||
@@ -278,7 +279,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
$params[] = \IPS\Member::loggedIn()->language()->addToStack('recur_human__forever');
|
||||
}
|
||||
|
||||
return \IPS\Member::loggedIn()->language()->addToStack( $langString, FALSE, array( 'sprintf' => $params ) );
|
||||
return \IPS\Member::loggedIn()->language()->addToStack( $langString, FALSE, array( 'pluralize' => $pluralize, 'sprintf' => $params ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -384,7 +385,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
/* Figure out which of teh days is next. For example, if the start date is a Wednesday, and the
|
||||
event repeats every Monday and Friday, we need to start with Friday (not Monday) because that's
|
||||
when the first occurance is */
|
||||
$nextTimes = array();
|
||||
$nextTimes = array();
|
||||
foreach ( $_repeatDays as $repeatDay )
|
||||
{
|
||||
$nextTimes[ $repeatDay ] = $date->adjust( "next {$repeatDay}" )->getTimestamp();
|
||||
@@ -393,14 +394,28 @@ class _Event extends \IPS\Content\Item implements
|
||||
$nextTimes = array_keys( $nextTimes );
|
||||
$nextDay = array_shift( $nextTimes );
|
||||
|
||||
/* We have to reset the $_repeatDays array pointer so that it matches $nextDay, otherwise it is possible a day might be skipped */
|
||||
while( current( $_repeatDays ) !== $nextDay )
|
||||
{
|
||||
$resetNextDay = next( $_repeatDays );
|
||||
|
||||
if( $resetNextDay === FALSE )
|
||||
{
|
||||
reset( $_repeatDays );
|
||||
$resetNextDay = current( $_repeatDays );
|
||||
}
|
||||
}
|
||||
|
||||
/* We need to set a counter in case we need to repeat every X weeks */
|
||||
$iteration = 1;
|
||||
|
||||
/* Do we have an occurrences limit? */
|
||||
if( $recurringData['repeat_end_occurrences'] )
|
||||
{
|
||||
while( $occurrences < $recurringData['repeat_end_occurrences'] )
|
||||
{
|
||||
$date = $date->adjust( "next {$nextDay}" );
|
||||
$eDate = ( $eDate !== NULL ) ? $eDate->adjust( "next {$nextDay}" ) : NULL;
|
||||
$occurrences++;
|
||||
$eDate = ( $eDate !== NULL ) ? $eDate->adjust( "next {$nextDay}" ) : NULL;
|
||||
|
||||
/* Figure out the next day this occurs on */
|
||||
$nextDay = next( $_repeatDays );
|
||||
@@ -411,6 +426,16 @@ class _Event extends \IPS\Content\Item implements
|
||||
$nextDay = current( $_repeatDays );
|
||||
}
|
||||
|
||||
/* Are we repeating every other week or something? */
|
||||
if( $recurringData['event_repeat_freq'] AND $iteration % $recurringData['event_repeat_freq'] != 0 )
|
||||
{
|
||||
$iteration++;
|
||||
continue;
|
||||
}
|
||||
|
||||
$iteration++;
|
||||
$occurrences++;
|
||||
|
||||
if( ( $date->mysqlDatetime( FALSE ) >= $startDate->mysqlDatetime( FALSE ) AND $date->mysqlDatetime( FALSE ) <= $endDate->mysqlDatetime( FALSE ) ) OR
|
||||
( $eDate !== NULL AND $eDate->mysqlDatetime( FALSE ) >= $startDate->mysqlDatetime( FALSE ) AND $eDate->mysqlDatetime( FALSE ) <= $endDate->mysqlDatetime( FALSE ) ) OR
|
||||
( $eDate !== NULL AND $date->mysqlDatetime( FALSE ) <= $startDate->mysqlDatetime( FALSE ) AND $eDate->mysqlDatetime( FALSE ) >= $endDate->mysqlDatetime( FALSE ) )
|
||||
@@ -437,6 +462,15 @@ class _Event extends \IPS\Content\Item implements
|
||||
$nextDay = current( $_repeatDays );
|
||||
}
|
||||
|
||||
/* Are we repeating every other week or something? */
|
||||
if( $recurringData['event_repeat_freq'] AND $iteration % $recurringData['event_repeat_freq'] != 0 )
|
||||
{
|
||||
$iteration++;
|
||||
continue;
|
||||
}
|
||||
|
||||
$iteration++;
|
||||
|
||||
if( ( $date->mysqlDatetime( FALSE ) >= $startDate->mysqlDatetime( FALSE ) AND $date->mysqlDatetime( FALSE ) <= $endDate->mysqlDatetime( FALSE ) ) OR
|
||||
( $eDate !== NULL AND $eDate->mysqlDatetime( FALSE ) >= $startDate->mysqlDatetime( FALSE ) AND $eDate->mysqlDatetime( FALSE ) <= $endDate->mysqlDatetime( FALSE ) ) OR
|
||||
( $eDate !== NULL AND $date->mysqlDatetime( FALSE ) <= $startDate->mysqlDatetime( FALSE ) AND $eDate->mysqlDatetime( FALSE ) >= $endDate->mysqlDatetime( FALSE ) )
|
||||
@@ -463,6 +497,15 @@ class _Event extends \IPS\Content\Item implements
|
||||
$nextDay = current( $_repeatDays );
|
||||
}
|
||||
|
||||
/* Are we repeating every other week or something? */
|
||||
if( $recurringData['event_repeat_freq'] AND $iteration % $recurringData['event_repeat_freq'] != 0 )
|
||||
{
|
||||
$iteration++;
|
||||
continue;
|
||||
}
|
||||
|
||||
$iteration++;
|
||||
|
||||
if( ( $date->mysqlDatetime( FALSE ) >= $startDate->mysqlDatetime( FALSE ) AND $date->mysqlDatetime( FALSE ) <= $endDate->mysqlDatetime( FALSE ) ) OR
|
||||
( $eDate !== NULL AND $eDate->mysqlDatetime( FALSE ) >= $startDate->mysqlDatetime( FALSE ) AND $eDate->mysqlDatetime( FALSE ) <= $endDate->mysqlDatetime( FALSE ) ) OR
|
||||
( $eDate !== NULL AND $date->mysqlDatetime( FALSE ) <= $startDate->mysqlDatetime( FALSE ) AND $eDate->mysqlDatetime( FALSE ) >= $endDate->mysqlDatetime( FALSE ) )
|
||||
@@ -553,7 +596,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
@@ -750,6 +793,68 @@ class _Event extends \IPS\Content\Item implements
|
||||
|
||||
return $this->dateObjects['end'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string with the event date/times in the timezone of the user who created the event
|
||||
* Used in outgoing emails
|
||||
*
|
||||
* @param \IPS\Lang $language The language to use
|
||||
* @return string
|
||||
*/
|
||||
public function fixedDateTimeDescription( \IPS\Lang $language )
|
||||
{
|
||||
/* Init */
|
||||
$return = '';
|
||||
try
|
||||
{
|
||||
$authorTimezone = new \DateTimeZone( $this->author()->timezone );
|
||||
}
|
||||
catch ( \Exception $e )
|
||||
{
|
||||
$authorTimezone = new \DateTimeZone('UTC');
|
||||
}
|
||||
|
||||
/* Start */
|
||||
$start = $this->_start_date->setTimezone( $authorTimezone );
|
||||
$startOffset = $authorTimezone->getOffset( $start ) / 3600;
|
||||
$return .= $start->calendarDate( $language );
|
||||
if ( !$this->all_day )
|
||||
{
|
||||
$return .= ' ' . $start->localeTime( FALSE, TRUE, $language );
|
||||
}
|
||||
if ( $startOffset )
|
||||
{
|
||||
$return .= ' (GMT' . ( ( $startOffset > 0 ) ? '+' : '' ) . $startOffset . ')';
|
||||
}
|
||||
else
|
||||
{
|
||||
$return .= ' (GMT)';
|
||||
}
|
||||
|
||||
/* End */
|
||||
if ( $this->_end_date )
|
||||
{
|
||||
$return .= ' - ';
|
||||
$end = $this->_end_date->setTimezone( $authorTimezone );
|
||||
$endOffset = $authorTimezone->getOffset( $end ) / 3600; // Unlikely, but if the event spans the DST switch, the end offset could be different to the start
|
||||
$return .= $end->calendarDate( $language );
|
||||
if ( !$this->all_day )
|
||||
{
|
||||
$return .= ' ' . $end->localeTime( FALSE, TRUE, $language );
|
||||
}
|
||||
if ( $endOffset )
|
||||
{
|
||||
$return .= ' (GMT' . ( ( $endOffset > 0 ) ? '+' : '' ) . $endOffset . ')';
|
||||
}
|
||||
else
|
||||
{
|
||||
$return .= ' (GMT)';
|
||||
}
|
||||
}
|
||||
|
||||
/* Return */
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Cached URLs
|
||||
@@ -865,11 +970,11 @@ class _Event extends \IPS\Content\Item implements
|
||||
*/
|
||||
public function commentReviews( $tab )
|
||||
{
|
||||
if ( $tab === 'reviews' )
|
||||
if ( $tab === 'reviews' and $this->container()->allow_reviews )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate('view')->reviews( $this );
|
||||
}
|
||||
elseif( $tab === 'comments' )
|
||||
elseif( $tab === 'comments' and $this->container()->allow_comments )
|
||||
{
|
||||
return \IPS\Theme::i()->getTemplate('view')->comments( $this );
|
||||
}
|
||||
@@ -903,7 +1008,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
public function moderateNewComments( \IPS\Member $member )
|
||||
{
|
||||
$commentClass = static::$commentClass;
|
||||
return $this->container()->comment_moderate and !$member->group['g_avoid_q'];
|
||||
return ( $this->container()->comment_moderate and !$member->group['g_avoid_q'] ) or parent::moderateNewComments( $member );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -915,7 +1020,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
public function moderateNewReviews( \IPS\Member $member )
|
||||
{
|
||||
$reviewClass = static::$reviewClass;
|
||||
return $this->container()->review_moderate and !$member->group['g_avoid_q'];
|
||||
return ( $this->container()->review_moderate and !$member->group['g_avoid_q'] ) or parent::moderateNewReviews( $member );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -933,7 +1038,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
* Get elements for add/edit form
|
||||
*
|
||||
* @param \IPS\Content\Item|NULL $item The current item if editing or NULL if creating
|
||||
* @param int $container Container (e.g. forum) ID, if appropriate
|
||||
* @param \IPS\Node\Model|NULL $container Container (e.g. forum) ID, if appropriate
|
||||
* @return array
|
||||
*/
|
||||
public static function formElements( $item=NULL, \IPS\Node\Model $container=NULL )
|
||||
@@ -949,7 +1054,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
|
||||
/* We are using a custom template to provide an optimal experience for the user instead of a basic linear top-down form elements for the date fields */
|
||||
$dateValues = array(
|
||||
'single_day' => $item ? !$item->end_date : TRUE,
|
||||
'single_day' => $item ? ( !$item->end_date or ( \IPS\calendar\Date::parseTime( $item->start_date, $item->all_day ? FALSE : TRUE )->format('Y-m-d') === \IPS\calendar\Date::parseTime( $item->end_date, $item->all_day ? FALSE : TRUE )->format('Y-m-d') ) ) : TRUE,
|
||||
'start_date' => $item ? \IPS\calendar\Date::parseTime( $item->start_date, $item->all_day ? FALSE : TRUE ) : \IPS\calendar\Date::parseTime( $newDefault ),
|
||||
'end_date' => ( $item AND $item->end_date ) ? \IPS\calendar\Date::parseTime( $item->end_date, $item->all_day ? FALSE : TRUE ) : NULL,
|
||||
'all_day' => $item ? $item->all_day : $allDay,
|
||||
@@ -1004,7 +1109,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
$end = null;
|
||||
|
||||
|
||||
if( isset( $val['end_date'] ) AND $val['end_date'] )
|
||||
{
|
||||
if( !isset( $val['single_day'] ) OR !$val['single_day'] )
|
||||
@@ -1021,8 +1126,19 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
$end = \IPS\calendar\Date::createFromForm( $val['start_date'], ( ( !isset( $val['all_day'] ) OR !$val['all_day'] ) ? $val['end_time'] : NULL ), ( isset( $val['all_day'] ) AND $val['all_day'] ) ? 'UTC' : $val['event_timezone'] )->format( 'Y-m-d H:i' );
|
||||
}
|
||||
catch( \Exception $e )
|
||||
{
|
||||
throw new \DomainException( "invalid_end_date" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Check the dates */
|
||||
if( $start === NULL )
|
||||
{
|
||||
@@ -1056,9 +1172,9 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
}, NULL, NULL, 'event_dates' );
|
||||
|
||||
|
||||
/* Init */
|
||||
$return['calendar'] = new \IPS\Helpers\Form\Node( static::$formLangPrefix . 'container', $container ? $container->id : ( isset( \IPS\Request::i()->id ) ? \IPS\Request::i()->id : NULL ), TRUE, array(
|
||||
$return['calendar'] = new \IPS\Helpers\Form\Node( static::$formLangPrefix . 'container', $container ? $container->id : ( isset( \IPS\Request::i()->calendar ) ? \IPS\Request::i()->calendar : NULL ), TRUE, array(
|
||||
'url' => \IPS\Http\Url::internal( 'app=calendar&module=calendar&controller=submit', 'front', 'calendar_submit' ),
|
||||
'class' => 'IPS\calendar\Calendar',
|
||||
'permissionCheck' => 'add',
|
||||
@@ -1087,8 +1203,11 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
/* Event - request RSVP */
|
||||
$return['rsvp'] = new \IPS\Helpers\Form\YesNo( 'event_rsvp', $item ? $item->rsvp : NULL, FALSE, array( 'togglesOn' => array( 'event_rsvp_limit' ) ), NULL, NULL, NULL, 'event_rsvp' );
|
||||
$return['rsvplimit'] = new \IPS\Helpers\Form\Number( 'event_rsvp_limit', $item ? $item->rsvp_limit : -1, FALSE, array( 'unlimited' => -1 ), NULL, NULL, NULL, 'event_rsvp_limit' );
|
||||
if( $container and $container->can( 'askrsvp', $item ? $item->author() : \IPS\Member::loggedIn() ) )
|
||||
{
|
||||
$return['rsvp'] = new \IPS\Helpers\Form\YesNo( 'event_rsvp', $item ? $item->rsvp : NULL, FALSE, array( 'togglesOn' => array( 'event_rsvp_limit' ) ), NULL, NULL, NULL, 'event_rsvp' );
|
||||
$return['rsvplimit'] = new \IPS\Helpers\Form\Number( 'event_rsvp_limit', $item ? $item->rsvp_limit : -1, FALSE, array( 'unlimited' => -1 ), NULL, NULL, NULL, 'event_rsvp_limit' );
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
@@ -1133,6 +1252,20 @@ class _Event extends \IPS\Content\Item implements
|
||||
$this->start_date = \IPS\calendar\Date::createFromForm( $values['event_dates']['start_date'], ( ( !isset( $values['event_dates']['all_day'] ) OR !$values['event_dates']['all_day'] ) ? $values['event_dates']['start_time'] : NULL ), ( isset( $values['event_dates']['all_day'] ) AND $values['event_dates']['all_day'] ) ? 'UTC' : $values['event_dates']['event_timezone'] )->format( 'Y-m-d H:i' );
|
||||
$this->end_date = null;
|
||||
|
||||
/* Clear clear fields for non-selected items */
|
||||
switch( $values['event_dates']['repeat_end'] )
|
||||
{
|
||||
case 'never':
|
||||
unset( $values['event_dates']['repeat_end_occurrences'], $values['event_dates']['repeat_end_date'] );
|
||||
break;
|
||||
case 'after':
|
||||
unset( $values['event_dates']['repeat_end_date'] );
|
||||
break;
|
||||
case 'date':
|
||||
unset( $values['event_dates']['repeat_end_occurrences'] );
|
||||
break;
|
||||
}
|
||||
|
||||
if( isset( $values['event_dates']['end_date'] ) AND $values['event_dates']['end_date'] )
|
||||
{
|
||||
if( !isset( $values['event_dates']['single_day'] ) OR !$values['event_dates']['single_day'] )
|
||||
@@ -1170,7 +1303,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
/* Cover photo */
|
||||
$this->cover_photo = ( $values['event_cover_photo'] !== NULL ) ? $values['event_cover_photo']->url : NULL;
|
||||
$this->cover_photo = ( $values['event_cover_photo'] !== NULL ) ? (string) $values['event_cover_photo'] : NULL;
|
||||
|
||||
/* Set location */
|
||||
$this->location = ( $values['event_location'] !== NULL ) ? json_encode( $values['event_location'] ) : NULL;
|
||||
@@ -1186,8 +1319,8 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
/* RSVP options */
|
||||
$this->rsvp = $values['event_rsvp'];
|
||||
$this->rsvp_limit = $values['event_rsvp_limit'];
|
||||
$this->rsvp = isset( $values['event_rsvp'] ) ? $values['event_rsvp'] : FALSE;
|
||||
$this->rsvp_limit = isset( $values['event_rsvp_limit'] ) ? $values['event_rsvp_limit'] : 0;
|
||||
|
||||
/* Get the normal stuff */
|
||||
parent::processForm( $values );
|
||||
@@ -1206,6 +1339,21 @@ class _Event extends \IPS\Content\Item implements
|
||||
|
||||
/* And claim attachments */
|
||||
\IPS\File::claimAttachments( 'calendar-event', $this->id );
|
||||
|
||||
/* And expire widget caches so an event for today will show in the upcoming events widget properly */
|
||||
$this->expireWidgetCaches();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Notification
|
||||
*
|
||||
* @param string|NULL $extra Additional data
|
||||
* @return \IPS\Notification
|
||||
*/
|
||||
protected function createNotification( $extra=NULL )
|
||||
{
|
||||
// New content is sent with itself as the item as we deliberately do not group notifications about new content items. Unlike comments where you're going to read them all - you might scan the notifications list for topic titles you're interested in
|
||||
return new \IPS\Notification( \IPS\Application::load( 'calendar' ), 'new_content', $this, array( $this ) );
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1227,7 +1375,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
* Return the map for the event, if location is specified
|
||||
*
|
||||
* @param int $width Width
|
||||
* @param int $heigth Height
|
||||
* @param int $height Height
|
||||
* @return string
|
||||
* @note \BadMethodCallException can be thrown if the google maps integration is shut off - don't show any error if that happens.
|
||||
*/
|
||||
@@ -1251,8 +1399,9 @@ class _Event extends \IPS\Content\Item implements
|
||||
* @param \IPS\calendar\Date $startDate Date to start from
|
||||
* @param \IPS\calendar\Date|NULL $endDate Cut off date for events. NULL accepted as a possible value only if $formatEvents is set to FALSE.
|
||||
* @param \IPS\calendar\Calendar|NULL|array $calendar Calendar to filter by
|
||||
* @param int|null $limit Maximum number of events to return (only supported when not formatting events)
|
||||
* @param bool $formatEvents Whether or not to format events into a structured array
|
||||
* @param int|null $limit Maximum number of events to return (only supported when not formatting events)
|
||||
* @param bool $formatEvents Whether or not to format events into a structured array
|
||||
* @param \IPS\Member $member The member (NULL to use currently logged in member)
|
||||
* @return \IPS\Patterns\ActiveRecordIterator
|
||||
* @throws \InvalidArgumentException
|
||||
* @see \IPS\Content\_Item::getItemsWithPermission()
|
||||
@@ -1286,7 +1435,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
/* Get timezone adjusted versions of start/end time */
|
||||
$startDateTimezone = \IPS\calendar\Date::parseTime( $startDate->mysqlDatetime() );
|
||||
$startDateTimezone = \IPS\calendar\Date::parseTime( $startDate->mysqlDatetime(), TRUE );
|
||||
$endDateTimezone = ( $endDate !== NULL ) ? \IPS\calendar\Date::parseTime( $endDate->mysqlDatetime() ) : NULL;
|
||||
|
||||
if ( $member->timezone )
|
||||
@@ -1368,7 +1517,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
/* Get the non-recurring events */
|
||||
$events = \IPS\calendar\Event::getItemsWithPermission( array_merge( $where, $nonRecurring ), 'event_start_date ASC', NULL, 'read', NULL, 0, $member );
|
||||
$events = \IPS\calendar\Event::getItemsWithPermission( array_merge( $where, $nonRecurring ), 'event_start_date ASC', NULL, 'read', \IPS\Content\Hideable::FILTER_AUTOMATIC, 0, $member );
|
||||
|
||||
/* We need to make sure ranged events repeat each day that they occur on */
|
||||
$formattedEvents = array();
|
||||
@@ -1391,14 +1540,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
else
|
||||
{
|
||||
if( $event->all_day )
|
||||
{
|
||||
$formattedEvents[ \IPS\calendar\Date::parseTime( $event->start_date, FALSE )->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event;
|
||||
}
|
||||
else
|
||||
{
|
||||
$formattedEvents[ $event->_start_date->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event;
|
||||
}
|
||||
$formattedEvents[ $event->_start_date->mysqlDatetime( FALSE ) ]['single'][ $event->id ] = $event;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1408,13 +1550,14 @@ class _Event extends \IPS\Content\Item implements
|
||||
}
|
||||
|
||||
/* Now get the recurring events.... */
|
||||
$recurringEvents = \IPS\calendar\Event::getItemsWithPermission( array_merge( $where, array( array( 'event_recurring IS NOT NULL' ) ) ), 'event_start_date ASC', NULL, 'read', NULL, 0, $member );
|
||||
$recurringEvents = \IPS\calendar\Event::getItemsWithPermission( array_merge( $where, array( array( 'event_recurring IS NOT NULL' ) ) ), 'event_start_date ASC', NULL, 'read', \IPS\Content\Hideable::FILTER_AUTOMATIC, 0, $member );
|
||||
|
||||
/* Loop over any results */
|
||||
foreach( $recurringEvents as $event )
|
||||
{
|
||||
/* Find occurrences within our date range (if any) */
|
||||
$occurrences = $event->findOccurrences( $startDate, ( $endDate ? $endDate : $startDate->adjust( "+2 years" ) ) );
|
||||
$thisEndDate = ( $endDate ? $endDate : $startDate->adjust( "+2 years" ) );
|
||||
$occurrences = $event->findOccurrences( $startDate, $thisEndDate );
|
||||
|
||||
/* Do we have any? */
|
||||
if( count( $occurrences ) )
|
||||
@@ -1428,7 +1571,8 @@ class _Event extends \IPS\Content\Item implements
|
||||
if( $occurrence['endDate'] !== NULL )
|
||||
{
|
||||
$date = $occurrence['startDate'];
|
||||
while( $date->mysqlDatetime( FALSE ) < $occurrence['endDate']->mysqlDatetime( FALSE ) )
|
||||
$eDate = ( $thisEndDate->mysqlDatetime( FALSE ) < $occurrence['endDate']->mysqlDatetime( FALSE ) ) ? $thisEndDate : $occurrence['endDate'];
|
||||
while( $date->mysqlDatetime( FALSE ) < $eDate->mysqlDatetime( FALSE ) )
|
||||
{
|
||||
$formattedEvents[ $date->mysqlDatetime( FALSE ) ]['ranged'][ $event->id ] = $event;
|
||||
$date = $date->adjust( '+1 day' );
|
||||
@@ -1456,6 +1600,16 @@ class _Event extends \IPS\Content\Item implements
|
||||
/* @note: Error suppressor is needed due to PHP bug https://bugs.php.net/bug.php?id=50688 */
|
||||
@usort( $formattedEvents, function( $a, $b ) use ( $startDate )
|
||||
{
|
||||
if( $a->nextOccurrence( $startDate, 'startDate' ) === NULL )
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
if( $b->nextOccurrence( $startDate, 'startDate' ) === NULL )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if ( $a->nextOccurrence( $startDate, 'startDate' )->mysqlDatetime() == $b->nextOccurrence( $startDate, 'startDate' )->mysqlDatetime() )
|
||||
{
|
||||
return 0;
|
||||
@@ -1555,7 +1709,7 @@ class _Event extends \IPS\Content\Item implements
|
||||
* @param array $indexData Data from the search index
|
||||
* @param array $authorData Basic data about the author. Only includes columns returned by \IPS\Member::columnsForPhoto()
|
||||
* @param array $itemData Basic data about the item. Only includes columns returned by item::basicDataColumns()
|
||||
* @param array|NULL $containerData Basic data about the author. Only includes columns returned by container::basicDataColumns()
|
||||
* @param array|NULL $containerData Basic data about the container. Only includes columns returned by container::basicDataColumns()
|
||||
* @param array $reputationData Array of people who have given reputation and the reputation they gave
|
||||
* @param int|NULL $reviewRating If this is a review, the rating
|
||||
* @param string $view 'expanded' or 'condensed'
|
||||
@@ -1581,4 +1735,81 @@ class _Event extends \IPS\Content\Item implements
|
||||
|
||||
return \IPS\Theme::i()->getTemplate( 'global', 'calendar', 'front' )->searchResultEventSnippet( $indexData, $itemData, $nextOccurance, $startDate, $endDate, $itemData['event_all_day'], $view == 'condensed' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get output for API
|
||||
*
|
||||
* @return array
|
||||
* @apiresponse int id ID number
|
||||
* @apiresponse string title Title
|
||||
* @apiresponse \IPS\calendar\Calendar calendar Calendar
|
||||
* @apiresponse datetime start Event start time
|
||||
* @apiresponse datetime end Event end time
|
||||
* @apiresponse string recurrence If this event recurs, the ICS recurrence definition
|
||||
* @apiresponse bool rsvp If this event accepts RSVPs
|
||||
* @apiresponse int rsvpLimit The number of RSVPs the event is limited to
|
||||
* @apiresponse \IPS\GeoLocation location The location where the event is taking place
|
||||
* @apiresponse \IPS\Member author The member thgat created the event
|
||||
* @apiresponse datetime postedDate When the event was created
|
||||
* @apiresponse string description Event description
|
||||
* @apiresponse int comments Number of comments
|
||||
* @apiresponse int reviews Number of reviews
|
||||
* @apiresponse int views Number of posts
|
||||
* @apiresponse string prefix The prefix tag, if there is one
|
||||
* @apiresponse [string] tags The tags
|
||||
* @apiresponse bool locked Event is locked
|
||||
* @apiresponse bool hidden Event is hidden
|
||||
* @apiresponse bool featured Event is featured
|
||||
* @apiresponse string url URL
|
||||
*/
|
||||
public function apiOutput()
|
||||
{
|
||||
return array(
|
||||
'id' => $this->tid,
|
||||
'title' => $this->title,
|
||||
'calendar' => $this->container()->apiOutput(),
|
||||
'start' => $this->_start_date->rfc3339(),
|
||||
'end' => $this->_end_date ? $this->_end_date->rfc3339() : NULL,
|
||||
'recurrence' => $this->recurring,
|
||||
'rsvp' => (bool) $this->rsvp,
|
||||
'rsvpLimit' => $this->rsvp_limit == -1 ? null : $this->rsvp_limit,
|
||||
'location' => $this->location ? \IPS\GeoLocation::buildFromJson( $this->location )->apiOutput() : null,
|
||||
'author' => $this->author()->apiOutput(),
|
||||
'postedDate' => \IPS\DateTime::ts( $this->saved )->rfc3339(),
|
||||
'description' => $this->content(),
|
||||
'comments' => $this->comments,
|
||||
'reviews' => $this->reviews,
|
||||
'views' => $this->views,
|
||||
'prefix' => $this->prefix(),
|
||||
'tags' => $this->tags(),
|
||||
'locked' => (bool) $this->locked(),
|
||||
'hidden' => (bool) $this->hidden(),
|
||||
'featured' => (bool) $this->mapped('featured'),
|
||||
'url' => (string) $this->url(),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Can comment?
|
||||
*
|
||||
* @param \IPS\Member\NULL $member The member (NULL for currently logged in member)
|
||||
* @return bool
|
||||
*/
|
||||
public function canComment( $member=NULL )
|
||||
{
|
||||
$member = $member ?: \IPS\Member::loggedIn();
|
||||
return parent::canComment( $member ) and $this->container()->allow_comments;
|
||||
}
|
||||
|
||||
/**
|
||||
* Can review?
|
||||
*
|
||||
* @param \IPS\Member\NULL $member The member (NULL for currently logged in member)
|
||||
* @return bool
|
||||
*/
|
||||
public function canReview( $member = NULL )
|
||||
{
|
||||
$member = $member ?: \IPS\Member::loggedIn();
|
||||
return parent::canReview( $member ) and $this->container()->allow_reviews;
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Event Review Model
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 7 Jan 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -116,7 +116,7 @@ class _Review extends \IPS\Content\Review implements \IPS\Content\EditHistory, \
|
||||
* @param array $indexData Data from the search index
|
||||
* @param array $authorData Basic data about the author. Only includes columns returned by \IPS\Member::columnsForPhoto()
|
||||
* @param array $itemData Basic data about the item. Only includes columns returned by item::basicDataColumns()
|
||||
* @param array|NULL $containerData Basic data about the author. Only includes columns returned by container::basicDataColumns()
|
||||
* @param array|NULL $containerData Basic data about the container. Only includes columns returned by container::basicDataColumns()
|
||||
* @param array $reputationData Array of people who have given reputation and the reputation they gave
|
||||
* @param int|NULL $reviewRating If this is a review, the rating
|
||||
* @param string $view 'expanded' or 'condensed'
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief iCalendar ICS Parser
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 19 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -298,15 +298,16 @@ class _ICSParser
|
||||
{
|
||||
$this->_parsedIcsData = $this->_convertToGmt( $this->_parsedIcsData );
|
||||
}
|
||||
|
||||
|
||||
/* Now loop over the results in order to insert */
|
||||
$_imported = 0;
|
||||
$_skipped = 0;
|
||||
$_newEvents = 0;
|
||||
|
||||
// Leave this here - useful for debugging
|
||||
// print_r($this->_parsedIcsData);exit;
|
||||
|
||||
if ( count( $this->_parsedIcsData ) )
|
||||
if ( count( $this->_parsedIcsData ) and isset( $this->_parsedIcsData['events'] ) )
|
||||
{
|
||||
/* Loop over the events */
|
||||
foreach( $this->_parsedIcsData['events'] as $event )
|
||||
@@ -316,7 +317,7 @@ class _ICSParser
|
||||
{
|
||||
try
|
||||
{
|
||||
$rrule = self::parseRrule( $event['recurr'] );
|
||||
$rrule = static::parseRrule( $event['recurr'] );
|
||||
}
|
||||
catch( \InvalidArgumentException $e )
|
||||
{
|
||||
@@ -327,24 +328,24 @@ class _ICSParser
|
||||
$event['uid'] = $event['uid'] ? $event['uid'] : md5( implode( ',', $event['start'] ) . implode( ',', $event['end'] ) );
|
||||
|
||||
/* Figure out some times */
|
||||
$event_unix_from = $event['start']['gmt_ts'];
|
||||
$event_unix_to = isset( $event['end'] ) ? $event['end']['gmt_ts'] : NULL;
|
||||
$event_all_day = ( $event['start']['type'] == 'DATE' ) ? 1 : 0;
|
||||
$event_unix_from = $event['start']['utc_time'];
|
||||
$event_unix_to = isset( $event['end'] ) ? $event['end']['utc_time'] : NULL;
|
||||
$event_all_day = ( $event['start']['type'] == 'DATE' ) ? TRUE : FALSE;
|
||||
|
||||
/* End dates in iCalendar format are "exclusive", meaning they are actually the day ahead. */
|
||||
/* @link http://microformats.org/wiki/dtend-issue */
|
||||
/* Only adjust end date if end date is not equal too the start date already. */
|
||||
/* @see Ticket 876817 */
|
||||
|
||||
if( $event_unix_to AND $event['end']['type'] == 'DATE' AND ( $event_unix_from != $event_unix_to ) )
|
||||
if( $event_unix_to AND $event['end']['type'] == 'DATE' AND ( $event_unix_from->getTimestamp() != $event_unix_to->getTimestamp() ) )
|
||||
{
|
||||
$event_unix_to -= 86400;
|
||||
$event_unix_to = $event_unix_to->sub( new \DateInterval( 'P1D' ) );
|
||||
}
|
||||
|
||||
/* It is a single day event if end date is equal to start date */
|
||||
if( $event_unix_from == $event_unix_to )
|
||||
{
|
||||
$event_unix_to = 0;
|
||||
$event_unix_to = NULL;
|
||||
}
|
||||
|
||||
/* If there is a duration, calculate the end date again */
|
||||
@@ -359,14 +360,14 @@ class _ICSParser
|
||||
preg_match( "#(\d+?)S#is", $event['duration'], $match );
|
||||
$second = $match[1] ? $match[1] : 0;
|
||||
|
||||
$event_unix_to = $event_unix_from + ( $hour * 3600 ) + ( $minute * 60 ) + $second;
|
||||
$event_unix_to = $event_unix_from->add( new \DateIntveral( 'PT' . ( $hour * 3600 ) . 'H' . ( $minute * 60 ) . 'M' . $second . 'S' ) );
|
||||
}
|
||||
|
||||
/* If this is an all day event, adjust the timestamps */
|
||||
if( $event_all_day )
|
||||
{
|
||||
$event_unix_from = gmmktime( 0, 0, 0, gmstrftime( '%m', $event_unix_from ), gmstrftime( '%d', $event_unix_from ), gmstrftime( '%Y', $event_unix_from ) );
|
||||
$event_unix_to = $event_unix_to ? gmmktime( 0, 0, 0, gmstrftime( '%m', $event_unix_to ), gmstrftime( '%d', $event_unix_to ), gmstrftime( '%Y', $event_unix_to ) ) : 0;
|
||||
$event_unix_from = $event_unix_from->setTime( 0, 0, 0 );
|
||||
$event_unix_to = $event_unix_to ? $event_unix_to->setTime( 0, 0, 0 ) : NULL;
|
||||
}
|
||||
|
||||
/* If we are missing crucial data, skip this event */
|
||||
@@ -378,11 +379,19 @@ class _ICSParser
|
||||
|
||||
/* Update previously imported events, if possible */
|
||||
$eventId = NULL;
|
||||
$_new = FALSE;
|
||||
|
||||
if( $event['uid'] )
|
||||
{
|
||||
try
|
||||
{
|
||||
/* If we are importing an ICS file, feed here will be null. */
|
||||
if ( is_null( $this->feed ) )
|
||||
{
|
||||
/* Bubble up so we can create a new event */
|
||||
throw new \UnderflowException;
|
||||
}
|
||||
|
||||
$eventId = \IPS\Db::i()->select( 'import_event_id', 'calendar_import_map', array( array( 'import_guid=? and import_feed_id=?', $event['uid'], $this->feed->id ) ) )->first();
|
||||
|
||||
try
|
||||
@@ -401,6 +410,7 @@ class _ICSParser
|
||||
catch( \UnderflowException $e )
|
||||
{
|
||||
$newEvent = new \IPS\calendar\Event;
|
||||
$_new = TRUE;
|
||||
|
||||
/* Basics */
|
||||
$newEvent->post_key = md5( uniqid() );
|
||||
@@ -425,8 +435,8 @@ class _ICSParser
|
||||
$newEvent->lastupdated = ( isset( $event['last_modified'] ) AND $event['last_modified'] AND $event['last_modified'] < time() ) ? $event['last_modified'] : ( ( isset( $event['created'] ) AND $event['created'] AND $event['created'] < time() ) ? $event['created'] : time() );
|
||||
$newEvent->all_day = $event_all_day;
|
||||
$newEvent->recurring = ( isset( $event['recurr'] ) ) ? $event['recurr'] : NULL;
|
||||
$newEvent->start_date = gmstrftime( "%Y-%m-%d %H:%M:00", $event_unix_from );
|
||||
$newEvent->end_date = $event_unix_to ? gmstrftime( "%Y-%m-%d %H:%M:00", $event_unix_to ) : NULL;
|
||||
$newEvent->start_date = $event_unix_from->setTimezone( new \DateTimeZone( 'UTC' ) )->format( 'Y-m-d H:i:s' );
|
||||
$newEvent->end_date = $event_unix_to ? $event_unix_to->setTimezone( new \DateTimeZone( 'UTC' ) )->format( 'Y-m-d H:i:s' ) : NULL;
|
||||
|
||||
/* Geolocation? */
|
||||
if( isset( $event['geo'] ) AND is_array( $event['geo'] ) AND count( $event['geo'] ) )
|
||||
@@ -444,6 +454,12 @@ class _ICSParser
|
||||
/* Increment counter */
|
||||
$_imported++;
|
||||
|
||||
/* Increment only if this is a new event */
|
||||
if( $_new )
|
||||
{
|
||||
$_newEvents++;
|
||||
}
|
||||
|
||||
/* Add to index */
|
||||
\IPS\Content\Search\Index::i()->index( $newEvent );
|
||||
|
||||
@@ -481,9 +497,12 @@ class _ICSParser
|
||||
}
|
||||
|
||||
/* Increment post counts */
|
||||
$this->member->member_posts = $this->member->member_posts + $_imported;
|
||||
$this->member->member_last_post = time();
|
||||
$this->member->save();
|
||||
if( $_newEvents )
|
||||
{
|
||||
$this->member->member_posts = $this->member->member_posts + $_newEvents;
|
||||
$this->member->member_last_post = time();
|
||||
$this->member->save();
|
||||
}
|
||||
|
||||
/* Return the data */
|
||||
return array( 'skipped' => $_skipped, 'imported' => $_imported );
|
||||
@@ -630,12 +649,13 @@ class _ICSParser
|
||||
/**
|
||||
* Return a UID for iCalendar
|
||||
*
|
||||
* @param array $params Parameters to use to generate UID
|
||||
* @param \IPS\calendar\Event $event Event
|
||||
* @param string
|
||||
*/
|
||||
protected function _buildUid( $params )
|
||||
protected static function _buildUid( $event )
|
||||
{
|
||||
return md5( implode( '.', $params ) ) . '@' . $_SERVER['SERVER_ADDR'];
|
||||
$baseUrl = \IPS\Http\Url::internal('');
|
||||
return $event->id . '-' . $event->calendar_id . '-' . md5( (string) $baseUrl ) . '@' . $baseUrl->data['host'];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -658,7 +678,7 @@ class _ICSParser
|
||||
$output .= "SUMMARY:" . $this->_encodeSpecialCharacters( $event->title ) . "\r\n";
|
||||
$output .= "DTSTAMP:" . \IPS\calendar\Date::ts( $event->saved )->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
$output .= "SEQUENCE:" . $event->sequence . "\r\n";
|
||||
$output .= "UID:" . $this->_buildUid( array( $event->saved, $event->id ) ) . "\r\n";
|
||||
$output .= "UID:" . static::_buildUid( $event ) . "\r\n";
|
||||
$output .= $this->_foldLines( "ORGANIZER;CN=\"" . $this->_encodeSpecialCharacters( $event->author()->name, false ) . '":' . \IPS\Settings::i()->email_out ) . "\r\n";
|
||||
|
||||
/* Attachments */
|
||||
@@ -696,8 +716,8 @@ class _ICSParser
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "DTSTART;" . $event->_start_date->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
$output .= "DTEND;" . $event->_end_date->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
$output .= "DTSTART:" . $event->_start_date->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
$output .= "DTEND:" . $event->_end_date->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -708,7 +728,7 @@ class _ICSParser
|
||||
}
|
||||
else
|
||||
{
|
||||
$output .= "DTSTART;" . $event->_start_date->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
$output .= "DTSTART:" . $event->_start_date->modifiedIso8601( TRUE, TRUE ) . "\r\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -830,16 +850,6 @@ class _ICSParser
|
||||
* @brief Raw iCalendar data before parsing
|
||||
*/
|
||||
protected $_rawIcsData = array();
|
||||
|
||||
/**
|
||||
* @brief Temp: Current timezone ID we are parsing
|
||||
*/
|
||||
protected $_tzId = '';
|
||||
|
||||
/**
|
||||
* @brief Temp: Current timezone ID we are beginning to parse
|
||||
*/
|
||||
protected $_tzBegin = '';
|
||||
|
||||
/**
|
||||
* @brief Earliest timestamp from feed
|
||||
@@ -931,32 +941,28 @@ class _ICSParser
|
||||
$_tmp = array();
|
||||
$_key = array();
|
||||
$tmp = explode( ':', $string );
|
||||
$tmp[0] = 'DATETIME';
|
||||
|
||||
/* The date string may be in the format of "DTSTART;20160219T140000Z" (for example) */
|
||||
if ( !isset( $tmp[1] ) )
|
||||
{
|
||||
if ( mb_strpos( $string, ';' ) !== false )
|
||||
{
|
||||
$tmp = explode( ';', $string );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$tzid = '';
|
||||
|
||||
/* Got a TZID? */
|
||||
if ( count( $_key ) AND $_key[1] == 'TZID' )
|
||||
{
|
||||
$tzid = $tmp[0];
|
||||
}
|
||||
$tzid = ( count( $_key ) AND $_key[1] == 'TZID' ) ? $tmp[0] : '';
|
||||
|
||||
/* Is it a date? */
|
||||
if ( $tmp[0] == 'DATE' )
|
||||
{
|
||||
$timestamp = strtotime( $tmp[1] );
|
||||
}
|
||||
else
|
||||
{
|
||||
$timestamp = '?';
|
||||
}
|
||||
/* If the value is a date without a time, then type should be reset to date */
|
||||
$type = ( mb_strlen( $tmp[1] ) === 8 ) ? 'DATE' : 'DATETIME';
|
||||
|
||||
/* Format return array */
|
||||
$return = array(
|
||||
'type' => $tmp[0],
|
||||
'type' => $type,
|
||||
'raw' => $tmp[1],
|
||||
'raw_ts' => strtotime( $tmp[1] ),
|
||||
'ts' => $timestamp,
|
||||
'tzid' => str_replace( '"', '', $tzid ),
|
||||
);
|
||||
|
||||
@@ -990,26 +996,14 @@ class _ICSParser
|
||||
$this->_begin = 'VCALENDAR';
|
||||
$this->_processVcalendarObject( $start + 1 );
|
||||
break;
|
||||
|
||||
case 'VTIMEZONE':
|
||||
$this->_begin = 'VTIMEZONE';
|
||||
$this->_processTimezoneObject( $start + 1 );
|
||||
break;
|
||||
|
||||
|
||||
case 'STANDARD':
|
||||
if ( $this->_begin == 'VTIMEZONE' )
|
||||
{
|
||||
$this->_processTimezoneTypeObject( $start + 1, 'STANDARD' );
|
||||
}
|
||||
break;
|
||||
|
||||
case 'DAYLIGHT':
|
||||
if ( $this->_begin == 'VTIMEZONE' )
|
||||
{
|
||||
$this->_processTimezoneTypeObject( $start + 1, 'DAYLIGHT' );
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 'VEVENT':
|
||||
$this->_begin = 'VEVENT';
|
||||
$this->_processEventObject( $start + 1 );
|
||||
@@ -1249,106 +1243,6 @@ class _ICSParser
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a timezone object in an ical feed
|
||||
*
|
||||
* @param int $start Line number
|
||||
* @param string $type Type of time zone object to parse
|
||||
* @return void
|
||||
*/
|
||||
protected function _processTimezoneTypeObject( $start, $type )
|
||||
{
|
||||
/* Init */
|
||||
$type = mb_strtolower( $type );
|
||||
$break = FALSE;
|
||||
|
||||
/* Loop over the lines */
|
||||
for( $i = $start, $j = count( $this->_rawIcsData ); $i < $j; $i++ )
|
||||
{
|
||||
/* Unparse and get the data */
|
||||
$tmp = $this->_unparseContent( $this->_rawIcsData[$i], $i );
|
||||
|
||||
if ( !$tmp )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$_type = $tmp['type'];
|
||||
$_data = $tmp['data'];
|
||||
|
||||
switch( $_type )
|
||||
{
|
||||
case 'DTSTART':
|
||||
$this->_parsedIcsData['timezones'][ $this->_tzId ][ $type ]['start'] = strtotime( $_data );
|
||||
break;
|
||||
|
||||
case 'TZOFFSETTO':
|
||||
$this->_parsedIcsData['timezones'][ $this->_tzId ][ $type ]['tz_offset_to'] = $_data;
|
||||
break;
|
||||
|
||||
case 'TZOFFSETFROM':
|
||||
$this->_parsedIcsData['timezones'][ $this->_tzId ][ $type ]['tz_offset_from'] = $_data;
|
||||
break;
|
||||
|
||||
case 'TZNAME':
|
||||
$this->_parsedIcsData['timezones'][ $this->_tzId ][ $type ]['tz_name'] = $_data;
|
||||
break;
|
||||
|
||||
case 'END':
|
||||
return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a timezone object in an ical feed
|
||||
*
|
||||
* @param int $start Line number
|
||||
* @return void
|
||||
*/
|
||||
protected function _processTimezoneObject( $start )
|
||||
{
|
||||
/* Loop over the lines */
|
||||
for( $i = $start, $j = count( $this->_rawIcsData ); $i < $j; $i++ )
|
||||
{
|
||||
/* Unparse and get the data */
|
||||
$tmp = $this->_unparseContent( $this->_rawIcsData[$i], $i );
|
||||
|
||||
if( !$tmp )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
$_type = $tmp['type'];
|
||||
$_data = $tmp['data'];
|
||||
|
||||
switch( $_type )
|
||||
{
|
||||
case 'TZID':
|
||||
$this->_tzId = $_data;
|
||||
$this->_parsedIcsData['timezones'][ $_data ] = array();
|
||||
break;
|
||||
|
||||
case 'LAST-MODIFIED':
|
||||
$this->_parsedIcsData['timezones'][ $this->_tzId ]['last_modified'] = $_data;
|
||||
break;
|
||||
|
||||
case 'BEGIN':
|
||||
$this->_tzBegin = $_data;
|
||||
$this->_parseBeginBlock( $_data, $i );
|
||||
break;
|
||||
|
||||
case 'END':
|
||||
if ( $this->_tzBegin == $_data )
|
||||
{
|
||||
return;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unformat content from incoming ical feed
|
||||
*
|
||||
@@ -1384,17 +1278,6 @@ class _ICSParser
|
||||
*/
|
||||
protected function _convertToGmt( $data )
|
||||
{
|
||||
/* Get timezones */
|
||||
$timezones = array();
|
||||
|
||||
if ( isset( $data['timezones'] ) AND is_array( $data['timezones'] ) AND count( $data['timezones'] ) )
|
||||
{
|
||||
foreach( $data['timezones'] as $type => $_data )
|
||||
{
|
||||
$timezones[ $type ] = $_data;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fix events */
|
||||
if ( is_array( $data['events'] ) AND count( $data['events'] ) )
|
||||
{
|
||||
@@ -1402,43 +1285,14 @@ class _ICSParser
|
||||
{
|
||||
foreach( array( 'start', 'end' ) as $method )
|
||||
{
|
||||
/* Set up constraints */
|
||||
if ( isset( $event[ $method ]['tzid'] ) AND isset( $timezones[ $event[ $method ]['tzid'] ] ) AND is_array( $timezones[ $event[ $method ]['tzid'] ] ) )
|
||||
/* Is a timezone specified? */
|
||||
if ( isset( $event[ $method ]['tzid'] ) AND $event[ $method ]['tzid'] )
|
||||
{
|
||||
$_standard = ( isset($timezones[ $event[ $method ]['tzid'] ]['standard']['start'] ) ) ? intval( $timezones[ $event[ $method ]['tzid'] ]['standard']['start'] ) : 0;
|
||||
$_daylight = ( isset($timezones[ $event[ $method ]['tzid'] ]['daylight']['start'] ) ) ? intval( $timezones[ $event[ $method ]['tzid'] ]['daylight']['start'] ) : 0;
|
||||
$_offset = 0;
|
||||
|
||||
if ( isset( $event[ $method ]['tzid'] ) AND $event[ $method ]['raw_ts'] )
|
||||
{
|
||||
//if ( $event[ $method ]['raw_ts'] < $_daylight )
|
||||
//{
|
||||
// $_offset = $timezones[ $event[ $method ]['tzid'] ]['standard']['tz_offset_to'];
|
||||
//}
|
||||
//else if ( $event[ $method ]['raw_ts'] > $_standard )
|
||||
//{
|
||||
// $_offset = $timezones[ $event[ $method ]['tzid'] ]['standard']['tz_offset_to'];
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// $_offset = $timezones[ $event[ $method ]['tzid'] ]['daylight']['tz_offset_to'];
|
||||
//}
|
||||
|
||||
$_offset = $timezones[ $event[ $method ]['tzid'] ]['standard']['tz_offset_to'];
|
||||
|
||||
$event[ $method ]['gmt_ts'] = $event[ $method ]['raw_ts'] - ( $_offset / 100 * 3600 );
|
||||
$event[ $method ]['offset'] = $_offset;
|
||||
$event[ $method ]['gmt_rfc'] = gmdate( 'r', $event[ $method ]['gmt_ts'] );
|
||||
}
|
||||
$event[ $method ]['utc_time'] = new \IPS\DateTime( $event[ $method ]['raw'], new \DateTimeZone( $event[ $method ]['tzid'] ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isset( $event[ $method ]['raw_ts'] ) )
|
||||
{
|
||||
$event[ $method ]['gmt_ts'] = $event[ $method ]['raw_ts'];
|
||||
$event[ $method ]['offset'] = 0;
|
||||
$event[ $method ]['gmt_rfc'] = gmdate( 'r', $event[ $method ]['gmt_ts'] );
|
||||
}
|
||||
$event[ $method ]['utc_time'] = new \IPS\DateTime( $event[ $method ]['raw'] );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief iCalendar active record
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 19 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief icalendar Task
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage calendar
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
/**
|
||||
* @brief Recent event reviews Widget
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 19 Feb 2014
|
||||
* @version SVN_VERSION_NUMBER
|
||||
@@ -95,7 +95,7 @@ class _recentReviews extends \IPS\Widget\PermissionCache
|
||||
$where['item'][] = array( \IPS\Db::i()->in( 'event_calendar_id', $this->configuration['widget_calendar'] ) );
|
||||
}
|
||||
|
||||
$reviews = \IPS\calendar\Event\Review::getItemsWithPermission( $where, NULL, ( isset( $this->configuration['review_count'] ) AND $this->configuration['review_count'] > 0 ) ? $this->configuration['review_count'] : 5 );
|
||||
$reviews = \IPS\calendar\Event\Review::getItemsWithPermission( $where, NULL, ( isset( $this->configuration['review_count'] ) AND $this->configuration['review_count'] > 0 ) ? $this->configuration['review_count'] : 5, 'read', \IPS\Content\Hideable::FILTER_PUBLIC_ONLY );
|
||||
|
||||
return $this->output( $reviews );
|
||||
}
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief todaysBirthdays Widget
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage calendar
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
@@ -70,6 +70,7 @@ class _todaysBirthdays extends \IPS\Widget
|
||||
|
||||
$date = \IPS\calendar\Date::getDate();
|
||||
$birthdays = $date->getBirthdays( TRUE );
|
||||
$totalCount = $date->getBirthdays( TRUE, TRUE );
|
||||
|
||||
if( !isset( $birthdays[ $date->mon . $date->mday ] ) )
|
||||
{
|
||||
@@ -82,6 +83,6 @@ class _todaysBirthdays extends \IPS\Widget
|
||||
return '';
|
||||
}
|
||||
|
||||
return $this->output( $birthdays[ $date->mon . $date->mday ] );
|
||||
return $this->output( $birthdays[ $date->mon . $date->mday ], isset( $totalCount[ $date->mon . $date->mday ] ) ? $totalCount[ $date->mon . $date->mday ] : 0, $date );
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
/**
|
||||
* @brief upcomingEvents Widget
|
||||
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
|
||||
* @copyright (c) 2001 - SVN_YYYY Invision Power Services, Inc.
|
||||
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
|
||||
* @license http://www.invisionpower.com/legal/standards/
|
||||
* @package IPS Social Suite
|
||||
* @subpackage calendar
|
||||
* @package IPS Community Suite
|
||||
* @subpackage Calendar
|
||||
* @since 18 Dec 2013
|
||||
* @version SVN_VERSION_NUMBER
|
||||
*/
|
||||
@@ -98,7 +98,7 @@ class _upcomingEvents extends \IPS\Widget\PermissionCache
|
||||
) ) );
|
||||
|
||||
$form->add( new \IPS\Helpers\Form\YesNo( 'auto_hide', isset( $this->configuration['auto_hide'] ) ? $this->configuration['auto_hide'] : FALSE, FALSE ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'days_ahead', isset( $this->configuration['days_ahead'] ) ? $this->configuration['days_ahead'] : NULL, TRUE, array( 'unlimited' => -1 ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'days_ahead', isset( $this->configuration['days_ahead'] ) ? $this->configuration['days_ahead'] : 7, TRUE, array( 'unlimited' => -1 ) ) );
|
||||
$form->add( new \IPS\Helpers\Form\Number( 'maximum_count', isset( $this->configuration['maximum_count'] ) ? $this->configuration['maximum_count'] : 5, TRUE, array( 'unlimited' => -1 ) ) );
|
||||
return $form;
|
||||
}
|
||||
@@ -131,7 +131,7 @@ class _upcomingEvents extends \IPS\Widget\PermissionCache
|
||||
return '';
|
||||
}
|
||||
|
||||
$_today = \IPS\calendar\Date::getDate();
|
||||
$_today = new \IPS\calendar\Date( "now", \IPS\Member::loggedIn()->timezone ? new \DateTimeZone( \IPS\Member::loggedIn()->timezone ) : NULL );
|
||||
|
||||
/* Do we have a days ahead cutoff? */
|
||||
$endDate = NULL;
|
||||
@@ -147,9 +147,23 @@ class _upcomingEvents extends \IPS\Widget\PermissionCache
|
||||
{
|
||||
$calendars = $this->configuration['widget_calendar'];
|
||||
}
|
||||
|
||||
$events = \IPS\calendar\Event::retrieveEvents( $_today, $endDate, $calendars, ( isset( $this->configuration['maximum_count'] ) AND $this->configuration['maximum_count'] > 0 ) ? $this->configuration['maximum_count'] : 5, FALSE );
|
||||
|
||||
/* How many are we displaying? */
|
||||
$count = 5;
|
||||
if( isset( $this->configuration['maximum_count'] ) )
|
||||
{
|
||||
if( $this->configuration['maximum_count'] > 0 )
|
||||
{
|
||||
$count = $this->configuration['maximum_count'];
|
||||
}
|
||||
else if ( $this->configuration['maximum_count'] == -1 )
|
||||
{
|
||||
$count = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
$events = \IPS\calendar\Event::retrieveEvents( $_today, $endDate, ( $calendars === NULL ? NULL : !is_array( $calendars ) ? array( $calendars ) : $calendars ), $count, FALSE );
|
||||
|
||||
/* Auto hiding? */
|
||||
if( !count($events) AND isset( $this->configuration['auto_hide'] ) AND $this->configuration['auto_hide'] )
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user