mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-10-30 03:56:23 -05:00 
			
		
		
		
	Hide toggled state & counts when selection spans documents not in view
This commit is contained in:
		| @@ -78,8 +78,15 @@ export class FilterableDropdownComponent { | ||||
|   @Output() | ||||
|   editingComplete = new EventEmitter() | ||||
|  | ||||
|   _showCounts: boolean = true | ||||
|  | ||||
|   @Input | ||||
|   set showCounts(show: boolean) { | ||||
|     this._showCounts = show | ||||
|   } | ||||
|  | ||||
|   get showCounts(): boolean { | ||||
|     return this.type == FilterableDropdownType.Editing || (this.type == FilterableDropdownType.Filtering && this.itemsSelected == 0) | ||||
|     return this._showCounts && (this.type == FilterableDropdownType.Editing || (this.type == FilterableDropdownType.Filtering && this.itemsSelected == 0)) | ||||
|   } | ||||
|  | ||||
|   constructor(private filterPipe: FilterPipe) { } | ||||
|   | ||||
| @@ -28,9 +28,9 @@ | ||||
|   <div class="col-auto mb-2 mb-xl-0"> | ||||
|     <div class="d-flex"> | ||||
|       <label class="ml-auto mt-1 mr-2">Edit:</label> | ||||
|       <app-filterable-dropdown class="mr-2 mr-md-3" title="Tags" icon="tag-fill" [toggleableItems]="tagsToggleableItems" [type]="dropdownTypes.Editing" (open)="tagsDropdownOpen()" (editingComplete)="applyTags($event)"></app-filterable-dropdown> | ||||
|       <app-filterable-dropdown class="mr-2 mr-md-3" title="Correspondent" icon="person-fill" [toggleableItems]="correspondentsToggleableItems" [type]="dropdownTypes.Editing" singular="true" (open)="correspondentsDropdownOpen()" (editingComplete)="applyCorrespondent($event)"></app-filterable-dropdown> | ||||
|       <app-filterable-dropdown class="mr-2 mr-md-3" title="Document Type" icon="file-earmark-fill" [toggleableItems]="documentTypesToggleableItems" [type]="dropdownTypes.Editing" singular="true" (open)="documentTypesDropdownOpen()" (editingComplete)="applyDocumentType($event)"></app-filterable-dropdown> | ||||
|       <app-filterable-dropdown class="mr-2 mr-md-3" title="Tags" icon="tag-fill" [toggleableItems]="tagsToggleableItems" [type]="dropdownTypes.Editing" [showCounts]="!this.selectionSpansPages" (open)="tagsDropdownOpen()" (editingComplete)="applyTags($event)"></app-filterable-dropdown> | ||||
|       <app-filterable-dropdown class="mr-2 mr-md-3" title="Correspondent" icon="person-fill" [toggleableItems]="correspondentsToggleableItems" [type]="dropdownTypes.Editing" [showCounts]="!this.selectionSpansPages" singular="true" (open)="correspondentsDropdownOpen()" (editingComplete)="applyCorrespondent($event)"></app-filterable-dropdown> | ||||
|       <app-filterable-dropdown class="mr-2 mr-md-3" title="Document Type" icon="file-earmark-fill" [toggleableItems]="documentTypesToggleableItems" [type]="dropdownTypes.Editing" [showCounts]="!this.selectionSpansPages" singular="true" (open)="documentTypesDropdownOpen()" (editingComplete)="applyDocumentType($event)"></app-filterable-dropdown> | ||||
|     </div> | ||||
|   </div> | ||||
|   <div class="w-100 d-xl-none"></div> | ||||
|   | ||||
| @@ -22,7 +22,7 @@ export class BulkEditorComponent { | ||||
|   selectedDocuments: Set<number> | ||||
|  | ||||
|   @Input() | ||||
|   allDocuments: PaperlessDocument[] | ||||
|   viewDocuments: PaperlessDocument[] | ||||
|  | ||||
|   @Output() | ||||
|   selectPage = new EventEmitter() | ||||
| @@ -45,53 +45,61 @@ export class BulkEditorComponent { | ||||
|   @Output() | ||||
|   delete = new EventEmitter() | ||||
|  | ||||
|   tags: PaperlessTag[] | ||||
|   correspondents: PaperlessCorrespondent[] | ||||
|   documentTypes: PaperlessDocumentType[] | ||||
|   private tags: PaperlessTag[] | ||||
|   private correspondents: PaperlessCorrespondent[] | ||||
|   private documentTypes: PaperlessDocumentType[] | ||||
|  | ||||
|   private initiallySelectedTagsToggleableItems: ToggleableItem[] | ||||
|   private initiallySelectedCorrespondentsToggleableItems: ToggleableItem[] | ||||
|   private initiallySelectedDocumentTypesToggleableItems: ToggleableItem[] | ||||
|  | ||||
|   dropdownTypes = FilterableDropdownType | ||||
|   private dropdownTypes = FilterableDropdownType | ||||
|  | ||||
|   get selectionSpansPages(): boolean { | ||||
|     return this.selectedDocuments.length > this.viewDocuments.length || !Array.from(this.selectedDocuments).every(sd => this.viewDocuments.find(d => d.id == sd)) | ||||
|   } | ||||
|  | ||||
|   get tagsToggleableItems(): ToggleableItem[] { | ||||
|     let tagsToggleableItems = [] | ||||
|     let selectedDocuments: PaperlessDocument[] = this.allDocuments.filter(d => this.selectedDocuments.has(d.id)) | ||||
|     let selectedDocuments: PaperlessDocument[] = this.viewDocuments.filter(d => this.selectedDocuments.has(d.id)) | ||||
|     if (this.selectionSpansPages) selectedDocuments = [] | ||||
|  | ||||
|     this.tags?.forEach(t => { | ||||
|       let selectedDocumentsWithTag: PaperlessDocument[] = selectedDocuments.filter(d => d.tags.includes(t.id)) | ||||
|       let state = ToggleableItemState.NotSelected | ||||
|       if (selectedDocumentsWithTag.length == selectedDocuments.length) state = ToggleableItemState.Selected | ||||
|       if (selectedDocuments.length > 0 && selectedDocumentsWithTag.length == selectedDocuments.length) state = ToggleableItemState.Selected | ||||
|       else if (selectedDocumentsWithTag.length > 0 && selectedDocumentsWithTag.length < selectedDocuments.length) state = ToggleableItemState.PartiallySelected | ||||
|       tagsToggleableItems.push( { item: t, state: state, count: selectedDocumentsWithTag.length } ) | ||||
|       tagsToggleableItems.push({item: t, state: state, count: selectedDocumentsWithTag.length}) | ||||
|     }) | ||||
|     return tagsToggleableItems | ||||
|   } | ||||
|  | ||||
|   get correspondentsToggleableItems(): ToggleableItem[] { | ||||
|     let correspondentsToggleableItems = [] | ||||
|     let selectedDocuments: PaperlessDocument[] = this.allDocuments.filter(d => this.selectedDocuments.has(d.id)) | ||||
|     let selectedDocuments: PaperlessDocument[] = this.viewDocuments.filter(d => this.selectedDocuments.has(d.id)) | ||||
|     if (this.selectionSpansPages) selectedDocuments = [] | ||||
|  | ||||
|     this.correspondents?.forEach(c => { | ||||
|       let selectedDocumentsWithCorrespondent: PaperlessDocument[] = selectedDocuments.filter(d => d.correspondent == c.id) | ||||
|       let state = ToggleableItemState.NotSelected | ||||
|       if (selectedDocumentsWithCorrespondent.length == selectedDocuments.length) state = ToggleableItemState.Selected | ||||
|       if (selectedDocuments.length > 0 && selectedDocumentsWithCorrespondent.length == selectedDocuments.length) state = ToggleableItemState.Selected | ||||
|       else if (selectedDocumentsWithCorrespondent.length > 0 && selectedDocumentsWithCorrespondent.length < selectedDocuments.length) state = ToggleableItemState.PartiallySelected | ||||
|       correspondentsToggleableItems.push( { item: c, state: state, count: selectedDocumentsWithCorrespondent.length } ) | ||||
|       correspondentsToggleableItems.push({item: c, state: state, count: selectedDocumentsWithCorrespondent.length}) | ||||
|     }) | ||||
|     return correspondentsToggleableItems | ||||
|   } | ||||
|  | ||||
|   get documentTypesToggleableItems(): ToggleableItem[] { | ||||
|     let documentTypesToggleableItems = [] | ||||
|     let selectedDocuments: PaperlessDocument[] = this.allDocuments.filter(d => this.selectedDocuments.has(d.id)) | ||||
|     let selectedDocuments: PaperlessDocument[] = this.viewDocuments.filter(d => this.selectedDocuments.has(d.id)) | ||||
|     if (this.selectionSpansPages) selectedDocuments = [] | ||||
|  | ||||
|     this.documentTypes?.forEach(dt => { | ||||
|       let selectedDocumentsWithDocumentType: PaperlessDocument[] = selectedDocuments.filter(d => d.document_type == dt.id) | ||||
|       let state = ToggleableItemState.NotSelected | ||||
|       if (selectedDocumentsWithDocumentType.length == selectedDocuments.length) state = ToggleableItemState.Selected | ||||
|       if (selectedDocuments.length > 0 && selectedDocumentsWithDocumentType.length == selectedDocuments.length) state = ToggleableItemState.Selected | ||||
|       else if (selectedDocumentsWithDocumentType.length > 0 && selectedDocumentsWithDocumentType.length < selectedDocuments.length) state = ToggleableItemState.PartiallySelected | ||||
|       documentTypesToggleableItems.push( { item: dt, state: state, count: selectedDocumentsWithDocumentType.length } ) | ||||
|       documentTypesToggleableItems.push({item: dt, state: state, count: selectedDocumentsWithDocumentType.length}) | ||||
|     }) | ||||
|     return documentTypesToggleableItems | ||||
|   } | ||||
|   | ||||
| @@ -81,7 +81,7 @@ | ||||
|   <app-filter-editor [hidden]="isBulkEditing" [(filterRules)]="list.filterRules" #filterEditor></app-filter-editor> | ||||
|  | ||||
|   <app-bulk-editor [hidden]="!isBulkEditing" | ||||
|     [allDocuments]="list.documents" | ||||
|     [viewDocuments]="list.documents" | ||||
|     [(selectedDocuments)]="list.selected" | ||||
|     (selectPage)="list.selectPage()" | ||||
|     (selectAll)="list.selectAll()" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Michael Shamoon
					Michael Shamoon