mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-08-12 00:19:48 +00:00
Enhancement: date picker and date filter dropdown improvements (#9033)
This commit is contained in:
@@ -94,11 +94,11 @@
|
||||
<pngx-dates-dropdown class="flex-fill fade" [class.show]="show"
|
||||
title="Dates" i18n-title
|
||||
(datesSet)="updateRules()"
|
||||
[(createdDateBefore)]="dateCreatedBefore"
|
||||
[(createdDateAfter)]="dateCreatedAfter"
|
||||
[(createdDateTo)]="dateCreatedTo"
|
||||
[(createdDateFrom)]="dateCreatedFrom"
|
||||
[(createdRelativeDate)]="dateCreatedRelativeDate"
|
||||
[(addedDateBefore)]="dateAddedBefore"
|
||||
[(addedDateAfter)]="dateAddedAfter"
|
||||
[(addedDateTo)]="dateAddedTo"
|
||||
[(addedDateFrom)]="dateAddedFrom"
|
||||
[(addedRelativeDate)]="dateAddedRelativeDate">
|
||||
</pngx-dates-dropdown>
|
||||
<pngx-permissions-filter-dropdown class="flex-fill fade" [class.show]="show"
|
||||
|
@@ -32,6 +32,8 @@ import { DocumentType } from 'src/app/data/document-type'
|
||||
import {
|
||||
FILTER_ADDED_AFTER,
|
||||
FILTER_ADDED_BEFORE,
|
||||
FILTER_ADDED_FROM,
|
||||
FILTER_ADDED_TO,
|
||||
FILTER_ASN,
|
||||
FILTER_ASN_GT,
|
||||
FILTER_ASN_ISNULL,
|
||||
@@ -39,6 +41,8 @@ import {
|
||||
FILTER_CORRESPONDENT,
|
||||
FILTER_CREATED_AFTER,
|
||||
FILTER_CREATED_BEFORE,
|
||||
FILTER_CREATED_FROM,
|
||||
FILTER_CREATED_TO,
|
||||
FILTER_CUSTOM_FIELDS_QUERY,
|
||||
FILTER_CUSTOM_FIELDS_TEXT,
|
||||
FILTER_DOCUMENT_TYPE,
|
||||
@@ -465,48 +469,92 @@ describe('FilterEditorComponent', () => {
|
||||
])
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date created after', fakeAsync(() => {
|
||||
expect(component.dateCreatedAfter).toBeNull()
|
||||
it('should ingest filter rules for date created after and adjust date by 1 day', fakeAsync(() => {
|
||||
expect(component.dateCreatedFrom).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_CREATED_AFTER,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateCreatedAfter).toEqual('2023-05-14')
|
||||
expect(component.dateCreatedFrom).toEqual('2023-05-15')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date created before', fakeAsync(() => {
|
||||
expect(component.dateCreatedBefore).toBeNull()
|
||||
it('should ingest filter rules for date created from', fakeAsync(() => {
|
||||
expect(component.dateCreatedFrom).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_CREATED_FROM,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateCreatedFrom).toEqual('2023-05-14')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date created before and adjust date by 1 day', fakeAsync(() => {
|
||||
expect(component.dateCreatedTo).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_CREATED_BEFORE,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateCreatedBefore).toEqual('2023-05-14')
|
||||
expect(component.dateCreatedTo).toEqual('2023-05-13')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date added after', fakeAsync(() => {
|
||||
expect(component.dateAddedAfter).toBeNull()
|
||||
it('should ingest filter rules for date created to', fakeAsync(() => {
|
||||
expect(component.dateCreatedTo).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_CREATED_TO,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateCreatedTo).toEqual('2023-05-14')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date added after and adjust date by 1 day', fakeAsync(() => {
|
||||
expect(component.dateAddedFrom).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_ADDED_AFTER,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateAddedAfter).toEqual('2023-05-14')
|
||||
expect(component.dateAddedFrom).toEqual('2023-05-15')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date added before', fakeAsync(() => {
|
||||
expect(component.dateAddedBefore).toBeNull()
|
||||
it('should ingest filter rules for date added from', fakeAsync(() => {
|
||||
expect(component.dateAddedFrom).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_ADDED_FROM,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateAddedFrom).toEqual('2023-05-14')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date added before and adjust date by 1 day', fakeAsync(() => {
|
||||
expect(component.dateAddedTo).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_ADDED_BEFORE,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateAddedBefore).toEqual('2023-05-14')
|
||||
expect(component.dateAddedTo).toEqual('2023-05-13')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for date added to', fakeAsync(() => {
|
||||
expect(component.dateAddedTo).toBeNull()
|
||||
component.filterRules = [
|
||||
{
|
||||
rule_type: FILTER_ADDED_TO,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
]
|
||||
expect(component.dateAddedTo).toEqual('2023-05-14')
|
||||
}))
|
||||
|
||||
it('should ingest filter rules for has all tags', fakeAsync(() => {
|
||||
@@ -1464,7 +1512,7 @@ describe('FilterEditorComponent', () => {
|
||||
])
|
||||
}))
|
||||
|
||||
it('should convert user input to correct filter rules on date created after', fakeAsync(() => {
|
||||
it('should convert user input to correct filter rules on date created from', fakeAsync(() => {
|
||||
const dateCreatedDropdown = fixture.debugElement.queryAll(
|
||||
By.directive(DatesDropdownComponent)
|
||||
)[0]
|
||||
@@ -1473,18 +1521,18 @@ describe('FilterEditorComponent', () => {
|
||||
dateCreatedAfter.nativeElement.value = '05/14/2023'
|
||||
// dateCreatedAfter.triggerEventHandler('change')
|
||||
// TODO: why isn't ngModel triggering this on change?
|
||||
component.dateCreatedAfter = '2023-05-14'
|
||||
component.dateCreatedFrom = '2023-05-14'
|
||||
fixture.detectChanges()
|
||||
tick(400)
|
||||
expect(component.filterRules).toEqual([
|
||||
{
|
||||
rule_type: FILTER_CREATED_AFTER,
|
||||
rule_type: FILTER_CREATED_FROM,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
])
|
||||
}))
|
||||
|
||||
it('should convert user input to correct filter rules on date created before', fakeAsync(() => {
|
||||
it('should convert user input to correct filter rules on date created to', fakeAsync(() => {
|
||||
const dateCreatedDropdown = fixture.debugElement.queryAll(
|
||||
By.directive(DatesDropdownComponent)
|
||||
)[0]
|
||||
@@ -1493,12 +1541,12 @@ describe('FilterEditorComponent', () => {
|
||||
dateCreatedBefore.nativeElement.value = '05/14/2023'
|
||||
// dateCreatedBefore.triggerEventHandler('change')
|
||||
// TODO: why isn't ngModel triggering this on change?
|
||||
component.dateCreatedBefore = '2023-05-14'
|
||||
component.dateCreatedTo = '2023-05-14'
|
||||
fixture.detectChanges()
|
||||
tick(400)
|
||||
expect(component.filterRules).toEqual([
|
||||
{
|
||||
rule_type: FILTER_CREATED_BEFORE,
|
||||
rule_type: FILTER_CREATED_TO,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
])
|
||||
@@ -1578,12 +1626,12 @@ describe('FilterEditorComponent', () => {
|
||||
dateAddedAfter.nativeElement.value = '05/14/2023'
|
||||
// dateAddedAfter.triggerEventHandler('change')
|
||||
// TODO: why isn't ngModel triggering this on change?
|
||||
component.dateAddedAfter = '2023-05-14'
|
||||
component.dateAddedFrom = '2023-05-14'
|
||||
fixture.detectChanges()
|
||||
tick(400)
|
||||
expect(component.filterRules).toEqual([
|
||||
{
|
||||
rule_type: FILTER_ADDED_AFTER,
|
||||
rule_type: FILTER_ADDED_FROM,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
])
|
||||
@@ -1598,12 +1646,12 @@ describe('FilterEditorComponent', () => {
|
||||
dateAddedBefore.nativeElement.value = '05/14/2023'
|
||||
// dateAddedBefore.triggerEventHandler('change')
|
||||
// TODO: why isn't ngModel triggering this on change?
|
||||
component.dateAddedBefore = '2023-05-14'
|
||||
component.dateAddedTo = '2023-05-14'
|
||||
fixture.detectChanges()
|
||||
tick(400)
|
||||
expect(component.filterRules).toEqual([
|
||||
{
|
||||
rule_type: FILTER_ADDED_BEFORE,
|
||||
rule_type: FILTER_ADDED_TO,
|
||||
value: '2023-05-14',
|
||||
},
|
||||
])
|
||||
|
@@ -38,6 +38,8 @@ import { FilterRule } from 'src/app/data/filter-rule'
|
||||
import {
|
||||
FILTER_ADDED_AFTER,
|
||||
FILTER_ADDED_BEFORE,
|
||||
FILTER_ADDED_FROM,
|
||||
FILTER_ADDED_TO,
|
||||
FILTER_ASN,
|
||||
FILTER_ASN_GT,
|
||||
FILTER_ASN_ISNULL,
|
||||
@@ -45,6 +47,8 @@ import {
|
||||
FILTER_CORRESPONDENT,
|
||||
FILTER_CREATED_AFTER,
|
||||
FILTER_CREATED_BEFORE,
|
||||
FILTER_CREATED_FROM,
|
||||
FILTER_CREATED_TO,
|
||||
FILTER_CUSTOM_FIELDS_QUERY,
|
||||
FILTER_CUSTOM_FIELDS_TEXT,
|
||||
FILTER_DOCUMENT_TYPE,
|
||||
@@ -133,19 +137,19 @@ const RELATIVE_DATE_QUERY_REGEXP_CREATED = /created:\[([^\]]+)\]/g
|
||||
const RELATIVE_DATE_QUERY_REGEXP_ADDED = /added:\[([^\]]+)\]/g
|
||||
const RELATIVE_DATE_QUERYSTRINGS = [
|
||||
{
|
||||
relativeDate: RelativeDate.LAST_7_DAYS,
|
||||
relativeDate: RelativeDate.WITHIN_1_WEEK,
|
||||
dateQuery: '-1 week to now',
|
||||
},
|
||||
{
|
||||
relativeDate: RelativeDate.LAST_MONTH,
|
||||
relativeDate: RelativeDate.WITHIN_1_MONTH,
|
||||
dateQuery: '-1 month to now',
|
||||
},
|
||||
{
|
||||
relativeDate: RelativeDate.LAST_3_MONTHS,
|
||||
relativeDate: RelativeDate.WITHIN_3_MONTHS,
|
||||
dateQuery: '-3 month to now',
|
||||
},
|
||||
{
|
||||
relativeDate: RelativeDate.LAST_YEAR,
|
||||
relativeDate: RelativeDate.WITHIN_1_YEAR,
|
||||
dateQuery: '-1 year to now',
|
||||
},
|
||||
]
|
||||
@@ -349,10 +353,10 @@ export class FilterEditorComponent
|
||||
storagePathSelectionModel = new FilterableDropdownSelectionModel()
|
||||
customFieldQueriesModel = new CustomFieldQueriesModel()
|
||||
|
||||
dateCreatedBefore: string
|
||||
dateCreatedAfter: string
|
||||
dateAddedBefore: string
|
||||
dateAddedAfter: string
|
||||
dateCreatedTo: string
|
||||
dateCreatedFrom: string
|
||||
dateAddedTo: string
|
||||
dateAddedFrom: string
|
||||
dateCreatedRelativeDate: RelativeDate
|
||||
dateAddedRelativeDate: RelativeDate
|
||||
|
||||
@@ -385,10 +389,10 @@ export class FilterEditorComponent
|
||||
this.customFieldQueriesModel.clear(false)
|
||||
this._textFilter = null
|
||||
this._moreLikeId = null
|
||||
this.dateAddedBefore = null
|
||||
this.dateAddedAfter = null
|
||||
this.dateCreatedBefore = null
|
||||
this.dateCreatedAfter = null
|
||||
this.dateAddedTo = null
|
||||
this.dateAddedFrom = null
|
||||
this.dateCreatedTo = null
|
||||
this.dateCreatedFrom = null
|
||||
this.dateCreatedRelativeDate = null
|
||||
this.dateAddedRelativeDate = null
|
||||
this.textFilterModifier = TEXT_FILTER_MODIFIER_EQUALS
|
||||
@@ -458,16 +462,40 @@ export class FilterEditorComponent
|
||||
})
|
||||
break
|
||||
case FILTER_CREATED_AFTER:
|
||||
this.dateCreatedAfter = rule.value
|
||||
// Old rules require adjusting date by a day
|
||||
const createdAfter = new Date(rule.value)
|
||||
createdAfter.setDate(createdAfter.getDate() + 1)
|
||||
this.dateCreatedFrom = createdAfter.toISOString().split('T')[0]
|
||||
break
|
||||
case FILTER_CREATED_BEFORE:
|
||||
this.dateCreatedBefore = rule.value
|
||||
// Old rules require adjusting date by a day
|
||||
const createdBefore = new Date(rule.value)
|
||||
createdBefore.setDate(createdBefore.getDate() - 1)
|
||||
this.dateCreatedTo = createdBefore.toISOString().split('T')[0]
|
||||
break
|
||||
case FILTER_ADDED_AFTER:
|
||||
this.dateAddedAfter = rule.value
|
||||
// Old rules require adjusting date by a day
|
||||
const addedAfter = new Date(rule.value)
|
||||
addedAfter.setDate(addedAfter.getDate() + 1)
|
||||
this.dateAddedFrom = addedAfter.toISOString().split('T')[0]
|
||||
break
|
||||
case FILTER_ADDED_BEFORE:
|
||||
this.dateAddedBefore = rule.value
|
||||
// Old rules require adjusting date by a day
|
||||
const addedBefore = new Date(rule.value)
|
||||
addedBefore.setDate(addedBefore.getDate() - 1)
|
||||
this.dateAddedTo = addedBefore.toISOString().split('T')[0]
|
||||
break
|
||||
case FILTER_CREATED_FROM:
|
||||
this.dateCreatedFrom = rule.value
|
||||
break
|
||||
case FILTER_CREATED_TO:
|
||||
this.dateCreatedTo = rule.value
|
||||
break
|
||||
case FILTER_ADDED_FROM:
|
||||
this.dateAddedFrom = rule.value
|
||||
break
|
||||
case FILTER_ADDED_TO:
|
||||
this.dateAddedTo = rule.value
|
||||
break
|
||||
case FILTER_HAS_TAGS_ALL:
|
||||
this.tagSelectionModel.logicalOperator = LogicalOperator.And
|
||||
@@ -814,28 +842,28 @@ export class FilterEditorComponent
|
||||
value: JSON.stringify(queries[0]),
|
||||
})
|
||||
}
|
||||
if (this.dateCreatedBefore) {
|
||||
if (this.dateCreatedTo) {
|
||||
filterRules.push({
|
||||
rule_type: FILTER_CREATED_BEFORE,
|
||||
value: this.dateCreatedBefore,
|
||||
rule_type: FILTER_CREATED_TO,
|
||||
value: this.dateCreatedTo,
|
||||
})
|
||||
}
|
||||
if (this.dateCreatedAfter) {
|
||||
if (this.dateCreatedFrom) {
|
||||
filterRules.push({
|
||||
rule_type: FILTER_CREATED_AFTER,
|
||||
value: this.dateCreatedAfter,
|
||||
rule_type: FILTER_CREATED_FROM,
|
||||
value: this.dateCreatedFrom,
|
||||
})
|
||||
}
|
||||
if (this.dateAddedBefore) {
|
||||
if (this.dateAddedTo) {
|
||||
filterRules.push({
|
||||
rule_type: FILTER_ADDED_BEFORE,
|
||||
value: this.dateAddedBefore,
|
||||
rule_type: FILTER_ADDED_TO,
|
||||
value: this.dateAddedTo,
|
||||
})
|
||||
}
|
||||
if (this.dateAddedAfter) {
|
||||
if (this.dateAddedFrom) {
|
||||
filterRules.push({
|
||||
rule_type: FILTER_ADDED_AFTER,
|
||||
value: this.dateAddedAfter,
|
||||
rule_type: FILTER_ADDED_FROM,
|
||||
value: this.dateAddedFrom,
|
||||
})
|
||||
}
|
||||
if (
|
||||
|
Reference in New Issue
Block a user