-<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>
}
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()
+ })
})
-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'
export class SuggestionsDropdownComponent {
public popperOptions = pngxPopperOptions
+ @ViewChild('dropdown') dropdown: NgbDropdown
+
@Input()
suggestions: DocumentSuggestions = null
@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 +