diff --git a/assets/js/register_events.js b/assets/js/register_events.js index 9732c0c1..547742ea 100644 --- a/assets/js/register_events.js +++ b/assets/js/register_events.js @@ -27,7 +27,12 @@ class RegisterEventHelper { constructor() { this.registerTooltips(); this.configureDropdowns(); - this.registerSpecialCharInput(); + + // Only register special character input if enabled in configuration + const keybindingsEnabled = document.body.dataset.keybindingsSpecialCharacters !== 'false'; + if (keybindingsEnabled) { + this.registerSpecialCharInput(); + } //Initialize ClipboardJS this.registerLoadHandler(() => { diff --git a/docs/usage/keybindings.md b/docs/usage/keybindings.md index 771d7684..f4b1980e 100644 --- a/docs/usage/keybindings.md +++ b/docs/usage/keybindings.md @@ -8,6 +8,21 @@ parent: Usage This page lists all the keybindings of Part-DB. Currently, there are only the special character keybindings. +## Disabling keybindings + +If you want to disable the special character keybindings (for example, because they conflict with your keyboard layout or system shortcuts), you can do so in two ways: + +### Via the System Settings UI (recommended) + +1. Navigate to **System Settings** (Tools → System Settings) +2. Go to **Behavior** → **Keybindings** +3. Uncheck **Enable special character keybindings** +4. Save the settings + +### Via Environment Variable + +Alternatively, you can set the environment variable `KEYBINDINGS_SPECIAL_CHARS_ENABLED=0` in your `.env.local` file or your server environment configuration. + ## Special characters Using the keybindings below (Alt + key) you can insert special characters into the text fields of Part-DB. This works on diff --git a/src/Settings/BehaviorSettings/BehaviorSettings.php b/src/Settings/BehaviorSettings/BehaviorSettings.php index 3053073f..ec849db3 100644 --- a/src/Settings/BehaviorSettings/BehaviorSettings.php +++ b/src/Settings/BehaviorSettings/BehaviorSettings.php @@ -41,4 +41,7 @@ class BehaviorSettings #[EmbeddedSettings] public ?PartInfoSettings $partInfo = null; + + #[EmbeddedSettings] + public ?KeybindingsSettings $keybindings = null; } diff --git a/src/Settings/BehaviorSettings/KeybindingsSettings.php b/src/Settings/BehaviorSettings/KeybindingsSettings.php new file mode 100644 index 00000000..2788de41 --- /dev/null +++ b/src/Settings/BehaviorSettings/KeybindingsSettings.php @@ -0,0 +1,47 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\BehaviorSettings; + +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Symfony\Component\Translation\TranslatableMessage as TM; + +#[Settings(name: "keybindings", label: new TM("settings.behavior.keybindings"))] +#[SettingsIcon('fa-keyboard')] +class KeybindingsSettings +{ + /** + * Whether to enable special character keybindings (Alt+key) in text input fields + * @var bool + */ + #[SettingsParameter( + label: new TM("settings.behavior.keybindings.enable_special_characters"), + description: new TM("settings.behavior.keybindings.enable_special_characters.help"), + envVar: "bool:KEYBINDINGS_SPECIAL_CHARS_ENABLED", + envVarMode: EnvVarMode::OVERWRITE + )] + public bool $enableSpecialCharacters = true; +} diff --git a/templates/base.html.twig b/templates/base.html.twig index 8dc87239..62f0ce53 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -73,7 +73,9 @@ {{ encore_entry_script_tags('webauthn_tfa') }} {% endblock %} - + {% block body %}
diff --git a/tests/Settings/BehaviorSettings/BehaviorSettingsTest.php b/tests/Settings/BehaviorSettings/BehaviorSettingsTest.php new file mode 100644 index 00000000..39ff65bd --- /dev/null +++ b/tests/Settings/BehaviorSettings/BehaviorSettingsTest.php @@ -0,0 +1,70 @@ +. + */ +namespace App\Tests\Settings\BehaviorSettings; + +use App\Settings\BehaviorSettings\BehaviorSettings; +use App\Settings\BehaviorSettings\KeybindingsSettings; +use App\Tests\SettingsTestHelper; +use PHPUnit\Framework\TestCase; + +final class BehaviorSettingsTest extends TestCase +{ + /** + * Test that BehaviorSettings has the keybindings property + */ + public function testHasKeybindingsProperty(): void + { + $settings = SettingsTestHelper::createSettingsDummy(BehaviorSettings::class); + + $reflection = new \ReflectionClass($settings); + $this->assertTrue($reflection->hasProperty('keybindings')); + } + + /** + * Test that keybindings property is nullable and of correct type + */ + public function testKeybindingsPropertyType(): void + { + $settings = SettingsTestHelper::createSettingsDummy(BehaviorSettings::class); + + $reflection = new \ReflectionClass($settings); + $property = $reflection->getProperty('keybindings'); + + $this->assertTrue($property->hasType()); + + $type = $property->getType(); + $this->assertInstanceOf(\ReflectionNamedType::class, $type); + $this->assertEquals(KeybindingsSettings::class, $type->getName()); + $this->assertTrue($type->allowsNull()); + } + + /** + * Test that keybindings property defaults to null + */ + public function testKeybindingsDefaultsToNull(): void + { + $settings = SettingsTestHelper::createSettingsDummy(BehaviorSettings::class); + + $this->assertNull($settings->keybindings); + } +} diff --git a/tests/Settings/BehaviorSettings/KeybindingsSettingsTest.php b/tests/Settings/BehaviorSettings/KeybindingsSettingsTest.php new file mode 100644 index 00000000..bd2a840d --- /dev/null +++ b/tests/Settings/BehaviorSettings/KeybindingsSettingsTest.php @@ -0,0 +1,77 @@ +. + */ +namespace App\Tests\Settings\BehaviorSettings; + +use App\Settings\BehaviorSettings\KeybindingsSettings; +use App\Tests\SettingsTestHelper; +use PHPUnit\Framework\TestCase; + +final class KeybindingsSettingsTest extends TestCase +{ + /** + * Test that the default value for enableSpecialCharacters is true + */ + public function testDefaultValueIsTrue(): void + { + $settings = SettingsTestHelper::createSettingsDummy(KeybindingsSettings::class); + + $this->assertTrue($settings->enableSpecialCharacters); + } + + /** + * Test that enableSpecialCharacters can be set to false + */ + public function testCanBeDisabled(): void + { + $settings = SettingsTestHelper::createSettingsDummy(KeybindingsSettings::class); + $settings->enableSpecialCharacters = false; + + $this->assertFalse($settings->enableSpecialCharacters); + } + + /** + * Test that enableSpecialCharacters can be set to true + */ + public function testCanBeEnabled(): void + { + $settings = SettingsTestHelper::createSettingsDummy(KeybindingsSettings::class); + $settings->enableSpecialCharacters = false; + $settings->enableSpecialCharacters = true; + + $this->assertTrue($settings->enableSpecialCharacters); + } + + /** + * Test that the settings class has the correct type for enableSpecialCharacters + */ + public function testPropertyTypeIsBool(): void + { + $settings = SettingsTestHelper::createSettingsDummy(KeybindingsSettings::class); + + $reflection = new \ReflectionClass($settings); + $property = $reflection->getProperty('enableSpecialCharacters'); + + $this->assertTrue($property->hasType()); + $this->assertEquals('bool', $property->getType()->getName()); + } +} diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 7bf613ae..719cbee9 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -10311,6 +10311,24 @@ Please note, that you can not impersonate a disabled user. If you try you will g Show the image overlay with attachment details on hovering over the part image gallery. + + + settings.behavior.keybindings + Keybindings + + + + + settings.behavior.keybindings.enable_special_characters + Enable special character keybindings + + + + + settings.behavior.keybindings.enable_special_characters.help + Enable Alt+key shortcuts to insert special characters (Greek letters, mathematical symbols, etc.) in text input fields. Disable this if the shortcuts conflict with your keyboard layout or system shortcuts. + + perm.config.change_system_settings