]> BookStack Code Mirror - bookstack/commitdiff
Added user filter to audit log
authorDan Brown <redacted>
Sun, 21 Mar 2021 15:04:32 +0000 (15:04 +0000)
committerDan Brown <redacted>
Sun, 21 Mar 2021 15:04:32 +0000 (15:04 +0000)
Included testing to cover.
Closes #2472

app/Http/Controllers/AuditLogController.php
resources/js/components/user-select.js
resources/sass/_components.scss
resources/sass/_header.scss
resources/sass/_variables.scss
resources/views/components/user-select-list.blade.php
resources/views/components/user-select.blade.php
resources/views/form/entity-permissions.blade.php
resources/views/settings/audit.blade.php
resources/views/users/delete.blade.php
tests/AuditLogTest.php

index eb6eecc944ec0ba29567b2147b5d88af4f39d437..f73ee4a20d227e0907ba51b7f07e8273ee580e04 100644 (file)
@@ -20,6 +20,7 @@ class AuditLogController extends Controller
             'sort' => $request->get('sort', 'created_at'),
             'date_from' => $request->get('date_from', ''),
             'date_to' => $request->get('date_to', ''),
+            'user' => $request->get('user', ''),
         ];
 
         $query = Activity::query()
@@ -34,6 +35,9 @@ class AuditLogController extends Controller
         if ($listDetails['event']) {
             $query->where('type', '=', $listDetails['event']);
         }
