mirror of
https://github.com/paperless-ngx/paperless-ngx.git
synced 2025-04-02 13:45:10 -05:00

Directly check permissions and no subscription (uisettings is always initialized on frontend startup) update permission directive to accept single string add explicit management permission name
108 lines
7.8 KiB
HTML
108 lines
7.8 KiB
HTML
<div class="card mb-3 shadow-sm" [class.card-selected]="selected" [class.document-card]="selectable" [class.popover-hidden]="popoverHidden" (mouseleave)="mouseLeaveCard()">
|
|
<div class="row g-0">
|
|
<div class="col-md-2 doc-img-background rounded-start" [class.doc-img-background-selected]="selected" (click)="this.toggleSelected.emit($event)">
|
|
<img [src]="getThumbUrl()" class="card-img doc-img border-end rounded-start" [class.inverted]="getIsThumbInverted()">
|
|
|
|
<div class="border-end border-bottom bg-light document-card-check">
|
|
<div class="form-check">
|
|
<input type="checkbox" class="form-check-input" id="smallCardCheck{{document.id}}" [checked]="selected" (click)="this.toggleSelected.emit($event)">
|
|
<label class="form-check-label" for="smallCardCheck{{document.id}}"></label>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
<div class="col">
|
|
<div class="card-body bg-light">
|
|
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<h5 class="card-title">
|
|
<ng-container *ngIf="document.correspondent">
|
|
<a *ngIf="clickCorrespondent.observers.length ; else nolink" title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="fw-bold btn-link">{{(document.correspondent$ | async)?.name}}</a>
|
|
<ng-template #nolink>{{(document.correspondent$ | async)?.name}}</ng-template>:
|
|
</ng-container>
|
|
{{document.title | documentTitle}}
|
|
<app-tag [tag]="t" linkTitle="Filter by tag" i18n-linkTitle *ngFor="let t of document.tags$ | async" class="ms-1" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="clickTag.observers.length"></app-tag>
|
|
</h5>
|
|
</div>
|
|
<p class="card-text">
|
|
<span *ngIf="document.__search_hit__" [innerHtml]="document.__search_hit__.highlights"></span>
|
|
<span *ngIf="!document.__search_hit__" class="result-content">{{contentTrimmed}}</span>
|
|
</p>
|
|
|
|
|
|
<div class="d-flex flex-column flex-md-row align-items-md-center">
|
|
<div class="btn-group">
|
|
<a class="btn btn-sm btn-outline-secondary" (click)="clickMoreLike.emit()">
|
|
<svg class="sidebaricon" fill="currentColor" class="sidebaricon">
|
|
<use xlink:href="assets/bootstrap-icons.svg#diagram-3"/>
|
|
</svg> <span class="d-none d-md-inline" i18n>More like this</span>
|
|
</a>
|
|
<a (click)="openDocumentsService.openDocument(document)" class="btn btn-sm btn-outline-secondary" *ifPermissions="'documents.change_document'">
|
|
<svg class="sidebaricon" fill="currentColor" class="sidebaricon">
|
|
<use xlink:href="assets/bootstrap-icons.svg#pencil"/>
|
|
</svg> <span class="d-none d-md-inline" i18n>Edit</span>
|
|
</a>
|
|
<a class="btn btn-sm btn-outline-secondary" target="_blank" [href]="previewUrl"
|
|
[ngbPopover]="previewContent" [popoverTitle]="document.title | documentTitle"
|
|
autoClose="true" popoverClass="shadow" (mouseenter)="mouseEnterPreview()" (mouseleave)="mouseLeavePreview()" #popover="ngbPopover">
|
|
<svg class="sidebaricon" fill="currentColor" class="sidebaricon">
|
|
<use xlink:href="assets/bootstrap-icons.svg#eye"/>
|
|
</svg> <span class="d-none d-md-inline" i18n>View</span>
|
|
</a>
|
|
<ng-template #previewContent>
|
|
<object [data]="previewUrl | safeUrl" class="preview" width="100%"></object>
|
|
</ng-template>
|
|
<a class="btn btn-sm btn-outline-secondary" [href]="getDownloadUrl()">
|
|
<svg class="sidebaricon" fill="currentColor" class="sidebaricon">
|
|
<use xlink:href="assets/bootstrap-icons.svg#download"/>
|
|
</svg> <span class="d-none d-md-inline" i18n>Download</span>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="list-group list-group-horizontal border-0 card-info ms-md-auto mt-2 mt-md-0">
|
|
<button *ngIf="document.document_type" type="button" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2" title="Filter by document type" i18n-title
|
|
(click)="clickDocumentType.emit(document.document_type);$event.stopPropagation()">
|
|
<svg class="metadata-icon me-2 text-muted bi bi-file-earmark" viewBox="0 0 16 16" fill="currentColor">
|
|
<path d="M14 4.5V14a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V2a2 2 0 0 1 2-2h5.5L14 4.5zm-3 0A1.5 1.5 0 0 1 9.5 3V1H4a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1V4.5h-2z"/>
|
|
</svg>
|
|
<small>{{(document.document_type$ | async)?.name}}</small>
|
|
</button>
|
|
<button *ngIf="document.storage_path" type="button" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2" title="Filter by storage path" i18n-title
|
|
(click)="clickStoragePath.emit(document.storage_path);$event.stopPropagation()">
|
|
<svg class="metadata-icon me-2 text-muted bi bi-folder" viewBox="0 0 16 16" fill="currentColor">
|
|
<path d="M0 2a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1v7.5a2.5 2.5 0 0 1-2.5 2.5h-9A2.5 2.5 0 0 1 1 12.5V5a1 1 0 0 1-1-1V2zm2 3v7.5A1.5 1.5 0 0 0 3.5 14h9a1.5 1.5 0 0 0 1.5-1.5V5H2zm13-3H1v2h14V2zM5 7.5a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5z"/>
|
|
</svg>
|
|
<small>{{(document.storage_path$ | async)?.name}}</small>
|
|
</button>
|
|
<div *ngIf="document.archive_serial_number" class="list-group-item me-2 bg-light text-dark p-1 border-0">
|
|
<svg class="metadata-icon me-2 text-muted bi bi-upc-scan" viewBox="0 0 16 16" fill="currentColor">
|
|
<path d="M1.5 1a.5.5 0 0 0-.5.5v3a.5.5 0 0 1-1 0v-3A1.5 1.5 0 0 1 1.5 0h3a.5.5 0 0 1 0 1h-3zM11 .5a.5.5 0 0 1 .5-.5h3A1.5 1.5 0 0 1 16 1.5v3a.5.5 0 0 1-1 0v-3a.5.5 0 0 0-.5-.5h-3a.5.5 0 0 1-.5-.5zM.5 11a.5.5 0 0 1 .5.5v3a.5.5 0 0 0 .5.5h3a.5.5 0 0 1 0 1h-3A1.5 1.5 0 0 1 0 14.5v-3a.5.5 0 0 1 .5-.5zm15 0a.5.5 0 0 1 .5.5v3a1.5 1.5 0 0 1-1.5 1.5h-3a.5.5 0 0 1 0-1h3a.5.5 0 0 0 .5-.5v-3a.5.5 0 0 1 .5-.5zM3 4.5a.5.5 0 0 1 1 0v7a.5.5 0 0 1-1 0v-7zm2 0a.5.5 0 0 1 1 0v7a.5.5 0 0 1-1 0v-7zm2 0a.5.5 0 0 1 1 0v7a.5.5 0 0 1-1 0v-7zm2 0a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v7a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-7zm3 0a.5.5 0 0 1 1 0v7a.5.5 0 0 1-1 0v-7z"/>
|
|
</svg>
|
|
<small>#{{document.archive_serial_number}}</small>
|
|
</div>
|
|
<ng-template #dateTooltip>
|
|
<div class="d-flex flex-column">
|
|
<span i18n>Created: {{ document.created | customDate }}</span>
|
|
<span i18n>Added: {{ document.added | customDate }}</span>
|
|
<span i18n>Modified: {{ document.modified | customDate }}</span>
|
|
</div>
|
|
</ng-template>
|
|
<div class="list-group-item bg-light text-dark p-1 border-0" [ngbTooltip]="dateTooltip">
|
|
<svg class="metadata-icon me-2 text-muted bi bi-calendar-event" viewBox="0 0 16 16" fill="currentColor">
|
|
<path d="M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1z"/>
|
|
<path d="M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5zM1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4H1z"/>
|
|
</svg>
|
|
<small>{{document.created_date | customDate:'mediumDate'}}</small>
|
|
</div>
|
|
<div *ngIf="document.__search_hit__?.score" class="list-group-item bg-light text-dark border-0 d-flex p-0 ps-4 search-score">
|
|
<small class="text-muted" i18n>Score:</small>
|
|
<ngb-progressbar [type]="searchScoreClass" [value]="document.__search_hit__.score" class="search-score-bar mx-2 mt-1" [max]="1"></ngb-progressbar>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|