mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Live document counts for bulk edit
This commit is contained in:
		@@ -25,7 +25,7 @@
 | 
			
		||||
      </div>
 | 
			
		||||
      <div *ngIf="selectionModel.items" class="items">
 | 
			
		||||
        <ng-container *ngFor="let item of selectionModel.itemsSorted | filter: filterText">
 | 
			
		||||
          <app-toggleable-dropdown-button *ngIf="allowSelectNone || item.id" [item]="item" [state]="selectionModel.get(item.id)" (toggle)="selectionModel.toggle(item.id)" (exclude)="excludeClicked(item.id)" [disabled]="disabled"></app-toggleable-dropdown-button>
 | 
			
		||||
          <app-toggleable-dropdown-button *ngIf="allowSelectNone || item.id" [item]="item" [state]="selectionModel.get(item.id)" [count]="getUpdatedDocumentCount(item.id)" (toggle)="selectionModel.toggle(item.id)" (exclude)="excludeClicked(item.id)" [disabled]="disabled"></app-toggleable-dropdown-button>
 | 
			
		||||
        </ng-container>
 | 
			
		||||
      </div>
 | 
			
		||||
      <button *ngIf="editing" class="list-group-item list-group-item-action bg-light" (click)="applyClicked()" [disabled]="!modelIsDirty || disabled">
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import { NgbDropdown } from '@ng-bootstrap/ng-bootstrap'
 | 
			
		||||
import { ToggleableItemState } from './toggleable-dropdown-button/toggleable-dropdown-button.component'
 | 
			
		||||
import { MatchingModel } from 'src/app/data/matching-model'
 | 
			
		||||
import { Subject } from 'rxjs'
 | 
			
		||||
import { SelectionDataItem } from 'src/app/services/rest/document.service'
 | 
			
		||||
 | 
			
		||||
export interface ChangedItems {
 | 
			
		||||
  itemsToAdd: MatchingModel[]
 | 
			
