]> git.ipfire.org Git - thirdparty/paperless-ngx.git/commitdiff
Fix: header button wrapping issues on mobile
authorshamoon <4887959+shamoon@users.noreply.github.com>
Tue, 5 Mar 2024 01:00:19 +0000 (17:00 -0800)
committershamoon <4887959+shamoon@users.noreply.github.com>
Tue, 5 Mar 2024 01:00:19 +0000 (17:00 -0800)
src-ui/src/app/components/admin/settings/settings.component.html
src-ui/src/app/components/common/page-header/page-header.component.html
src-ui/src/app/components/document-detail/document-detail.component.html
src-ui/src/app/components/document-list/document-list.component.html
src-ui/src/app/components/manage/custom-fields/custom-fields.component.html
src-ui/src/app/components/manage/management-list/management-list.component.html
src-ui/src/app/components/manage/workflows/workflows.component.html

index 76625d8863fe6e00ec449aabd2a2a6239010ca5f..42147a9b83cc769b91bfa9f97b117e7a9a80fb11 100644 (file)
@@ -7,7 +7,7 @@
   <button class="btn btn-sm btn-outline-primary" (click)="tourService.start()">
     <i-bs class="me-1" name="airplane"></i-bs>&nbsp;<ng-container i18n>Start tour</ng-container>
   </button>
-  <button class="btn btn-sm btn-outline-primary position-relative ms-5" (click)="showSystemStatus()"
+  <button class="btn btn-sm btn-outline-primary position-relative ms-md-5 me-1" (click)="showSystemStatus()"
     [disabled]="!systemStatus"
     *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Admin }">
     @if (!systemStatus) {
@@ -26,7 +26,7 @@
     }
     <ng-container i18n>System Status</ng-container>
   </button>
-  <a *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Admin }" class="btn btn-sm btn-primary ms-3" href="admin/" target="_blank">
+  <a *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Admin }" class="btn btn-sm btn-primary" href="admin/" target="_blank">
     <ng-container i18n>Open Django Admin</ng-container>
     &nbsp;<i-bs name="arrow-up-right"></i-bs>
   </a>
index e550bcffe1f756880c260dcff770e107f4a03a0f..2832182199763aa69bc365578ff499f34e844c93 100644 (file)
@@ -19,7 +19,7 @@
       }
     </h3>
   </div>
-  <div class="btn-toolbar col col-md-auto">
+  <div class="btn-toolbar col col-md-auto gap-2">
     <ng-content></ng-content>
   </div>
 </div>
index 79cc58f534788030d2cf76c3200b69ab6d16b3ac..5b27a51acc0b701e65a1543bcd61baf06033e5ab 100644 (file)
@@ -1,11 +1,11 @@
 <pngx-page-header [(title)]="title">
   @if (contentRenderType === ContentRenderType.PDF && !useNativePdfViewer) {
-    <div class="input-group input-group-sm me-2 d-none d-md-flex">
+    <div class="input-group input-group-sm d-none d-md-flex">
       <div class="input-group-text" i18n>Page</div>
       <input class="form-control flex-grow-0 w-auto" type="number" min="1" [max]="previewNumPages" [(ngModel)]="previewCurrentPage" />
       <div class="input-group-text" i18n>of {{previewNumPages}}</div>
     </div>
-    <div class="input-group input-group-sm me-5 d-none d-md-flex">
+    <div class="input-group input-group-sm me-md-5 d-none d-md-flex">
       <button class="btn btn-outline-secondary" (click)="decreaseZoom()" i18n>-</button>
       <select class="form-select" (change)="onZoomSelect($event)">
         @for (setting of zoomSettings; track setting) {
     </div>
   }
 
-  <button type="button" class="btn btn-sm btn-outline-danger me-4" (click)="delete()" [disabled]="!userIsOwner" *pngxIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.Document }">
+  <button type="button" class="btn btn-sm btn-outline-danger me-md-4" (click)="delete()" [disabled]="!userIsOwner" *pngxIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.Document }">
     <i-bs width="1.2em" height="1.2em" name="trash"></i-bs><span class="d-none d-lg-inline ps-1" i18n>Delete</span>
   </button>
 
-  <div class="btn-group me-2">
+  <div class="btn-group">
     <a [href]="downloadUrl" class="btn btn-sm btn-outline-primary">
       <i-bs width="1.2em" height="1.2em" name="download"></i-bs><span class="d-none d-lg-inline ps-1" i18n>Download</span>
     </a>
@@ -38,7 +38,7 @@
   </div>
 
   <div class="ms-auto" ngbDropdown>
