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