Skip to content

Commit

Permalink
feat(dashboard): added new FavouriteWidget to display favorite files …
Browse files Browse the repository at this point in the history
…in dashboard widget

* Added widget star icon
* run build/autoloaderchecker.sh
* removed unwanted IWidget and usersession
* renamed id
* renamed class to FavoriteWidget
* removed limit logic
* removed IAPIWidget
* ui fixes to remove rounded corners and make the ui/ux similar to recommendation widget.
* cs fix + composer fix no dev and review comments from Joas and Côme addressed
* added count and removed slice

Signed-off-by: yemkareems <[email protected]>
  • Loading branch information
yemkareems authored and susnux committed Jan 13, 2025
1 parent 42c021f commit 9745aaa
Show file tree
Hide file tree
Showing 7 changed files with 182 additions and 1 deletion.
2 changes: 1 addition & 1 deletion apps/dashboard/src/DashboardApp.vue
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
{{ t('dashboard', '"{title} icon"', { title: apiWidgets[panels[panelId].id].title }) }}
</span>
</div>
<div class="panel--content">
<div class="panel--content" :id="`panel-${panels[panelId].id}`">
<ApiDashboardWidget :widget="apiWidgets[panels[panelId].id]"
:data="apiWidgetItems[panels[panelId].id]"
:loading="loadingItems" />
Expand Down
1 change: 1 addition & 0 deletions apps/files/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
'OCA\\Files\\Controller\\TemplateController' => $baseDir . '/../lib/Controller/TemplateController.php',
'OCA\\Files\\Controller\\TransferOwnershipController' => $baseDir . '/../lib/Controller/TransferOwnershipController.php',
'OCA\\Files\\Controller\\ViewController' => $baseDir . '/../lib/Controller/ViewController.php',
'OCA\\Files\\Dashboard\\FavoriteWidget' => $baseDir . '/../lib/Dashboard/FavoriteWidget.php',
'OCA\\Files\\Db\\OpenLocalEditor' => $baseDir . '/../lib/Db/OpenLocalEditor.php',
'OCA\\Files\\Db\\OpenLocalEditorMapper' => $baseDir . '/../lib/Db/OpenLocalEditorMapper.php',
'OCA\\Files\\Db\\TransferOwnership' => $baseDir . '/../lib/Db/TransferOwnership.php',
Expand Down
1 change: 1 addition & 0 deletions apps/files/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ class ComposerStaticInitFiles
'OCA\\Files\\Controller\\TemplateController' => __DIR__ . '/..' . '/../lib/Controller/TemplateController.php',
'OCA\\Files\\Controller\\TransferOwnershipController' => __DIR__ . '/..' . '/../lib/Controller/TransferOwnershipController.php',
'OCA\\Files\\Controller\\ViewController' => __DIR__ . '/..' . '/../lib/Controller/ViewController.php',
'OCA\\Files\\Dashboard\\FavoriteWidget' => __DIR__ . '/..' . '/../lib/Dashboard/FavoriteWidget.php',
'OCA\\Files\\Db\\OpenLocalEditor' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditor.php',
'OCA\\Files\\Db\\OpenLocalEditorMapper' => __DIR__ . '/..' . '/../lib/Db/OpenLocalEditorMapper.php',
'OCA\\Files\\Db\\TransferOwnership' => __DIR__ . '/..' . '/../lib/Db/TransferOwnership.php',
Expand Down
38 changes: 38 additions & 0 deletions apps/files/css/style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#panel-files-favorites {
.avatardiv {
border-radius: var(--border-radius);
flex-shrink: 0;

& > img {
border-radius: var(--border-radius);
flex-shrink: 0;
margin-right: 9px;
}

background: none !important;
margin-left: 8px;
margin-right: 9px;
}
.item-list__entry {
padding-left: 0;
padding-right: 0;
}
.item__details {
white-space: nowrap;
margin-bottom: -8px;
display: inline-block;
max-width: 170px;
color: var(--color-main-text);
text-overflow: ellipsis;
overflow: hidden;
padding-left: 0;
border-radius: var(--border-radius);
}
h3 {
font-weight: 400;
}
}
1 change: 1 addition & 0 deletions apps/files/img/app-favorite.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions apps/files/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
use OCA\Files\Collaboration\Resources\Listener;
use OCA\Files\Collaboration\Resources\ResourceProvider;
use OCA\Files\Controller\ApiController;
use OCA\Files\Dashboard\FavoriteWidget;
use OCA\Files\DirectEditingCapabilities;
use OCA\Files\Event\LoadSearchPlugins;
use OCA\Files\Event\LoadSidebar;
Expand Down Expand Up @@ -123,6 +124,7 @@ public function register(IRegistrationContext $context): void {
$context->registerSearchProvider(FilesSearchProvider::class);

$context->registerNotifierService(Notifier::class);
$context->registerDashboardWidget(FavoriteWidget::class);
}

