mirror of
				https://github.com/paperless-ngx/paperless-ngx.git
				synced 2025-11-03 03:16:10 -06:00 
			
		
		
		
	Add "clearable" badge
This commit is contained in:
		@@ -24,6 +24,7 @@ import { CorrespondentEditDialogComponent } from './components/common/edit-dialo
 | 
			
		||||
import { TagEditDialogComponent } from './components/common/edit-dialog/tag-edit-dialog/tag-edit-dialog.component'
 | 
			
		||||
import { DocumentTypeEditDialogComponent } from './components/common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component'
 | 
			
		||||
import { TagComponent } from './components/common/tag/tag.component'
 | 
			
		||||
import { ClearableBadge } from './components/common/clearable-badge/clearable-badge.component'
 | 
			
		||||
import { PageHeaderComponent } from './components/common/page-header/page-header.component'
 | 
			
		||||
import { AppFrameComponent } from './components/app-frame/app-frame.component'
 | 
			
		||||
import { ToastsComponent } from './components/common/toasts/toasts.component'
 | 
			
		||||
@@ -141,6 +142,7 @@ function initializeApp(settings: SettingsService) {
 | 
			
		||||
    DocumentTypeEditDialogComponent,
 | 
			
		||||
    StoragePathEditDialogComponent,
 | 
			
		||||
    TagComponent,
 | 
			
		||||
    ClearableBadge,
 | 
			
		||||
    PageHeaderComponent,
 | 
			
		||||
    AppFrameComponent,
 | 
			
		||||
    ToastsComponent,
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,9 @@
 | 
			
		||||
<button *ngIf="active" class="position-absolute top-0 start-100 translate-middle badge bg-secondary border border-light rounded-circle p-1" title="Clear" i18n-title (click)="onClick($event)">
 | 
			
		||||
    <svg *ngIf="!isNumbered && selected" width="1em" height="1em" class="check m-0 p-0 opacity-75" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
        <use xlink:href="assets/bootstrap-icons.svg#check-lg"/>
 | 
			
		||||
    </svg>
 | 
			
		||||
    <div *ngIf="isNumbered" class="number">{{number}}<span class="visually-hidden">selected</span></div>
 | 
			
		||||
    <svg width=".9em" height="1em" class="x m-0 p-0 opacity-75" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
        <use xlink:href="assets/bootstrap-icons.svg#x-lg"/>
 | 
			
		||||
    </svg>
 | 
			
		||||
</button>
 | 
			
		||||
@@ -0,0 +1,25 @@
 | 
			
		||||
.badge {
 | 
			
		||||
    width: 20px;
 | 
			
		||||
    height: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.x {
 | 
			
		||||
    display: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.number {
 | 
			
		||||
    width: 1em;
 | 
			
		||||
    height: 1em;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
button:hover {
 | 
			
		||||
    .check,
 | 
			
		||||
    .number {
 | 
			
		||||
        display: none;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .x {
 | 
			
		||||
        display: inline-block;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,33 @@
 | 
			
		||||
import { Component, Input, Output, EventEmitter } from '@angular/core'
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'app-clearable-badge',
 | 
			
		||||
  templateUrl: './clearable-badge.component.html',
 | 
			
		||||
  styleUrls: ['./clearable-badge.component.scss'],
 | 
			
		||||
})
 | 
			
		||||
export class ClearableBadge {
 | 
			
		||||
  constructor() {}
 | 
			
		||||
 | 
			
		||||
  @Input()
 | 
			
		||||
  number: number
 | 
			
		||||
 | 
			
		||||
  @Input()
 | 
			
		||||
  selected: boolean
 | 
			
		||||
 | 
			
		||||
  @Output()
 | 
			
		||||
  cleared: EventEmitter<boolean> = new EventEmitter()
 | 
			
		||||
 | 
			
		||||
  get active(): boolean {
 | 
			
		||||
    return this.selected || this.number > -1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get isNumbered(): boolean {
 | 
			
		||||
    return this.number > -1
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onClick(event: PointerEvent) {
 | 
			
		||||
    this.cleared.emit(true)
 | 
			
		||||
    event.stopImmediatePropagation()
 | 
			
		||||
    event.preventDefault()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -1,11 +1,7 @@
 | 
			
		||||
  <div class="btn-group w-100" ngbDropdown role="group">
 | 
			
		||||
  <button class="btn btn-sm" id="dropdown{{title}}" ngbDropdownToggle [ngClass]="dateBefore || dateAfter ? 'btn-primary' : 'btn-outline-primary'">
 | 
			
		||||
    {{title}}
 | 
			
		||||
    <div *ngIf="isActive" class="position-absolute top-0 start-100 p-1 translate-middle badge bg-secondary border border-light rounded-circle">
 | 
			
		||||
      <svg width="1em" height="1em" class="m-0 p-0 opacity-75" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
        <use xlink:href="assets/bootstrap-icons.svg#check-lg"/>
 | 
			
		||||
      </svg><span class="visually-hidden">selected</span>
 | 
			
		||||
    </div>
 | 
			
		||||
    <app-clearable-badge [selected]="isActive" (cleared)="reset()"></app-clearable-badge><span class="visually-hidden">selected</span>
 | 
			
		||||
  </button>
 | 
			
		||||
  <div class="dropdown-menu date-dropdown shadow pt-0" ngbDropdownMenu attr.aria-labelledby="dropdown{{title}}">
 | 
			
		||||
    <div class="list-group list-group-flush">
 | 
			
		||||
 
 | 
			
		||||
@@ -106,6 +106,13 @@ export class DateDropdownComponent implements OnInit, OnDestroy {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  reset() {
 | 
			
		||||
    this.dateBefore = null
 | 
			
		||||
    this.dateAfter = null
 | 
			
		||||
    this.relativeDate = null
 | 
			
		||||
    this.onChange()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  setRelativeDate(rd: RelativeDate) {
 | 
			
		||||
    this.dateBefore = null
 | 
			
		||||
    this.dateAfter = null
 | 
			
		||||
 
 | 
			
		||||
@@ -5,14 +5,7 @@
 | 
			
		||||
    </svg>
 | 
			
		||||
    <div class="d-none d-sm-inline"> {{title}}</div>
 | 
			
		||||
    <ng-container *ngIf="!editing && selectionModel.selectionSize() > 0">
 | 
			
		||||
      <div *ngIf="multiple" class="position-absolute top-0 start-100 translate-middle badge bg-secondary border border-light text-light rounded-pill">
 | 
			
		||||
        {{selectionModel.totalCount}}<span class="visually-hidden">selected</span>
 | 
			
		||||
      </div>
 | 
			
		||||
      <div *ngIf="!multiple" class="position-absolute top-0 start-100 p-1 translate-middle badge bg-secondary border border-light rounded-circle">
 | 
			
		||||
        <svg width="1em" height="1em" class="m-0 p-0 opacity-75" viewBox="0 0 16 16" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
 | 
			
		||||
          <use xlink:href="assets/bootstrap-icons.svg#check-lg"/>
 | 
			
		||||
        </svg><span class="visually-hidden">selected</span>
 | 
			
		||||
      </div>
 | 
			
		||||
      <app-clearable-badge [number]="multiple ? selectionModel.totalCount : undefined" [selected]="!multiple && selectionModel.selectionSize() > 0" (cleared)="reset()"></app-clearable-badge>
 | 
			
		||||
    </ng-container>
 | 
			
		||||
  </button>
 | 
			
		||||
  <div class="dropdown-menu py-0 shadow" ngbDropdownMenu attr.aria-labelledby="dropdown{{title}}">
 | 
			
		||||
 
 | 
			
		||||
@@ -384,4 +384,9 @@ export class FilterableDropdownComponent {
 | 
			
		||||
      this.selectionModel.exclude(itemID)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  reset() {
 | 
			
		||||
    this.selectionModel.reset()
 | 
			
		||||
    this.selectionModelChange.emit(this.selectionModel)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user