2020-10-27 01:10:18 +01:00
import { Injectable } from '@angular/core' ;
import { PaperlessDocument } from 'src/app/data/paperless-document' ;
2020-11-25 18:01:43 +01:00
import { PaperlessDocumentMetadata } from 'src/app/data/paperless-document-metadata' ;
2020-10-27 01:10:18 +01:00
import { AbstractPaperlessService } from './abstract-paperless-service' ;
2020-12-27 12:54:47 +01:00
import { HttpClient , HttpParams } from '@angular/common/http' ;
2020-10-30 23:43:19 +01:00
import { Observable } from 'rxjs' ;
import { Results } from 'src/app/data/results' ;
import { FilterRule } from 'src/app/data/filter-rule' ;
2020-12-04 01:24:07 +01:00
import { map } from 'rxjs/operators' ;
import { CorrespondentService } from './correspondent.service' ;
import { DocumentTypeService } from './document-type.service' ;
import { TagService } from './tag.service' ;
2020-12-14 19:26:36 +01:00
import { FILTER_RULE_TYPES } from 'src/app/data/filter-rule-type' ;
2021-01-29 16:48:51 +01:00
import { PaperlessDocumentSuggestions } from 'src/app/data/paperless-document-suggestions' ;
2020-10-30 23:43:19 +01:00
export const DOCUMENT_SORT_FIELDS = [
2021-01-04 15:57:52 +01:00
{ field : 'archive_serial_number' , name : $localize ` ASN ` } ,
2020-12-23 15:09:39 +01:00
{ field : "correspondent__name" , name : $localize ` Correspondent ` } ,
{ field : 'title' , name : $localize ` Title ` } ,
2021-01-04 15:57:52 +01:00
{ field : "document_type__name" , name : $localize ` Document type ` } ,
2020-12-23 15:09:39 +01:00
{ field : 'created' , name : $localize ` Created ` } ,
{ field : 'added' , name : $localize ` Added ` } ,
{ field : 'modified' , name : $localize ` Modified ` }
2020-10-30 23:43:19 +01:00
]
2021-05-15 18:48:39 +02:00
export const DOCUMENT_SORT_FIELDS_FULLTEXT = [
. . . DOCUMENT_SORT_FIELDS ,
{ field : 'score' , name : $localize ` :Score is a value returned by the full text search engine and specifies how well a result matches the given query:Search score ` }
]
2020-12-27 12:54:47 +01:00
export interface SelectionDataItem {
id : number
document_count : number
}
export interface SelectionData {
2020-12-28 12:31:14 +01:00
selected_correspondents : SelectionDataItem [ ]
selected_tags : SelectionDataItem [ ]
selected_document_types : SelectionDataItem [ ]
2020-12-27 12:54:47 +01:00
}
2020-10-27 01:10:18 +01:00
@Injectable ( {
providedIn : 'root'
} )
export class DocumentService extends AbstractPaperlessService < PaperlessDocument > {
2021-04-05 16:35:15 -07:00
private _searchQuery : string
2021-04-03 13:10:39 -07:00
2021-04-05 16:35:15 -07:00
constructor ( http : HttpClient , private correspondentService : CorrespondentService , private documentTypeService : DocumentTypeService , private tagService : TagService ) {
2020-10-27 01:10:18 +01:00
super ( http , 'documents' )
}
2020-10-30 23:43:19 +01:00
private filterRulesToQueryParams ( filterRules : FilterRule [ ] ) {
if ( filterRules ) {
let params = { }
for ( let rule of filterRules ) {
2020-12-14 19:26:36 +01:00
let ruleType = FILTER_RULE_TYPES . find ( t = > t . id == rule . rule_type )
if ( ruleType . multi ) {
params [ ruleType . filtervar ] = params [ ruleType . filtervar ] ? params [ ruleType . filtervar ] + "," + rule.value : rule.value
2020-12-25 19:06:12 +01:00
} else if ( ruleType . isnull_filtervar && rule . value == null ) {
params [ ruleType . isnull_filtervar ] = true
2020-11-04 00:01:08 +01:00
} else {
2020-12-14 19:26:36 +01:00
params [ ruleType . filtervar ] = rule . value
2020-11-04 00:01:08 +01:00
}
2020-10-30 23:43:19 +01:00
}
return params
} else {
return null
}
}
2020-12-04 01:24:07 +01:00
addObservablesToDocument ( doc : PaperlessDocument ) {
if ( doc . correspondent ) {
doc . correspondent $ = this . correspondentService . getCached ( doc . correspondent )
}
if ( doc . document_type ) {
doc . document_type $ = this . documentTypeService . getCached ( doc . document_type )
}
if ( doc . tags ) {
doc . tags $ = this . tagService . getCachedMany ( doc . tags )
}
return doc
}
2020-12-15 03:13:22 +01:00
listFiltered ( page? : number , pageSize? : number , sortField? : string , sortReverse? : boolean , filterRules? : FilterRule [ ] , extraParams = { } ) : Observable < Results < PaperlessDocument > > {
return this . list ( page , pageSize , sortField , sortReverse , Object . assign ( extraParams , this . filterRulesToQueryParams ( filterRules ) ) ) . pipe (
2020-12-04 01:24:07 +01:00
map ( results = > {
results . results . forEach ( doc = > this . addObservablesToDocument ( doc ) )
return results
} )
)
2020-10-30 23:43:19 +01:00
}
2020-12-11 14:46:38 +01:00
listAllFilteredIds ( filterRules? : FilterRule [ ] ) : Observable < number [ ] > {
return this . listFiltered ( 1 , 100000 , null , null , filterRules , { "fields" : "id" } ) . pipe (
map ( response = > response . results . map ( doc = > doc . id ) )
)
}
2020-11-25 18:01:43 +01:00
getPreviewUrl ( id : number , original : boolean = false ) : string {
let url = this . getResourceUrl ( id , 'preview' )
2021-04-05 16:35:15 -07:00
if ( this . _searchQuery ) url += ` #search=" ${ this . _searchQuery } " `
2020-11-25 18:01:43 +01:00
if ( original ) {
url += "?original=true"
}
return url
2020-10-27 01:10:18 +01:00
}
getThumbUrl ( id : number ) : string {
2020-11-09 15:28:12 +01:00
return this . getResourceUrl ( id , 'thumb' )
2020-10-27 01:10:18 +01:00
}
2020-11-25 18:01:43 +01:00
getDownloadUrl ( id : number , original : boolean = false ) : string {
let url = this . getResourceUrl ( id , 'download' )
if ( original ) {
url += "?original=true"
}
return url
2020-10-27 01:10:18 +01:00
}
2020-10-27 17:35:10 +01:00
uploadDocument ( formData ) {
2020-12-08 00:45:11 +01:00
return this . http . post ( this . getResourceUrl ( null , 'post_document' ) , formData , { reportProgress : true , observe : "events" } )
2020-10-27 17:35:10 +01:00
}
2020-11-25 18:01:43 +01:00
getMetadata ( id : number ) : Observable < PaperlessDocumentMetadata > {
return this . http . get < PaperlessDocumentMetadata > ( this . getResourceUrl ( id , 'metadata' ) )
}
2020-12-11 14:46:38 +01:00
bulkEdit ( ids : number [ ] , method : string , args : any ) {
2020-11-30 13:58:40 +01:00
return this . http . post ( this . getResourceUrl ( null , 'bulk_edit' ) , {
2020-12-11 14:46:38 +01:00
'documents' : ids ,
2020-11-30 13:58:40 +01:00
'method' : method ,
2020-12-11 14:46:38 +01:00
'parameters' : args
2020-11-30 13:58:40 +01:00
} )
}
2020-12-28 12:31:14 +01:00
getSelectionData ( ids : number [ ] ) : Observable < SelectionData > {
2020-12-27 12:54:47 +01:00
return this . http . post < SelectionData > ( this . getResourceUrl ( null , 'selection_data' ) , { "documents" : ids } )
}
2021-01-29 16:48:51 +01:00
getSuggestions ( id : number ) : Observable < PaperlessDocumentSuggestions > {
return this . http . get < PaperlessDocumentSuggestions > ( this . getResourceUrl ( id , 'suggestions' ) )
}
2021-02-20 16:10:50 +01:00
bulkDownload ( ids : number [ ] , content = "both" ) {
return this . http . post ( this . getResourceUrl ( null , 'bulk_download' ) , { "documents" : ids , "content" : content } , { responseType : 'blob' } )
}
2021-04-05 16:35:15 -07:00
public set searchQuery ( query : string ) {
this . _searchQuery = query
2021-04-03 13:10:39 -07:00
}
2020-10-27 01:10:18 +01:00
}