diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 61722b5ad..999413c35 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -255,20 +255,20 @@ src/app/components/admin/trash/trash.component.ts - 118 - - - src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 37 - - - src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 40 + 127 src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html 43 + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 46 + + + src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html + 49 + src/app/components/dashboard/widgets/upload-file-widget/upload-file-widget.component.html 73 @@ -327,7 +327,7 @@ src/app/components/manage/custom-fields/custom-fields.component.html - 54 + 61 src/app/components/manage/management-list/management-list.component.html @@ -728,10 +728,6 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 10 - - src/app/components/dashboard/dashboard.component.html - 15 - src/app/components/dashboard/widgets/widget-frame/widget-frame.component.html 14 @@ -744,9 +740,21 @@ src/app/components/document-list/document-list.component.html 110 + + src/app/components/manage/custom-fields/custom-fields.component.html + 26 + src/app/components/manage/mail/mail.component.html - 164 + 40 + + + src/app/components/manage/mail/mail.component.html + 114 + + + src/app/components/manage/mail/mail.component.html + 178 src/app/components/manage/management-list/management-list.component.html @@ -768,6 +776,10 @@ src/app/components/manage/saved-views/saved-views.component.html 68 + + src/app/components/manage/workflows/workflows.component.html + 28 + Options to customize appearance, notifications and more. Settings apply to the <strong>current user only</strong>. @@ -1157,19 +1169,19 @@ src/app/components/manage/mail/mail.component.html - 59 + 66 src/app/components/manage/mail/mail.component.html - 69 + 76 src/app/components/manage/mail/mail.component.html - 126 + 140 src/app/components/manage/mail/mail.component.html - 138 + 152 src/app/components/manage/management-list/management-list.component.html @@ -1636,7 +1648,7 @@ src/app/components/manage/mail/mail.component.html - 96 + 103 src/app/components/manage/management-list/management-list.component.html @@ -1756,7 +1768,7 @@ src/app/components/manage/mail/mail.component.html - 100 + 107 src/app/components/manage/management-list/management-list.component.html @@ -1993,11 +2005,11 @@ src/app/components/admin/trash/trash.component.ts - 59 + 68 src/app/components/admin/trash/trash.component.ts - 88 + 97 src/app/components/admin/users-groups/users-groups.component.html @@ -2041,28 +2053,28 @@ src/app/components/manage/custom-fields/custom-fields.component.html - 36 + 43 src/app/components/manage/custom-fields/custom-fields.component.html - 48 + 55 src/app/components/manage/mail/mail.component.html - 60 + 67 src/app/components/manage/mail/mail.component.html - 72 - - - src/app/components/manage/mail/mail.component.html - 127 + 79 src/app/components/manage/mail/mail.component.html 141 + + src/app/components/manage/mail/mail.component.html + 155 + src/app/components/manage/management-list/management-list.component.html 9 @@ -2113,7 +2125,7 @@ src/app/components/manage/management-list/management-list.component.ts - 210 + 225 src/app/components/manage/saved-views/saved-views.component.html @@ -2121,11 +2133,11 @@ src/app/components/manage/workflows/workflows.component.html - 48 + 55 src/app/components/manage/workflows/workflows.component.html - 59 + 66 @@ -2139,37 +2151,37 @@ Confirm delete src/app/components/admin/trash/trash.component.ts - 55 + 64 src/app/components/admin/trash/trash.component.ts - 82 + 91 src/app/components/manage/management-list/management-list.component.ts - 206 + 221 src/app/components/manage/management-list/management-list.component.ts - 323 + 338 This operation will permanently delete this document. src/app/components/admin/trash/trash.component.ts - 56 + 65 This operation cannot be undone. src/app/components/admin/trash/trash.component.ts - 57 + 66 src/app/components/admin/trash/trash.component.ts - 86 + 95 src/app/components/admin/users-groups/users-groups.component.ts @@ -2181,37 +2193,37 @@ src/app/components/manage/custom-fields/custom-fields.component.ts - 83 + 93 src/app/components/manage/mail/mail.component.ts - 158 + 179 src/app/components/manage/mail/mail.component.ts - 238 + 259 src/app/components/manage/management-list/management-list.component.ts - 325 + 340 src/app/components/manage/workflows/workflows.component.ts - 115 + 124 Document deleted src/app/components/admin/trash/trash.component.ts - 66 + 75 Error deleting document src/app/components/admin/trash/trash.component.ts - 71 + 80 src/app/components/document-detail/document-detail.component.ts @@ -2222,56 +2234,56 @@ This operation will permanently delete the selected documents. src/app/components/admin/trash/trash.component.ts - 84 + 93 This operation will permanently delete all documents in the trash. src/app/components/admin/trash/trash.component.ts - 85 + 94 Document(s) deleted src/app/components/admin/trash/trash.component.ts - 96 + 105 Error deleting document(s) src/app/components/admin/trash/trash.component.ts - 103 + 112 Document restored src/app/components/admin/trash/trash.component.ts - 116 + 125 Error restoring document src/app/components/admin/trash/trash.component.ts - 126 + 135 Document(s) restored src/app/components/admin/trash/trash.component.ts - 136 + 145 Error restoring document(s) src/app/components/admin/trash/trash.component.ts - 142 + 151 @@ -2364,27 +2376,27 @@ src/app/components/manage/custom-fields/custom-fields.component.html - 35 + 42 src/app/components/manage/custom-fields/custom-fields.component.html - 45 + 52 src/app/components/manage/mail/mail.component.html - 58 + 65 src/app/components/manage/mail/mail.component.html - 66 + 73 src/app/components/manage/mail/mail.component.html - 125 + 139 src/app/components/manage/mail/mail.component.html - 135 + 149 src/app/components/manage/management-list/management-list.component.html @@ -2420,11 +2432,11 @@ src/app/components/manage/workflows/workflows.component.html - 47 + 54 src/app/components/manage/workflows/workflows.component.html - 56 + 63 @@ -2520,23 +2532,23 @@ src/app/components/manage/custom-fields/custom-fields.component.ts - 85 + 95 src/app/components/manage/mail/mail.component.ts - 160 + 181 src/app/components/manage/mail/mail.component.ts - 240 + 261 src/app/components/manage/management-list/management-list.component.ts - 327 + 342 src/app/components/manage/workflows/workflows.component.ts - 117 + 126 @@ -2686,7 +2698,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 72 + 106 @@ -2705,7 +2717,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 64 + 93 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -2736,7 +2748,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 80 + 119 @@ -2751,7 +2763,7 @@ src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 88 + 132 @@ -2911,11 +2923,11 @@ src/app/components/document-list/document-card-large/document-card-large.component.html - 57 + 72 src/app/components/document-list/document-card-small/document-card-small.component.html - 129 + 143 @@ -2933,7 +2945,7 @@ src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 74 + 80 src/app/components/document-detail/document-detail.component.html @@ -2945,11 +2957,11 @@ src/app/components/document-list/document-card-large/document-card-large.component.html - 63 + 78 src/app/components/document-list/document-card-small/document-card-small.component.html - 135 + 149 @@ -3238,7 +3250,7 @@ src/app/components/document-list/document-card-large/document-card-large.component.html - 60 + 75 @@ -3263,7 +3275,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts - 65 + 75 @@ -3274,7 +3286,7 @@ src/app/components/manage/custom-fields/custom-fields.component.ts - 73 + 83 @@ -3758,7 +3770,7 @@ src/app/components/manage/mail/mail.component.html - 98 + 105 @@ -3780,11 +3792,11 @@ src/app/components/manage/mail/mail.component.html - 114 + 128 src/app/components/manage/workflows/workflows.component.html - 34 + 41 @@ -5381,19 +5393,19 @@ src/app/components/manage/mail/mail.component.html - 128 + 142 src/app/components/manage/mail/mail.component.html - 146 + 160 src/app/components/manage/workflows/workflows.component.html - 49 + 56 src/app/components/manage/workflows/workflows.component.html - 64 + 71 @@ -5787,7 +5799,7 @@ src/app/components/manage/mail/mail.component.html - 99 + 106 src/app/components/manage/workflows/workflows.component.html @@ -5921,11 +5933,11 @@ Filter by correspondent src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 47 + 53 src/app/components/document-list/document-card-large/document-card-large.component.html - 20 + 25 src/app/components/document-list/document-list.component.html @@ -5936,11 +5948,11 @@ Filter by document type src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 57 + 63 src/app/components/document-list/document-card-large/document-card-large.component.html - 74 + 96 src/app/components/document-list/document-list.component.html @@ -5951,11 +5963,11 @@ Filter by storage path src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 62 + 68 src/app/components/document-list/document-card-large/document-card-large.component.html - 80 + 102 src/app/components/document-list/document-list.component.html @@ -5966,7 +5978,7 @@ No documents src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html - 116 + 125 @@ -5980,42 +5992,42 @@ Go to inbox src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 5 + 28 Documents in inbox src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 6 + 29 Go to documents src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 10 + 33 Total documents src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 11 + 34 Total characters src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 15 + 38 Current ASN src/app/components/dashboard/widgets/statistics-widget/statistics-widget.component.html - 20 + 43 @@ -6177,7 +6189,7 @@ src/app/components/document-list/document-card-large/document-card-large.component.html - 54 + 69 @@ -7152,7 +7164,7 @@ Filter by tag src/app/components/document-list/document-card-large/document-card-large.component.html - 31 + 36 src/app/components/document-list/document-list.component.html @@ -7163,74 +7175,74 @@ View notes src/app/components/document-list/document-card-large/document-card-large.component.html - 69 + 91 Created: src/app/components/document-list/document-card-large/document-card-large.component.html - 93,94 + 115,116 src/app/components/document-list/document-card-small/document-card-small.component.html - 66,67 + 76,77 src/app/components/document-list/document-card-small/document-card-small.component.html - 81,82 + 91,92 Added: src/app/components/document-list/document-card-large/document-card-large.component.html - 94,95 + 116,117 src/app/components/document-list/document-card-small/document-card-small.component.html - 67,68 + 77,78 src/app/components/document-list/document-card-small/document-card-small.component.html - 82,83 + 92,93 Modified: src/app/components/document-list/document-card-large/document-card-large.component.html - 95,96 + 117,118 src/app/components/document-list/document-card-small/document-card-small.component.html - 68,69 + 78,79 src/app/components/document-list/document-card-small/document-card-small.component.html - 83,84 + 93,94 {VAR_PLURAL, plural, =1 {1 page} other { pages}} src/app/components/document-list/document-card-large/document-card-large.component.html - 112 + 134 src/app/components/document-list/document-card-small/document-card-small.component.html - 96 + 106 Shared src/app/components/document-list/document-card-large/document-card-large.component.html - 122 + 144 src/app/components/document-list/document-card-small/document-card-small.component.html - 115 + 125 src/app/data/document.ts @@ -7245,35 +7257,35 @@ Score: src/app/components/document-list/document-card-large/document-card-large.component.html - 127 + 149 Toggle tag filter src/app/components/document-list/document-card-small/document-card-small.component.html - 16 + 20 Toggle correspondent filter src/app/components/document-list/document-card-small/document-card-small.component.html - 38 + 43 Toggle document type filter src/app/components/document-list/document-card-small/document-card-small.component.html - 49 + 59 Toggle storage path filter src/app/components/document-list/document-card-small/document-card-small.component.html - 56 + 66 @@ -7859,28 +7871,28 @@ correspondent src/app/components/manage/correspondent-list/correspondent-list.component.ts - 40 + 39 correspondents src/app/components/manage/correspondent-list/correspondent-list.component.ts - 41 + 40 Last used src/app/components/manage/correspondent-list/correspondent-list.component.ts - 46 + 45 Do you really want to delete the correspondent ""? src/app/components/manage/correspondent-list/correspondent-list.component.ts - 89 + 71 @@ -7908,7 +7920,7 @@ Filter Documents () src/app/components/manage/custom-fields/custom-fields.component.html - 38 + 45 src/app/components/manage/management-list/management-list.component.html @@ -7931,35 +7943,35 @@ No fields defined. src/app/components/manage/custom-fields/custom-fields.component.html - 63 + 70 Confirm delete field src/app/components/manage/custom-fields/custom-fields.component.ts - 81 + 91 This operation will permanently delete this field. src/app/components/manage/custom-fields/custom-fields.component.ts - 82 + 92 Deleted field src/app/components/manage/custom-fields/custom-fields.component.ts - 91 + 101 Error deleting field. src/app/components/manage/custom-fields/custom-fields.component.ts - 97 + 107 @@ -8029,197 +8041,197 @@ No mail accounts defined. src/app/components/manage/mail/mail.component.html - 80 + 87 Mail rules src/app/components/manage/mail/mail.component.html - 88 + 95 Add Rule src/app/components/manage/mail/mail.component.html - 90 + 97 Sort Order src/app/components/manage/mail/mail.component.html - 97 + 104 Disabled src/app/components/manage/mail/mail.component.html - 114 + 128 src/app/components/manage/workflows/workflows.component.html - 34 + 41 No mail rules defined. src/app/components/manage/mail/mail.component.html - 155 + 169 Error retrieving mail accounts src/app/components/manage/mail/mail.component.ts - 79 + 92 Error retrieving mail rules src/app/components/manage/mail/mail.component.ts - 93 + 114 OAuth2 authentication success src/app/components/manage/mail/mail.component.ts - 101 + 122 OAuth2 authentication failed, see logs for details src/app/components/manage/mail/mail.component.ts - 112 + 133 Saved account "". src/app/components/manage/mail/mail.component.ts - 136 + 157 Error saving account. src/app/components/manage/mail/mail.component.ts - 148 + 169 Confirm delete mail account src/app/components/manage/mail/mail.component.ts - 156 + 177 This operation will permanently delete this mail account. src/app/components/manage/mail/mail.component.ts - 157 + 178 Deleted mail account src/app/components/manage/mail/mail.component.ts - 166 + 187 Error deleting mail account. src/app/components/manage/mail/mail.component.ts - 176 + 197 Saved rule "". src/app/components/manage/mail/mail.component.ts - 195 + 216 Error saving rule. src/app/components/manage/mail/mail.component.ts - 206 + 227 Rule "" enabled. src/app/components/manage/mail/mail.component.ts - 222 + 243 Rule "" disabled. src/app/components/manage/mail/mail.component.ts - 223 + 244 Error toggling rule. src/app/components/manage/mail/mail.component.ts - 227 + 248 Confirm delete mail rule src/app/components/manage/mail/mail.component.ts - 236 + 257 This operation will permanently delete this mail rule. src/app/components/manage/mail/mail.component.ts - 237 + 258 Deleted mail rule src/app/components/manage/mail/mail.component.ts - 246 + 267 Error deleting mail rule. src/app/components/manage/mail/mail.component.ts - 255 + 276 Permissions updated src/app/components/manage/mail/mail.component.ts - 277 + 298 Error updating permissions src/app/components/manage/mail/mail.component.ts - 282 + 303 src/app/components/manage/management-list/management-list.component.ts - 310 + 325 @@ -8302,7 +8314,7 @@ Automatic src/app/components/manage/management-list/management-list.component.ts - 117 + 125 src/app/data/matching-model.ts @@ -8313,7 +8325,7 @@ None src/app/components/manage/management-list/management-list.component.ts - 119 + 127 src/app/data/matching-model.ts @@ -8324,70 +8336,70 @@ Successfully created . src/app/components/manage/management-list/management-list.component.ts - 163 + 178 Error occurred while creating . src/app/components/manage/management-list/management-list.component.ts - 168 + 183 Successfully updated . src/app/components/manage/management-list/management-list.component.ts - 183 + 198 Error occurred while saving . src/app/components/manage/management-list/management-list.component.ts - 188 + 203 Associated documents will not be deleted. src/app/components/manage/management-list/management-list.component.ts - 208 + 223 Error while deleting element src/app/components/manage/management-list/management-list.component.ts - 224 + 239 Permissions updated successfully src/app/components/manage/management-list/management-list.component.ts - 303 + 318 This operation will permanently delete all objects. src/app/components/manage/management-list/management-list.component.ts - 324 + 339 Objects deleted successfully src/app/components/manage/management-list/management-list.component.ts - 338 + 353 Error deleting objects src/app/components/manage/management-list/management-list.component.ts - 344 + 359 @@ -8520,70 +8532,70 @@ No workflows defined. src/app/components/manage/workflows/workflows.component.html - 73 + 80 Saved workflow "". src/app/components/manage/workflows/workflows.component.ts - 78 + 87 Error saving workflow. src/app/components/manage/workflows/workflows.component.ts - 86 + 95 Confirm delete workflow src/app/components/manage/workflows/workflows.component.ts - 113 + 122 This operation will permanently delete this workflow. src/app/components/manage/workflows/workflows.component.ts - 114 + 123 Deleted workflow src/app/components/manage/workflows/workflows.component.ts - 123 + 132 Error deleting workflow. src/app/components/manage/workflows/workflows.component.ts - 128 + 137 Enabled workflow src/app/components/manage/workflows/workflows.component.ts - 139 + 148 Disabled workflow src/app/components/manage/workflows/workflows.component.ts - 140 + 149 Error toggling workflow. src/app/components/manage/workflows/workflows.component.ts - 146 + 155 diff --git a/src-ui/src/app/components/admin/trash/trash.component.html b/src-ui/src/app/components/admin/trash/trash.component.html index 3dbf3db2b..a148f2033 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.html +++ b/src-ui/src/app/components/admin/trash/trash.component.html @@ -47,7 +47,7 @@ } @for (document of documentsInTrash; track document.id) { - +
diff --git a/src-ui/src/app/components/admin/trash/trash.component.scss b/src-ui/src/app/components/admin/trash/trash.component.scss index e69de29bb..648aa7f4d 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.scss +++ b/src-ui/src/app/components/admin/trash/trash.component.scss @@ -0,0 +1,8 @@ +.data-row { + opacity: 0; + transition: opacity .2s; +} + +.reveal { + opacity: 1; +} diff --git a/src-ui/src/app/components/admin/trash/trash.component.spec.ts b/src-ui/src/app/components/admin/trash/trash.component.spec.ts index 9ac89d9a5..066311726 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.spec.ts +++ b/src-ui/src/app/components/admin/trash/trash.component.spec.ts @@ -69,6 +69,7 @@ describe('TrashComponent', () => { }) it('should call correct service method on reload', () => { + jest.useFakeTimers() const trashSpy = jest.spyOn(trashService, 'getTrash') trashSpy.mockReturnValue( of({ @@ -78,6 +79,7 @@ describe('TrashComponent', () => { }) ) component.reload() + jest.advanceTimersByTime(100) expect(trashSpy).toHaveBeenCalled() expect(component.documentsInTrash).toEqual(documentsInTrash) }) diff --git a/src-ui/src/app/components/admin/trash/trash.component.ts b/src-ui/src/app/components/admin/trash/trash.component.ts index 9364d4cce..055c5fa97 100644 --- a/src-ui/src/app/components/admin/trash/trash.component.ts +++ b/src-ui/src/app/components/admin/trash/trash.component.ts @@ -4,7 +4,7 @@ import { Document } from 'src/app/data/document' import { ToastService } from 'src/app/services/toast.service' import { TrashService } from 'src/app/services/trash.service' import { ConfirmDialogComponent } from '../../common/confirm-dialog/confirm-dialog.component' -import { Subject, takeUntil } from 'rxjs' +import { delay, Subject, takeUntil, tap } from 'rxjs' import { SettingsService } from 'src/app/services/settings.service' import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { Router } from '@angular/router' @@ -21,6 +21,7 @@ export class TrashComponent implements OnDestroy { public page: number = 1 public totalDocuments: number public isLoading: boolean = false + public reveal: boolean = false unsubscribeNotifier: Subject = new Subject() constructor( @@ -40,12 +41,20 @@ export class TrashComponent implements OnDestroy { reload() { this.isLoading = true - this.trashService.getTrash(this.page).subscribe((r) => { - this.documentsInTrash = r.results - this.totalDocuments = r.count - this.isLoading = false - this.selectedDocuments.clear() - }) + this.trashService + .getTrash(this.page) + .pipe( + tap((r) => { + this.documentsInTrash = r.results + this.totalDocuments = r.count + this.selectedDocuments.clear() + }), + delay(100) + ) + .subscribe(() => { + this.reveal = true + this.isLoading = false + }) } delete(document: Document) { diff --git a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts b/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts index 224b9c8a3..94e12cd48 100644 --- a/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts +++ b/src-ui/src/app/components/manage/correspondent-list/correspondent-list.component.ts @@ -12,7 +12,6 @@ import { CorrespondentService } from 'src/app/services/rest/correspondent.servic import { ToastService } from 'src/app/services/toast.service' import { CorrespondentEditDialogComponent } from '../../common/edit-dialog/correspondent-edit-dialog/correspondent-edit-dialog.component' import { ManagementListComponent } from '../management-list/management-list.component' -import { takeUntil } from 'rxjs' @Component({ selector: 'pngx-correspondent-list', @@ -65,24 +64,7 @@ export class CorrespondentListComponent extends ManagementListComponent { - this.data = c.results - this.collectionSize = c.count - this.isLoading = false - }) + super.reloadData({ last_correspondence: true }) } getDeleteMessage(object: Correspondent) { diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.html b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.html index 8439cd1a7..291520b83 100644 --- a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.html +++ b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.html @@ -13,16 +13,23 @@
  • -
    +
    Name
    Data Type
    Actions
  • + @if (loading) { +
  • +
    + Loading... +
  • + } + @for (field of fields; track field) {
  • -
    +
    {{getDataType(field)}}
    @@ -59,7 +66,7 @@
  • } - @if (fields.length === 0) { + @if (!loading && fields.length === 0) {
  • No fields defined.
  • }
diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.scss b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.scss index dfdd20433..22a61847c 100644 --- a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.scss +++ b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.scss @@ -2,3 +2,12 @@ .d-block.d-sm-none .dropdown-toggle::after { display: none; } + +.list-group-item .row { + opacity: 0; + transition: opacity .2s; +} + +.list-group-item .reveal { + opacity: 1; +} diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts index 5feb17055..1be5484c1 100644 --- a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts +++ b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.spec.ts @@ -95,6 +95,8 @@ describe('CustomFieldsComponent', () => { fixture = TestBed.createComponent(CustomFieldsComponent) component = fixture.componentInstance fixture.detectChanges() + jest.useFakeTimers() + jest.advanceTimersByTime(100) }) it('should support create, show notification on error / success', () => { @@ -119,6 +121,7 @@ describe('CustomFieldsComponent', () => { editDialog.succeeded.emit(fields[0]) expect(toastInfoSpy).toHaveBeenCalled() expect(reloadSpy).toHaveBeenCalled() + jest.advanceTimersByTime(100) }) it('should support edit, show notification on error / success', () => { diff --git a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts index 0933cd38f..9300a0c2c 100644 --- a/src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts +++ b/src-ui/src/app/components/manage/custom-fields/custom-fields.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' -import { Subject, takeUntil } from 'rxjs' +import { delay, Subject, takeUntil, tap } from 'rxjs' import { DATA_TYPE_LABELS, CustomField } from 'src/app/data/custom-field' import { PermissionsService } from 'src/app/services/permissions.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' @@ -28,6 +28,9 @@ export class CustomFieldsComponent { public fields: CustomField[] = [] + public loading: boolean = true + public reveal: boolean = false + private unsubscribeNotifier: Subject = new Subject() constructor( private customFieldsService: CustomFieldsService, @@ -47,9 +50,16 @@ export class CustomFieldsComponent reload() { this.customFieldsService .listAll() - .pipe(takeUntil(this.unsubscribeNotifier)) - .subscribe((r) => { - this.fields = r.results + .pipe( + takeUntil(this.unsubscribeNotifier), + tap((r) => { + this.fields = r.results + }), + delay(100) + ) + .subscribe(() => { + this.reveal = true + this.loading = false }) } diff --git a/src-ui/src/app/components/manage/mail/mail.component.html b/src-ui/src/app/components/manage/mail/mail.component.html index 9058e6884..090afe0cd 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.html +++ b/src-ui/src/app/components/manage/mail/mail.component.html @@ -26,7 +26,7 @@
  • -
    +
    Name
    Server
    Username
    @@ -34,9 +34,16 @@
  • + @if (loadingAccounts) { +
  • +
    + Loading... +
  • + } + @for (account of mailAccounts; track account) {
  • -
    +
  • } - @if (mailAccounts.length === 0) { + @if (!loadingAccounts && mailAccounts.length === 0) {
  • No mail accounts defined.
  • }
@@ -92,7 +99,7 @@
  • -
    +
    Name
    Sort Order
    Account
    @@ -101,9 +108,16 @@
  • + @if (loadingRules) { +
  • +
    + Loading... +
  • + } + @for (rule of mailRules; track rule) {
  • -
    +
    {{rule.order}}
    {{(mailAccountService.getCached(rule.account) | async)?.name}}
    @@ -151,7 +165,7 @@
  • } - @if (mailRules.length === 0) { + @if (!loadingRules && mailRules.length === 0) {
  • No mail rules defined.
  • }
diff --git a/src-ui/src/app/components/manage/mail/mail.component.scss b/src-ui/src/app/components/manage/mail/mail.component.scss index 0c1f432aa..d18ed3d30 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.scss +++ b/src-ui/src/app/components/manage/mail/mail.component.scss @@ -2,3 +2,12 @@ .d-block.d-sm-none .dropdown-toggle::after { display: none; } + +.list-group-item .row { + opacity: 0; + transition: opacity .2s; +} + +.list-group-item .reveal { + opacity: 1; +} diff --git a/src-ui/src/app/components/manage/mail/mail.component.spec.ts b/src-ui/src/app/components/manage/mail/mail.component.spec.ts index 34db62b7e..d3194459f 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.spec.ts +++ b/src-ui/src/app/components/manage/mail/mail.component.spec.ts @@ -129,6 +129,8 @@ describe('MailComponent', () => { fixture = TestBed.createComponent(MailComponent) component = fixture.componentInstance fixture.detectChanges() + jest.useFakeTimers() + jest.advanceTimersByTime(100) }) function completeSetup(excludeService = null) { @@ -386,6 +388,7 @@ describe('MailComponent', () => { component.oAuthAccountId = 3 const editSpy = jest.spyOn(component, 'editMailAccount') component.ngOnInit() + jest.advanceTimersByTime(200) expect(editSpy).toHaveBeenCalled() }) }) diff --git a/src-ui/src/app/components/manage/mail/mail.component.ts b/src-ui/src/app/components/manage/mail/mail.component.ts index f1c30674b..d4bbf77c4 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.ts +++ b/src-ui/src/app/components/manage/mail/mail.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit, OnDestroy } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' -import { Subject, first, takeUntil } from 'rxjs' +import { Subject, delay, first, takeUntil, tap } from 'rxjs' import { ObjectWithPermissions } from 'src/app/data/object-with-permissions' import { MailAccount, MailAccountType } from 'src/app/data/mail-account' import { MailRule } from 'src/app/data/mail-rule' @@ -47,6 +47,11 @@ export class MailComponent return this.settingsService.get(SETTINGS_KEYS.OUTLOOK_OAUTH_URL) } + public loadingRules: boolean = true + public revealRules: boolean = false + public loadingAccounts: boolean = true + public revealAccounts: boolean = false + constructor( public mailAccountService: MailAccountService, public mailRuleService: MailRuleService, @@ -62,9 +67,10 @@ export class MailComponent ngOnInit(): void { this.mailAccountService .listAll(null, null, { full_perms: true }) - .pipe(first(), takeUntil(this.unsubscribeNotifier)) - .subscribe({ - next: (r) => { + .pipe( + first(), + takeUntil(this.unsubscribeNotifier), + tap((r) => { this.mailAccounts = r.results if (this.oAuthAccountId) { this.editMailAccount( @@ -73,6 +79,13 @@ export class MailComponent ) ) } + }), + delay(100) + ) + .subscribe({ + next: () => { + this.loadingAccounts = false + this.revealAccounts = true }, error: (e) => { this.toastService.showError( @@ -84,10 +97,18 @@ export class MailComponent this.mailRuleService .listAll(null, null, { full_perms: true }) - .pipe(first(), takeUntil(this.unsubscribeNotifier)) + .pipe( + first(), + takeUntil(this.unsubscribeNotifier), + tap((r) => { + this.mailRules = r.results + }), + delay(100) + ) .subscribe({ next: (r) => { - this.mailRules = r.results + this.loadingRules = false + this.revealRules = true }, error: (e) => { this.toastService.showError($localize`Error retrieving mail rules`, e) diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.html b/src-ui/src/app/components/manage/management-list/management-list.component.html index da04208b4..6dbe590c7 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.html +++ b/src-ui/src/app/components/manage/management-list/management-list.component.html @@ -53,7 +53,7 @@ } @for (object of data; track object) { - +
diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.scss b/src-ui/src/app/components/manage/management-list/management-list.component.scss index aa2871d68..79db7e74f 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.scss +++ b/src-ui/src/app/components/manage/management-list/management-list.component.scss @@ -10,3 +10,12 @@ tbody tr:last-child td { .form-check { min-height: 0; } + +.data-row { + opacity: 0; + transition: opacity .2s; +} + +.reveal { + opacity: 1; +} diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.spec.ts b/src-ui/src/app/components/manage/management-list/management-list.component.spec.ts index 9aa876da2..02dec4b59 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.spec.ts +++ b/src-ui/src/app/components/manage/management-list/management-list.component.spec.ts @@ -150,6 +150,7 @@ describe('ManagementListComponent', () => { fixture.detectChanges() expect(component.nameFilter).toBeNull() expect(component.data).toEqual(tags) + tick(100) // load })) it('should support create, show notification on error / success', () => { diff --git a/src-ui/src/app/components/manage/management-list/management-list.component.ts b/src-ui/src/app/components/manage/management-list/management-list.component.ts index 27165a8fb..50ae1c86b 100644 --- a/src-ui/src/app/components/manage/management-list/management-list.component.ts +++ b/src-ui/src/app/components/manage/management-list/management-list.component.ts @@ -7,7 +7,13 @@ import { } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { Subject } from 'rxjs' -import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators' +import { + debounceTime, + delay, + distinctUntilChanged, + takeUntil, + tap, +} from 'rxjs/operators' import { MatchingModel, MATCHING_ALGORITHMS, @@ -89,6 +95,8 @@ export abstract class ManagementListComponent public selectedObjects: Set = new Set() public togggleAll: boolean = false + public reveal: boolean = false + ngOnInit(): void { this.reloadData() @@ -132,7 +140,7 @@ export abstract class ManagementListComponent this.reloadData() } - reloadData() { + reloadData(extraParams: { [key: string]: any } = null) { this.isLoading = true this.clearSelection() this.service @@ -142,12 +150,19 @@ export abstract class ManagementListComponent this.sortField, this.sortReverse, this._nameFilter, - true + true, + extraParams ) - .pipe(takeUntil(this.unsubscribeNotifier)) - .subscribe((c) => { - this.data = c.results - this.collectionSize = c.count + .pipe( + takeUntil(this.unsubscribeNotifier), + tap((c) => { + this.data = c.results + this.collectionSize = c.count + }), + delay(100) + ) + .subscribe(() => { + this.reveal = true this.isLoading = false }) } diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.html b/src-ui/src/app/components/manage/workflows/workflows.component.html index ddb8a8654..10c0cc80d 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.html +++ b/src-ui/src/app/components/manage/workflows/workflows.component.html @@ -13,7 +13,7 @@
  • -
    +
    Name
    Sort order
    Status
    @@ -22,9 +22,16 @@
  • + @if (loading) { +
  • +
    + Loading... +
  • + } + @for (workflow of workflows; track workflow.id) {
  • -
    +
    {{workflow.order}}
    @@ -69,7 +76,7 @@
  • } - @if (workflows.length === 0) { -
  • No workflows defined.
  • + @if (!loading && workflows.length === 0) { +
  • No workflows defined.
  • }
diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.scss b/src-ui/src/app/components/manage/workflows/workflows.component.scss index 0c1f432aa..d18ed3d30 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.scss +++ b/src-ui/src/app/components/manage/workflows/workflows.component.scss @@ -2,3 +2,12 @@ .d-block.d-sm-none .dropdown-toggle::after { display: none; } + +.list-group-item .row { + opacity: 0; + transition: opacity .2s; +} + +.list-group-item .reveal { + opacity: 1; +} diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts b/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts index 9d92d9ba7..a268d964c 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts +++ b/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts @@ -119,10 +119,11 @@ describe('WorkflowsComponent', () => { ) modalService = TestBed.inject(NgbModal) toastService = TestBed.inject(ToastService) - + jest.useFakeTimers() fixture = TestBed.createComponent(WorkflowsComponent) component = fixture.componentInstance fixture.detectChanges() + jest.advanceTimersByTime(100) }) it('should support create, show notification on error / success', () => { diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.ts b/src-ui/src/app/components/manage/workflows/workflows.component.ts index 592dd3efe..106b99485 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.ts +++ b/src-ui/src/app/components/manage/workflows/workflows.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core' import { WorkflowService } from 'src/app/services/rest/workflow.service' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' -import { Subject, takeUntil } from 'rxjs' +import { delay, Subject, takeUntil, tap } from 'rxjs' import { Workflow } from 'src/app/data/workflow' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { ToastService } from 'src/app/services/toast.service' @@ -26,6 +26,9 @@ export class WorkflowsComponent private unsubscribeNotifier: Subject = new Subject() + public loading: boolean = false + public reveal: boolean = false + constructor( private workflowService: WorkflowService, public permissionsService: PermissionsService, @@ -40,11 +43,17 @@ export class WorkflowsComponent } reload() { + this.loading = true this.workflowService .listAll() - .pipe(takeUntil(this.unsubscribeNotifier)) - .subscribe((r) => { - this.workflows = r.results + .pipe( + takeUntil(this.unsubscribeNotifier), + tap((r) => (this.workflows = r.results)), + delay(100) + ) + .subscribe(() => { + this.reveal = true + this.loading = false }) }