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) ?: []);
 | |
|     }
 | |
| }
 |