mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-19 10:19:27 -05:00
151 lines
3.4 KiB
TypeScript
151 lines
3.4 KiB
TypeScript
import {
|
|
Component,
|
|
EventEmitter,
|
|
Input,
|
|
Output,
|
|
ViewChild,
|
|
} from '@angular/core'
|
|
import {
|
|
DEFAULT_DISPLAY_FIELDS,
|
|
DisplayField,
|
|
Document,
|
|
} from 'src/app/data/document'
|
|
import { DocumentService } from 'src/app/services/rest/document.service'
|
|
import { SettingsService } from 'src/app/services/settings.service'
|
|
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap'
|
|
import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
|
|
import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component'
|
|
|
|
@Component({
|
|
selector: 'pngx-document-card-large',
|
|
templateUrl: './document-card-large.component.html',
|
|
styleUrls: ['./document-card-large.component.scss'],
|
|
})
|
|
export class DocumentCardLargeComponent extends ComponentWithPermissions {
|
|
DisplayField = DisplayField
|
|
|
|
constructor(
|
|
private documentService: DocumentService,
|
|
public settingsService: SettingsService
|
|
) {
|
|
super()
|
|
}
|
|
|
|
@Input()
|
|
selected = false
|
|
|
|
@Input()
|
|
displayFields: string[] = DEFAULT_DISPLAY_FIELDS.map((f) => f.id)
|
|
|
|
@Output()
|
|
toggleSelected = new EventEmitter()
|
|
|
|
get selectable() {
|
|
return this.toggleSelected.observers.length > 0
|
|
}
|
|
|
|
@Input()
|
|
document: Document
|
|
|
|
@Output()
|
|
dblClickDocument = new EventEmitter()
|
|
|
|
@Output()
|
|
clickTag = new EventEmitter<number>()
|
|
|
|
@Output()
|
|
clickCorrespondent = new EventEmitter<number>()
|
|
|
|
@Output()
|
|
clickDocumentType = new EventEmitter<number>()
|
|
|
|
@Output()
|
|
clickStoragePath = new EventEmitter<number>()
|
|
|
|
@Output()
|
|
clickMoreLike = new EventEmitter()
|
|
|
|
@ViewChild('popover') popover: NgbPopover
|
|
|
|
mouseOnPreview = false
|
|
popoverHidden = true
|
|
|
|
get searchScoreClass() {
|
|
if (this.document.__search_hit__) {
|
|
if (this.document.__search_hit__.score > 0.7) {
|
|
return 'success'
|
|
} else if (this.document.__search_hit__.score > 0.3) {
|
|
return 'warning'
|
|
} else {
|
|
return 'danger'
|
|
}
|
|
}
|
|
}
|
|
|
|
get searchNoteHighlights() {
|
|
let highlights = []
|
|
if (
|
|
this.document['__search_hit__'] &&
|
|
this.document['__search_hit__'].note_highlights
|
|
) {
|
|
// only show notes with a match
|
|
highlights = (this.document['__search_hit__'].note_highlights as string)
|
|
.split(',')
|
|
.filter((highlight) => highlight.includes('<span'))
|
|
}
|
|
return highlights
|
|
}
|
|
|
|
getIsThumbInverted() {
|
|
return this.settingsService.get(SETTINGS_KEYS.DARK_MODE_THUMB_INVERTED)
|
|
}
|
|
|
|
getThumbUrl() {
|
|
return this.documentService.getThumbUrl(this.document.id)
|
|
}
|
|
|
|
getDownloadUrl() {
|
|
return this.documentService.getDownloadUrl(this.document.id)
|
|
}
|
|
|
|
get previewUrl() {
|
|
return this.documentService.getPreviewUrl(this.document.id)
|
|
}
|
|
|
|
mouseEnterPreview() {
|
|
this.mouseOnPreview = true
|
|
if (!this.popover.isOpen()) {
|
|
// we're going to open but hide to pre-load content during hover delay
|
|
this.popover.open()
|
|
this.popoverHidden = true
|
|
setTimeout(() => {
|
|
if (this.mouseOnPreview) {
|
|
// show popover
|
|
this.popoverHidden = false
|
|
} else {
|
|
this.popover.close()
|
|
}
|
|
}, 600)
|
|
}
|
|
}
|
|
|
|
mouseLeavePreview() {
|
|
this.mouseOnPreview = false
|
|
}
|
|
|
|
mouseLeaveCard() {
|
|
this.popover.close()
|
|
}
|
|
|
|
get contentTrimmed() {
|
|
return (
|
|
this.document.content.substring(0, 500) +
|
|
(this.document.content.length > 500 ? '...' : '')
|
|
)
|
|
}
|
|
|
|
get notesEnabled(): boolean {
|
|
return this.settingsService.get(SETTINGS_KEYS.NOTES_ENABLED)
|
|
}
|
|
}
|