Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
be430e4
Refactored Activity Handling
luke- Jan 29, 2026
c87ddf6
Autocommit PHP CS Fixer
actions-user Jan 29, 2026
99682d5
Merge pull request #671 from humhub/php-fixer/2026-01-29-094222
luke- Jan 29, 2026
357e03f
Activity Wording improvements
luke- Feb 1, 2026
f9c1a21
Remove deprecations
yurabakhtin Feb 20, 2026
aeb2ce2
Fix branch for REST module testing
yurabakhtin Feb 20, 2026
8d79b1d
Merge pull request #673 from humhub/enh/1042-remove-deprecations
luke- Feb 23, 2026
dd6f04d
Cleaning up REST error handling module as it is handled by core
yurabakhtin May 25, 2026
8b18f9f
Enh: Updated Translations (translate.humhub.org)
May 30, 2026
aea75cd
Merge branch 'master' into develop
luke- May 30, 2026
5572691
Enh: Updated Translations (translate.humhub.org)
May 30, 2026
8716fa4
Merge branch 'develop' of github.com:humhub/calendar into develop
May 30, 2026
22d0df3
Merge branch 'master' into develop
luke- Jun 3, 2026
bd679bf
Merge branch 'master' into develop
luke- Jun 5, 2026
7db2ebb
Release 1.9.0
luke- Jun 5, 2026
93df169
Enh: Updated Translations (translate.humhub.org)
Jun 15, 2026
79fb1a3
Merge remote-tracking branch 'origin/master' into develop
luke- Jun 16, 2026
c0d3fea
Add aria-label attribute for icon-only buttons
yurabakhtin Jun 25, 2026
2c2db01
Merge pull request #702 from humhub/fix/1239-icon-only-aria-label
luke- Jun 25, 2026
5f687d2
Enh: Updated Translations (translate.humhub.org)
Jun 26, 2026
7e299cf
Enh: Updated Translations (translate.humhub.org)
Jun 27, 2026
6b3eb31
Merge branch 'master' into develop
luke- Jul 8, 2026
897a406
Release 1.9.1
luke- Jul 8, 2026
05ce063
Enh: Updated Translations (translate.humhub.org)
Jul 9, 2026
3ff14c0
Enh: Updated Translations (translate.humhub.org)
Jul 10, 2026
7e250ba
Exempt CalDAV from the core user gates by disabling the session
luke- Jul 14, 2026
f557cbd
Merge pull request #706 from humhub/enh/caldav-gate-exempt
luke- Jul 14, 2026
27649d3
Enh: Updated Translations (translate.humhub.org)
Jul 16, 2026
9971ffc
Merge branch 'master' into develop
luke- Jul 16, 2026
d032197
Release 1.9.2
luke- Jul 16, 2026
2e4e1b6
Merge branch 'master' into develop
luke- Jul 21, 2026
47b58ce
Enh: Updated Translations (translate.humhub.org)
Jul 22, 2026
a4c1f56
Merge branch 'develop' of github.com:humhub/calendar into develop
Jul 22, 2026
18089df
Enh: Updated Translations (translate.humhub.org)
Jul 22, 2026
6fe8744
Enh: Updated Translations (translate.humhub.org)
Jul 23, 2026
813c096
Enh: Updated Translations (translate.humhub.org)
Jul 28, 2026
39224a4
Fix event type linking
yurabakhtin Jul 29, 2026
ca906f5
Update CHANGELOG.md
yurabakhtin Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/codeception-min-version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ jobs:
with:
module-id: calendar
use-rest-module: true
rest-module-branch: develop
99 changes: 58 additions & 41 deletions Events.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
namespace humhub\modules\calendar;

