This commit is contained in:
Niklas 2026-02-25 09:42:07 +01:00 committed by GitHub
commit 8987a1e7ef
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 239 additions and 2 deletions

View file

@ -27,7 +27,12 @@ class RegisterEventHelper {
constructor() { constructor() {
this.registerTooltips(); this.registerTooltips();
this.configureDropdowns(); 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 //Initialize ClipboardJS
this.registerLoadHandler(() => { this.registerLoadHandler(() => {

View file

@ -8,6 +8,21 @@ parent: Usage
This page lists all the keybindings of Part-DB. Currently, there are only the special character keybindings. 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 ## Special characters
Using the keybindings below (Alt + key) you can insert special characters into the text fields of Part-DB. This works on Using the keybindings below (Alt + key) you can insert special characters into the text fields of Part-DB. This works on

View file

@ -41,4 +41,7 @@ class BehaviorSettings
#[EmbeddedSettings] #[EmbeddedSettings]
public ?PartInfoSettings $partInfo = null; public ?PartInfoSettings $partInfo = null;
#[EmbeddedSettings]
public ?KeybindingsSettings $keybindings = null;
} }

View file

@ -0,0 +1,47 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2025 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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;
}

View file

@ -73,7 +73,9 @@
{{ encore_entry_script_tags('webauthn_tfa') }} {{ encore_entry_script_tags('webauthn_tfa') }}
{% endblock %} {% endblock %}
</head> </head>
<body data-base-url="{{ path('homepage', {'_locale': app.request.locale}) }}" data-locale="{{ app.request.locale|default("en")|slice(0,2) }}"> <body data-base-url="{{ path('homepage', {'_locale': app.request.locale}) }}"
data-locale="{{ app.request.locale|default("en")|slice(0,2) }}"
data-keybindings-special-characters="{{ settings_instance('keybindings').enableSpecialCharacters ? 'true' : 'false' }}">
{% block body %} {% block body %}
<header> <header>
<turbo-frame id="navbar-frame" target="content" data-turbo-action="advance"> <turbo-frame id="navbar-frame" target="content" data-turbo-action="advance">

View file

@ -0,0 +1,70 @@
<?php
declare(strict_types=1);
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2025 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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);
}
}

View file

@ -0,0 +1,77 @@
<?php
declare(strict_types=1);
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2025 Jan Böhmer (https://github.com/jbtronics)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
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());
}
}

View file

@ -10311,6 +10311,24 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>Show the image overlay with attachment details on hovering over the part image gallery.</target> <target>Show the image overlay with attachment details on hovering over the part image gallery.</target>
</segment> </segment>
</unit> </unit>
<unit id="keybind1" name="settings.behavior.keybindings">
<segment state="translated">
<source>settings.behavior.keybindings</source>
<target>Keybindings</target>
</segment>
</unit>
<unit id="keybind2" name="settings.behavior.keybindings.enable_special_characters">
<segment state="translated">
<source>settings.behavior.keybindings.enable_special_characters</source>
<target>Enable special character keybindings</target>
</segment>
</unit>
<unit id="keybind3" name="settings.behavior.keybindings.enable_special_characters.help">
<segment state="translated">
<source>settings.behavior.keybindings.enable_special_characters.help</source>
<target>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.</target>
</segment>
</unit>
<unit id="ALfPkeR" name="perm.config.change_system_settings"> <unit id="ALfPkeR" name="perm.config.change_system_settings">
<segment state="translated"> <segment state="translated">
<source>perm.config.change_system_settings</source> <source>perm.config.change_system_settings</source>