]> BookStack Code Mirror - bookstack/commitdiff
Revised revision list to responsive layout
authorDan Brown <redacted>
Mon, 31 Oct 2022 21:26:31 +0000 (21:26 +0000)
committerDan Brown <redacted>
Mon, 31 Oct 2022 21:26:31 +0000 (21:26 +0000)
app/Http/Controllers/PageRevisionController.php
app/Http/Controllers/UserPreferencesController.php
app/Util/SimpleListOptions.php
resources/lang/en/entities.php
resources/sass/_layout.scss
resources/views/pages/parts/revisions-index-row.blade.php [moved from resources/views/pages/parts/revision-table-row.blade.php with 62% similarity]
resources/views/pages/revisions.blade.php

index 85ee6c2bcccbaa0e1ed35ab63e2dec1e10698515..3da5e7c2dd07894c6ed67389d30cc5746b43fe86 100644 (file)
@@ -8,6 +8,8 @@ use BookStack\Entities\Repos\PageRepo;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Facades\Activity;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Facades\Activity;
+use BookStack\Util\SimpleListOptions;
+use Illuminate\Http\Request;
 use Ssddanbrown\HtmlDiff\Diff;
 
 class PageRevisionController extends Controller
 use Ssddanbrown\HtmlDiff\Diff;
 
 class PageRevisionController extends Controller
@@ -24,22 +26,29 @@ class PageRevisionController extends Controller
      *
      * @throws NotFoundException
      */
      *
      * @throws NotFoundException
      */
-    public function index(string $bookSlug, string $pageSlug)
+    public function index(Request $request, string $bookSlug, string $pageSlug)
     {
         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
     {
         $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
+        $listOptions = SimpleListOptions::fromRequest($request, 'page_revisions', true)->withSortOptions([
+            'id' => trans('entities.pages_revisions_sort_number')
+        ]);
+
         $revisions = $page->revisions()->select([
         $revisions = $page->revisions()->select([
-            'id', 'page_id', 'name', 'created_at', 'created_by', 'updated_at',
-            'type', 'revision_number', 'summary',
-        ])
+                'id', 'page_id', 'name', 'created_at', 'created_by', 'updated_at',
+                'type', 'revision_number', 'summary',
+            ])
             ->selectRaw("IF(markdown = '', false, true) as is_markdown")
             ->with(['page.book', 'createdBy'])
             ->selectRaw("IF(markdown = '', false, true) as is_markdown")
             ->with(['page.book', 'createdBy'])
-            ->get();
+            ->reorder('id', $listOptions->getOrder())
+            ->reorder('created_at', $listOptions->getOrder())
+            ->paginate(50);
 
         $this->setPageTitle(trans('entities.pages_revisions_named', ['pageName' => $page->getShortName()]));
 
         return view('pages.revisions', [
 
         $this->setPageTitle(trans('entities.pages_revisions_named', ['pageName' => $page->getShortName()]));
 
         return view('pages.revisions', [
-            'revisions' => $revisions,
-            'page'      => $page,
+            'revisions'   => $revisions,
+            'page'        => $page,
+            'listOptions' => $listOptions,
         ]);
     }
 
         ]);
     }
 
