From 47830dcd087dc57a2940fd0f4c31d6b8ecc1adc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20B=C3=B6hmer?= Date: Sun, 4 Aug 2024 00:00:38 +0200 Subject: [PATCH] Allow to define icons for settings --- src/Settings/SettingsIcon.php | 32 +++++++++++++++++++ .../SystemSettings/AttachmentsSettings.php | 2 ++ .../SystemSettings/CustomizationSettings.php | 2 ++ .../SystemSettings/HistorySettings.php | 2 ++ .../SystemSettings/LocalizationSettings.php | 2 ++ .../SystemSettings/PrivacySettings.php | 3 +- src/Twig/MiscExtension.php | 25 +++++++++++++++ templates/settings/settings.html.twig | 7 ++-- 8 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/Settings/SettingsIcon.php diff --git a/src/Settings/SettingsIcon.php b/src/Settings/SettingsIcon.php new file mode 100644 index 00000000..45bfc544 --- /dev/null +++ b/src/Settings/SettingsIcon.php @@ -0,0 +1,32 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings; + +#[\Attribute(\Attribute::TARGET_CLASS)] +class SettingsIcon +{ + public function __construct(public string $icon) + { + } +} \ No newline at end of file diff --git a/src/Settings/SystemSettings/AttachmentsSettings.php b/src/Settings/SystemSettings/AttachmentsSettings.php index b7c794bd..6d15c639 100644 --- a/src/Settings/SystemSettings/AttachmentsSettings.php +++ b/src/Settings/SystemSettings/AttachmentsSettings.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Settings\SystemSettings; +use App\Settings\SettingsIcon; use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; @@ -31,6 +32,7 @@ use Symfony\Component\Translation\TranslatableMessage as TM; use Symfony\Component\Validator\Constraints as Assert; #[Settings(label: new TM("settings.system.attachments"))] +#[SettingsIcon("fa-paperclip")] class AttachmentsSettings { use SettingsTrait; diff --git a/src/Settings/SystemSettings/CustomizationSettings.php b/src/Settings/SystemSettings/CustomizationSettings.php index bcb0e98f..abfeb880 100644 --- a/src/Settings/SystemSettings/CustomizationSettings.php +++ b/src/Settings/SystemSettings/CustomizationSettings.php @@ -25,6 +25,7 @@ namespace App\Settings\SystemSettings; use App\Form\Type\RichTextEditorType; use App\Form\Type\ThemeChoiceType; +use App\Settings\SettingsIcon; use App\Validator\Constraints\ValidTheme; use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; @@ -33,6 +34,7 @@ use Jbtronics\SettingsBundle\Settings\SettingsTrait; use Symfony\Component\Translation\TranslatableMessage as TM; #[Settings(name: "customization", label: new TM("settings.system.customization"))] +#[SettingsIcon("fa-paint-roller")] class CustomizationSettings { use SettingsTrait; diff --git a/src/Settings/SystemSettings/HistorySettings.php b/src/Settings/SystemSettings/HistorySettings.php index 5c50df78..3602a398 100644 --- a/src/Settings/SystemSettings/HistorySettings.php +++ b/src/Settings/SystemSettings/HistorySettings.php @@ -25,6 +25,7 @@ namespace App\Settings\SystemSettings; use App\Form\History\EnforceEventCommentTypesType; use App\Services\LogSystem\EventCommentType; +use App\Settings\SettingsIcon; use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\ParameterTypes\ArrayType; use Jbtronics\SettingsBundle\ParameterTypes\EnumType; @@ -34,6 +35,7 @@ use Jbtronics\SettingsBundle\Settings\SettingsTrait; use Symfony\Component\Translation\TranslatableMessage as TM; #[Settings(label: new TM("settings.system.history"))] +#[SettingsIcon("fa-binoculars")] class HistorySettings { use SettingsTrait; diff --git a/src/Settings/SystemSettings/LocalizationSettings.php b/src/Settings/SystemSettings/LocalizationSettings.php index d4820a41..434a4e69 100644 --- a/src/Settings/SystemSettings/LocalizationSettings.php +++ b/src/Settings/SystemSettings/LocalizationSettings.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace App\Settings\SystemSettings; use App\Form\Type\LocaleSelectType; +use App\Settings\SettingsIcon; use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; @@ -34,6 +35,7 @@ use Symfony\Component\Translation\TranslatableMessage as TM; use Symfony\Component\Validator\Constraints as Assert; #[Settings(label: new TM("settings.system.localization"))] +#[SettingsIcon("fa-globe")] class LocalizationSettings { use SettingsTrait; diff --git a/src/Settings/SystemSettings/PrivacySettings.php b/src/Settings/SystemSettings/PrivacySettings.php index 1686326e..1ef3c635 100644 --- a/src/Settings/SystemSettings/PrivacySettings.php +++ b/src/Settings/SystemSettings/PrivacySettings.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace App\Settings\SystemSettings; +use App\Settings\SettingsIcon; use Jbtronics\SettingsBundle\Metadata\EnvVarMode; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; @@ -30,6 +31,7 @@ use Jbtronics\SettingsBundle\Settings\SettingsTrait; use Symfony\Component\Translation\TranslatableMessage as TM; #[Settings(label: new TM("settings.system.privacy"))] +#[SettingsIcon("fa-location-pin-lock")] class PrivacySettings { use SettingsTrait; @@ -48,5 +50,4 @@ class PrivacySettings description: new TM("settings.system.privacy.useGravatar.description"), envVar: 'bool:USE_GRAVATAR', envVarMode: EnvVarMode::OVERWRITE)] public bool $useGravatar = false; - } \ No newline at end of file diff --git a/src/Twig/MiscExtension.php b/src/Twig/MiscExtension.php index 248d1d28..54aebdd7 100644 --- a/src/Twig/MiscExtension.php +++ b/src/Twig/MiscExtension.php @@ -23,6 +23,8 @@ declare(strict_types=1); namespace App\Twig; use App\Services\LogSystem\EventCommentType; +use Jbtronics\SettingsBundle\Proxy\SettingsProxyInterface; +use ReflectionClass; use Twig\TwigFunction; use App\Services\LogSystem\EventCommentNeededHelper; use Twig\Extension\AbstractExtension; @@ -37,6 +39,8 @@ final class MiscExtension extends AbstractExtension { return [ new TwigFunction('event_comment_needed', $this->evenCommentNeeded(...)), + + new TwigFunction('settings_icon', $this->settingsIcon(...)), ]; } @@ -48,4 +52,25 @@ final class MiscExtension extends AbstractExtension return $this->eventCommentNeededHelper->isCommentNeeded($operation_type); } + + /** + * Returns the value of the icon attribute of the SettingsIcon attribute of the given class. + * If the class does not have a SettingsIcon attribute, then null is returned. + * @param string|object $objectOrClass + * @return string|null + * @throws \ReflectionException + */ + private function settingsIcon(string|object $objectOrClass): ?string + { + //If the given object is a proxy, then get the real object + if (is_a($objectOrClass, SettingsProxyInterface::class)) { + $objectOrClass = get_parent_class($objectOrClass); + } + + $reflection = new ReflectionClass($objectOrClass); + + $attribute = $reflection->getAttributes(\App\Settings\SettingsIcon::class)[0] ?? null; + + return $attribute?->newInstance()->icon; + } } diff --git a/templates/settings/settings.html.twig b/templates/settings/settings.html.twig index 4398ee78..95f4d8c6 100644 --- a/templates/settings/settings.html.twig +++ b/templates/settings/settings.html.twig @@ -32,9 +32,12 @@ {{ form_errors(tab_widget) }} {% for section_widget in tab_widget %} + {% set settings_object = section_widget.vars.value %} + {% if section_widget.vars.compound ?? false %}
- + + {{ (section_widget.vars.label ?? section_widget.vars.name|humanize)|trans }} {{ form_help(section_widget) }} @@ -42,7 +45,7 @@ {{ form_widget(section_widget) }}
{% if not loop.last %} -
+
{% endif %} {% else %} {# If not a compound render as normal row #} {{ form_row(section_widget) }}