From: Dan Brown Date: Mon, 3 Feb 2025 16:48:57 +0000 (+0000) Subject: Sorting: Started sort set routes and form X-Git-Tag: v25.02~1^2~17^2~12 X-Git-Url: http://source.bookstackapp.com/bookstack/commitdiff_plain/bf8a84a8b1dd02578e6b5e2b39882902809f112a Sorting: Started sort set routes and form --- diff --git a/app/Sorting/SortSetController.php b/app/Sorting/SortSetController.php new file mode 100644 index 000000000..4ef148295 --- /dev/null +++ b/app/Sorting/SortSetController.php @@ -0,0 +1,19 @@ +middleware('can:settings-manage'); + // TODO - Test + } + + public function create() + { + return view('settings.sort-sets.create'); + } +} diff --git a/app/Sorting/SortSetOption.php b/app/Sorting/SortSetOption.php index 0a78e99c7..bb878cf30 100644 --- a/app/Sorting/SortSetOption.php +++ b/app/Sorting/SortSetOption.php @@ -13,4 +13,32 @@ enum SortSetOption: string case UpdateDateDesc = 'updated_date_desc'; case ChaptersFirst = 'chapters_first'; case ChaptersLast = 'chapters_last'; + + /** + * Provide a translated label string for this option. + */ + public function getLabel(): string + { + $key = $this->value; + $label = ''; + if (str_ends_with($key, '_asc')) { + $key = substr($key, 0, -4); + $label = trans('settings.sort_set_op_asc'); + } elseif (str_ends_with($key, '_desc')) { + $key = substr($key, 0, -5); + $label = trans('settings.sort_set_op_desc'); + } + + $label = trans('settings.sort_set_op_' . $key) . ' ' . $label; + return trim($label); + } + + /** + * @return SortSetOption[] + */ + public static function allExcluding(array $options): array + { + $all = SortSetOption::cases(); + return array_diff($all, $options); + } } diff --git a/lang/en/settings.php b/lang/en/settings.php index b20152bfe..b29ec2533 100644 --- a/lang/en/settings.php +++ b/lang/en/settings.php @@ -80,6 +80,22 @@ return [ 'sorting_book_default_desc' => 'Select the default sort set to apply to new books. This won\'t affect existing books, and can be overridden per-book.', 'sorting_sets' => 'Sort Sets', 'sorting_sets_desc' => 'These are predefined sorting operations which can be applied to content in the system.', + 'sort_set_create' => 'Create Sort Set', + 'sort_set_edit' => 'Edit Sort Set', + 'sort_set_details' => 'Sort Set Details', + 'sort_set_details_desc' => 'Set a name for this sort set, which will appear in lists when users are selecting a sort.', + 'sort_set_operations' => 'Sort Operations', + 'sort_set_operations_desc' => 'Configure the sort actions to be performed in this set by moving them from the list of available operations. Upon use, the operations will be applied in order, from top to bottom.', + 'sort_set_available_operations' => 'Available Operations', + 'sort_set_configured_operations' => 'Configured Operations', + 'sort_set_op_asc' => '(Asc)', + 'sort_set_op_desc' => '(Desc)', + 'sort_set_op_name' => 'Name - Alphabetical', + 'sort_set_op_name_numeric' => 'Name - Numeric', + 'sort_set_op_created_date' => 'Created Date', + 'sort_set_op_updated_date' => 'Updated Date', + 'sort_set_op_chapters_first' => 'Chapters First', + 'sort_set_op_chapters_last' => 'Chapters Last', // Maintenance settings 'maint' => 'Maintenance', diff --git a/resources/views/settings/categories/sorting.blade.php b/resources/views/settings/categories/sorting.blade.php index 153ea0e3b..9de11bb6f 100644 --- a/resources/views/settings/categories/sorting.blade.php +++ b/resources/views/settings/categories/sorting.blade.php @@ -42,8 +42,16 @@ @section('after-card')
-

{{ trans('settings.sorting_sets') }}

-

{{ trans('settings.sorting_sets_desc') }}

+
+
+

{{ trans('settings.sorting_sets') }}

+

{{ trans('settings.sorting_sets_desc') }}

+
+
+ {{ trans('settings.sort_set_create') }} +
+
+ {{-- TODO--}}
@endsection \ No newline at end of file diff --git a/resources/views/settings/sort-sets/create.blade.php b/resources/views/settings/sort-sets/create.blade.php new file mode 100644 index 000000000..16f2d2ac7 --- /dev/null +++ b/resources/views/settings/sort-sets/create.blade.php @@ -0,0 +1,24 @@ +@extends('layouts.simple') + +@section('body') + +
+ + @include('settings.parts.navbar', ['selected' => 'settings']) + +
+

{{ trans('settings.sort_set_create') }}