-    <button class="btn btn-sm btn-outline-primary me-2" id="actionsDropdown" ngbDropdownToggle>
+    <button class="btn btn-sm btn-outline-primary" id="actionsDropdown" ngbDropdownToggle>
       <i-bs name="three-dots"></i-bs>
       <div class="d-none d-sm-inline">&nbsp;<ng-container i18n>Actions</ng-container></div>
     </button>
@@ -55,7 +55,6 @@
 
   <pngx-custom-fields-dropdown
     *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.CustomField }"
-    class="me-2"
     [documentId]="documentId"
     [disabled]="!userIsOwner"
     [existingFields]="document?.custom_fields"
index 5409306c630413058628485a2693a0cb664882ae..5a52c39c100f38544cfaff8910a6b2681823f335 100644 (file)
@@ -1,6 +1,6 @@
 <pngx-page-header [title]="getTitle()">
 
-  <div ngbDropdown class="me-2 d-flex">
+  <div ngbDropdown class="d-flex">
     <button class="btn btn-sm btn-outline-primary" id="dropdownSelect" ngbDropdownToggle>
       <i-bs name="text-indent-left"></i-bs>
       <div class="d-none d-sm-inline">&nbsp;<ng-container i18n>Select</ng-container></div>
@@ -26,7 +26,7 @@
     </label>
   </div>
 
-  <div ngbDropdown class="btn-group ms-2 flex-fill">
+  <div ngbDropdown class="btn-group flex-fill">
     <button class="btn btn-outline-primary btn-sm" id="dropdownBasic1" ngbDropdownToggle i18n>Sort</button>
     <div ngbDropdownMenu aria-labelledby="dropdownBasic1" class="shadow dropdown-menu-right">
       <div class="w-100 d-flex pb-2 mb-1 border-bottom">
@@ -49,7 +49,7 @@
     </div>
   </div>
 
