diff options
Diffstat (limited to 'lib/public/AppFramework/Http/Template')
5 files changed, 402 insertions, 0 deletions
diff --git a/lib/public/AppFramework/Http/Template/ExternalShareMenuAction.php b/lib/public/AppFramework/Http/Template/ExternalShareMenuAction.php new file mode 100644 index 00000000000..281bb559a10 --- /dev/null +++ b/lib/public/AppFramework/Http/Template/ExternalShareMenuAction.php @@ -0,0 +1,29 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCP\AppFramework\Http\Template; + +/** + * Class LinkMenuAction + * + * @since 14.0.0 + */ +class ExternalShareMenuAction extends SimpleMenuAction { + + /** + * ExternalShareMenuAction constructor. + * + * @param string $label Translated label + * @param string $icon Icon CSS class + * @param string $owner Owner user ID (unused) + * @param string $displayname Display name of the owner (unused) + * @param string $shareName Name of the share (unused) + * @since 14.0.0 + */ + public function __construct(string $label, string $icon, string $owner, string $displayname, string $shareName) { + parent::__construct('save', $label, $icon); + } +} diff --git a/lib/public/AppFramework/Http/Template/IMenuAction.php b/lib/public/AppFramework/Http/Template/IMenuAction.php new file mode 100644 index 00000000000..124e95fe019 --- /dev/null +++ b/lib/public/AppFramework/Http/Template/IMenuAction.php @@ -0,0 +1,51 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCP\AppFramework\Http\Template; + +/** + * Interface IMenuAction + * + * @since 14.0 + */ +interface IMenuAction { + /** + * @since 14.0.0 + * @return string + */ + public function getId(): string; + + /** + * The translated label of the menu item. + * + * @since 14.0.0 + * @return string + */ + public function getLabel(): string; + + /** + * The link this menu item points to. + * + * @since 14.0.0 + * @return string + */ + public function getLink(): string; + + /** + * @since 14.0.0 + * @return int + */ + public function getPriority(): int; + + /** + * Custom render function. + * The returned HTML will be wrapped within a listitem element (`<li>...</li>`). + * + * @since 14.0.0 + * @return string + */ + public function render(): string; +} diff --git a/lib/public/AppFramework/Http/Template/LinkMenuAction.php b/lib/public/AppFramework/Http/Template/LinkMenuAction.php new file mode 100644 index 00000000000..391802a1dce --- /dev/null +++ b/lib/public/AppFramework/Http/Template/LinkMenuAction.php @@ -0,0 +1,26 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCP\AppFramework\Http\Template; + +/** + * Class LinkMenuAction + * + * @since 14.0.0 + */ +class LinkMenuAction extends SimpleMenuAction { + /** + * LinkMenuAction constructor. + * + * @param string $label + * @param string $icon + * @param string $link + * @since 14.0.0 + */ + public function __construct(string $label, string $icon, string $link) { + parent::__construct('directLink', $label, $icon, $link); + } +} diff --git a/lib/public/AppFramework/Http/Template/PublicTemplateResponse.php b/lib/public/AppFramework/Http/Template/PublicTemplateResponse.php new file mode 100644 index 00000000000..4c156cdecea --- /dev/null +++ b/lib/public/AppFramework/Http/Template/PublicTemplateResponse.php @@ -0,0 +1,176 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCP\AppFramework\Http\Template; + +use InvalidArgumentException; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\IInitialStateService; + +/** + * Class PublicTemplateResponse + * + * @since 14.0.0 + * @template H of array<string, mixed> + * @template S of Http::STATUS_* + * @template-extends TemplateResponse<Http::STATUS_*, array<string, mixed>> + */ +class PublicTemplateResponse extends TemplateResponse { + private $headerTitle = ''; + private $headerDetails = ''; + /** @var IMenuAction[] */ + private $headerActions = []; + private $footerVisible = true; + + /** + * PublicTemplateResponse constructor. + * + * @param string $appName + * @param string $templateName + * @param array $params + * @param S $status + * @param H $headers + * @since 14.0.0 + */ + public function __construct( + string $appName, + string $templateName, + array $params = [], + $status = Http::STATUS_OK, + array $headers = [], + ) { + parent::__construct($appName, $templateName, $params, 'public', $status, $headers); + \OCP\Util::addScript('core', 'public-page-menu'); + \OCP\Util::addScript('core', 'public-page-user-menu'); + + $state = \OCP\Server::get(IInitialStateService::class); + $state->provideLazyInitialState('core', 'public-page-menu', function () { + $response = []; + foreach ($this->headerActions as $action) { + // First try in it is a custom action that provides rendered HTML + $rendered = $action->render(); + if ($rendered === '') { + // If simple action, add the response data + if ($action instanceof SimpleMenuAction) { + $response[] = $action->getData(); + } + } else { + // custom action so add the rendered output + $response[] = [ + 'id' => $action->getId(), + 'label' => $action->getLabel(), + 'html' => $rendered, + ]; + } + } + return $response; + }); + } + + /** + * @param string $title + * @since 14.0.0 + */ + public function setHeaderTitle(string $title) { + $this->headerTitle = $title; + } + + /** + * @return string + * @since 14.0.0 + */ + public function getHeaderTitle(): string { + return $this->headerTitle; + } + + /** + * @param string $details + * @since 14.0.0 + */ + public function setHeaderDetails(string $details) { + $this->headerDetails = $details; + } + + /** + * @return string + * @since 14.0.0 + */ + public function getHeaderDetails(): string { + return $this->headerDetails; + } + + /** + * @param array $actions + * @since 14.0.0 + * @throws InvalidArgumentException + */ + public function setHeaderActions(array $actions) { + foreach ($actions as $action) { + if ($actions instanceof IMenuAction) { + throw new InvalidArgumentException('Actions must be of type IMenuAction'); + } + $this->headerActions[] = $action; + } + usort($this->headerActions, function (IMenuAction $a, IMenuAction $b) { + return $a->getPriority() <=> $b->getPriority(); + }); + } + + /** + * @return IMenuAction + * @since 14.0.0 + * @throws \Exception + */ + public function getPrimaryAction(): IMenuAction { + if ($this->getActionCount() > 0) { + return $this->headerActions[0]; + } + throw new \Exception('No header actions have been set'); + } + + /** + * @return int + * @since 14.0.0 + */ + public function getActionCount(): int { + return count($this->headerActions); + } + + /** + * @return IMenuAction[] + * @since 14.0.0 + */ + public function getOtherActions(): array { + return array_slice($this->headerActions, 1); + } + + /** + * @since 14.0.0 + */ + public function setFooterVisible(bool $visible = false) { + $this->footerVisible = $visible; + } + + /** + * @since 14.0.0 + */ + public function getFooterVisible(): bool { + return $this->footerVisible; + } + + /** + * @return string + * @since 14.0.0 + */ + public function render(): string { + $params = array_merge($this->getParams(), [ + 'template' => $this, + ]); + $this->setParams($params); + return parent::render(); + } +} diff --git a/lib/public/AppFramework/Http/Template/SimpleMenuAction.php b/lib/public/AppFramework/Http/Template/SimpleMenuAction.php new file mode 100644 index 00000000000..03cb9b4c7ea --- /dev/null +++ b/lib/public/AppFramework/Http/Template/SimpleMenuAction.php @@ -0,0 +1,120 @@ +<?php + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCP\AppFramework\Http\Template; + +/** + * Class SimpleMenuAction + * + * @since 14.0.0 + */ +class SimpleMenuAction implements IMenuAction { + /** @var string */ + private $id; + + /** @var string */ + private $label; + + /** @var string */ + private $icon; + + /** @var string */ + private $link; + + /** @var int */ + private $priority; + + /** @var string */ + private $detail; + + /** + * SimpleMenuAction constructor. + * + * @param string $id + * @param string $label + * @param string $icon + * @param string $link + * @param int $priority + * @param string $detail + * @since 14.0.0 + */ + public function __construct(string $id, string $label, string $icon, string $link = '', int $priority = 100, string $detail = '') { + $this->id = $id; + $this->label = $label; + $this->icon = $icon; + $this->link = $link; + $this->priority = $priority; + $this->detail = $detail; + } + + /** + * @return string + * @since 14.0.0 + */ + public function getId(): string { + return $this->id; + } + + /** + * @return string + * @since 14.0.0 + */ + public function getLabel(): string { + return $this->label; + } + + /** + * The icon CSS class to use. + * + * @return string + * @since 14.0.0 + */ + public function getIcon(): string { + return $this->icon; + } + + /** + * @return string + * @since 14.0.0 + */ + public function getLink(): string { + return $this->link; + } + + /** + * @return int + * @since 14.0.0 + */ + public function getPriority(): int { + return $this->priority; + } + + /** + * Custom render function. + * The returned HTML must be wrapped within a listitem (`<li>...</li>`). + * * If an empty string is returned, the default design is used (based on the label and link specified). + * @return string + * @since 14.0.0 + */ + public function render(): string { + return ''; + } + + /** + * Return JSON data to let the frontend render the menu entry. + * @return array{id: string, label: string, href: string, icon: string, details: string|null} + * @since 31.0.0 + */ + public function getData(): array { + return [ + 'id' => $this->id, + 'label' => $this->label, + 'href' => $this->link, + 'icon' => $this->icon, + 'details' => $this->detail, + ]; + } +} |