public function boot(IBootContext $context): void {
Expand Down
138 changes: 138 additions & 0 deletions apps/files/lib/Dashboard/FavoriteWidget.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OCA\Files\Dashboard;

use OCA\Files\AppInfo\Application;
use OCP\Dashboard\IAPIWidgetV2;
use OCP\Dashboard\IButtonWidget;
use OCP\Dashboard\IIconWidget;
use OCP\Dashboard\Model\WidgetButton;
use OCP\Dashboard\Model\WidgetItem;
use OCP\Dashboard\Model\WidgetItems;
use OCP\Files\IMimeTypeDetector;
use OCP\Files\IRootFolder;
use OCP\IL10N;
use OCP\IPreview;
use OCP\ITagManager;
use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Util;

class FavoriteWidget implements IIconWidget, IAPIWidgetV2, IButtonWidget {
public function __construct(
private readonly IL10N $l10n,
private readonly IURLGenerator $urlGenerator,
private readonly IMimeTypeDetector $mimeTypeDetector,
private readonly IUserManager $userManager,
private readonly ITagManager $tagManager,
private readonly IRootFolder $rootFolder,
private readonly IPreview $previewManager,
) {

}

public function getId(): string {
return Application::APP_ID . '-favorites';
}

public function getTitle(): string {
return $this->l10n->t('Favorite files');
}

public function getOrder(): int {
return 0;
}

public function getIconClass(): string {
return 'icon-star-dark';
}

public function getIconUrl(): string {
return $this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->imagePath('files', 'app-favorite.svg')
);
}

public function getUrl(): ?string {
return $this->urlGenerator->linkToRouteAbsolute('files.View.indexView', ['view' => 'favorites']);
}

public function load(): void {
Util::addStyle('files', 'style');
}

public function getItems(string $userId, int $limit = 7): array {
$user = $this->userManager->get($userId);

if (!$user) {
return [];
}
$tags = $this->tagManager->load('files', [], false, $userId);
$favorites = $tags->getFavorites();
if (empty($favorites)) {
return [];
}
$favoriteNodes = [];
$userFolder = $this->rootFolder->getUserFolder($userId);
$count = 0;
foreach ($favorites as $favorite) {
$node = $userFolder->getFirstNodeById($favorite);
if ($node) {
$url = $this->urlGenerator->linkToRouteAbsolute(
'files.view.showFile', ['fileid' => $node->getId()]
);
if ($this->previewManager->isAvailable($node)) {
$icon = $this->urlGenerator->linkToRouteAbsolute('core.Preview.getPreviewByFileId', [
'x' => 256,
'y' => 256,
'fileId' => $node->getId(),
'c' => $node->getEtag(),
]);
} else {
$icon = $this->urlGenerator->getAbsoluteURL(
$this->mimeTypeDetector->mimeTypeIcon($node->getMimetype())
);
}
if($count < $limit) {
$favoriteNodes[] = new WidgetItem(
$node->getName(),
'',
$url,
$icon,
(string)$node->getCreationTime()
);
$count++;
} else {
break;
}
}
}

return $favoriteNodes;
}

public function getItemsV2(string $userId, ?string $since = null, int $limit = 7): WidgetItems {
$items = $this->getItems($userId, $limit);
return new WidgetItems(
$items,
count($items) === 0 ? $this->l10n->t('No favorites') : '',
);
}

public function getWidgetButtons(string $userId): array {
return [
new WidgetButton(
WidgetButton::TYPE_MORE,
$this->urlGenerator->linkToRouteAbsolute('files.View.indexView', ['view' => 'favorites']),
$this->l10n->t('More favorites')
),
];
}
}

0 comments on commit 9745aaa

Please sign in to comment.