use DateTime;
use humhub\helpers\ControllerHelper;
use humhub\modules\calendar\extensions\custom_pages\elements\CalendarEntryElement;
use humhub\modules\calendar\extensions\custom_pages\elements\CalendarEventsElement;
use humhub\modules\calendar\helpers\dav\SyncService;
use humhub\modules\calendar\helpers\RecurrenceHelper;
use humhub\modules\calendar\models\CalendarEntry;
use humhub\modules\calendar\models\CalendarEntryParticipant;
use humhub\modules\calendar\models\ExportSettings;
use humhub\modules\calendar\models\MenuSettings;
use humhub\modules\content\events\ContentEvent;
use humhub\modules\space\models\Space;
use humhub\modules\user\models\User;
use humhub\modules\content\widgets\WallEntryLinks;
use humhub\modules\dashboard\widgets\Sidebar as DashboardSidebar;
use humhub\modules\space\widgets\Menu;
use humhub\modules\space\widgets\Sidebar as SpaceSidebar;
use humhub\modules\ui\menu\MenuLink;
use humhub\modules\calendar\interfaces\event\EditableEventIF;
use humhub\modules\calendar\interfaces\event\CalendarItemTypesEvent;
use humhub\modules\calendar\interfaces\recurrence\RecurrentEventIF;
Expand All @@ -32,11 +35,13 @@
use humhub\modules\calendar\widgets\UpcomingEvents;
use humhub\modules\content\models\Content;
use humhub\modules\calendar\helpers\Url;
use humhub\modules\user\widgets\ProfileMenu;
use humhub\modules\user\widgets\ProfileSidebar;
use humhub\widgets\TopMenu;
use Yii;
use yii\db\StaleObjectException;
use yii\helpers\Console;
use yii\web\Application;
use humhub\components\ModuleEvent;

