mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-02 13:45:10 -05:00
Merge branch 'dev' into beta
This commit is contained in:
commit
85e2081e40
@ -41,7 +41,7 @@
|
||||
<option value="false" i18n>False</option>
|
||||
</select>
|
||||
} @else if (getCustomFieldByID(atom.field)?.data_type === CustomFieldDataType.Select) {
|
||||
<ng-select
|
||||
<ng-select #fieldSelects
|
||||
class="paperless-input-select rounded-end"
|
||||
[items]="getSelectOptionsForField(atom.field)"
|
||||
[(ngModel)]="atom.value"
|
||||
|
@ -1,4 +1,9 @@
|
||||
import { ComponentFixture, TestBed } from '@angular/core/testing'
|
||||
import {
|
||||
ComponentFixture,
|
||||
fakeAsync,
|
||||
TestBed,
|
||||
tick,
|
||||
} from '@angular/core/testing'
|
||||
import {
|
||||
CustomFieldQueriesModel,
|
||||
CustomFieldsQueryDropdownComponent,
|
||||
@ -20,6 +25,8 @@ import {
|
||||
CustomFieldQueryAtom,
|
||||
CustomFieldQueryElement,
|
||||
} from 'src/app/utils/custom-field-query-element'
|
||||
import { NgSelectModule } from '@ng-select/ng-select'
|
||||
import { FormsModule, ReactiveFormsModule } from '@angular/forms'
|
||||
|
||||
const customFields = [
|
||||
{
|
||||
@ -44,7 +51,13 @@ describe('CustomFieldsQueryDropdownComponent', () => {
|
||||
beforeEach(async () => {
|
||||
await TestBed.configureTestingModule({
|
||||
declarations: [CustomFieldsQueryDropdownComponent],
|
||||
imports: [NgbDropdownModule, NgxBootstrapIconsModule.pick(allIcons)],
|
||||
imports: [
|
||||
NgbDropdownModule,
|
||||
NgxBootstrapIconsModule.pick(allIcons),
|
||||
NgSelectModule,
|
||||
FormsModule,
|
||||
ReactiveFormsModule,
|
||||
],
|
||||
providers: [
|
||||
provideHttpClient(withInterceptorsFromDi()),
|
||||
provideHttpClientTesting(),
|
||||
@ -181,6 +194,15 @@ describe('CustomFieldsQueryDropdownComponent', () => {
|
||||
expect(component.name).toBe('test_title')
|
||||
})
|
||||
|
||||
it('should add a default atom on open and focus the select field', fakeAsync(() => {
|
||||
expect(component.selectionModel.queries.length).toBe(0)
|
||||
component.onOpenChange(true)
|
||||
fixture.detectChanges()
|
||||
tick()
|
||||
expect(component.selectionModel.queries.length).toBe(1)
|
||||
expect(window.document.activeElement.tagName).toBe('INPUT')
|
||||
}))
|
||||
|
||||
describe('CustomFieldQueriesModel', () => {
|
||||
let model: CustomFieldQueriesModel
|
||||
|
||||
|
@ -4,9 +4,12 @@ import {
|
||||
Input,
|
||||
OnDestroy,
|
||||
Output,
|
||||
QueryList,
|
||||
ViewChild,
|
||||
ViewChildren,
|
||||
} from '@angular/core'
|
||||
import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'
|
||||
import { NgSelectComponent } from '@ng-select/ng-select'
|
||||
import { Subject, first, takeUntil } from 'rxjs'
|
||||
import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field'
|
||||
import {
|
||||
@ -184,6 +187,8 @@ export class CustomFieldsQueryDropdownComponent implements OnDestroy {
|
||||
|
||||
@ViewChild('dropdown') dropdown: NgbDropdown
|
||||
|
||||
@ViewChildren(NgSelectComponent) fieldSelects!: QueryList<NgSelectComponent>
|
||||
|
||||
private _selectionModel: CustomFieldQueriesModel
|
||||
|
||||
@Input()
|
||||
@ -227,16 +232,32 @@ export class CustomFieldsQueryDropdownComponent implements OnDestroy {
|
||||
}
|
||||
|
||||
public onOpenChange(open: boolean) {
|
||||
if (open && this.selectionModel.queries.length === 0) {
|
||||
this.selectionModel.addExpression()
|
||||
if (open) {
|
||||
if (this.selectionModel.queries.length === 0) {
|
||||
this.selectionModel.addAtom(
|
||||
new CustomFieldQueryAtom([
|
||||
null,
|
||||
CustomFieldQueryOperator.Exists,
|
||||
'true',
|
||||
])
|
||||
)
|
||||
}
|
||||
if (
|
||||
this.selectionModel.queries.length === 1 &&
|
||||
(
|
||||
(this.selectionModel.queries[0] as CustomFieldQueryExpression)
|
||||
?.value[0] as CustomFieldQueryAtom
|
||||
)?.field === null
|
||||
) {
|
||||
setTimeout(() => {
|
||||
this.fieldSelects.first?.focus()
|
||||
}, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public get isActive(): boolean {
|
||||
return (
|
||||
(this.selectionModel.queries[0] as CustomFieldQueryExpression)?.value
|
||||
?.length > 0
|
||||
)
|
||||
return this.selectionModel.isValid()
|
||||
}
|
||||
|
||||
private getFields() {
|
||||
|
@ -101,7 +101,10 @@ import {
|
||||
CustomFieldQueryLogicalOperator,
|
||||
CustomFieldQueryOperator,
|
||||
} from 'src/app/data/custom-field-query'
|
||||
import { CustomFieldQueryAtom } from 'src/app/utils/custom-field-query-element'
|
||||
import {
|
||||
CustomFieldQueryAtom,
|
||||
CustomFieldQueryExpression,
|
||||
} from 'src/app/utils/custom-field-query-element'
|
||||
|
||||
const tags: Tag[] = [
|
||||
{
|
||||
@ -1441,15 +1444,12 @@ describe('FilterEditorComponent', () => {
|
||||
By.css('button')
|
||||
)
|
||||
customFieldToggleButton.triggerEventHandler('click')
|
||||
tick()
|
||||
fixture.detectChanges()
|
||||
const customFieldButtons = customFieldsQueryDropdown.queryAll(
|
||||
By.css('button')
|
||||
)
|
||||
customFieldButtons[1].triggerEventHandler('click')
|
||||
fixture.detectChanges()
|
||||
const query = component.customFieldQueriesModel
|
||||
.queries[0] as CustomFieldQueryAtom
|
||||
query.field = custom_fields[0].id
|
||||
const expression = component.customFieldQueriesModel
|
||||
.queries[0] as CustomFieldQueryExpression
|
||||
const atom = expression.value[0] as CustomFieldQueryAtom
|
||||
atom.field = custom_fields[0].id
|
||||
const fieldSelect: NgSelectComponent = customFieldsQueryDropdown.queryAll(
|
||||
By.directive(NgSelectComponent)
|
||||
)[0].componentInstance
|
||||
|
Loading…
x
Reference in New Issue
Block a user