mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2026-10-06 08:10:35 +00:00
* Feature: store barcode contents, list and search them New setting PAPERLESS_CONSUMER_STORE_BARCODE_VALUES (off by default) stores all barcodes found during consumption with the document: page, type and content. They are listed on the metadata tab with a copy button, returned by the documents API and searchable with barcodes: in the advanced search. Versions keep their own barcodes, reprocessing reads them again. Refs #9898 * Tests: cover the remaining barcode branches Covers unchanged and failing barcode reads on reprocessing, unsupported files and DocumentBarcode.__str__, and uses toHaveLength in the barcode list spec as suggested by SonarCloud. * Address review: keep barcodes when they can't be read, format choices - Reprocessing and new versions keep the stored barcodes when the file can't be scanned or the scan fails, and replace them atomically. - Format is a TextChoices of the zxing-cpp formats, with a test. - Shared scan code, latest_version helper, TypedDict, serializer reuse. - Barcodes in the split manifest, export/import tests, pytest-style tests. * Barcode tests: TIFF reprocess, format check both ways, fixtures - Reprocessing a TIFF with TIFF support off keeps the stored barcodes. - The format test also fails when zxing-cpp drops a format. - Fixtures in place of the sample dir mixin, plugin-level disabled test. - Format labels aren't translated, OpenAPI enum named BarcodeFormatEnum. * Review: module-level zxing reader, shorter barcode docs - read_barcodes_zxing is a module-level function used by scan_pdf. - Drop the trivial __str__ test, mark it no cover. - Shorten the barcode docs and remove the duplicate in configuration.md. * Fix header * Use utility class * Return barcodes from the metadata endpoint only Drop the barcodes field and its prefetches from the document serializer, as agreed in the review. Also remove the now empty component stylesheet. --------- Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
39 lines
1.2 KiB
TypeScript
39 lines
1.2 KiB
TypeScript
import { Clipboard } from '@angular/cdk/clipboard'
|
|
import { Component, inject, input, OnDestroy, signal } from '@angular/core'
|
|
import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
|
|
import { DocumentBarcode } from 'src/app/data/document-barcode'
|
|
|
|
@Component({
|
|
selector: 'pngx-document-barcodes',
|
|
templateUrl: './document-barcodes.component.html',
|
|
imports: [NgxBootstrapIconsModule],
|
|
})
|
|
export class DocumentBarcodesComponent implements OnDestroy {
|
|
private readonly clipboard = inject(Clipboard)
|
|
|
|
readonly barcodes = input<DocumentBarcode[]>([])
|
|
|
|
readonly copiedIndex = signal<number>(null)
|
|
private copyTimeout: ReturnType<typeof setTimeout>
|
|
|
|
public isLink(value: string): boolean {
|
|
try {
|
|
const url = new URL(value.trim())
|
|
return ['http:', 'https:'].includes(url.protocol) && !!url.host
|
|
} catch {
|
|
return false
|
|
}
|
|
}
|
|
|
|
public copy(index: number) {
|
|
if (!this.clipboard.copy(this.barcodes()[index].value)) return
|
|
this.copiedIndex.set(index)
|
|
clearTimeout(this.copyTimeout)
|
|
this.copyTimeout = setTimeout(() => this.copiedIndex.set(null), 3000)
|
|
}
|
|
|
|
ngOnDestroy(): void {
|
|
clearTimeout(this.copyTimeout)
|
|
}
|
|
}
|