+        if ($listDetails['user']) {
+            $query->where('user_id', '=', $listDetails['user']);
+        }
 
         if ($listDetails['date_from']) {
             $query->where('created_at', '>=', $listDetails['date_from']);
index 477c11d6b5d0e3184fad6ed5144fbb472bc9482e..c2c1f97c3aee5911fdb8c80ce4d63c5609370139 100644 (file)
@@ -13,9 +13,11 @@ class UserSelect {
     }
 
     selectUser(event, userEl) {
+        event.preventDefault();
         const id = userEl.getAttribute('data-id');
         this.input.value = id;
         this.userInfoContainer.innerHTML = userEl.innerHTML;
+        this.input.dispatchEvent(new Event('change', {bubbles: true}));
         this.hide();
     }
 
index ede26c51ca3d16bd68530105bfab92b4482c5aaa..ad630469438f770dcb6c95c204801f70475274ab 100644 (file)
@@ -783,6 +783,6 @@ body.flexbox-support #entity-selector-wrap .popup-body .form-group {
 
 .custom-select-input {
   max-width: 280px;
-  border: 1px solid #DDD;
-  border-radius: 4px;
+  border: 1px solid #D4D4D4;
+  border-radius: 3px;
 }
\ No newline at end of file
index 3e8c676fdb08bd2d3e838cb9ef7c86f4a77abcfd..f371e0410bfdf3f3aa2d58e5d8ec56a31d72e4d4 100644 (file)
@@ -269,7 +269,7 @@ header .search-box {
 .dropdown-search {
   position: relative;
   .dropdown-search-toggle {
-    padding: 6px;
+    padding: $-xs;
     border: 1px solid transparent;
     border-radius: 4px;
     &:hover {
@@ -281,6 +281,14 @@ header .search-box {
   }
 }
 
+.dropdown-search-toggle.compact {
+  padding: $-xxs $-xs;
+  .avatar {
+    height: 22px;
+    width: 22px;
+  }
+}
+
 .faded {
   a, button, span, span > div {
     color: #666;
index d0d1f27d3715b0fc8599b661b671f0c604c568d7..42207528b82e67b091a29f13bfb78132abb3be02 100644 (file)
@@ -28,7 +28,7 @@ $-xs: 6px;
 $-xxs: 3px;
 
 // List of our spacing sizes
-$spacing: (('none', 0), ('xxs', $-xxs), ('xs', $-xs), ('s', $-s), ('m', $-m), ('l', $-l), ('xl', $-xl), ('xxl', $-xxl));
+$spacing: (('none', 0), ('xxs', $-xxs), ('xs', $-xs), ('s', $-s), ('m', $-m), ('l', $-l), ('xl', $-xl), ('xxl', $-xxl), ('auto', auto));
 
 // Fonts
 $text: -apple-system, BlinkMacSystemFont,
index 2c49e965dae1e1dd8da76bead5be3b3349fc87ff..0018d64bf474d1652ec29a8f8f1146ff8da30096 100644 (file)
@@ -1,3 +1,6 @@
+<a href="#" class="flex-container-row items-center dropdown-search-item" data-id="">
+    <span>{{ trans('settings.users_none_selected') }}</span>
+</a>
 @foreach($users as $user)
     <a href="#" class="flex-container-row items-center dropdown-search-item" data-id="{{ $user->id }}">
         <img class="avatar mr-m" src="{{ $user->getAvatar(30) }}" alt="{{ $user->name }}">
index 2a07f0bde5044e03aa00e7eaaff724b2deffce63..50c731efd6e00352f0c388c112fabc516aadfa53 100644 (file)
@@ -3,17 +3,17 @@
 >
     <input refs="user-select@input" type="hidden" name="{{ $name }}" value="{{ $user->id ?? '' }}">
     <div refs="dropdown@toggle"
-         class="dropdown-search-toggle flex-container-row items-center"
+         class="dropdown-search-toggle {{ $compact ? 'compact' : '' }} flex-container-row items-center"
          aria-haspopup="true" aria-expanded="false" tabindex="0">
         <div refs="user-select@user-info" class="flex-container-row items-center px-s">
             @if($user)
-                <img class="avatar mr-m" src="{{ $user->getAvatar(30) }}" alt="{{ $user->name }}">
+                <img class="avatar small mr-m" src="{{ $user->getAvatar($compact ? 22 : 30) }}" alt="{{ $user->name }}">
                 <span>{{ $user->name }}</span>
             @else
                 <span>{{ trans('settings.users_none_selected') }}</span>
             @endif
         </div>
-        <span style="font-size: 1.5rem; margin-left: auto;">
+        <span style="font-size: {{ $compact ? '1.15rem' : '1.5rem' }}; margin-left: auto;">
             @icon('caret-down')
         </span>
     </div>
index 35490bed9a89e74f3eeb071e708e5618fa719807..6cf5ab8bdcac9db8b02f3debb384005ddaa27c80 100644 (file)
@@ -15,7 +15,7 @@
         <div>
             <div class="form-group">
                 <label for="owner">{{ trans('entities.permissions_owner') }}</label>
-                @include('components.user-select', ['user' => $model->ownedBy, 'name' => 'owned_by'])
+                @include('components.user-select', ['user' => $model->ownedBy, 'name' => 'owned_by', 'compact' => false])
             </div>
         </div>
     </div>
index c52390f73c4e7c453ecc71984efc1d2fa17011ba..9fda39a317c96e6536576d30d2d7a209e488ada4 100644 (file)
                 </ul>
             </div>
 
-            @foreach(['date_from', 'date_to'] as $filterKey)
-                <form action="{{ url('/settings/audit') }}" method="get" class="block mr-m">
-                    @foreach($listDetails as $param => $val)
-                        @if(!empty($val) && $param !== $filterKey)
-                            <input type="hidden" name="{{ $param }}" value="{{ $val }}">
-                        @endif
-                    @endforeach
-                    <label for="audit_filter_{{ $filterKey }}">{{ trans('settings.audit_' . $filterKey) }}</label>
-                    <input id="audit_filter_{{ $filterKey }}"
-                           component="submit-on-change"
-                           type="date"
-                           name="{{ $filterKey }}"
-                           value="{{ $listDetails[$filterKey] ?? '' }}">
-                </form>
-            @endforeach
+            <form action="{{ url('/settings/audit') }}" method="get" class="flex-container-row mr-m">
+                @if(!empty($listDetails['event']))
+                    <input type="hidden" name="event" value="{{ $listDetails['event'] }}">
+                @endif
+
+                @foreach(['date_from', 'date_to'] as $filterKey)
+                    <div class="mr-m">
+                        <label for="audit_filter_{{ $filterKey }}">{{ trans('settings.audit_' . $filterKey) }}</label>
+                        <input id="audit_filter_{{ $filterKey }}"
+                               component="submit-on-change"
+                               type="date"
+                               name="{{ $filterKey }}"
+                               value="{{ $listDetails[$filterKey] ?? '' }}">
+                    </div>
+                @endforeach
+
+                <div class="form-group ml-auto" component="submit-on-change">
+                    <label for="owner">{{ trans('settings.audit_table_user') }}</label>
+                    @include('components.user-select', ['user' => $listDetails['user'] ? \BookStack\Auth\User::query()->find($listDetails['user']) : null, 'name' => 'user', 'compact' =>  true])
+                </div>
+            </form>
         </div>
 
         <hr class="mt-l mb-s">
index aba6f5cc1f6de6cee8da0beec9b64a51fc563eab..7b1d38d340b1eb9cdf789806cf9a0421486be0f3 100644 (file)
@@ -20,7 +20,7 @@
                     <p class="small">{{ trans('settings.users_migrate_ownership_desc') }}</p>
                 </div>
                 <div>
-                    @include('components.user-select', ['name' => 'new_owner_id', 'user' => null])
+                    @include('components.user-select', ['name' => 'new_owner_id', 'user' => null, 'compact' => false])
                 </div>
             </div>
 
index 3dc6fd7c2ecfd46b19cde94ba81f04da4a8f5d9a..55a458786b2e2f4b4f7eacc56d8c089c65b80192 100644 (file)
@@ -4,6 +4,7 @@ use BookStack\Actions\Activity;
 use BookStack\Actions\ActivityService;
 use BookStack\Actions\ActivityType;
 use BookStack\Auth\UserRepo;
+use BookStack\Entities\Models\Chapter;
 use BookStack\Entities\Tools\TrashCan;
 use BookStack\Entities\Models\Page;
 use BookStack\Entities\Repos\PageRepo;
@@ -117,4 +118,26 @@ class AuditLogTest extends TestCase
         $resp->assertDontSeeText($page->name);
     }
 
+    public function test_user_filter()
+    {
+        $admin = $this->getAdmin();
+        $editor = $this->getEditor();
+        $this->actingAs($admin);
+        $page = Page::query()->first();
+        $this->activityService->addForEntity($page, ActivityType::PAGE_CREATE);
+
+        $this->actingAs($editor);
+        $chapter = Chapter::query()->first();
+        $this->activityService->addForEntity($chapter, ActivityType::CHAPTER_UPDATE);
+
+        $resp = $this->actingAs($admin)->get('settings/audit?user=' . $admin->id);
+        $resp->assertSeeText($page->name);
+        $resp->assertDontSeeText($chapter->name);
+
+        $resp = $this->actingAs($admin)->get('settings/audit?user=' . $editor->id);
+        $resp->assertSeeText($chapter->name);
+        $resp->assertDontSeeText($page->name);
+
+    }
+
 }
\ No newline at end of file
Morty Proxy This is a proxified and sanitized view of the page, visit original site.