aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl Schwan <carl@carlschwan.eu>2021-11-24 14:08:16 +0100
committerCarl Schwan <carl@carlschwan.eu>2022-05-16 22:47:37 +0200
commit046d5451b15d46581cde846676e0b6d631fedbb7 (patch)
treeab0c48dc23940de1b6edbff9f2b1243e1c911b19
parentab0548e4edb1d2cf47718f752272d68aa6be07e2 (diff)
downloadnextcloud-server-046d5451b15d46581cde846676e0b6d631fedbb7.tar.gz
nextcloud-server-046d5451b15d46581cde846676e0b6d631fedbb7.zip
Improve accessibility of the title of the settings
Before every setting page had the same title and this is causing issues for screenreaders since they can't differenciate the title of page. Now a new variable is available for apps to declare the page subtitle. This new variable is implemented for the settings app and while at it I added a bit more type hinting to the stuff I touched :) Signed-off-by: Carl Schwan <carl@carlschwan.eu>
-rw-r--r--apps/settings/lib/Controller/CommonSettingsTrait.php34
-rw-r--r--core/templates/layout.user.php1
-rw-r--r--lib/private/Settings/Manager.php7
-rw-r--r--lib/public/Settings/IIconSection.php4
-rw-r--r--lib/public/Settings/IManager.php6
5 files changed, 35 insertions, 17 deletions
diff --git a/apps/settings/lib/Controller/CommonSettingsTrait.php b/apps/settings/lib/Controller/CommonSettingsTrait.php
index 2eb7b4ccf99..7cb706bb3a6 100644
--- a/apps/settings/lib/Controller/CommonSettingsTrait.php
+++ b/apps/settings/lib/Controller/CommonSettingsTrait.php
@@ -33,6 +33,7 @@ use OCP\Group\ISubAdmin;
use OCP\IGroupManager;
use OCP\INavigationManager;
use OCP\IUserSession;
+use OCP\Settings\IIconSection;
use OCP\Settings\IManager as ISettingsManager;
use OCP\Settings\ISettings;
@@ -54,28 +55,31 @@ trait CommonSettingsTrait {
private $subAdmin;
/**
- * @param string $currentSection
- * @return array
+ * @return array{forms: array{personal: array, admin: array}}
*/
- private function getNavigationParameters($currentType, $currentSection) {
+ private function getNavigationParameters(string $currentType, string $currentSection): array {
$templateParameters = [
'personal' => $this->formatPersonalSections($currentType, $currentSection),
'admin' => []
];
$templateParameters['admin'] = $this->formatAdminSections(
- $currentType,
- $currentSection
- );
+ $currentType,
+ $currentSection
+ );
return [
'forms' => $templateParameters
];
}
+ /**
+ * @param IIconSection[][] $sections
+ * @psam-param 'admin'|'personal' $type
+ * @return list<array{anchor: string, section-name: string, active: bool, icon: string}>
+ */
protected function formatSections(array $sections, string $currentSection, string $type, string $currentType): array {
$templateParameters = [];
- /** @var \OCP\Settings\IIconSection[] $prioritizedSections */
foreach ($sections as $prioritizedSections) {
foreach ($prioritizedSections as $section) {
if ($type === 'admin') {
@@ -105,21 +109,17 @@ trait CommonSettingsTrait {
protected function formatPersonalSections(string $currentType, string $currentSections): array {
$sections = $this->settingsManager->getPersonalSections();
- $templateParameters = $this->formatSections($sections, $currentSections, 'personal', $currentType);
-
- return $templateParameters;
+ return $this->formatSections($sections, $currentSections, 'personal', $currentType);
}
protected function formatAdminSections(string $currentType, string $currentSections): array {
$sections = $this->settingsManager->getAdminSections();
- $templateParameters = $this->formatSections($sections, $currentSections, 'admin', $currentType);
-
- return $templateParameters;
+ return $this->formatSections($sections, $currentSections, 'admin', $currentType);
}
/**
* @param array<int, list<\OCP\Settings\ISettings>> $settings
- * @return array
+ * @return array{content: string}
*/
private function formatSettings(array $settings): array {
$html = '';
@@ -133,11 +133,15 @@ trait CommonSettingsTrait {
return ['content' => $html];
}
- private function getIndexResponse($type, $section) {
+ private function getIndexResponse(string $type, string $section): TemplateResponse {
$this->navigationManager->setActiveEntry('settings');
$templateParams = [];
$templateParams = array_merge($templateParams, $this->getNavigationParameters($type, $section));
$templateParams = array_merge($templateParams, $this->getSettings($section));
+ $activeSection = $this->settingsManager->getSection($type, $section);
+ if ($activeSection) {
+ $templateParams['pageTitle'] = $activeSection->getName();
+ }
return new TemplateResponse('settings', 'settings/frame', $templateParams);
}
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 82626733bd2..ecb0c614dd4 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -18,6 +18,7 @@ $getUserAvatar = static function (int $size) use ($_): string {
<meta charset="utf-8">
<title>
<?php
+ p(!empty($_['pageTitle'])?$_['pageTitle'].' - ':'');
p(!empty($_['application'])?$_['application'].' - ':'');
p($theme->getTitle());
?>
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php
index 84fbf9426b0..ed331c59725 100644
--- a/lib/private/Settings/Manager.php
+++ b/lib/private/Settings/Manager.php
@@ -145,6 +145,13 @@ class Manager implements IManager {
return $this->sections[$type];
}
+ public function getSection(string $type, string $sectionId): ?IIconSection {
+ if (isset($this->sections[$type]) && isset($this->sections[$type][$sectionId])) {
+ return $this->sections[$type][$sectionId];
+ }
+ return null;
+ }
+
protected function isKnownDuplicateSectionId(string $sectionID): bool {
return in_array($sectionID, [
'connected-accounts',
diff --git a/lib/public/Settings/IIconSection.php b/lib/public/Settings/IIconSection.php
index c56565fbf85..bb9b2e94b0d 100644
--- a/lib/public/Settings/IIconSection.php
+++ b/lib/public/Settings/IIconSection.php
@@ -31,7 +31,7 @@ interface IIconSection {
* returns the ID of the section. It is supposed to be a lower case string,
* e.g. 'ldap'
*
- * @returns string
+ * @return string
* @since 9.1
*/
public function getID();
@@ -59,7 +59,7 @@ interface IIconSection {
* returns the relative path to an 16*16 icon describing the section.
* e.g. '/core/img/places/files.svg'
*
- * @returns string
+ * @return string
* @since 12
*/
public function getIcon();
diff --git a/lib/public/Settings/IManager.php b/lib/public/Settings/IManager.php
index 2ec3fb0fd21..10de596dbea 100644
--- a/lib/public/Settings/IManager.php
+++ b/lib/public/Settings/IManager.php
@@ -116,4 +116,10 @@ interface IManager {
* @since 13.0.0
*/
public function getPersonalSettings($section): array;
+
+ /**
+ * Get a specific section by type and id
+ * @since 25.0.0
+ */
+ public function getSection(string $type, string $sectionId): ?IIconSection;
}