Enhancement: filter by file type (#8946)

This commit is contained in:
shamoon
2025-02-10 08:09:50 -08:00
committed by GitHub
parent 880f08599a
commit 63bb3644f6
11 changed files with 175 additions and 52 deletions

View File

@@ -60,6 +60,7 @@ import {
FILTER_HAS_STORAGE_PATH_ANY,
FILTER_HAS_TAGS_ALL,
FILTER_HAS_TAGS_ANY,
FILTER_MIME_TYPE,
FILTER_OWNER,
FILTER_OWNER_ANY,
FILTER_OWNER_DOES_NOT_INCLUDE,
@@ -389,6 +390,18 @@ describe('FilterEditorComponent', () => {
expect(component.textFilterModifier).toEqual('less') // TEXT_FILTER_MODIFIER_LT
}))
it('should ingest text filter rules for mime type', fakeAsync(() => {
expect(component.textFilter).toEqual(null)
component.filterRules = [
{
rule_type: FILTER_MIME_TYPE,
value: 'pdf',
},
]
expect(component.textFilter).toEqual('pdf')
expect(component.textFilterTarget).toEqual('mime-type') // TEXT_FILTER_TARGET_MIME_TYPE
}))
it('should ingest text filter rules for fulltext query', fakeAsync(() => {
expect(component.textFilter).toEqual(null)
component.filterRules = [
@@ -1222,12 +1235,30 @@ describe('FilterEditorComponent', () => {
])
}))
it('should convert user input to correct filter rules on mime type', fakeAsync(() => {
component.textFilterInput.nativeElement.value = 'pdf'
component.textFilterInput.nativeElement.dispatchEvent(new Event('input'))
const textFieldTargetDropdown = fixture.debugElement.queryAll(
By.directive(NgbDropdownItem)
)[4]
textFieldTargetDropdown.triggerEventHandler('click') // TEXT_FILTER_TARGET_MIME_TYPE
fixture.detectChanges()
tick(400)
expect(component.textFilterTarget).toEqual('mime-type')
expect(component.filterRules).toEqual([
{
rule_type: FILTER_MIME_TYPE,
value: 'pdf',
},
])
}))
it('should convert user input to correct filter rules on full text query', fakeAsync(() => {
component.textFilterInput.nativeElement.value = 'foo'
component.textFilterInput.nativeElement.dispatchEvent(new Event('input'))
const textFieldTargetDropdown = fixture.debugElement.queryAll(
By.directive(NgbDropdownItem)
)[4]
)[5]
textFieldTargetDropdown.triggerEventHandler('click') // TEXT_FILTER_TARGET_ASN
fixture.detectChanges()
tick(400)
@@ -1594,7 +1625,7 @@ describe('FilterEditorComponent', () => {
component.textFilterInput.nativeElement.dispatchEvent(new Event('input'))
const textFieldTargetDropdown = fixture.debugElement.queryAll(
By.directive(NgbDropdownItem)
)[4]
)[5]
textFieldTargetDropdown.triggerEventHandler('click')
fixture.detectChanges()
tick(400)

View File

@@ -66,6 +66,7 @@ import {
FILTER_HAS_STORAGE_PATH_ANY,
FILTER_HAS_TAGS_ALL,
FILTER_HAS_TAGS_ANY,
FILTER_MIME_TYPE,
FILTER_OWNER,
FILTER_OWNER_ANY,
FILTER_OWNER_DOES_NOT_INCLUDE,
@@ -126,6 +127,7 @@ const TEXT_FILTER_TARGET_ASN = 'asn'
const TEXT_FILTER_TARGET_FULLTEXT_QUERY = 'fulltext-query'
const TEXT_FILTER_TARGET_FULLTEXT_MORELIKE = 'fulltext-morelike'
const TEXT_FILTER_TARGET_CUSTOM_FIELDS = 'custom-fields'
const TEXT_FILTER_TARGET_MIME_TYPE = 'mime-type'
const TEXT_FILTER_MODIFIER_EQUALS = 'equals'
const TEXT_FILTER_MODIFIER_NULL = 'is null'
@@ -165,6 +167,7 @@ const DEFAULT_TEXT_FILTER_TARGET_OPTIONS = [
id: TEXT_FILTER_TARGET_CUSTOM_FIELDS,
name: $localize`Custom fields`,
},
{ id: TEXT_FILTER_TARGET_MIME_TYPE, name: $localize`File type` },
{
id: TEXT_FILTER_TARGET_FULLTEXT_QUERY,
name: $localize`Advanced search`,
@@ -416,6 +419,10 @@ export class FilterEditorComponent
this._textFilter = rule.value
this.textFilterTarget = TEXT_FILTER_TARGET_CUSTOM_FIELDS
break
case FILTER_MIME_TYPE:
this.textFilterTarget = TEXT_FILTER_TARGET_MIME_TYPE
this._textFilter = rule.value
break
case FILTER_FULLTEXT_QUERY:
let allQueryArgs = rule.value.split(',')
let textQueryArgs = []
@@ -729,6 +736,15 @@ export class FilterEditorComponent
value: this._textFilter,
})
}
if (
this._textFilter &&
this.textFilterTarget == TEXT_FILTER_TARGET_MIME_TYPE
) {
filterRules.push({
rule_type: FILTER_MIME_TYPE,
value: this._textFilter,
})
}
if (
this._textFilter &&
this.textFilterTarget == TEXT_FILTER_TARGET_FULLTEXT_QUERY