Skip to content

Commit

Permalink
Merge pull request #5417 from nextcloud/perf/dashboard/item-api-v2
Browse files Browse the repository at this point in the history
perf(dashboard): implement widget item api v2
  • Loading branch information
st3iny authored Sep 5, 2023
2 parents d0d9a30 + a00f344 commit 4b2ca7f
Show file tree
Hide file tree
Showing 6 changed files with 107 additions and 10 deletions.
10 changes: 9 additions & 1 deletion lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* Calendar App
*
* @author Georg Ehrke
* @author Richard Steinmetz <[email protected]>
* @copyright 2019 Georg Ehrke <[email protected]>
*
* This library is free software; you can redistribute it and/or
Expand All @@ -24,6 +25,7 @@
namespace OCA\Calendar\AppInfo;

use OCA\Calendar\Dashboard\CalendarWidget;
use OCA\Calendar\Dashboard\CalendarWidgetV2;
use OCA\Calendar\Events\BeforeAppointmentBookedEvent;
use OCA\Calendar\Listener\AppointmentBookedListener;
use OCA\Calendar\Listener\UserDeletedListener;
Expand All @@ -33,6 +35,7 @@
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\Dashboard\IAPIWidgetV2;
use OCP\User\Events\UserDeletedEvent;
use function method_exists;

Expand All @@ -51,7 +54,12 @@ public function __construct(array $params = []) {
* @inheritDoc
*/
public function register(IRegistrationContext $context): void {
$context->registerDashboardWidget(CalendarWidget::class);
// TODO: drop conditional code when the app is 27.1+
if (interface_exists(IAPIWidgetV2::class)) {
$context->registerDashboardWidget(CalendarWidgetV2::class);
} else {
$context->registerDashboardWidget(CalendarWidget::class);
}

// TODO: drop conditional code when the app is 23+
if (method_exists($context, 'registerProfileLinkAction')) {
Expand Down
3 changes: 3 additions & 0 deletions lib/Controller/ViewController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* Calendar App
*
* @author Georg Ehrke
* @author Richard Steinmetz <[email protected]>
* @copyright 2019 Georg Ehrke <[email protected]>
* @copyright Copyright (c) 2022 Informatyka Boguslawski sp. z o.o. sp.k., http://www.ib.pl/
*
Expand Down Expand Up @@ -201,6 +202,8 @@ public function getCalendarDotSvg(string $color = "#0082c9"): FileDisplayRespons
}
$file = $folder->newFile($color . '.svg', $svg);
$response = new FileDisplayResponse($file);
// Some browsers won't render SVGs without content types (for security reasons)
$response->addHeader('Content-Type', 'image/svg+xml');
$response->cacheFor(24 * 3600); // 1 day
return $response;
}
Expand Down
15 changes: 8 additions & 7 deletions lib/Dashboard/CalendarWidget.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* @copyright Copyright (c) 2020 Julius Härtl <[email protected]>
*
* @author Julius Härtl <[email protected]>
* @author Richard Steinmetz <[email protected]>
*
* @license GNU AGPL version 3 or any later version
*
Expand Down Expand Up @@ -46,13 +47,13 @@
use OCP\Util;

class CalendarWidget implements IAPIWidget, IButtonWidget, IIconWidget, IOptionWidget {
private IL10N $l10n;
private IInitialState $initialStateService;
private JSDataService $dataService;
private IDateTimeFormatter $dateTimeFormatter;
private IURLGenerator $urlGenerator;
private IManager $calendarManager;
private ITimeFactory $timeFactory;
protected IL10N $l10n;
protected IInitialState $initialStateService;
protected JSDataService $dataService;
protected IDateTimeFormatter $dateTimeFormatter;
protected IURLGenerator $urlGenerator;
protected IManager $calendarManager;
protected ITimeFactory $timeFactory;

/**
* CalendarWidget constructor.
Expand Down
73 changes: 73 additions & 0 deletions lib/Dashboard/CalendarWidgetV2.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
<?php

declare(strict_types=1);

/**
* @copyright Copyright (c) 2023 Richard Steinmetz <[email protected]>
*
* @author Richard Steinmetz <[email protected]>
*
* @license AGPL-3.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/

namespace OCA\Calendar\Dashboard;

use OCP\Dashboard\IAPIWidgetV2;
use OCP\Dashboard\Model\WidgetItems;

/**
* Requires Nextcloud >= 27.1.0
*/
class CalendarWidgetV2 extends CalendarWidget implements IAPIWidgetV2 {

/**
* @inheritDoc
*/
public function getItemsV2(string $userId, ?string $since = null, int $limit = 7): WidgetItems {
$widgetItems = $this->getItems($userId, $since, $limit);

$halfEmptyContentMessage = '';
if (!empty($widgetItems)) {
$startOfTomorrow = $this->timeFactory->getDateTime('tomorrow')->getTimestamp();
foreach ($widgetItems as $item) {
if ((int)$item->getSinceId() >= $startOfTomorrow) {
$halfEmptyContentMessage = $this->l10n->t('No more events today');
}
}
}

return new WidgetItems(
$widgetItems,
empty($widgetItems) ? $this->l10n->t('No upcoming events') : '',
$halfEmptyContentMessage,
);
}

/**
* @inheritDoc
*/
public function load(): void {
// No assets need to be loaded anymore as the widget is rendered from the API
}

/**
* @inheritDoc
*/
public function getIconClass(): string {
return 'icon-calendar-dark';
}
}
1 change: 0 additions & 1 deletion psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
xmlns="https://getpsalm.org/schema/config"
xsi:schemaLocation="https://getpsalm.org/schema/config"
errorBaseline="tests/psalm-baseline.xml"
findUnusedBaselineEntry="true"
findUnusedCode="false"
>
<projectFiles>
Expand Down
15 changes: 14 additions & 1 deletion tests/psalm-baseline.xml
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<files psalm-version="5.13.1@086b94371304750d1c673315321a55d15fc59015">
<files psalm-version="5.15.0@5c774aca4746caf3d239d9c8cadb9f882ca29352">
<file src="lib/AppInfo/Application.php">
<MissingDependency>
<code>CalendarWidgetV2</code>
</MissingDependency>
<UndefinedClass>
<code>IAPIWidgetV2</code>
</UndefinedClass>
</file>
<file src="lib/Controller/AppointmentConfigController.php">
<RedundantCondition>
<code>$expectedDayKeys !== $actualDayKeys</code>
<code><![CDATA[$slotKeys !== ['end', 'start']]]></code>
</RedundantCondition>
</file>
<file src="lib/Dashboard/CalendarWidgetV2.php">
<UndefinedClass>
<code>IAPIWidgetV2</code>
</UndefinedClass>
</file>
<file src="lib/Listener/AppointmentBookedListener.php">
<MissingTemplateParam>
<code>IEventListener</code>
Expand Down

0 comments on commit 4b2ca7f

Please sign in to comment.