]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Refine the suggestions dropdown ui a bit
authorshamoon <4887959+shamoon@users.noreply.github.com>
Mon, 21 Apr 2025 17:51:17 +0000 (10:51 -0700)
committershamoon <4887959+shamoon@users.noreply.github.com>
Wed, 2 Jul 2025 18:01:46 +0000 (11:01 -0700)
src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.html
src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.spec.ts
src-ui/src/app/components/common/suggestions-dropdown/suggestions-dropdown.component.ts

index 377a23ff6f88d3c4d45de3ad4612f6ee3520aa27..7f0edca8f1d3df6908f21765cb5585ae760e6519 100644 (file)
@@ -1,6 +1,5 @@
-<div ngbDropdown [popperOptions]="popperOptions">
-
-  <button type="button" class="btn btn-sm btn-outline-primary" (click)="getSuggestions.emit(this)" [disabled]="loading" ngbDropdownToggle>
+<div class="btn-group">
+  <button type="button" class="btn btn-sm btn-outline-primary" (click)="clickSuggest()" [disabled]="loading">
     @if (loading) {
       <div class="spinner-border spinner-border-sm" role="status"></div>
     } @else {
       <span class="badge bg-primary ms-2">{{ totalSuggestions }}</span>
     }
   </button>
+  <div class="btn-group" ngbDropdown #dropdown="ngbDropdown" [popperOptions]="popperOptions">
+
+    <button type="button" class="btn btn-sm btn-outline-primary" ngbDropdownToggle [disabled]="loading || !suggestions" aria-expanded="false" aria-controls="suggestionsDropdown" aria-label="Suggestions dropdown">
+      <span class="visually-hidden" i18n>Show suggestions</span>
+    </button>
 
-  <div ngbDropdownMenu aria-labelledby="suggestionsDropdown" class="shadow suggestions-dropdown">
-      <div class="list-group list-group-flush">
-        @if (suggestions?.suggested_tags.length > 0) {
-          <div class="list-group-item text-uppercase text-muted small">Tags</div>
-          @for (tag of suggestions.suggested_tags; track tag) {
-            <a class="list-group-item list-group-item-action bg-light small" (click)="addTag.emit(tag)" i18n>{{ tag }}</a>
+    <div ngbDropdownMenu aria-labelledby="suggestionsDropdown" class="shadow suggestions-dropdown">
+        <div class="list-group list-group-flush small">
+          @if (suggestions?.suggested_tags.length > 0) {
+            <small class="list-group-item text-uppercase text-muted small">Tags</small>
+            @for (tag of suggestions.suggested_tags; track tag) {
+              <button type="button" class="list-group-item list-group-item-action bg-light" (click)="addTag.emit(tag)" i18n>{{ tag }}</button>
+            }
           }
-        }
-        @if (suggestions?.suggested_document_types.length > 0) {
-          <div class="list-group-item text-uppercase text-muted small">Document Types</div>
-          @for (type of suggestions.suggested_document_types; track type) {
-            <a class="list-group-item list-group-item-action bg-light small" (click)="addDocumentType.emit(type)" i18n>{{ type }}</a>
+          @if (suggestions?.suggested_document_types.length > 0) {
+            <div class="list-group-item text-uppercase text-muted small">Document Types</div>
+            @for (type of suggestions.suggested_document_types; track type) {
+              <button type="button" class="list-group-item list-group-item-action bg-light" (click)="addDocumentType.emit(type)" i18n>{{ type }}</button>
+            }
           }
-        }
-        @if (suggestions?.suggested_correspondents.length > 0) {
-          <div class="list-group-item text-uppercase text-muted small">Correspondents</div>
-          @for (correspondent of suggestions.suggested_correspondents; track correspondent) {
-            <a class="list-group-item list-group-item-action bg-light small" (click)="addCorrespondent.emit(correspondent)" i18n>{{ correspondent }}</a>
+          @if (suggestions?.suggested_correspondents.length > 0) {
+            <div class="list-group-item text-uppercase text-muted small">Correspondents</div>
+            @for (correspondent of suggestions.suggested_correspondents; track correspondent) {
+              <button type="button" class="list-group-item list-group-item-action bg-light" (click)="addCorrespondent.emit(correspondent)" i18n>{{ correspondent }}</button>
+            }
           }
-        }
-      </div>
+        </div>
+    </div>
   </div>
 </div>
index 01407dfc66d7df54926c804072f3aee410f0bbca..6d202a1b163459dbe9fd5b7d9b24e4c6a2dd2cff 100644 (file)
@@ -29,4 +29,21 @@ describe('SuggestionsDropdownComponent', () => {
     }
     expect(component.totalSuggestions).toBe(4)
   })
+
+  it('should emit getSuggestions when clickSuggest is called and suggestions are null', () => {
+    jest.spyOn(component.getSuggestions, 'emit')
+    component.suggestions = null
+    component.clickSuggest()
+    expect(component.getSuggestions.emit).toHaveBeenCalled()
+  })
+
+  it('should toggle dropdown when clickSuggest is called and suggestions are not null', () => {
+    component.suggestions = {
+      suggested_correspondents: [],
+      suggested_tags: [],
+      suggested_document_types: [],
+    }
+    component.clickSuggest()
+    expect(component.dropdown.open).toBeTruthy()
+  })
 })
index bbdb12c6087e00e91940b355dc9db51d90255b8b..485c68627689d56a17eddef5e5390f26973c3a5d 100644 (file)
@@ -1,5 +1,11 @@
-import { Component, EventEmitter, Input, Output } from '@angular/core'
-import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
+import {
+  Component,
+  EventEmitter,
+  Input,
+  Output,
+  ViewChild,
+} from '@angular/core'
+import { NgbDropdown, NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap'
 import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
 import { DocumentSuggestions } from 'src/app/data/document-suggestions'
 import { pngxPopperOptions } from 'src/app/utils/popper-options'
@@ -13,6 +19,8 @@ import { pngxPopperOptions } from 'src/app/utils/popper-options'
 export class SuggestionsDropdownComponent {
   public popperOptions = pngxPopperOptions
 
+  @ViewChild('dropdown') dropdown: NgbDropdown
+
   @Input()
   suggestions: DocumentSuggestions = null
 
@@ -35,6 +43,14 @@ export class SuggestionsDropdownComponent {
   @Output()
   addCorrespondent: EventEmitter<string> = new EventEmitter()
 
+  public clickSuggest(): void {
+    if (!this.suggestions) {
+      this.getSuggestions.emit(this)
+    } else {
+      this.dropdown.toggle()
+    }
+  }
+
   get totalSuggestions(): number {
     return (
       this.suggestions?.suggested_correspondents?.length +