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