mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-02 13:45:10 -05:00
149 lines
5.1 KiB
TypeScript
149 lines
5.1 KiB
TypeScript
import { Component, OnInit } from '@angular/core'
|
|
import {
|
|
NgbDropdownModule,
|
|
NgbModal,
|
|
NgbPaginationModule,
|
|
} from '@ng-bootstrap/ng-bootstrap'
|
|
import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons'
|
|
import { delay, takeUntil, tap } from 'rxjs'
|
|
import { CustomField, DATA_TYPE_LABELS } from 'src/app/data/custom-field'
|
|
import {
|
|
CustomFieldQueryLogicalOperator,
|
|
CustomFieldQueryOperator,
|
|
} from 'src/app/data/custom-field-query'
|
|
import { FILTER_CUSTOM_FIELDS_QUERY } from 'src/app/data/filter-rule-type'
|
|
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
|
|
import { DocumentListViewService } from 'src/app/services/document-list-view.service'
|
|
import { PermissionsService } from 'src/app/services/permissions.service'
|
|
import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service'
|
|
import { DocumentService } from 'src/app/services/rest/document.service'
|
|
import { SavedViewService } from 'src/app/services/rest/saved-view.service'
|
|
import { SettingsService } from 'src/app/services/settings.service'
|
|
import { ToastService } from 'src/app/services/toast.service'
|
|
import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component'
|
|
import { CustomFieldEditDialogComponent } from '../../common/edit-dialog/custom-field-edit-dialog/custom-field-edit-dialog.component'
|
|
import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component'
|
|
import { PageHeaderComponent } from '../../common/page-header/page-header.component'
|
|
import { LoadingComponentWithPermissions } from '../../loading-component/loading.component'
|
|
|
|
@Component({
|
|
selector: 'pngx-custom-fields',
|
|
templateUrl: './custom-fields.component.html',
|
|
styleUrls: ['./custom-fields.component.scss'],
|
|
imports: [
|
|
PageHeaderComponent,
|
|
IfPermissionsDirective,
|
|
NgbDropdownModule,
|
|
NgbPaginationModule,
|
|
NgxBootstrapIconsModule,
|
|
],
|
|
})
|
|
export class CustomFieldsComponent
|
|
extends LoadingComponentWithPermissions
|
|
implements OnInit
|
|
{
|
|
public fields: CustomField[] = []
|
|
|
|
constructor(
|
|
private customFieldsService: CustomFieldsService,
|
|
public permissionsService: PermissionsService,
|
|
private modalService: NgbModal,
|
|
private toastService: ToastService,
|
|
private documentListViewService: DocumentListViewService,
|
|
private settingsService: SettingsService,
|
|
private documentService: DocumentService,
|
|
private savedViewService: SavedViewService
|
|
) {
|
|
super()
|
|
}
|
|
|
|
ngOnInit() {
|
|
this.reload()
|
|
}
|
|
|
|
reload() {
|
|
this.customFieldsService
|
|
.listAll()
|
|
.pipe(
|
|
takeUntil(this.unsubscribeNotifier),
|
|
tap((r) => {
|
|
this.fields = r.results
|
|
}),
|
|
delay(100)
|
|
)
|
|
.subscribe(() => {
|
|
this.show = true
|
|
this.loading = false
|
|
})
|
|
}
|
|
|
|
editField(field: CustomField) {
|
|
const modal = this.modalService.open(CustomFieldEditDialogComponent)
|
|
modal.componentInstance.dialogMode = field
|
|
? EditDialogMode.EDIT
|
|
: EditDialogMode.CREATE
|
|
modal.componentInstance.object = field
|
|
modal.componentInstance.succeeded
|
|
.pipe(takeUntil(this.unsubscribeNotifier))
|
|
.subscribe((newField) => {
|
|
this.toastService.showInfo($localize`Saved field "${newField.name}".`)
|
|
this.customFieldsService.clearCache()
|
|
this.settingsService.initializeDisplayFields()
|
|
this.documentService.reload()
|
|
this.reload()
|
|
})
|
|
modal.componentInstance.failed
|
|
.pipe(takeUntil(this.unsubscribeNotifier))
|
|
.subscribe((e) => {
|
|
this.toastService.showError($localize`Error saving field.`, e)
|
|
})
|
|
}
|
|
|
|
deleteField(field: CustomField) {
|
|
const modal = this.modalService.open(ConfirmDialogComponent, {
|
|
backdrop: 'static',
|
|
})
|
|
modal.componentInstance.title = $localize`Confirm delete field`
|
|
modal.componentInstance.messageBold = $localize`This operation will permanently delete this field.`
|
|
modal.componentInstance.message = $localize`This operation cannot be undone.`
|
|
modal.componentInstance.btnClass = 'btn-danger'
|
|
modal.componentInstance.btnCaption = $localize`Proceed`
|
|
modal.componentInstance.confirmClicked.subscribe(() => {
|
|
modal.componentInstance.buttonsEnabled = false
|
|
this.customFieldsService.delete(field).subscribe({
|
|
next: () => {
|
|
modal.close()
|
|
this.toastService.showInfo($localize`Deleted field "${field.name}"`)
|
|
this.customFieldsService.clearCache()
|
|
this.settingsService.initializeDisplayFields()
|
|
this.documentService.reload()
|
|
this.savedViewService.reload()
|
|
this.reload()
|
|
},
|
|
error: (e) => {
|
|
this.toastService.showError(
|
|
$localize`Error deleting field "${field.name}".`,
|
|
e
|
|
)
|
|
},
|
|
})
|
|
})
|
|
}
|
|
|
|
getDataType(field: CustomField): string {
|
|
return DATA_TYPE_LABELS.find((l) => l.id === field.data_type).name
|
|
}
|
|
|
|
filterDocuments(field: CustomField) {
|
|
this.documentListViewService.quickFilter([
|
|
{
|
|
rule_type: FILTER_CUSTOM_FIELDS_QUERY,
|
|
value: JSON.stringify([
|
|
CustomFieldQueryLogicalOperator.Or,
|
|
[[field.id, CustomFieldQueryOperator.Exists, true]],
|
|
]),
|
|
},
|
|
])
|
|
}
|
|
}
|