index ca77dcd0b49c44cb6a99d61e33eaedb2f719ca3c..972742e0318fc42155833015b82d1dc7cfbfc604 100644 (file)
@@ -62,7 +62,7 @@ class UserPreferencesController extends Controller
      */
     public function changeSort(Request $request, string $id, string $type)
     {
      */
     public function changeSort(Request $request, string $id, string $type)
     {
-        $validSortTypes = ['books', 'bookshelves', 'shelf_books', 'users', 'roles', 'webhooks', 'tags'];
+        $validSortTypes = ['books', 'bookshelves', 'shelf_books', 'users', 'roles', 'webhooks', 'tags', 'page_revisions'];
         if (!in_array($type, $validSortTypes)) {
             return redirect()->back(500);
         }
         if (!in_array($type, $validSortTypes)) {
             return redirect()->back(500);
         }
index f6daa6954adfcf4f7f5ab20641b0fa77c2d216c1..cb7e75a2d5609f48560d3aa6ac3e35078889e780 100644 (file)
@@ -28,11 +28,11 @@ class SimpleListOptions
      * Create a new instance from the given request.
      * Takes the item type (plural) that's used as a key for storing sort preferences.
      */
      * 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): self
+    public static function fromRequest(Request $request, string $typeKey, bool $sortDescDefault = false): self
     {
         $search = $request->get('search', '');
         $sort = setting()->getForCurrentUser($typeKey . '_sort', '');
     {
         $search = $request->get('search', '');
         $sort = setting()->getForCurrentUser($typeKey . '_sort', '');
-        $order = setting()->getForCurrentUser($typeKey . '_sort_order', 'asc');
+        $order = setting()->getForCurrentUser($typeKey . '_sort_order', $sortDescDefault ? 'desc' : 'asc');
 
         return new static($typeKey, $sort, $order, $search);
     }
 
         return new static($typeKey, $sort, $order, $search);
     }
index b3dfb0bf7620f56efe9282ff7c0fe240c5919cd3..e7fbe37d95db6a0d52a6658b8a6e906a600e6587 100644 (file)
@@ -233,12 +233,14 @@ return [
     'pages_permissions_success' => 'Page permissions updated',
     'pages_revision' => 'Revision',
     'pages_revisions' => 'Page Revisions',
     'pages_permissions_success' => 'Page permissions updated',
     'pages_revision' => 'Revision',
     'pages_revisions' => 'Page Revisions',
+    'pages_revisions_desc' => 'Listed below are all the past revisions of this page. You can look back upon, compare, and restore old page versions if permissions allow. The full history of the page may not be fully reflected here since, depending on system configuration, old revisions could be auto-deleted.',
     'pages_revisions_named' => 'Page Revisions for :pageName',
     'pages_revision_named' => 'Page Revision for :pageName',
     'pages_revision_restored_from' => 'Restored from #:id; :summary',
     'pages_revisions_created_by' => 'Created By',
     'pages_revisions_date' => 'Revision Date',
     'pages_revisions_number' => '#',
     'pages_revisions_named' => 'Page Revisions for :pageName',
     'pages_revision_named' => 'Page Revision for :pageName',
     'pages_revision_restored_from' => 'Restored from #:id; :summary',
     'pages_revisions_created_by' => 'Created By',
     'pages_revisions_date' => 'Revision Date',
     'pages_revisions_number' => '#',
+    'pages_revisions_sort_number' => 'Revision Number',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Changes',
     'pages_revisions_editor' => 'Editor Type',
     'pages_revisions_numbered' => 'Revision #:id',
     'pages_revisions_numbered_changes' => 'Revision #:id Changes',
     'pages_revisions_editor' => 'Editor Type',
index 105b6a16ffc20fb6c4c05c2a990d5e94ed1aff1f..a5f895f80de9a4ddcc95037663a68dd6a44eb4f0 100644 (file)
@@ -202,6 +202,15 @@ body.flexbox {
 /**
  * Min width utilities
  */
 /**
  * Min width utilities
  */
+.min-width-xxxxs {
+  min-width: 60px;
+}
+.min-width-xxxs {
+  min-width: 80px;
+}
+.min-width-xxs {
+  min-width: 100px;
+}
 .min-width-xs {
   min-width: 120px;
 }
 .min-width-xs {
   min-width: 120px;
 }
similarity index 62%
rename from resources/views/pages/parts/revision-table-row.blade.php
rename to resources/views/pages/parts/revisions-index-row.blade.php
index 24301adc376991a9bbe4412440f627fd2ee14388..597b53234198cef25addab495078237721302a61 100644 (file)
@@ -1,38 +1,43 @@
-<tr>
-    <td>{{ $revision->revision_number == 0 ? '' : $revision->revision_number }}</td>
-    <td>
+<div class="item-list-row flex-container-row items-center wrap">
+    <div class="flex fit-content min-width-xxxxs px-m py-xs">
+        <span class="hide-over-l">{{ trans('entities.pages_revisions_number') }}</span>
+        {{ $revision->revision_number == 0 ? '' : $revision->revision_number }}
+    </div>
+    <div class="flex-2 px-m py-xs min-width-s">
         {{ $revision->name }}
         <br>
         {{ $revision->name }}
         <br>
-        <small class="text-muted">({{ $revision->is_markdown ? 'Markdown' : 'WYSIWYG' }})</small>
-    </td>
-    <td style="line-height: 0;" width="30">
-        @if($revision->createdBy)
-            <img class="avatar" src="{{ $revision->createdBy->getAvatar(30) }}" alt="{{ $revision->createdBy->name }}">
-        @endif
-    </td>
-    <td width="260">
-        @if($revision->createdBy) {{ $revision->createdBy->name }} @else {{ trans('common.deleted_user') }} @endif
-        <br>
-        <div class="text-muted">
-            <small>{{ $revision->created_at->formatLocalized('%e %B %Y %H:%M:%S') }}</small>
-            <small>({{ $revision->created_at->diffForHumans() }})</small>
+        <small class="text-muted">(<strong class="hide-over-l">{{ trans('entities.pages_revisions_editor') }}: </strong>{{ $revision->is_markdown ? 'Markdown' : 'WYSIWYG' }})</small>
+    </div>
+    <div class="flex-3 px-m py-xs min-width-l">
+        <div class="flex-container-row items-center gap-s">
+            @if($revision->createdBy)
+                <img class="avatar flex-none" height="30" width="30" src="{{ $revision->createdBy->getAvatar(30) }}" alt="{{ $revision->createdBy->name }}">
+            @endif
+            <div>
+                @if($revision->createdBy) {{ $revision->createdBy->name }} @else {{ trans('common.deleted_user') }} @endif
+                <br>
+                <div class="text-muted">
+                    <small>{{ $revision->created_at->formatLocalized('%e %B %Y %H:%M:%S') }}</small>
+                    <small>({{ $revision->created_at->diffForHumans() }})</small>
+                </div>
+            </div>
         </div>
         </div>
-    </td>
-    <td>
+    </div>
+    <div class="flex-2 px-m py-xs min-width-m text-small">
         {{ $revision->summary }}
         {{ $revision->summary }}
-    </td>
-    <td class="actions text-small text-right">
+    </div>
+    <div class="flex-2 px-m py-xs actions text-small text-l-right min-width-l">
         <a href="{{ $revision->getUrl('changes') }}" target="_blank" rel="noopener">{{ trans('entities.pages_revisions_changes') }}</a>
         <a href="{{ $revision->getUrl('changes') }}" target="_blank" rel="noopener">{{ trans('entities.pages_revisions_changes') }}</a>
-        <span class="text-muted">&nbsp;|&nbsp;</span>
+        <span class="text-muted opacity-70">&nbsp;|&nbsp;</span>
 
 
 
 
-        @if ($index === 0)
+        @if ($current)
             <a target="_blank" rel="noopener" href="{{ $revision->page->getUrl() }}"><i>{{ trans('entities.pages_revisions_current') }}</i></a>
         @else
             <a href="{{ $revision->getUrl() }}" target="_blank" rel="noopener">{{ trans('entities.pages_revisions_preview') }}</a>
 
             @if(userCan('page-update', $revision->page))
             <a target="_blank" rel="noopener" href="{{ $revision->page->getUrl() }}"><i>{{ trans('entities.pages_revisions_current') }}</i></a>
         @else
             <a href="{{ $revision->getUrl() }}" target="_blank" rel="noopener">{{ trans('entities.pages_revisions_preview') }}</a>
 
             @if(userCan('page-update', $revision->page))
-                <span class="text-muted">&nbsp;|&nbsp;</span>
+                <span class="text-muted opacity-70">&nbsp;|&nbsp;</span>
                 <div component="dropdown" class="dropdown-container">
                     <a refs="dropdown@toggle" href="#" aria-haspopup="true" aria-expanded="false">{{ trans('entities.pages_revisions_restore') }}</a>
                     <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
                 <div component="dropdown" class="dropdown-container">
                     <a refs="dropdown@toggle" href="#" aria-haspopup="true" aria-expanded="false">{{ trans('entities.pages_revisions_restore') }}</a>
                     <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
@@ -52,7 +57,7 @@
             @endif
 
             @if(userCan('page-delete', $revision->page))
             @endif
 
             @if(userCan('page-delete', $revision->page))
-                <span class="text-muted">&nbsp;|&nbsp;</span>
+                <span class="text-muted opacity-70">&nbsp;|&nbsp;</span>
                 <div component="dropdown" class="dropdown-container">
                     <a refs="dropdown@toggle" href="#" aria-haspopup="true" aria-expanded="false">{{ trans('common.delete') }}</a>
                     <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
                 <div component="dropdown" class="dropdown-container">
                     <a refs="dropdown@toggle" href="#" aria-haspopup="true" aria-expanded="false">{{ trans('common.delete') }}</a>
                     <ul refs="dropdown@menu" class="dropdown-menu" role="menu">
@@ -71,5 +76,5 @@
                 </div>
             @endif
         @endif
                 </div>
             @endif
         @endif
-    </td>
-</tr>
\ No newline at end of file
+    </div>
+</div>
\ No newline at end of file
index 3e7edad997fe1c8cdb823abd2762ca67475a7d64..9f462e930ebb6e7e054a303a2664f807ada4948a 100644 (file)
 
         <main class="card content-wrap">
             <h1 class="list-heading">{{ trans('entities.pages_revisions') }}</h1>
 
         <main class="card content-wrap">
             <h1 class="list-heading">{{ trans('entities.pages_revisions') }}</h1>
-            @if(count($revisions) > 0)
 
 
-                <table class="table">
-                    <tr>
-                        <th width="56">{{ trans('entities.pages_revisions_number') }}</th>
-                        <th>
-                            {{ trans('entities.pages_name') }} / {{ trans('entities.pages_revisions_editor') }}
-                        </th>
-                        <th colspan="2">{{ trans('entities.pages_revisions_created_by') }} / {{ trans('entities.pages_revisions_date') }}</th>
-                        <th>{{ trans('entities.pages_revisions_changelog') }}</th>
-                        <th class="text-right">{{ trans('common.actions') }}</th>
-                    </tr>
+            <p class="text-muted">{{ trans('entities.pages_revisions_desc') }}</p>
+
+            <div class="flex-container-row my-m items-center justify-space-between wrap gap-x-m gap-y-s">
+                {{ $revisions->links() }}
+                <div>
+                    @include('common.sort', $listOptions->getSortControlData())
+                </div>
+            </div>
+
+            @if(count($revisions) > 0)
+                <div class="item-list">
+                    <div class="item-list-row flex-container-row items-center strong hide-under-l">
+                        <div class="flex fit-content min-width-xxxxs px-m py-xs">{{ trans('entities.pages_revisions_number') }}</div>
+                        <div class="flex-2 px-m py-xs">{{ trans('entities.pages_name') }} / {{ trans('entities.pages_revisions_editor') }}</div>
+                        <div class="flex-3 px-m py-xs">{{ trans('entities.pages_revisions_created_by') }} / {{ trans('entities.pages_revisions_date') }}</div>
+                        <div class="flex-2 px-m py-xs">{{ trans('entities.pages_revisions_changelog') }}</div>
+                        <div class="flex-2 px-m py-xs text-right">{{ trans('common.actions') }}</div>
+                    </div>
                     @foreach($revisions as $index => $revision)
                     @foreach($revisions as $index => $revision)
-                        @include('pages.parts.revision-table-row', ['revision' => $revision])
+                        @include('pages.parts.revisions-index-row', ['revision' => $revision, 'current' => $page->revision_count === $revision->revision_number])
                     @endforeach
                     @endforeach
-                </table>
-
+                </div>
             @else
                 <p>{{ trans('entities.pages_revisions_none') }}</p>
             @endif
             @else
                 <p>{{ trans('entities.pages_revisions_none') }}</p>
             @endif
+
+            <div class="my-m">
+                {{ $revisions->links() }}
+            </div>
         </main>
 
     </div>
         </main>
 
     </div>