diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 7b813e0e03..15ac1de26c 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -12,6 +12,7 @@ use OCA\Files\Event\LoadSidebar; use OCA\Libresign\Activity\Listener as ActivityListener; use OCA\Libresign\Capabilities; +use OCA\Libresign\Dashboard\PendingSignaturesWidget; use OCA\Libresign\Events\SendSignNotificationEvent; use OCA\Libresign\Events\SignedEvent; use OCA\Libresign\Events\SignRequestCanceledEvent; @@ -89,5 +90,7 @@ public function register(IRegistrationContext $context): void { $context->registerEventListener(SignedEvent::class, TwofactorGatewayListener::class); $context->registerEventListener(UserDeletedEvent::class, UserDeletedListener::class); + + $context->registerDashboardWidget(PendingSignaturesWidget::class); } } diff --git a/lib/Dashboard/PendingSignaturesWidget.php b/lib/Dashboard/PendingSignaturesWidget.php new file mode 100644 index 0000000000..f288a867d0 --- /dev/null +++ b/lib/Dashboard/PendingSignaturesWidget.php @@ -0,0 +1,164 @@ +l10n->t('Pending signatures'); + } + + #[Override] + public function getOrder(): int { + return 10; + } + + #[Override] + public function getIconClass(): string { + return 'icon-libresign'; + } + + #[Override] + public function getIconUrl(): string { + return $this->urlGenerator->getAbsoluteURL( + $this->urlGenerator->imagePath(Application::APP_ID, 'app-dark.svg') + ); + } + + #[Override] + public function getUrl(): ?string { + return $this->urlGenerator->linkToRouteAbsolute('libresign.page.index'); + } + + #[Override] + public function load(): void { + // No special loading required + } + + #[Override] + public function isEnabled(): bool { + return $this->certificateEngineFactory->getEngine()->isSetupOk(); + } + + #[Override] + public function getItemsV2(string $userId, ?string $since = null, int $limit = 7): WidgetItems { + $user = $this->userSession->getUser(); + if (!$user) { + return new WidgetItems([], $this->l10n->t('User not found')); + } + + $result = $this->signRequestMapper->getFilesAssociatedFilesWithMe( + $user, + ['status' => [FileStatus::ABLE_TO_SIGN->value, FileStatus::PARTIAL_SIGNED->value]], + 1, + $limit, + ['sortBy' => 'created_at', 'sortDirection' => 'desc'] + ); + + $items = []; + + foreach ($result['data'] as $fileEntity) { + $signRequests = $this->signRequestMapper->getByFileId($fileEntity->getId()); + + foreach ($signRequests as $signRequest) { + if ($signRequest->getSigned()) { + continue; + } + + $item = new WidgetItem( + $fileEntity->getName(), + $this->getSubtitle($signRequest, $fileEntity), + $this->urlGenerator->linkToRouteAbsolute('libresign.page.signFPath', ['uuid' => $signRequest->getUuid(), 'path' => 'pdf']), + $this->urlGenerator->getAbsoluteURL( + $this->urlGenerator->imagePath('core', 'filetypes/application-pdf.svg') + ), + $this->getTimestamp($fileEntity) + ); + + $items[] = $item; + } + } + + return new WidgetItems( + $items, + empty($items) ? $this->l10n->t('No pending signatures') : '', + ); + } + + private function getSubtitle(SignRequest $signRequest, File $fileEntity): string { + $displayName = $signRequest->getDisplayName(); + $createdAt = $fileEntity->getCreatedAt(); + if ($createdAt instanceof \DateTime) { + $date = $createdAt->format('d/m/Y'); + // TRANSLATORS %s is the sender name, %s is the date + return $this->l10n->t('From: %s • Date: %s', [$displayName, $date]); + } + // TRANSLATORS %s is the sender name + return $this->l10n->t('From: %s', [$displayName]); + } + + private function getTimestamp(File $fileEntity): string { + $createdAt = $fileEntity->getCreatedAt(); + if ($createdAt instanceof \DateTime) { + return (string)$createdAt->getTimestamp(); + } + return ''; + } + + #[Override] + public function getItems(string $userId, ?string $since = null, int $limit = 7): array { + $widgetItems = $this->getItemsV2($userId, $since, $limit); + return array_values($widgetItems->getItems()); + } + + #[Override] + public function getWidgetButtons(string $userId): array { + return [ + new WidgetButton( + WidgetButton::TYPE_MORE, + $this->urlGenerator->linkToRouteAbsolute('libresign.page.index'), + $this->l10n->t('View all documents') + ), + ]; + } +}