105 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
| <?php
 | |
| 
 | |
| namespace BookStack\Util;
 | |
| 
 | |
| use Illuminate\Http\Request;
 | |
| 
 | |
| /**
 | |
|  * Handled options commonly used for item lists within the system, providing a standard
 | |
|  * model for handling and validating sort, order and search options.
 | |
|  */
 | |
| class SimpleListOptions
 | |
| {
 | |
|     protected string $typeKey;
 | |
|     protected string $sort;
 | |
|     protected string $order;
 | |
|     protected string $search;
 | |
|     protected array $sortOptions = [];
 | |
| 
 | |
|     public function __construct(string $typeKey, string $sort, string $order, string $search = '')
 | |
|     {
 | |
|         $this->typeKey = $typeKey;
 | |
|         $this->sort = $sort;
 | |
|         $this->order = $order;
 | |
|         $this->search = $search;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Create a new instance from the given request.
 | |
|      * Takes the item type (plural) that's used as a key for storing sort preferences.
 | |
|      */
 | |
|     public static function fromRequest(Request $request, string $typeKey, bool $sortDescDefault = false): self
 | |
|     {
 | |
|         $search = $request->get('search', '');
 | |
|         $sort = setting()->getForCurrentUser($typeKey . '_sort', '');
 | |
|         $order = setting()->getForCurrentUser($typeKey . '_sort_order', $sortDescDefault ? 'desc' : 'asc');
 | |
| 
 | |
|         return new self($typeKey, $sort, $order, $search);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Configure the valid sort options for this set of list options.
 | |
|      * Provided sort options must be an array, keyed by search properties
 | |
|      * with values being user-visible option labels.
 | |
|      * Returns current options for easy fluent usage during creation.
 | |
|      */
 | |
|     public function withSortOptions(array $sortOptions): self
 | |
|     {
 | |
|         $this->sortOptions = array_merge($this->sortOptions, $sortOptions);
 | |
| 
 | |
|         return $this;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the current order option.
 | |
|      */
 | |
|     public function getOrder(): string
 | |
|     {
 | |
|         return strtolower($this->order) === 'desc' ? 'desc' : 'asc';
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the current sort option.
 | |
|      */
 | |
|     public function getSort(): string
 | |
|     {
 | |
|         $default = array_key_first($this->sortOptions) ?? 'name';
 | |
|         $sort = $this->sort ?: $default;
 | |
| 
 | |
|         if (empty($this->sortOptions) || array_key_exists($sort, $this->sortOptions)) {
 | |
|             return $sort;
 | |
|         }
 | |
| 
 | |
|         return $default;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the set search term.
 | |
|      */
 | |
|     public function getSearch(): string
 | |
|     {
 | |
|         return $this->search;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the data to append for pagination.
 | |
|      */
 | |
|     public function getPaginationAppends(): array
 | |
|     {
 | |
|         return ['search' => $this->search];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the data required by the sort control view.
 | |
|      */
 | |
|     public function getSortControlData(): array
 | |
|     {
 | |
|         return [
 | |
|             'options' => $this->sortOptions,
 | |
|             'order' => $this->getOrder(),
 | |
|             'sort' => $this->getSort(),
 | |
|             'type' => $this->typeKey,
 | |
|         ];
 | |
|     }
 | |
| }
 |