/**
* Description of CalendarEvents
Expand Down Expand Up @@ -107,15 +112,15 @@ public static function onTopMenuInit($event)
try {
if (SnippetModuleSettings::instance()->showGlobalCalendarItems()
&& MenuSettings::instance()->show) {
$event->sender->addItem([
/* @var TopMenu $menu */
$menu = $event->sender;
$menu->addEntry(new MenuLink([
'label' => Yii::t('CalendarModule.base', 'Calendar'),
'url' => Url::toGlobalCalendar(),
'icon' => '<i class="fa fa-calendar"></i>',
'isActive' => (Yii::$app->controller->module
&& Yii::$app->controller->module->id == 'calendar'
&& Yii::$app->controller->id == 'global'),
'icon' => 'calendar',
'isActive' => ControllerHelper::isActivePath('calendar', 'global'),
'sortOrder' => MenuSettings::instance()->sortOrder,
]);
]));
}
} catch (\Throwable $e) {
Yii::error($e);
Expand All @@ -125,17 +130,15 @@ public static function onTopMenuInit($event)
public static function onSpaceMenuInit($event)
{
try {
/* @var Space $space */
$space = $event->sender->space;
if ($space->moduleManager->isEnabled('calendar')) {
$event->sender->addItem([
/* @var Menu $menu */
$menu = $event->sender;
if ($menu->space->moduleManager->isEnabled('calendar')) {
$menu->addEntry(new MenuLink([
'label' => Yii::t('CalendarModule.base', 'Calendar'),
'group' => 'modules',
'url' => Url::toCalendar($space),
'icon' => '<i class="fa fa-calendar"></i>',
'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'calendar'),

]);
'url' => Url::toCalendar($menu->space),
'icon' => 'calendar',
'isActive' => ControllerHelper::isActivePath('calendar'),
]));
}
} catch (\Throwable $e) {
Yii::error($e);
Expand All @@ -145,15 +148,15 @@ public static function onSpaceMenuInit($event)
public static function onProfileMenuInit($event)
{
try {
/* @var User $user */
$user = $event->sender->user;
if ($user->moduleManager->isEnabled('calendar')) {
$event->sender->addItem([
/* @var ProfileMenu $menu */
$menu = $event->sender;
if ($menu->user->moduleManager->isEnabled('calendar')) {
$menu->addEntry(new MenuLink([
'label' => Yii::t('CalendarModule.base', 'Calendar'),
'url' => Url::toCalendar($user),
'icon' => '<i class="fa fa-calendar"></i>',
'isActive' => (Yii::$app->controller->module && Yii::$app->controller->module->id == 'calendar'),
]);
'url' => Url::toCalendar($menu->user),
'icon' => 'calendar',
'isActive' => ControllerHelper::isActivePath('calendar'),
]));
}
} catch (\Throwable $e) {
Yii::error($e);
Expand All @@ -163,14 +166,17 @@ public static function onProfileMenuInit($event)
public static function onSpaceSidebarInit($event)
{
try {
/* @var Space $space */
$space = $event->sender->space;
/* @var SpaceSidebar $sidebar */
$sidebar = $event->sender;
$settings = SnippetModuleSettings::instantiate();

if ($space->moduleManager->isEnabled('calendar')) {
if ($settings->showUpcomingEventsSnippet()) {
$event->sender->addWidget(UpcomingEvents::class, ['contentContainer' => $space], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
}
if ($sidebar->space->moduleManager->isEnabled('calendar')
&& $settings->showUpcomingEventsSnippet()) {
$sidebar->addWidget(
UpcomingEvents::class,
['contentContainer' => $sidebar->space],
['sortOrder' => $settings->upcomingEventsSnippetSortOrder],
);
}
} catch (\Throwable $e) {
Yii::error($e);
Expand All @@ -180,10 +186,12 @@ public static function onSpaceSidebarInit($event)
public static function onDashboardSidebarInit($event)
{
try {
/* @var DashboardSidebar $sidebar */
$sidebar = $event->sender;
$settings = SnippetModuleSettings::instantiate();

if ($settings->showUpcomingEventsSnippet()) {
$event->sender->addWidget(UpcomingEvents::class, [], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
$sidebar->addWidget(UpcomingEvents::class, [], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
}
} catch (\Throwable $e) {
Yii::error($e);
Expand All @@ -197,12 +205,18 @@ public static function onProfileSidebarInit($event)
return;
}

$user = $event->sender->user;
if ($user != null) {
/* @var ProfileSidebar $sidebar */
$sidebar = $event->sender;

if ($sidebar->user != null) {
$settings = SnippetModuleSettings::instantiate();

if ($settings->showUpcomingEventsSnippet()) {
$event->sender->addWidget(UpcomingEvents::class, ['contentContainer' => $user], ['sortOrder' => $settings->upcomingEventsSnippetSortOrder]);
$sidebar->addWidget(
UpcomingEvents::class,
['contentContainer' => $sidebar->user],
['sortOrder' => $settings->upcomingEventsSnippetSortOrder],
);
}
}
} catch (\Throwable $e) {
Expand All @@ -213,14 +227,17 @@ public static function onProfileSidebarInit($event)
public static function onWallEntryLinks($event)
{
try {
$eventModel = static::getCalendarEvent($event->sender->object);
/* @var WallEntryLinks $links */
$links = $event->sender;

$eventModel = static::getCalendarEvent($links->object);

if (!$eventModel) {
return;
}

if ($eventModel instanceof ContentActiveRecord && $eventModel instanceof CalendarEventIF) {
$event->sender->addWidget(DownloadIcsLink::class, ['calendarEntry' => $eventModel]);
$links->addWidget(DownloadIcsLink::class, ['calendarEntry' => $eventModel]);
}

/* @var $eventModel CalendarEventIF */
Expand All @@ -229,7 +246,7 @@ public static function onWallEntryLinks($event)
}

if ($eventModel instanceof CalendarEventReminderIF && !RecurrenceHelper::isRecurrentRoot($eventModel)) {
$event->sender->addWidget(ReminderLink::class, ['entry' => $eventModel]);
$links->addWidget(ReminderLink::class, ['entry' => $eventModel]);
}
} catch (\Throwable $e) {
Yii::error($e);
Expand Down
14 changes: 0 additions & 14 deletions Module.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace humhub\modules\calendar;

use humhub\components\console\Application as ConsoleApplication;
use humhub\modules\calendar\models\CalendarEntryType;
use Yii;
use humhub\modules\calendar\helpers\Url;
Expand Down Expand Up @@ -47,19 +46,6 @@ class Module extends ContentContainerModule
*/
public $icsOrganizer = false;

/**
* @inheritdoc
*/
public function init()
{
parent::init();

if (Yii::$app instanceof ConsoleApplication) {
// Prevents the Yii HelpCommand from crawling all web controllers and possibly throwing errors at REST endpoints if the REST module is not available.
$this->controllerNamespace = 'calendar/commands';
}
}

/**
* @return bool
*/
Expand Down
38 changes: 17 additions & 21 deletions activities/ResponseAttend.php
Original file line number Diff line number Diff line change
@@ -1,40 +1,36 @@
<?php

/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2015 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/

namespace humhub\modules\calendar\activities;

use humhub\modules\activity\components\BaseActivity;
use humhub\modules\activity\components\BaseContentActivity;
use humhub\modules\activity\interfaces\ConfigurableActivityInterface;
use humhub\modules\calendar\models\CalendarDateFormatter;
use humhub\modules\calendar\models\CalendarEntry;
use Yii;

/**
* ResponseAttend Activity
*
* @author luke
* @extends BaseContentActivity<CalendarEntry>
*/
class ResponseAttend extends BaseActivity implements ConfigurableActivityInterface
class ResponseAttend extends BaseContentActivity implements ConfigurableActivityInterface
{
public $viewName = 'response_attend';
public $moduleId = 'calendar';
protected string $contentActiveRecordClass = CalendarEntry::class;

/**
* @inheritdoc
*/
public function getTitle()
public static function getTitle(): string
{
return Yii::t('CalendarModule.notification', 'Calendar: attend');
}

/**
* @inheritdoc
*/
public function getDescription()
public static function getDescription(): string
{
return Yii::t('CalendarModule.notification', 'Whenever someone participates in an event.');
}

protected function getMessage(array $params): string
{
$params['dateTime']
= (new CalendarDateFormatter(['calendarItem' => $this->contentActiveRecord]))
->getFormattedTime('short');

return Yii::t('CalendarModule.views', '{displayName} is attending Event "{contentTitle}" on {dateTime}.', $params);
}
}
38 changes: 17 additions & 21 deletions activities/ResponseDeclined.php
Original file line number Diff line number Diff line change
@@ -1,40 +1,36 @@
<?php

/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2015 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*/

namespace humhub\modules\calendar\activities;

use humhub\modules\activity\components\BaseActivity;
use humhub\modules\activity\components\BaseContentActivity;
use humhub\modules\activity\interfaces\ConfigurableActivityInterface;
use humhub\modules\calendar\models\CalendarDateFormatter;
use humhub\modules\calendar\models\CalendarEntry;
use Yii;

/**
* ResponseDeclined Activity
*
* @author luke
* @extends BaseContentActivity<CalendarEntry>
*/
class ResponseDeclined extends BaseActivity implements ConfigurableActivityInterface
class ResponseDeclined extends BaseContentActivity implements ConfigurableActivityInterface
{
public $viewName = 'response_declined';
public $moduleId = 'calendar';
protected string $contentActiveRecordClass = CalendarEntry::class;

/**
* @inheritdoc
*/
public function getTitle()
public static function getTitle(): string
{
return Yii::t('CalendarModule.notification', 'Calendar: decline');
}

/**
* @inheritdoc
*/
public function getDescription()
public static function getDescription(): string
{
return Yii::t('CalendarModule.notification', 'Whenever someone declines to participate in an event.');
}

protected function getMessage(array $params): string
{
$params['dateTime'] = (new CalendarDateFormatter(
['calendarItem' => $this->contentActiveRecord],
))->getFormattedTime('short');

return Yii::t('CalendarModule.views', '{displayName} is attending Event "{contentTitle}" on {dateTime}.', $params);
}
}
Loading
Loading