diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.spec.ts b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.spec.ts index e445a73b7..c119a2c93 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.spec.ts @@ -135,4 +135,10 @@ describe('DateDropdownComponent', () => { input.dispatchEvent(event) expect(eventSpy).toHaveBeenCalled() }) + + it('should correctly pass open state', () => { + expect(component.isOpen()).toBeFalsy() + component.dropdown.open() + expect(component.isOpen()).toBeTruthy() + }) }) diff --git a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.ts b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.ts index f47489699..73337086f 100644 --- a/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.ts +++ b/src-ui/src/app/components/common/date-dropdown/date-dropdown.component.ts @@ -5,8 +5,9 @@ import { Output, OnInit, OnDestroy, + ViewChild, } from '@angular/core' -import { NgbDateAdapter } from '@ng-bootstrap/ng-bootstrap' +import { NgbDateAdapter, NgbDropdown } from '@ng-bootstrap/ng-bootstrap' import { Subject, Subscription } from 'rxjs' import { debounceTime } from 'rxjs/operators' import { SettingsService } from 'src/app/services/settings.service' @@ -88,6 +89,8 @@ export class DateDropdownComponent implements OnInit, OnDestroy { @Input() disabled: boolean = false + @ViewChild(NgbDropdown) dropdown: NgbDropdown + get isActive(): boolean { return ( this.relativeDate !== null || @@ -96,6 +99,10 @@ export class DateDropdownComponent implements OnInit, OnDestroy { ) } + public isOpen(): boolean { + return this.dropdown.isOpen() + } + private datesSetDebounce$ = new Subject() private sub: Subscription diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts index fe377cc70..22d693a53 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts @@ -577,4 +577,13 @@ describe('FilterableDropdownComponent & FilterableDropdownSelectionModel', () => expect(selectionModel.getSelectedItems()).toEqual([items[0]]) expect(selectionModel.getExcludedItems()).toEqual([items[1]]) }) + + it('should correctly pass open state', () => { + component.items = items + component.icon = 'tag-fill' + fixture.detectChanges() + expect(component.isOpen()).toBeFalsy() + component.dropdown.open() + expect(component.isOpen()).toBeTruthy() + }) }) diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts index 4f39d32c3..78f9ae3a6 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts @@ -425,6 +425,10 @@ export class FilterableDropdownComponent { modelIsDirty: boolean = false + public isOpen(): boolean { + return this.dropdown.isOpen() + } + private keyboardIndex: number constructor(private filterPipe: FilterPipe) { diff --git a/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.spec.ts b/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.spec.ts index eb9dfed7b..c9a582980 100644 --- a/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.spec.ts @@ -165,4 +165,10 @@ describe('PermissionsFilterDropdownComponent', () => { userID: null, }) }) + + it('should correctly pass open state', () => { + expect(component.isOpen()).toBeFalsy() + component.dropdown.open() + expect(component.isOpen()).toBeTruthy() + }) }) diff --git a/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.ts b/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.ts index b0c3e8817..dc84467f3 100644 --- a/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.ts +++ b/src-ui/src/app/components/common/permissions-filter-dropdown/permissions-filter-dropdown.component.ts @@ -1,4 +1,10 @@ -import { Component, EventEmitter, Input, Output } from '@angular/core' +import { + Component, + EventEmitter, + Input, + Output, + ViewChild, +} from '@angular/core' import { first } from 'rxjs' import { User } from 'src/app/data/user' import { @@ -9,6 +15,7 @@ import { import { UserService } from 'src/app/services/rest/user.service' import { SettingsService } from 'src/app/services/settings.service' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' +import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap' export class PermissionsSelectionModel { ownerFilter: OwnerFilterType @@ -59,6 +66,8 @@ export class PermissionsFilterDropdownComponent extends ComponentWithPermissions hideUnowned: boolean + @ViewChild(NgbDropdown) dropdown: NgbDropdown + get isActive(): boolean { return ( this.selectionModel.ownerFilter !== OwnerFilterType.NONE || @@ -66,6 +75,10 @@ export class PermissionsFilterDropdownComponent extends ComponentWithPermissions ) } + public isOpen(): boolean { + return this.dropdown.isOpen() + } + constructor( public permissionsService: PermissionsService, userService: UserService, diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts index 127d7ef2b..c06af89ae 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts @@ -1179,4 +1179,16 @@ describe('BulkEditorComponent', () => { ) expect(component.storagePaths).toEqual(storagePaths.results) }) + + it('should correctly pass open state from dropdowns', () => { + jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) + fixture.detectChanges() + expect(component.hasOpenMenu).toBeFalsy() + component.filterableDropdowns = [ + { + isOpen: () => true, + } as any, + ] + expect(component.hasOpenMenu).toBeTruthy() + }) }) diff --git a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts index 556a1ff13..455d9f56c 100644 --- a/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts +++ b/src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -1,4 +1,4 @@ -import { Component, OnDestroy, OnInit } from '@angular/core' +import { Component, OnDestroy, OnInit, ViewChildren } from '@angular/core' import { Tag } from 'src/app/data/tag' import { Correspondent } from 'src/app/data/correspondent' import { DocumentType } from 'src/app/data/document-type' @@ -6,7 +6,7 @@ import { TagService } from 'src/app/services/rest/tag.service' import { CorrespondentService } from 'src/app/services/rest/correspondent.service' import { DocumentTypeService } from 'src/app/services/rest/document-type.service' import { DocumentListViewService } from 'src/app/services/document-list-view.service' -import { NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap' +import { NgbDropdown, NgbModal, NgbModalRef } from '@ng-bootstrap/ng-bootstrap' import { DocumentService, SelectionDataItem, @@ -15,6 +15,7 @@ import { OpenDocumentsService } from 'src/app/services/open-documents.service' import { ConfirmDialogComponent } from 'src/app/components/common/confirm-dialog/confirm-dialog.component' import { ChangedItems, + FilterableDropdownComponent, FilterableDropdownSelectionModel, } from '../../common/filterable-dropdown/filterable-dropdown.component' import { ToggleableItemState } from '../../common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component' @@ -74,6 +75,10 @@ export class BulkEditorComponent downloadUseFormatting: new FormControl(false), }) + @ViewChildren(NgbDropdown) dropdowns: NgbDropdown[] + @ViewChildren(FilterableDropdownComponent) + filterableDropdowns: FilterableDropdownComponent[] + constructor( private documentTypeService: DocumentTypeService, private tagService: TagService, @@ -121,6 +126,13 @@ export class BulkEditorComponent return ownsAll } + get hasOpenMenu(): boolean { + return ( + this.filterableDropdowns.some((d) => d.isOpen()) || + this.dropdowns.some((d) => d.isOpen()) + ) + } + ngOnInit() { if ( this.permissionService.currentUserCan( diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index 3cce1496b..8f98ffe2f 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -81,7 +81,7 @@