From 8e6063ab11b5954302e8839d0175e4d18e21727e Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 15 Jan 2025 23:28:34 -0800 Subject: [PATCH] Make it a separate button --- src-ui/messages.xlf | 366 +++++++++--------- .../email-document-dropdown.component.html | 32 ++ .../email-document-dropdown.component.scss | 3 + .../email-document-dropdown.component.spec.ts | 56 +++ .../email-document-dropdown.component.ts | 82 ++++ .../share-document-dropdown.component.html | 104 ----- .../share-document-dropdown.component.scss | 17 - .../share-links-dropdown.component.html | 70 ++++ .../share-links-dropdown.component.scss | 14 + .../share-links-dropdown.component.spec.ts} | 39 +- .../share-links-dropdown.component.ts} | 79 +--- .../document-detail.component.html | 5 +- .../document-detail.component.ts | 6 +- 13 files changed, 472 insertions(+), 401 deletions(-) create mode 100644 src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.html create mode 100644 src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.scss create mode 100644 src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.spec.ts create mode 100644 src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts delete mode 100644 src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.html delete mode 100644 src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.scss create mode 100644 src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.html create mode 100644 src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.scss rename src-ui/src/app/components/common/{share-document-dropdown/share-document-dropdown.component.spec.ts => share-links-dropdown/share-links-dropdown.component.spec.ts} (81%) rename src-ui/src/app/components/common/{share-document-dropdown/share-document-dropdown.component.ts => share-links-dropdown/share-links-dropdown.component.ts} (65%) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 60f9f474b..90fe30781 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -385,7 +385,7 @@ src/app/components/document-detail/document-detail.component.html - 100 + 103 @@ -534,7 +534,7 @@ src/app/components/document-detail/document-detail.component.html - 353 + 356 @@ -593,7 +593,7 @@ src/app/components/document-detail/document-detail.component.html - 346 + 349 src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html @@ -739,7 +739,7 @@ src/app/components/document-detail/document-detail.component.html - 366 + 369 src/app/components/document-list/document-list.component.html @@ -1190,7 +1190,7 @@ src/app/components/document-detail/document-detail.component.html - 322 + 325 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -2077,8 +2077,8 @@ 19 - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 69 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 37 src/app/components/document-detail/document-detail.component.html @@ -2537,19 +2537,19 @@ src/app/components/document-detail/document-detail.component.ts - 958 + 960 src/app/components/document-detail/document-detail.component.ts - 1318 + 1320 src/app/components/document-detail/document-detail.component.ts - 1357 + 1359 src/app/components/document-detail/document-detail.component.ts - 1398 + 1400 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3157,7 +3157,7 @@ src/app/components/document-detail/document-detail.component.ts - 911 + 913 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -3391,11 +3391,11 @@ src/app/components/document-detail/document-detail.component.html - 94 + 97 src/app/components/document-detail/document-detail.component.ts - 1375 + 1377 src/app/guards/dirty-saved-view.guard.ts @@ -4288,7 +4288,7 @@ src/app/components/document-detail/document-detail.component.html - 288 + 291 @@ -4386,6 +4386,10 @@ src/app/components/common/edit-dialog/workflow-edit-dialog/workflow-edit-dialog.component.ts 125 + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.html + 4 + src/app/components/common/profile-edit-dialog/profile-edit-dialog.component.html 10 @@ -5061,6 +5065,62 @@ 229 + + Email address(es) + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.html + 8 + + + + Subject + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.html + 12 + + + + Message + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.html + 16 + + + + Use archive version + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.html + 22 + + + + Send email + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.html + 28 + + + + Email Document + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts + 19 + + + + Email sent + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts + 74 + + + + Error emailing document + + src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts + 78 + + Include @@ -5082,8 +5142,8 @@ 58 - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 96 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 64 src/app/components/manage/management-list/management-list.component.html @@ -5543,8 +5603,8 @@ 155 - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 61 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 29 src/app/components/common/system-status-dialog/system-status-dialog.component.html @@ -5585,8 +5645,8 @@ 162 - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 72 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 40 @@ -5765,159 +5825,103 @@ 320 - - Share + + Share Links - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html 4 - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 65 - - - - Email document - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 10 - - - - Email address(es) - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 12 - - - - Subject - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 16 - - - - Message - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 20 - - - - Use archive version - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 26 - - - - Send email - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts 32 - - Share links - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 38 - - No existing links - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 41,43 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 9,11 + + + + Share + + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 33 Share archive version - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 79 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 47 Expires - src/app/components/common/share-document-dropdown/share-document-dropdown.component.html - 83 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.html + 51 1 day - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 18 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 25 - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 129 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 111 7 days - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 19 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 26 30 days - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 20 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 27 Never - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 21 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 28 Error retrieving links - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 110 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 92 days - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 129 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 111 Error deleting link - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 158 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 140 Error creating link - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 186 - - - - Email sent - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 211 - - - - Error emailing document - - src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts - 215 + src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts + 168 @@ -6439,21 +6443,21 @@ Previous src/app/components/document-detail/document-detail.component.html - 97 + 100 Details src/app/components/document-detail/document-detail.component.html - 110 + 113 Title src/app/components/document-detail/document-detail.component.html - 113 + 116 src/app/components/document-list/document-list.component.html @@ -6476,21 +6480,21 @@ Archive serial number src/app/components/document-detail/document-detail.component.html - 114 + 117 Date created src/app/components/document-detail/document-detail.component.html - 115 + 118 Correspondent src/app/components/document-detail/document-detail.component.html - 117 + 120 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -6517,7 +6521,7 @@ Document type src/app/components/document-detail/document-detail.component.html - 119 + 122 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -6544,7 +6548,7 @@ Storage path src/app/components/document-detail/document-detail.component.html - 121 + 124 src/app/components/document-list/bulk-editor/bulk-editor.component.html @@ -6567,7 +6571,7 @@ Default src/app/components/document-detail/document-detail.component.html - 122 + 125 src/app/components/manage/saved-views/saved-views.component.html @@ -6578,14 +6582,14 @@ Content src/app/components/document-detail/document-detail.component.html - 218 + 221 Metadata src/app/components/document-detail/document-detail.component.html - 227 + 230 src/app/components/document-detail/metadata-collapse/metadata-collapse.component.ts @@ -6596,175 +6600,175 @@ Date modified src/app/components/document-detail/document-detail.component.html - 234 + 237 Date added src/app/components/document-detail/document-detail.component.html - 238 + 241 Media filename src/app/components/document-detail/document-detail.component.html - 242 + 245 Original filename src/app/components/document-detail/document-detail.component.html - 246 + 249 Original MD5 checksum src/app/components/document-detail/document-detail.component.html - 250 + 253 Original file size src/app/components/document-detail/document-detail.component.html - 254 + 257 Original mime type src/app/components/document-detail/document-detail.component.html - 258 + 261 Archive MD5 checksum src/app/components/document-detail/document-detail.component.html - 263 + 266 Archive file size src/app/components/document-detail/document-detail.component.html - 269 + 272 Original document metadata src/app/components/document-detail/document-detail.component.html - 278 + 281 Archived document metadata src/app/components/document-detail/document-detail.component.html - 281 + 284 Notes src/app/components/document-detail/document-detail.component.html - 300,303 + 303,306 History src/app/components/document-detail/document-detail.component.html - 311 + 314 Save & next src/app/components/document-detail/document-detail.component.html - 348 + 351 Save & close src/app/components/document-detail/document-detail.component.html - 351 + 354 Document loading... src/app/components/document-detail/document-detail.component.html - 361 + 364 Enter Password src/app/components/document-detail/document-detail.component.html - 415 + 418 An error occurred loading content: src/app/components/document-detail/document-detail.component.ts - 412,414 + 414,416 Document changes detected src/app/components/document-detail/document-detail.component.ts - 435 + 437 The version of this document in your browser session appears older than the existing version. src/app/components/document-detail/document-detail.component.ts - 436 + 438 Saving the document here may overwrite other changes that were made. To restore the existing version, discard your changes or close the document. src/app/components/document-detail/document-detail.component.ts - 437 + 439 Ok src/app/components/document-detail/document-detail.component.ts - 439 + 441 Next document src/app/components/document-detail/document-detail.component.ts - 546 + 548 Previous document src/app/components/document-detail/document-detail.component.ts - 556 + 558 Close document src/app/components/document-detail/document-detail.component.ts - 564 + 566 src/app/services/open-documents.service.ts @@ -6775,67 +6779,67 @@ Save document src/app/components/document-detail/document-detail.component.ts - 571 + 573 Save and close / next src/app/components/document-detail/document-detail.component.ts - 580 + 582 Error retrieving metadata src/app/components/document-detail/document-detail.component.ts - 632 + 634 Error retrieving suggestions. src/app/components/document-detail/document-detail.component.ts - 661 + 663 Document "" saved successfully. src/app/components/document-detail/document-detail.component.ts - 813 + 815 src/app/components/document-detail/document-detail.component.ts - 829 + 831 Error saving document "" src/app/components/document-detail/document-detail.component.ts - 835 + 837 Error saving document src/app/components/document-detail/document-detail.component.ts - 880 + 882 Do you really want to move the document "" to the trash? src/app/components/document-detail/document-detail.component.ts - 912 + 914 Documents can be restored prior to permanent deletion. src/app/components/document-detail/document-detail.component.ts - 913 + 915 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6846,7 +6850,7 @@ Move to trash src/app/components/document-detail/document-detail.component.ts - 915 + 917 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6857,14 +6861,14 @@ Error deleting document src/app/components/document-detail/document-detail.component.ts - 934 + 936 Reprocess confirm src/app/components/document-detail/document-detail.component.ts - 954 + 956 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6875,77 +6879,77 @@ This operation will permanently recreate the archive file for this document. src/app/components/document-detail/document-detail.component.ts - 955 + 957 The archive file will be re-generated with the current settings. src/app/components/document-detail/document-detail.component.ts - 956 + 958 Reprocess operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see new content. src/app/components/document-detail/document-detail.component.ts - 966 + 968 Error executing operation src/app/components/document-detail/document-detail.component.ts - 977 + 979 Error downloading document src/app/components/document-detail/document-detail.component.ts - 1024 + 1026 Page Fit src/app/components/document-detail/document-detail.component.ts - 1103 + 1105 Split confirm src/app/components/document-detail/document-detail.component.ts - 1316 + 1318 This operation will split the selected document(s) into new documents. src/app/components/document-detail/document-detail.component.ts - 1317 + 1319 Split operation for "" will begin in the background. src/app/components/document-detail/document-detail.component.ts - 1333 + 1335 Error executing split operation src/app/components/document-detail/document-detail.component.ts - 1342 + 1344 Rotate confirm src/app/components/document-detail/document-detail.component.ts - 1355 + 1357 src/app/components/document-list/bulk-editor/bulk-editor.component.ts @@ -6956,60 +6960,60 @@ This operation will permanently rotate the original version of the current document. src/app/components/document-detail/document-detail.component.ts - 1356 + 1358 Rotation of "" will begin in the background. Close and re-open the document after the operation has completed to see the changes. src/app/components/document-detail/document-detail.component.ts - 1372 + 1374 Error executing rotate operation src/app/components/document-detail/document-detail.component.ts - 1384 + 1386 Delete pages confirm src/app/components/document-detail/document-detail.component.ts - 1396 + 1398 This operation will permanently delete the selected pages from the original document. src/app/components/document-detail/document-detail.component.ts - 1397 + 1399 Delete pages operation for "" will begin in the background. Close and re-open or reload this document after the operation has completed to see the changes. src/app/components/document-detail/document-detail.component.ts - 1412 + 1414 Error executing delete pages operation src/app/components/document-detail/document-detail.component.ts - 1421 + 1423 An error occurred loading tiff: src/app/components/document-detail/document-detail.component.ts - 1461 + 1463 src/app/components/document-detail/document-detail.component.ts - 1465 + 1467 diff --git a/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.html b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.html new file mode 100644 index 000000000..e22ade106 --- /dev/null +++ b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.html @@ -0,0 +1,32 @@ +
+ + +
diff --git a/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.scss b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.scss new file mode 100644 index 000000000..f6e9b1263 --- /dev/null +++ b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.scss @@ -0,0 +1,3 @@ +.email-document-dropdown { + min-width: 350px; +} diff --git a/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.spec.ts b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.spec.ts new file mode 100644 index 000000000..0a4c528b5 --- /dev/null +++ b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.spec.ts @@ -0,0 +1,56 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing' + +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' +import { provideHttpClientTesting } from '@angular/common/http/testing' +import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' +import { of, throwError } from 'rxjs' +import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' +import { PermissionsService } from 'src/app/services/permissions.service' +import { DocumentService } from 'src/app/services/rest/document.service' +import { ToastService } from 'src/app/services/toast.service' +import { EmailDocumentDropdownComponent } from './email-document-dropdown.component' + +describe('EmailDocumentDropdownComponent', () => { + let component: EmailDocumentDropdownComponent + let fixture: ComponentFixture + let documentService: DocumentService + let permissionsService: PermissionsService + let toastService: ToastService + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ + EmailDocumentDropdownComponent, + IfPermissionsDirective, + NgxBootstrapIconsModule.pick(allIcons), + ], + providers: [ + provideHttpClient(withInterceptorsFromDi()), + provideHttpClientTesting(), + ], + }).compileComponents() + + fixture = TestBed.createComponent(EmailDocumentDropdownComponent) + documentService = TestBed.inject(DocumentService) + toastService = TestBed.inject(ToastService) + component = fixture.componentInstance + fixture.detectChanges() + }) + + it('should support sending document via email, showing error if needed', () => { + const toastErrorSpy = jest.spyOn(toastService, 'showError') + const toastSuccessSpy = jest.spyOn(toastService, 'showInfo') + component.emailAddress = 'hello@paperless-ngx.com' + component.emailSubject = 'Hello' + component.emailMessage = 'World' + jest + .spyOn(documentService, 'emailDocument') + .mockReturnValue(throwError(() => new Error('Unable to email document'))) + component.emailDocument() + expect(toastErrorSpy).toHaveBeenCalled() + + jest.spyOn(documentService, 'emailDocument').mockReturnValue(of(true)) + component.emailDocument() + expect(toastSuccessSpy).toHaveBeenCalled() + }) +}) diff --git a/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts new file mode 100644 index 000000000..c9a648381 --- /dev/null +++ b/src-ui/src/app/components/common/email-document-dropdown/email-document-dropdown.component.ts @@ -0,0 +1,82 @@ +import { Component, Input } from '@angular/core' +import { FormsModule } from '@angular/forms' +import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap' +import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' +import { SETTINGS_KEYS } from 'src/app/data/ui-settings' +import { DocumentService } from 'src/app/services/rest/document.service' +import { SettingsService } from 'src/app/services/settings.service' +import { ToastService } from 'src/app/services/toast.service' +import { LoadingComponentWithPermissions } from '../../loading-component/loading.component' + +@Component({ + selector: 'pngx-email-document-dropdown', + imports: [FormsModule, NgbDropdownModule, NgxBootstrapIconsModule], + templateUrl: './email-document-dropdown.component.html', + styleUrl: './email-document-dropdown.component.scss', +}) +export class EmailDocumentDropdownComponent extends LoadingComponentWithPermissions { + @Input() + title = $localize`Email Document` + + @Input() + documentId: number + + @Input() + disabled: boolean = false + + private _hasArchiveVersion: boolean = true + + @Input() + set hasArchiveVersion(value: boolean) { + this._hasArchiveVersion = value + this.useArchiveVersion = value + } + + get hasArchiveVersion(): boolean { + return this._hasArchiveVersion + } + + public useArchiveVersion: boolean = true + + public emailAddress: string = '' + public emailSubject: string = '' + public emailMessage: string = '' + + get emailEnabled(): boolean { + return this.settingsService.get(SETTINGS_KEYS.EMAIL_ENABLED) + } + + constructor( + private documentService: DocumentService, + private toastService: ToastService, + private settingsService: SettingsService + ) { + super() + this.loading = false + } + + public emailDocument() { + this.loading = true + this.documentService + .emailDocument( + this.documentId, + this.emailAddress, + this.emailSubject, + this.emailMessage, + this.useArchiveVersion + ) + .subscribe({ + next: () => { + this.loading = false + this.emailAddress = '' + this.emailSubject = '' + this.emailMessage = '' + this.toastService.showInfo($localize`Email sent`) + }, + error: (e) => { + this.loading = false + this.toastService.showError($localize`Error emailing document`, e) + }, + }) + } +} diff --git a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.html b/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.html deleted file mode 100644 index 7f9d92577..000000000 --- a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.html +++ /dev/null @@ -1,104 +0,0 @@ -
- - -
diff --git a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.scss b/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.scss deleted file mode 100644 index 48743fe78..000000000 --- a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.scss +++ /dev/null @@ -1,17 +0,0 @@ -.share-document-dropdown { - min-width: 360px; - - .col { - min-width: 350px; - } - - @media screen and (min-width: 1024px) { - &.x2 { - width: 720px; - } - } -} - -.copied-badge { - right: 7.5em; -} diff --git a/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.html b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.html new file mode 100644 index 000000000..08298abc7 --- /dev/null +++ b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.html @@ -0,0 +1,70 @@ +
+ + +
diff --git a/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.scss b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.scss new file mode 100644 index 000000000..47e19d871 --- /dev/null +++ b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.scss @@ -0,0 +1,14 @@ +.share-links-dropdown { + min-width: 350px; + + // correct position on mobile + @media (max-width: 575.98px) { + &.show { + margin-left: -175px !important; + } + } +} + +.copied-badge { + right: 7.5em; +} diff --git a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.spec.ts b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts similarity index 81% rename from src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.spec.ts rename to src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts index e02bfcfa8..b7b0305be 100644 --- a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.spec.ts @@ -14,30 +14,23 @@ import { By } from '@angular/platform-browser' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { of, throwError } from 'rxjs' import { FileVersion, ShareLink } from 'src/app/data/share-link' -import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' -import { PermissionsService } from 'src/app/services/permissions.service' -import { DocumentService } from 'src/app/services/rest/document.service' import { ShareLinkService } from 'src/app/services/rest/share-link.service' import { ToastService } from 'src/app/services/toast.service' import { environment } from 'src/environments/environment' -import { ShareDocumentDropdownComponent } from './share-document-dropdown.component' +import { ShareLinksDropdownComponent } from './share-links-dropdown.component' -describe('ShareDocumentDropdownComponent', () => { - let component: ShareDocumentDropdownComponent - let fixture: ComponentFixture +describe('ShareLinksDropdownComponent', () => { + let component: ShareLinksDropdownComponent + let fixture: ComponentFixture let shareLinkService: ShareLinkService - let documentService: DocumentService - let permissionsService: PermissionsService let toastService: ToastService let httpController: HttpTestingController let clipboard: Clipboard beforeEach(() => { TestBed.configureTestingModule({ - declarations: [], imports: [ - ShareDocumentDropdownComponent, - IfPermissionsDirective, + ShareLinksDropdownComponent, NgxBootstrapIconsModule.pick(allIcons), ], providers: [ @@ -46,15 +39,12 @@ describe('ShareDocumentDropdownComponent', () => { ], }) - fixture = TestBed.createComponent(ShareDocumentDropdownComponent) + fixture = TestBed.createComponent(ShareLinksDropdownComponent) shareLinkService = TestBed.inject(ShareLinkService) - documentService = TestBed.inject(DocumentService) - permissionsService = TestBed.inject(PermissionsService) toastService = TestBed.inject(ToastService) httpController = TestBed.inject(HttpTestingController) clipboard = TestBed.inject(Clipboard) - jest.spyOn(permissionsService, 'currentUserCan').mockReturnValue(true) component = fixture.componentInstance fixture.detectChanges() }) @@ -242,21 +232,4 @@ describe('ShareDocumentDropdownComponent', () => { ] ).toBeTruthy() }) - - it('should support sending document via email, showing error if needed', () => { - const toastErrorSpy = jest.spyOn(toastService, 'showError') - const toastSuccessSpy = jest.spyOn(toastService, 'showInfo') - component.emailAddress = 'hello@paperless-ngx.com' - component.emailSubject = 'Hello' - component.emailMessage = 'World' - jest - .spyOn(documentService, 'emailDocument') - .mockReturnValue(throwError(() => new Error('Unable to email document'))) - component.emailDocument() - expect(toastErrorSpy).toHaveBeenCalled() - - jest.spyOn(documentService, 'emailDocument').mockReturnValue(of(true)) - component.emailDocument() - expect(toastSuccessSpy).toHaveBeenCalled() - }) }) diff --git a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts similarity index 65% rename from src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts rename to src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts index 3f66436e3..5e65eed73 100644 --- a/src-ui/src/app/components/common/share-document-dropdown/share-document-dropdown.component.ts +++ b/src-ui/src/app/components/common/share-links-dropdown/share-links-dropdown.component.ts @@ -5,40 +5,33 @@ import { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap' import { NgxBootstrapIconsModule } from 'ngx-bootstrap-icons' import { first } from 'rxjs' import { FileVersion, ShareLink } from 'src/app/data/share-link' -import { SETTINGS_KEYS } from 'src/app/data/ui-settings' -import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' -import { DocumentService } from 'src/app/services/rest/document.service' import { ShareLinkService } from 'src/app/services/rest/share-link.service' -import { SettingsService } from 'src/app/services/settings.service' import { ToastService } from 'src/app/services/toast.service' import { environment } from 'src/environments/environment' -import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' - -const EXPIRATION_OPTIONS = [ - { label: $localize`1 day`, value: 1 }, - { label: $localize`7 days`, value: 7 }, - { label: $localize`30 days`, value: 30 }, - { label: $localize`Never`, value: null }, -] @Component({ - selector: 'pngx-share-document-dropdown', - templateUrl: './share-document-dropdown.component.html', - styleUrls: ['./share-document-dropdown.component.scss'], + selector: 'pngx-share-links-dropdown', + templateUrl: './share-links-dropdown.component.html', + styleUrls: ['./share-links-dropdown.component.scss'], imports: [ - IfPermissionsDirective, FormsModule, ReactiveFormsModule, NgbDropdownModule, NgxBootstrapIconsModule, ], }) -export class ShareDocumentDropdownComponent - extends ComponentWithPermissions - implements OnInit -{ - public EXPIRATION_OPTIONS = EXPIRATION_OPTIONS - private _documentId: number +export class ShareLinksDropdownComponent implements OnInit { + EXPIRATION_OPTIONS = [ + { label: $localize`1 day`, value: 1 }, + { label: $localize`7 days`, value: 7 }, + { label: $localize`30 days`, value: 30 }, + { label: $localize`Never`, value: null }, + ] + + @Input() + title = $localize`Share Links` + + _documentId: number @Input() set documentId(id: number) { @@ -57,7 +50,6 @@ export class ShareDocumentDropdownComponent set hasArchiveVersion(value: boolean) { this._hasArchiveVersion = value this.useArchiveVersion = value - this.emailUseArchiveVersion = value } get hasArchiveVersion(): boolean { @@ -74,21 +66,11 @@ export class ShareDocumentDropdownComponent useArchiveVersion: boolean = true - emailLoading: boolean = false - emailAddress: string = '' - emailSubject: string = '' - emailMessage: string = '' - emailUseArchiveVersion: boolean = true - constructor( private shareLinkService: ShareLinkService, - private documentService: DocumentService, - private settingsService: SettingsService, private toastService: ToastService, private clipboard: Clipboard - ) { - super() - } + ) {} ngOnInit(): void { if (this._documentId !== undefined) this.refresh() @@ -187,33 +169,4 @@ export class ShareDocumentDropdownComponent }, }) } - - get emailEnabled(): boolean { - return this.settingsService.get(SETTINGS_KEYS.EMAIL_ENABLED) - } - - public emailDocument() { - this.emailLoading = true - this.documentService - .emailDocument( - this._documentId, - this.emailAddress, - this.emailSubject, - this.emailMessage, - this.emailUseArchiveVersion - ) - .subscribe({ - next: () => { - this.emailLoading = false - this.emailAddress = '' - this.emailSubject = '' - this.emailMessage = '' - this.toastService.showInfo($localize`Email sent`) - }, - error: (e) => { - this.emailLoading = false - this.toastService.showError($localize`Error emailing document`, e) - }, - }) - } } diff --git a/src-ui/src/app/components/document-detail/document-detail.component.html b/src-ui/src/app/components/document-detail/document-detail.component.html index 556874f9b..9931b491c 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.html +++ b/src-ui/src/app/components/document-detail/document-detail.component.html @@ -81,7 +81,10 @@ (added)="addField($event)"> - + + + +
diff --git a/src-ui/src/app/components/document-detail/document-detail.component.ts b/src-ui/src/app/components/document-detail/document-detail.component.ts index 9fe0d7294..8a0b9a45c 100644 --- a/src-ui/src/app/components/document-detail/document-detail.component.ts +++ b/src-ui/src/app/components/document-detail/document-detail.component.ts @@ -88,6 +88,7 @@ import { CorrespondentEditDialogComponent } from '../common/edit-dialog/correspo import { DocumentTypeEditDialogComponent } from '../common/edit-dialog/document-type-edit-dialog/document-type-edit-dialog.component' import { EditDialogMode } from '../common/edit-dialog/edit-dialog.component' import { StoragePathEditDialogComponent } from '../common/edit-dialog/storage-path-edit-dialog/storage-path-edit-dialog.component' +import { EmailDocumentDropdownComponent } from '../common/email-document-dropdown/email-document-dropdown.component' import { CheckComponent } from '../common/input/check/check.component' import { DateComponent } from '../common/input/date/date.component' import { DocumentLinkComponent } from '../common/input/document-link/document-link.component' @@ -99,7 +100,7 @@ import { TagsComponent } from '../common/input/tags/tags.component' import { TextComponent } from '../common/input/text/text.component' import { UrlComponent } from '../common/input/url/url.component' import { PageHeaderComponent } from '../common/page-header/page-header.component' -import { ShareDocumentDropdownComponent } from '../common/share-document-dropdown/share-document-dropdown.component' +import { ShareLinksDropdownComponent } from '../common/share-links-dropdown/share-links-dropdown.component' import { DocumentHistoryComponent } from '../document-history/document-history.component' import { DocumentNotesComponent } from '../document-notes/document-notes.component' import { ComponentWithPermissions } from '../with-permissions/with-permissions.component' @@ -145,7 +146,8 @@ export enum ZoomSetting { CustomFieldsDropdownComponent, DocumentNotesComponent, DocumentHistoryComponent, - ShareDocumentDropdownComponent, + ShareLinksDropdownComponent, + EmailDocumentDropdownComponent, CheckComponent, DateComponent, DocumentLinkComponent,