mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Refactor: allow filterpipe to specify key
This commit is contained in:
		@@ -35,7 +35,7 @@
 | 
			
		||||
      </div>
 | 
			
		||||
      @if (selectionModel.items) {
 | 
			
		||||
        <div class="items" #buttonItems>
 | 
			
		||||
          @for (item of selectionModel.itemsSorted | filter: filterText; track item; let i = $index) {
 | 
			
		||||
          @for (item of selectionModel.itemsSorted | filter: filterText:'name'; track item; let i = $index) {
 | 
			
		||||
            @if (allowSelectNone || item.id) {
 | 
			
		||||
              <pngx-toggleable-dropdown-button
 | 
			
		||||
                [item]="item" [hideCount]="hideCount(item)" [state]="selectionModel.get(item.id)" [count]="getUpdatedDocumentCount(item.id)" (toggle)="selectionModel.toggle(item.id)" (exclude)="excludeClicked(item.id)" (click)="setButtonItemIndex(i - 1)" [disabled]="disabled">
 | 
			
		||||
@@ -45,13 +45,13 @@
 | 
			
		||||
        </div>
 | 
			
		||||
      }
 | 
			
		||||
      @if (editing) {
 | 
			
		||||
        @if ((selectionModel.itemsSorted | filter: filterText).length === 0 && createRef !== undefined) {
 | 
			
		||||
        @if ((selectionModel.itemsSorted | filter: filterText:'name').length === 0 && createRef !== undefined) {
 | 
			
		||||
          <button class="list-group-item list-group-item-action bg-light" (click)="createClicked()" [disabled]="disabled">
 | 
			
		||||
            <small class="ms-2"><ng-container i18n>Create</ng-container> "{{filterText}}"</small>
 | 
			
		||||
            <i-bs width="1.5em" height="1em" name="plus"></i-bs>
 | 
			
		||||
          </button>
 | 
			
		||||
        }
 | 
			
		||||
        @if ((selectionModel.itemsSorted | filter: filterText).length > 0) {
 | 
			
		||||
        @if ((selectionModel.itemsSorted | filter: filterText:'name').length > 0) {
 | 
			
		||||
          <button class="list-group-item list-group-item-action bg-light" (click)="applyClicked()" [disabled]="!modelIsDirty || disabled">
 | 
			
		||||
            <small class="ms-2" [ngClass]="{'fw-bold': modelIsDirty}" i18n>Apply</small>
 | 
			
		||||
            <i-bs width="1.5em" height="1em" name="arrow-right"></i-bs>
 | 
			
		||||
 
 | 
			
		||||
@@ -25,4 +25,25 @@ describe('FilterPipe', () => {
 | 
			
		||||
    itemsReturned = pipe.transform(items, null)
 | 
			
		||||
    expect(itemsReturned).toEqual(items)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('should filter matchingmodel items by key', () => {
 | 
			
		||||
    const pipe = new FilterPipe()
 | 
			
		||||
    const items: MatchingModel[] = [
 | 
			
		||||
      {
 | 
			
		||||
        id: 1,
 | 
			
		||||
        name: 'Hello World',
 | 
			
		||||
        slug: 'slug-1',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        id: 2,
 | 
			
		||||
        name: 'Hello with slug',
 | 
			
		||||
        slug: 'not this',
 | 
			
		||||
      },
 | 
			
		||||
    ]
 | 
			
		||||
    let itemsReturned = pipe.transform(items, 'slug')
 | 
			
		||||
    expect(itemsReturned).toEqual(items)
 | 
			
		||||
 | 
			
		||||
    itemsReturned = pipe.transform(items, 'slug', 'slug')
 | 
			
		||||
    expect(itemsReturned).toEqual([items[0]])
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
@@ -5,17 +5,22 @@ import { MatchingModel } from '../data/matching-model'
 | 
			
		||||
  name: 'filter',
 | 
			
		||||
})
 | 
			
		||||
export class FilterPipe implements PipeTransform {
 | 
			
		||||
  transform(items: MatchingModel[], searchText: string): MatchingModel[] {
 | 
			
		||||
  transform(
 | 
			
		||||
    items: MatchingModel[],
 | 
			
		||||
    searchText: string,
 | 
			
		||||
    key?: string
 | 
			
		||||
  ): MatchingModel[] {
 | 
			
		||||
    if (!items) return []
 | 
			
		||||
    if (!searchText) return items
 | 
			
		||||
 | 
			
		||||
    return items.filter((item) => {
 | 
			
		||||
      return Object.keys(item)
 | 
			
		||||
        .filter(
 | 
			
		||||
      const keys = key
 | 
			
		||||
        ? [key]
 | 
			
		||||
        : Object.keys(item).filter(
 | 
			
		||||
            (key) =>
 | 
			
		||||
              typeof item[key] === 'string' || typeof item[key] === 'number'
 | 
			
		||||
          )
 | 
			
		||||
        .some((key) => {
 | 
			
		||||
      return keys.some((key) => {
 | 
			
		||||
        return String(item[key])
 | 
			
		||||
          .toLowerCase()
 | 
			
		||||
          .includes(searchText.toLowerCase())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user