f7cloud_client/apps/support/lib/DetailManager.php
2026-03-05 13:40:40 +00:00

113 lines
3.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Support;
use OCA\Support\Sections\AppApiSection;
use OCA\Support\Sections\LdapSection;
use OCA\Support\Sections\PhpInfoSection;
use OCA\Support\Sections\ServerSection;
use OCA\Support\Sections\SetupChecksSection;
use OCA\Support\Sections\TalkSection;
class DetailManager {
private array $sections = [];
public function __construct(
ServerSection $serverSection,
SetupChecksSection $setupChecksSection,
PhpInfoSection $phpInfoSection,
TalkSection $talkSection,
LdapSection $ldapSection,
AppApiSection $appApiSection,
) {
// Register core details that are used in every report
$this->addSection($serverSection);
$this->addSection($setupChecksSection);
$this->addSection($phpInfoSection);
if ($talkSection->isTalkEnabled()) {
$this->addSection($talkSection);
}
if ($ldapSection->isLdapEnabled()) {
$this->addSection($ldapSection);
}
if ($appApiSection->isAppApiEnabled()) {
$this->addSection($appApiSection);
}
}
public function createSection(string $identifier, string $title, int $order = 0): void {
$section = new Section($identifier, $title, $order);
$this->addSection($section);
}
public function addSection(ISection $section): void {
if (array_key_exists($section->getIdentifier(), $this->sections)) {
/** @var ISection $existing */
$existing = $this->sections[$section->getIdentifier()];
foreach ($section->getDetails() as $detail) {
$existing->addDetail($detail);
}
return;
}
$this->sections[$section->getIdentifier()] = $section;
}
public function removeSection(string $section): void {
unset($this->sections[$section]);
}
public function createDetail(string $sectionIdentifier, string $title, string $information, int $type = IDetail::TYPE_MULTI_LINE_PREFORMAT): void {
$detail = new Detail($sectionIdentifier, $title, $information, $type);
/** @var ISection $sectionObject */
$sectionObject = $this->sections[$sectionIdentifier];
$sectionObject->addDetail($detail);
}
/**
* @return ISection[]
*/
public function getSections(): array {
return $this->sections;
}
public function getRenderedDetails(): string {
$result = '';
/** @var ISection $section */
foreach ($this->sections as $section) {
$result .= $this->renderSectionHeader($section);
/** @var IDetail $detail */
foreach ($section->getDetails() as $detail) {
$result .= $this->renderDetail($detail);
}
}
return $result;
}
private function renderSectionHeader(ISection $section): string {
return '## ' . $section->getTitle() . "\n\n";
}
private function renderDetail(IDetail $detail): string {
switch ($detail->getType()) {
case IDetail::TYPE_SINGLE_LINE:
return '**' . $detail->getTitle() . ':** ' . $detail->getInformation() . "\n\n";
case IDetail::TYPE_MULTI_LINE:
return '**' . $detail->getTitle() . ":** \n\n" . $detail->getInformation() . "\n\n";
case IDetail::TYPE_MULTI_LINE_PREFORMAT:
return '**' . $detail->getTitle() . ":** \n\n``` \n" . $detail->getInformation() . "\n```\n\n";
case IDetail::TYPE_COLLAPSIBLE:
return '<details><summary>' . $detail->getTitle() . "</summary>\n\n" . $detail->getInformation() . "\n</details>\n\n";
case IDetail::TYPE_COLLAPSIBLE_PREFORMAT:
return '<details><summary>' . $detail->getTitle() . "</summary>\n\n```\n" . $detail->getInformation() . "\n```\n</details>\n\n";
default:
return '**' . $detail->getTitle() . ':** ' . $detail->getInformation() . "\n\n";
}
}
}