		||||
@@ -333,6 +334,15 @@ export class FilterableDropdownComponent {
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @Input()
 | 
			
		||||
  documentCounts: SelectionDataItem[]
 | 
			
		||||
 | 
			
		||||
  getUpdatedDocumentCount(id: number) {
 | 
			
		||||
    if (this.documentCounts) {
 | 
			
		||||
      return this.documentCounts.find((c) => c.id === id)?.document_count
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  modelIsDirty: boolean = false
 | 
			
		||||
 | 
			
		||||
  constructor(private filterPipe: FilterPipe) {
 | 
			
		||||
 
 | 
			
		||||
@@ -20,5 +20,5 @@
 | 
			
		||||
    <app-tag *ngIf="isTag; else displayName" [tag]="item" [clickable]="false"></app-tag>
 | 
			
		||||
    <ng-template #displayName><small>{{item.name}}</small></ng-template>
 | 
			
		||||
  </div>
 | 
			
		||||
  <div class="badge badge-light rounded-pill ms-auto me-1">{{item.document_count}}</div>
 | 
			
		||||
  <div class="badge badge-light rounded-pill ms-auto me-1">{{count ?? item.document_count}}</div>
 | 
			
		||||
</button>
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,7 @@
 | 
			
		||||
        [applyOnClose]="applyOnClose"
 | 
			
		||||
        (opened)="openTagsDropdown()"
 | 
			
		||||
        [(selectionModel)]="tagSelectionModel"
 | 
			
		||||
        [documentCounts]="tagDocumentCounts"
 | 
			
		||||
        (apply)="setTags($event)">
 | 
			
		||||
      </app-filterable-dropdown>
 | 
			
		||||
      <app-filterable-dropdown class="me-2 me-md-3" title="Correspondent" icon="person-fill" i18n-title
 | 
			
		||||
@@ -44,6 +45,7 @@
 | 
			
		||||
        [applyOnClose]="applyOnClose"
 | 
			
		||||
        (opened)="openCorrespondentDropdown()"
 | 
			
		||||
        [(selectionModel)]="correspondentSelectionModel"
 | 
			
		||||
        [documentCounts]="correspondentDocumentCounts"
 | 
			
		||||
        (apply)="setCorrespondents($event)">
 | 
			
		||||
      </app-filterable-dropdown>
 | 
			
		||||
      <app-filterable-dropdown class="me-2 me-md-3" title="Document type" icon="file-earmark-fill" i18n-title
 | 
			
		||||
@@ -54,6 +56,7 @@
 | 
			
		||||
        [applyOnClose]="applyOnClose"
 | 
			
		||||
        (opened)="openDocumentTypeDropdown()"
 | 
			
		||||
        [(selectionModel)]="documentTypeSelectionModel"
 | 
			
		||||
        [documentCounts]="documentTypeDocumentCounts"
 | 
			
		||||
        (apply)="setDocumentTypes($event)">
 | 
			
		||||
      </app-filterable-dropdown>
 | 
			
		||||
      <app-filterable-dropdown class="me-2 me-md-3" title="Storage path" icon="folder-fill" i18n-title
 | 
			
		||||
@@ -64,6 +67,7 @@
 | 
			
		||||
        [applyOnClose]="applyOnClose"
 | 
			
		||||
        (opened)="openStoragePathDropdown()"
 | 
			
		||||
        [(selectionModel)]="storagePathsSelectionModel"
 | 
			
		||||
        [documentCounts]="storagePathDocumentCounts"
 | 
			
		||||
        (apply)="setStoragePaths($event)">
 | 
			
		||||
      </app-filterable-dropdown>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,10 @@ export class BulkEditorComponent
 | 
			
		||||
  correspondentSelectionModel = new FilterableDropdownSelectionModel()
 | 
			
		||||
  documentTypeSelectionModel = new FilterableDropdownSelectionModel()
 | 
			
		||||
  storagePathsSelectionModel = new FilterableDropdownSelectionModel()
 | 
			
		||||
  tagDocumentCounts: SelectionDataItem[]
 | 
			
		||||
  correspondentDocumentCounts: SelectionDataItem[]
 | 
			
		||||
  documentTypeDocumentCounts: SelectionDataItem[]
 | 
			
		||||
  storagePathDocumentCounts: SelectionDataItem[]
 | 
			
		||||
  awaitingDownload: boolean
 | 
			
		||||
 | 
			
		||||
  unsubscribeNotifier: Subject<any> = new Subject()
 | 
			
		||||
@@ -197,6 +201,7 @@ export class BulkEditorComponent
 | 
			
		||||
      .getSelectionData(Array.from(this.list.selected))
 | 
			
		||||
      .pipe(first())
 | 
			
		||||
      .subscribe((s) => {
 | 
			
		||||
        this.tagDocumentCounts = s.selected_tags
 | 
			
		||||
        this.applySelectionData(s.selected_tags, this.tagSelectionModel)
 | 
			
		||||
      })
 | 
			
		||||
  }
 | 
			
		||||
@@ -206,6 +211,7 @@ export class BulkEditorComponent
 | 
			
		||||
      .getSelectionData(Array.from(this.list.selected))
 | 
			
		||||
      .pipe(first())
 | 
			
		||||
      .subscribe((s) => {
 | 
			
		||||
        this.documentTypeDocumentCounts = s.selected_document_types
 | 
			
		||||
        this.applySelectionData(
 | 
			
		||||
          s.selected_document_types,
 | 
			
		||||
          this.documentTypeSelectionModel
 | 
			
		||||
@@ -218,6 +224,7 @@ export class BulkEditorComponent
 | 
			
		||||
      .getSelectionData(Array.from(this.list.selected))
 | 
			
		||||
      .pipe(first())
 | 
			
		||||
      .subscribe((s) => {
 | 
			
		||||
        this.correspondentDocumentCounts = s.selected_correspondents
 | 
			
		||||
        this.applySelectionData(
 | 
			
		||||
          s.selected_correspondents,
 | 
			
		||||
          this.correspondentSelectionModel
 | 
			
		||||
@@ -230,6 +237,7 @@ export class BulkEditorComponent
 | 
			
		||||
      .getSelectionData(Array.from(this.list.selected))
 | 
			
		||||
      .pipe(first())
 | 
			
		||||
      .subscribe((s) => {
 | 
			
		||||
        this.storagePathDocumentCounts = s.selected_storage_paths
 | 
			
		||||
        this.applySelectionData(
 | 
			
		||||
          s.selected_storage_paths,
 | 
			
		||||
          this.storagePathsSelectionModel
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user