+ +
+ {{ csrf_field() }} + @include('settings.sort-sets.parts.form', ['model' => null]) + +
+ {{ trans('common.cancel') }} + +
+
+
+
+ +@stop diff --git a/resources/views/settings/sort-sets/parts/form.blade.php b/resources/views/settings/sort-sets/parts/form.blade.php new file mode 100644 index 000000000..6df04a721 --- /dev/null +++ b/resources/views/settings/sort-sets/parts/form.blade.php @@ -0,0 +1,74 @@ + +
+
+
+ +

{{ trans('settings.sort_set_details_desc') }}

+
+
+
+ + @include('form.text', ['name' => 'name']) +
+
+
+ +
+ +

{{ trans('settings.sort_set_operations_desc') }}

+ + + +
+
+ +
    + @foreach(($model?->getOptions() ?? []) as $option) +
  • +
    @icon('grip')
    +
    {{ $option->getLabel() }}
    +
    + + + + +
    +
  • + @endforeach +
+
+ +
+ +
    + @foreach(\BookStack\Sorting\SortSetOption::allExcluding($model?->getOptions() ?? []) as $option) +
  • +
    @icon('grip')
    +
    {{ $option->getLabel() }}
    +
    + + + + +
    +
  • + @endforeach +
+
+
+
+
\ No newline at end of file diff --git a/routes/web.php b/routes/web.php index e1e819dd0..62c120f20 100644 --- a/routes/web.php +++ b/routes/web.php @@ -13,7 +13,7 @@ use BookStack\Permissions\PermissionsController; use BookStack\References\ReferenceController; use BookStack\Search\SearchController; use BookStack\Settings as SettingControllers; -use BookStack\Sorting\BookSortController; +use BookStack\Sorting as SortingControllers; use BookStack\Theming\ThemeController; use BookStack\Uploads\Controllers as UploadControllers; use BookStack\Users\Controllers as UserControllers; @@ -67,7 +67,7 @@ Route::middleware('auth')->group(function () { Route::get('/books/{slug}/edit', [EntityControllers\BookController::class, 'edit']); Route::put('/books/{slug}', [EntityControllers\BookController::class, 'update']); Route::delete('/books/{id}', [EntityControllers\BookController::class, 'destroy']); - Route::get('/books/{slug}/sort-item', [BookSortController::class, 'showItem']); + Route::get('/books/{slug}/sort-item', [SortingControllers\BookSortController::class, 'showItem']); Route::get('/books/{slug}', [EntityControllers\BookController::class, 'show']); Route::get('/books/{bookSlug}/permissions', [PermissionsController::class, 'showForBook']); Route::put('/books/{bookSlug}/permissions', [PermissionsController::class, 'updateForBook']); @@ -75,8 +75,8 @@ Route::middleware('auth')->group(function () { Route::get('/books/{bookSlug}/copy', [EntityControllers\BookController::class, 'showCopy']); Route::post('/books/{bookSlug}/copy', [EntityControllers\BookController::class, 'copy']); Route::post('/books/{bookSlug}/convert-to-shelf', [EntityControllers\BookController::class, 'convertToShelf']); - Route::get('/books/{bookSlug}/sort', [BookSortController::class, 'show']); - Route::put('/books/{bookSlug}/sort', [BookSortController::class, 'update']); + Route::get('/books/{bookSlug}/sort', [SortingControllers\BookSortController::class, 'show']); + Route::put('/books/{bookSlug}/sort', [SortingControllers\BookSortController::class, 'update']); Route::get('/books/{slug}/references', [ReferenceController::class, 'book']); Route::get('/books/{bookSlug}/export/html', [ExportControllers\BookExportController::class, 'html']); Route::get('/books/{bookSlug}/export/pdf', [ExportControllers\BookExportController::class, 'pdf']); @@ -295,6 +295,13 @@ Route::middleware('auth')->group(function () { Route::get('/settings/webhooks/{id}/delete', [ActivityControllers\WebhookController::class, 'delete']); Route::delete('/settings/webhooks/{id}', [ActivityControllers\WebhookController::class, 'destroy']); + // Sort Sets + Route::get('/settings/sorting/sets/new', [SortingControllers\SortSetController::class, 'create']); + Route::post('/settings/sorting/sets', [SortingControllers\SortSetController::class, 'store']); + Route::get('/settings/sorting/sets/{id}', [SortingControllers\SortSetController::class, 'edit']); + Route::put('/settings/sorting/sets/{id}', [SortingControllers\SortSetController::class, 'update']); + Route::delete('/settings/sorting/sets/{id}', [SortingControllers\SortSetController::class, 'destroy']); + // Settings Route::get('/settings', [SettingControllers\SettingController::class, 'index'])->name('settings'); Route::get('/settings/{category}', [SettingControllers\SettingController::class, 'category'])->name('settings.category');