-  <div class="btn-group ms-2 flex-fill" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.SavedView }" ngbDropdown role="group">
+  <div class="btn-group flex-fill" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.SavedView }" ngbDropdown role="group">
     <button class="btn btn-sm btn-outline-primary dropdown-toggle flex-fill" tourAnchor="tour.documents-views" ngbDropdownToggle>
       <ng-container i18n>Views</ng-container>
       @if (savedViewIsModified) {
index 2d4c77f939a9cb5ec161ec4dd18d0d8bba956f8e..5a1fa727bf3b689411d19a8995dd397263d475fe 100644 (file)
@@ -5,7 +5,7 @@
   i18n-info
   infoLink="usage/#custom-fields"
   >
-  <button type="button" class="btn btn-sm btn-outline-primary ms-4" (click)="editField()" *pngxIfPermissions="{ action: PermissionAction.Add, type: PermissionType.CustomField }">
+  <button type="button" class="btn btn-sm btn-outline-primary" (click)="editField()" *pngxIfPermissions="{ action: PermissionAction.Add, type: PermissionType.CustomField }">
     <i-bs name="plus-circle"></i-bs>&nbsp;<ng-container i18n>Add Field</ng-container>
   </button>
 </pngx-page-header>
index e2d23ff0e91fc146a360ed13a8fea2908612ff35..4995771d8fae66437f4045d9380b95f3003d594b 100644 (file)
 <pngx-page-header title="{{ typeNamePlural | titlecase }}">
-  <button class="btn btn-sm btn-outline-secondary me-2" (click)="clearSelection()" [hidden]="selectedObjects.size === 0">
+  <button class="btn btn-sm btn-outline-secondary" (click)="clearSelection()" [hidden]="selectedObjects.size === 0">
     <i-bs  name="x"></i-bs>&nbsp;<ng-container i18n>Clear selection</ng-container>
     </button>
-    <button type="button" class="btn btn-sm btn-outline-primary me-2" (click)="setPermissions()" [disabled]="!userCanBulkEdit(PermissionAction.Change) || selectedObjects.size === 0">
+    <button type="button" class="btn btn-sm btn-outline-primary" (click)="setPermissions()" [disabled]="!userCanBulkEdit(PermissionAction.Change) || selectedObjects.size === 0">
       <i-bs name="person-fill-lock"></i-bs>&nbsp;<ng-container i18n>Permissions</ng-container>
     </button>
-    <button type="button" class="btn btn-sm btn-outline-danger me-5" (click)="delete()" [disabled]="!userCanBulkEdit(PermissionAction.Delete) || selectedObjects.size === 0">
+    <button type="button" class="btn btn-sm btn-outline-danger" (click)="delete()" [disabled]="!userCanBulkEdit(PermissionAction.Delete) || selectedObjects.size === 0">
       <i-bs name="trash"></i-bs>&nbsp;<ng-container i18n>Delete</ng-container>
     </button>
-    <button type="button" class="btn btn-sm btn-outline-primary" (click)="openCreateDialog()" *pngxIfPermissions="{ action: PermissionAction.Add, type: permissionType }">
+    <button type="button" class="btn btn-sm btn-outline-primary ms-md-5" (click)="openCreateDialog()" *pngxIfPermissions="{ action: PermissionAction.Add, type: permissionType }">
       <i-bs name="plus-circle"></i-bs>&nbsp;<ng-container i18n>Create</ng-container>
     </button>
-    </pngx-page-header>
+</pngx-page-header>
 
-    <div class="row mb-3">
-      <div class="col-md mb-2 mb-xl-0">
-        <div class="form-inline d-flex align-items-center">
-          <label class="text-muted me-2 mb-0" i18n>Filter by:</label>
-          <input class="form-control form-control-sm flex-fill w-auto" type="text" autofocus [(ngModel)]="nameFilter" (keyup)="onNameFilterKeyUp($event)" placeholder="Name" i18n-placeholder>
-        </div>
-      </div>
-
-      <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" [maxSize]="5" (pageChange)="reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
+<div class="row mb-3">
+  <div class="col-md mb-2 mb-xl-0">
+    <div class="form-inline d-flex align-items-center">
+      <label class="text-muted me-2 mb-0" i18n>Filter by:</label>
+      <input class="form-control form-control-sm flex-fill w-auto" type="text" autofocus [(ngModel)]="nameFilter" (keyup)="onNameFilterKeyUp($event)" placeholder="Name" i18n-placeholder>
     </div>
+  </div>
 
-    <div class="card border mb-3">
-      <table class="table table-striped align-middle shadow-sm mb-0">
-        <thead>
-          <tr>
-            <th scope="col">
-              <div class="form-check m-0 ms-2 me-n2">
-                <input type="checkbox" class="form-check-input" id="all-objects" [disabled]="data.length === 0" (click)="toggleAll($event); $event.stopPropagation();">
-                <label class="form-check-label" for="all-objects"></label>
-              </div>
-            </th>
-            <th scope="col" class="fw-normal" pngxSortable="name" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)" i18n>Name</th>
-            <th scope="col" class="fw-normal d-none d-sm-table-cell" pngxSortable="matching_algorithm" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)" i18n>Matching</th>
-            <th scope="col" class="fw-normal" pngxSortable="document_count" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)" i18n>Document count</th>
-            @for (column of extraColumns; track column) {
-              <th scope="col" class="fw-normal" pngxSortable="{{column.key}}" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)">{{column.name}}</th>
-            }
-            <th scope="col" class="fw-normal" i18n>Actions</th>
-          </tr>
-        </thead>
-        <tbody>
-          @if (isLoading) {
-            <tr>
-              <td colspan="5">
-                <div class="spinner-border spinner-border-sm me-2" role="status"></div>
-                <ng-container i18n>Loading...</ng-container>
-              </td>
-            </tr>
-          }
-          @for (object of data; track object) {
-            <tr (click)="toggleSelected(object); $event.stopPropagation();">
-              <td>
-                <div class="form-check m-0 ms-2 me-n2">
-                  <input type="checkbox" class="form-check-input" id="{{typeName}}{{object.id}}" [checked]="selectedObjects.has(object.id)" (click)="toggleSelected(object); $event.stopPropagation();">
-                  <label class="form-check-label" for="{{typeName}}{{object.id}}"></label>
-                </div>
-              </td>
-              <td scope="row"><button class="btn btn-link ms-0 ps-0 text-start" (click)="userCanEdit(object) ? openEditDialog(object) : null">{{ object.name }}</button> </td>
-              <td scope="row" class="d-none d-sm-table-cell">{{ getMatching(object) }}</td>
-              <td scope="row">{{ object.document_count }}</td>
-              @for (column of extraColumns; track column) {
-                <td scope="row">
-                  @if (column.rendersHtml) {
-                    <div [innerHtml]="column.valueFn.call(null, object) | safeHtml"></div>
-                  } @else {
-                    {{ column.valueFn.call(null, object) }}
-                  }
-                </td>
-              }
-              <td scope="row">
-                <div class="btn-group d-block d-sm-none">
-                  <div ngbDropdown class="d-inline-block">
-                    <button type="button" class="btn btn-link" id="actionsMenuMobile" (click)="$event.stopPropagation()" ngbDropdownToggle>
-                      <i-bs name="three-dots-vertical"></i-bs>
-                    </button>
-                    <div ngbDropdownMenu aria-labelledby="actionsMenuMobile">
-                      <button (click)="filterDocuments(object)" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Document }" ngbDropdownItem i18n>Filter Documents</button>
-                      <button (click)="openEditDialog(object)" *pngxIfPermissions="{ action: PermissionAction.Change, type: permissionType }" ngbDropdownItem i18n>Edit</button>
-                      <button class="text-danger" (click)="openDeleteDialog(object)" *pngxIfPermissions="{ action: PermissionAction.Delete, type: permissionType }" ngbDropdownItem i18n>Delete</button>
-                    </div>
-                  </div>
-                </div>
-                <div class="btn-group d-none d-sm-block">
-                  <button class="btn btn-sm btn-outline-secondary" (click)="filterDocuments(object); $event.stopPropagation();" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Document }">
-                    <i-bs width="1em" height="1em" name="filter"></i-bs>&nbsp;<ng-container i18n>Documents</ng-container>
-                    </button>
-                    <button class="btn btn-sm btn-outline-secondary" (click)="openEditDialog(object); $event.stopPropagation();" *pngxIfPermissions="{ action: PermissionAction.Change, type: permissionType }" [disabled]="!userCanEdit(object)">
-                      <i-bs width="1em" height="1em" name="pencil"></i-bs>&nbsp;<ng-container i18n>Edit</ng-container>
-                      </button>
-                      <button class="btn btn-sm btn-outline-danger" (click)="openDeleteDialog(object); $event.stopPropagation();" *pngxIfPermissions="{ action: PermissionAction.Delete, type: permissionType }" [disabled]="!userCanDelete(object)">
-                        <i-bs width="1em" height="1em" name="trash"></i-bs>&nbsp;<ng-container i18n>Delete</ng-container>
-                        </button>
-                      </div>
-                    </td>
-                  </tr>
-                }
-              </tbody>
-            </table>
-          </div>
+  <ngb-pagination class="col-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" [maxSize]="5" (pageChange)="reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
+</div>
 
