mirror of
https://github.com/nextcloud/server.git
synced 2026-04-15 22:11:17 -04:00
Show local time in avatar menu
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
ce50acd9b2
commit
8eca26012f
5 changed files with 254 additions and 0 deletions
|
|
@ -873,6 +873,7 @@ return array(
|
|||
'OC\\Contacts\\ContactsMenu\\Entry' => $baseDir . '/lib/private/Contacts/ContactsMenu/Entry.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Manager' => $baseDir . '/lib/private/Contacts/ContactsMenu/Manager.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => $baseDir . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
|
||||
'OC\\Core\\Application' => $baseDir . '/core/Application.php',
|
||||
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => $baseDir . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
|
||||
|
|
|
|||
|
|
@ -906,6 +906,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
|
|||
'OC\\Contacts\\ContactsMenu\\Entry' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Entry.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Manager' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Manager.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Providers\\EMailProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/EMailProvider.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Providers\\LocalTimeProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/LocalTimeProvider.php',
|
||||
'OC\\Contacts\\ContactsMenu\\Providers\\ProfileProvider' => __DIR__ . '/../../..' . '/lib/private/Contacts/ContactsMenu/Providers/ProfileProvider.php',
|
||||
'OC\\Core\\Application' => __DIR__ . '/../../..' . '/core/Application.php',
|
||||
'OC\\Core\\BackgroundJobs\\BackgroundCleanupUpdaterBackupsJob' => __DIR__ . '/../../..' . '/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php',
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ namespace OC\Contacts\ContactsMenu;
|
|||
use Exception;
|
||||
use OC\App\AppManager;
|
||||
use OC\Contacts\ContactsMenu\Providers\EMailProvider;
|
||||
use OC\Contacts\ContactsMenu\Providers\LocalTimeProvider;
|
||||
use OC\Contacts\ContactsMenu\Providers\ProfileProvider;
|
||||
use OCP\AppFramework\QueryException;
|
||||
use OCP\Contacts\ContactsMenu\IProvider;
|
||||
|
|
@ -83,6 +84,7 @@ class ActionProviderStore {
|
|||
private function getServerProviderClasses(): array {
|
||||
return [
|
||||
ProfileProvider::class,
|
||||
LocalTimeProvider::class,
|
||||
EMailProvider::class,
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,87 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2023, Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\Contacts\ContactsMenu\Providers;
|
||||
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\Contacts\ContactsMenu\IActionFactory;
|
||||
use OCP\Contacts\ContactsMenu\IEntry;
|
||||
use OCP\Contacts\ContactsMenu\IProvider;
|
||||
use OCP\IConfig;
|
||||
use OCP\IDateTimeFormatter;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\IUserManager;
|
||||
use OCP\L10N\IFactory as IL10NFactory;
|
||||
|
||||
class LocalTimeProvider implements IProvider {
|
||||
private IActionFactory $actionFactory;
|
||||
private IL10NFactory $l10nFactory;
|
||||
private IURLGenerator $urlGenerator;
|
||||
private IUserManager $userManager;
|
||||
private ITimeFactory $timeFactory;
|
||||
private IDateTimeFormatter $dateTimeFormatter;
|
||||
private IConfig $config;
|
||||
|
||||
public function __construct(
|
||||
IActionFactory $actionFactory,
|
||||
IL10NFactory $l10nFactory,
|
||||
IURLGenerator $urlGenerator,
|
||||
IUserManager $userManager,
|
||||
ITimeFactory $timeFactory,
|
||||
IDateTimeFormatter $dateTimeFormatter,
|
||||
IConfig $config
|
||||
) {
|
||||
$this->actionFactory = $actionFactory;
|
||||
$this->l10nFactory = $l10nFactory;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
$this->userManager = $userManager;
|
||||
$this->timeFactory = $timeFactory;
|
||||
$this->dateTimeFormatter = $dateTimeFormatter;
|
||||
$this->config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param IEntry $entry
|
||||
*/
|
||||
public function process(IEntry $entry) {
|
||||
$targetUserId = $entry->getProperty('UID');
|
||||
$targetUser = $this->userManager->get($targetUserId);
|
||||
if (!empty($targetUser)) {
|
||||
$timezone = $this->config->getUserValue($targetUser->getUID(), 'core', 'timezone') ?: date_default_timezone_get();
|
||||
$dateTimeZone = new \DateTimeZone($timezone);
|
||||
$localTime = $this->dateTimeFormatter->formatTime($this->timeFactory->getDateTime(), 'short', $dateTimeZone);
|
||||
|
||||
$iconUrl = $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('core', 'actions/recent.svg'));
|
||||
$l = $this->l10nFactory->get('lib');
|
||||
$profileActionText = $l->t('Local time: %s', [$localTime]);
|
||||
|
||||
$action = $this->actionFactory->newLinkAction($iconUrl, $profileActionText, '#', 'timezone');
|
||||
// Order after the profile page
|
||||
$action->setPriority(19);
|
||||
$entry->addAction($action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,163 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2023, Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @author Joas Schilling <coding@schilljs.com>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace lib\Contacts\ContactsMenu\Providers;
|
||||
|
||||
use OC\Contacts\ContactsMenu\Providers\LocalTimeProvider;
|
||||
use OCP\AppFramework\Utility\ITimeFactory;
|
||||
use OCP\Contacts\ContactsMenu\IActionFactory;
|
||||
use OCP\Contacts\ContactsMenu\IEntry;
|
||||
use OCP\Contacts\ContactsMenu\ILinkAction;
|
||||
use OCP\IConfig;
|
||||
use OCP\IDateTimeFormatter;
|
||||
use OCP\IL10N;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\L10N\IFactory as IL10NFactory;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
use Test\TestCase;
|
||||
|
||||
class LocalTimeProviderTest extends TestCase {
|
||||
|
||||
/** @var IActionFactory|MockObject */
|
||||
private $actionFactory;
|
||||
/** @var IL10N|MockObject */
|
||||
private $l;
|
||||
/** @var IURLGenerator|MockObject */
|
||||
private $urlGenerator;
|
||||
/** @var IUserManager|MockObject */
|
||||
private $userManager;
|
||||
/** @var ITimeFactory|MockObject */
|
||||
private $timeFactory;
|
||||
/** @var IDateTimeFormatter|MockObject */
|
||||
private $dateTimeFormatter;
|
||||
/** @var IConfig|MockObject */
|
||||
private $config;
|
||||
|
||||
private LocalTimeProvider $provider;
|
||||
|
||||
protected function setUp(): void {
|
||||
parent::setUp();
|
||||
|
||||
$this->actionFactory = $this->createMock(IActionFactory::class);
|
||||
$this->l10nFactory = $this->createMock(IL10NFactory::class);
|
||||
$this->l = $this->createMock(IL10N::class);
|
||||
$this->l->expects($this->any())
|
||||
->method('t')
|
||||
->will($this->returnCallback(function ($text, $parameters = []) {
|
||||
return vsprintf($text, $parameters);
|
||||
}));
|
||||
$this->urlGenerator = $this->createMock(IURLGenerator::class);
|
||||
$this->userManager = $this->createMock(IUserManager::class);
|
||||
$this->timeFactory = $this->createMock(ITimeFactory::class);
|
||||
$this->dateTimeFormatter = $this->createMock(IDateTimeFormatter::class);
|
||||
$this->config = $this->createMock(IConfig::class);
|
||||
|
||||
$this->provider = new LocalTimeProvider(
|
||||
$this->actionFactory,
|
||||
$this->l10nFactory,
|
||||
$this->urlGenerator,
|
||||
$this->userManager,
|
||||
$this->timeFactory,
|
||||
$this->dateTimeFormatter,
|
||||
$this->config
|
||||
);
|
||||
}
|
||||
|
||||
public function testProcess(): void {
|
||||
$entry = $this->createMock(IEntry::class);
|
||||
$entry->expects($this->once())
|
||||
->method('getProperty')
|
||||
->with('UID')
|
||||
->willReturn('user1');
|
||||
|
||||
$user = $this->createMock(IUser::class);
|
||||
$user->method('getUID')
|
||||
->willReturn('user1');
|
||||
$this->userManager->expects($this->once())
|
||||
->method('get')
|
||||
->with('user1')
|
||||
->willReturn($user);
|
||||
|
||||
$this->l10nFactory->method('get')
|
||||
->with('lib')
|
||||
->willReturn($this->l);
|
||||
|
||||
$this->config->method('getUserValue')
|
||||
->with('user1', 'core', 'timezone')
|
||||
->willReturn('America/Los_Angeles');
|
||||
|
||||
$now = new \DateTime('2023-01-04 10:24:43');
|
||||
$this->timeFactory->method('getDateTime')
|
||||
->willReturn($now);
|
||||
|
||||
$now = new \DateTime('2023-01-04 10:24:43');
|
||||
$this->dateTimeFormatter->method('formatTime')
|
||||
->with($now, 'short', $this->anything())
|
||||
->willReturn('01:24');
|
||||
|
||||
$this->urlGenerator->method('imagePath')
|
||||
->willReturn('actions/recent.svg');
|
||||
$this->urlGenerator->method('getAbsoluteURL')
|
||||
->with('actions/recent.svg')
|
||||
->willReturn('https://localhost/actions/recent.svg');
|
||||
|
||||
$action = $this->createMock(ILinkAction::class);
|
||||
$this->actionFactory->expects($this->once())
|
||||
->method('newLinkAction')
|
||||
->with(
|
||||
'https://localhost/actions/recent.svg',
|
||||
'Local time: 01:24',
|
||||
'#',
|
||||
'timezone'
|
||||
)
|
||||
->willReturn($action);
|
||||
|
||||
$entry->expects($this->once())
|
||||
->method('addAction')
|
||||
->with($action);
|
||||
|
||||
$this->provider->process($entry);
|
||||
}
|
||||
|
||||
public function testProcessNoUser(): void {
|
||||
$entry = $this->createMock(IEntry::class);
|
||||
$entry->expects($this->once())
|
||||
->method('getProperty')
|
||||
->with('UID')
|
||||
->willReturn('user1');
|
||||
|
||||
$user = $this->createMock(IUser::class);
|
||||
$user->method('getUID')
|
||||
->willReturn(null);
|
||||
|
||||
$entry->expects($this->never())
|
||||
->method('addAction');
|
||||
|
||||
$this->provider->process($entry);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in a new issue