83 lines
1.8 KiB
PHP
83 lines
1.8 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace BookStack\Settings;
|
||
|
|
||
|
class UserShortcutMap
|
||
|
{
|
||
|
protected const DEFAULTS = [
|
||
|
// Header actions
|
||
|
"home_view" => "1",
|
||
|
"shelves_view" => "2",
|
||
|
"books_view" => "3",
|
||
|
"settings_view" => "4",
|
||
|
"favourites_view" => "5",
|
||
|
"profile_view" => "6",
|
||
|
"global_search" => "/",
|
||
|
"logout" => "0",
|
||
|
|
||
|
// Common actions
|
||
|
"edit" => "e",
|
||
|
"new" => "n",
|
||
|
"copy" => "c",
|
||
|
"delete" => "d",
|
||
|
"favourite" => "f",
|
||
|
"export" => "x",
|
||
|
"sort" => "s",
|
||
|
"permissions" => "p",
|
||
|
"move" => "m",
|
||
|
"revisions" => "r",
|
||
|
|
||
|
// Navigation
|
||
|
"next" => "ArrowRight",
|
||
|
"previous" => "ArrowLeft",
|
||
|
];
|
||
|
|
||
|
/**
|
||
|
* @var array<string, string>
|
||
|
*/
|
||
|
protected array $mapping;
|
||
|
|
||
|
public function __construct(array $map)
|
||
|
{
|
||
|
$this->mapping = static::DEFAULTS;
|
||
|
$this->merge($map);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Merge the given map into the current shortcut mapping.
|
||
|
*/
|
||
|
protected function merge(array $map): void
|
||
|
{
|
||
|
foreach ($map as $key => $value) {
|
||
|
if (is_string($value) && isset($this->mapping[$key])) {
|
||
|
$this->mapping[$key] = $value;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the shortcut defined for the given ID.
|
||
|
*/
|
||
|
public function getShortcut(string $id): string
|
||
|
{
|
||
|
return $this->mapping[$id] ?? '';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert this mapping to JSON.
|
||
|
*/
|
||
|
public function toJson(): string
|
||
|
{
|
||
|
return json_encode($this->mapping);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a new instance from the current user's preferences.
|
||
|
*/
|
||
|
public static function fromUserPreferences(): self
|
||
|
{
|
||
|
$userKeyMap = setting()->getForCurrentUser('ui-shortcuts');
|
||
|
return new self(json_decode($userKeyMap, true) ?: []);
|
||
|
}
|
||
|
}
|