-          @if (!isLoading) {
-            <div class="d-flex mb-2">
-              @if (collectionSize > 0) {
-                <div>
-                  <ng-container i18n>{collectionSize, plural, =1 {One {{typeName}}} other {{{collectionSize || 0}} total {{typeNamePlural}}}}</ng-container>
-                  @if (selectedObjects.size > 0) {
-                    &nbsp;({{selectedObjects.size}} selected)
-                  }
-                </div>
-              }
-              @if (collectionSize > 20) {
-                <ngb-pagination class="ms-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" [maxSize]="5" (pageChange)="reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
-              }
+<div class="card border mb-3">
+  <table class="table table-striped align-middle shadow-sm mb-0">
+    <thead>
+      <tr>
+        <th scope="col">
+          <div class="form-check m-0 ms-2 me-n2">
+            <input type="checkbox" class="form-check-input" id="all-objects" [disabled]="data.length === 0" (click)="toggleAll($event); $event.stopPropagation();">
+            <label class="form-check-label" for="all-objects"></label>
+          </div>
+        </th>
+        <th scope="col" class="fw-normal" pngxSortable="name" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)" i18n>Name</th>
+        <th scope="col" class="fw-normal d-none d-sm-table-cell" pngxSortable="matching_algorithm" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)" i18n>Matching</th>
+        <th scope="col" class="fw-normal" pngxSortable="document_count" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)" i18n>Document count</th>
+        @for (column of extraColumns; track column) {
+          <th scope="col" class="fw-normal" pngxSortable="{{column.key}}" [currentSortField]="sortField" [currentSortReverse]="sortReverse" (sort)="onSort($event)">{{column.name}}</th>
+        }
+        <th scope="col" class="fw-normal" i18n>Actions</th>
+      </tr>
+    </thead>
+    <tbody>
+      @if (isLoading) {
+        <tr>
+          <td colspan="5">
+            <div class="spinner-border spinner-border-sm me-2" role="status"></div>
+            <ng-container i18n>Loading...</ng-container>
+          </td>
+        </tr>
+      }
+      @for (object of data; track object) {
+        <tr (click)="toggleSelected(object); $event.stopPropagation();">
+          <td>
+            <div class="form-check m-0 ms-2 me-n2">
+              <input type="checkbox" class="form-check-input" id="{{typeName}}{{object.id}}" [checked]="selectedObjects.has(object.id)" (click)="toggleSelected(object); $event.stopPropagation();">
+              <label class="form-check-label" for="{{typeName}}{{object.id}}"></label>
             </div>
+          </td>
+          <td scope="row"><button class="btn btn-link ms-0 ps-0 text-start" (click)="userCanEdit(object) ? openEditDialog(object) : null">{{ object.name }}</button> </td>
+          <td scope="row" class="d-none d-sm-table-cell">{{ getMatching(object) }}</td>
+          <td scope="row">{{ object.document_count }}</td>
+          @for (column of extraColumns; track column) {
+            <td scope="row">
+              @if (column.rendersHtml) {
+                <div [innerHtml]="column.valueFn.call(null, object) | safeHtml"></div>
+              } @else {
+                {{ column.valueFn.call(null, object) }}
+              }
+            </td>
           }
+          <td scope="row">
+            <div class="btn-group d-block d-sm-none">
+              <div ngbDropdown class="d-inline-block">
+                <button type="button" class="btn btn-link" id="actionsMenuMobile" (click)="$event.stopPropagation()" ngbDropdownToggle>
+                  <i-bs name="three-dots-vertical"></i-bs>
+                </button>
+                <div ngbDropdownMenu aria-labelledby="actionsMenuMobile">
+                  <button (click)="filterDocuments(object)" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Document }" ngbDropdownItem i18n>Filter Documents</button>
+                  <button (click)="openEditDialog(object)" *pngxIfPermissions="{ action: PermissionAction.Change, type: permissionType }" ngbDropdownItem i18n>Edit</button>
+                  <button class="text-danger" (click)="openDeleteDialog(object)" *pngxIfPermissions="{ action: PermissionAction.Delete, type: permissionType }" ngbDropdownItem i18n>Delete</button>
+                </div>
+              </div>
+            </div>
+            <div class="btn-group d-none d-sm-block">
+              <button class="btn btn-sm btn-outline-secondary" (click)="filterDocuments(object); $event.stopPropagation();" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Document }">
+                <i-bs width="1em" height="1em" name="filter"></i-bs>&nbsp;<ng-container i18n>Documents</ng-container>
+              </button>
+              <button class="btn btn-sm btn-outline-secondary" (click)="openEditDialog(object); $event.stopPropagation();" *pngxIfPermissions="{ action: PermissionAction.Change, type: permissionType }" [disabled]="!userCanEdit(object)">
+                <i-bs width="1em" height="1em" name="pencil"></i-bs>&nbsp;<ng-container i18n>Edit</ng-container>
+              </button>
+              <button class="btn btn-sm btn-outline-danger" (click)="openDeleteDialog(object); $event.stopPropagation();" *pngxIfPermissions="{ action: PermissionAction.Delete, type: permissionType }" [disabled]="!userCanDelete(object)">
+                <i-bs width="1em" height="1em" name="trash"></i-bs>&nbsp;<ng-container i18n>Delete</ng-container>
+              </button>
+            </div>
+          </td>
+        </tr>
+      }
+    </tbody>
+  </table>
+</div>
+
+@if (!isLoading) {
+  <div class="d-flex mb-2">
+    @if (collectionSize > 0) {
+      <div>
+        <ng-container i18n>{collectionSize, plural, =1 {One {{typeName}}} other {{{collectionSize || 0}} total {{typeNamePlural}}}}</ng-container>
+        @if (selectedObjects.size > 0) {
+          &nbsp;({{selectedObjects.size}} selected)
+        }
+      </div>
+    }
+    @if (collectionSize > 20) {
+      <ngb-pagination class="ms-auto" [pageSize]="25" [collectionSize]="collectionSize" [(page)]="page" [maxSize]="5" (pageChange)="reloadData()" size="sm" aria-label="Pagination"></ngb-pagination>
+    }
+  </div>
+}
index 9bc68fb4921e9372d226393150edbb6b7900b5f0..632cbfe16ac7f1e28b047bc5ced6ab80be9a3058 100644 (file)
@@ -5,7 +5,7 @@
   i18n-info
   infoLink="usage/#workflows"
   >
-  <button type="button" class="btn btn-sm btn-outline-primary ms-4" (click)="editWorkflow()" *pngxIfPermissions="{ action: PermissionAction.Add, type: PermissionType.Workflow }">
+  <button type="button" class="btn btn-sm btn-outline-primary" (click)="editWorkflow()" *pngxIfPermissions="{ action: PermissionAction.Add, type: PermissionType.Workflow }">
     <i-bs name="plus-circle"></i-bs>&nbsp;<ng-container i18n>Add Workflow</ng-container>
   </button>
 </pngx-page-header>