diff --git a/src/app/compose/compose.module.ts b/src/app/compose/compose.module.ts index 4ec5d5595..c7f0ab155 100644 --- a/src/app/compose/compose.module.ts +++ b/src/app/compose/compose.module.ts @@ -37,6 +37,7 @@ import { DraftDeskComponent } from './draftdesk.component'; import { ComposeComponent } from './compose.component'; export { ComposeComponent } from './compose.component'; import { MenuModule } from '../menu/menu.module'; +import { DialogModule } from '../dialog/dialog.module'; import { MailRecipientInputComponent} from './mailrecipientinput.component'; export { MailRecipientInputComponent} from './mailrecipientinput.component'; @@ -56,6 +57,7 @@ export { MailRecipientInputComponent} from './mailrecipientinput.component'; FormsModule, ReactiveFormsModule, MenuModule, + DialogModule, MatTooltipModule ], declarations: [DraftDeskComponent, ComposeComponent, MailRecipientInputComponent], diff --git a/src/app/compose/draftdesk.component.html b/src/app/compose/draftdesk.component.html index d33548f20..70c2f4ba0 100644 --- a/src/app/compose/draftdesk.component.html +++ b/src/app/compose/draftdesk.component.html @@ -1,6 +1,14 @@
Test body
' } })), - copyAttachmentToDraft: jasmine.createSpy('copyAttachmentToDraft').and.returnValue(of({ filename: 'attachment.txt' })) + copyAttachmentToDraft: jasmine.createSpy('copyAttachmentToDraft').and.returnValue(of({ filename: 'attachment.txt' })), + deleteMessages: jasmine.createSpy('deleteMessages').and.returnValue(of({ status: 'success' })) }; draftDeskService = new DraftDeskService( @@ -522,6 +523,53 @@ describe('DraftDeskService', () => { }); }); + describe('deleteDrafts', () => { + it('should batch-delete saved drafts and remove them locally', (done) => { + const firstDraft = DraftFormModel.create( + 12345, + mockProfileService.composeProfile, + 'to@runbox.com', + 'First Draft' + ); + const secondDraft = DraftFormModel.create( + 23456, + mockProfileService.composeProfile, + 'to@runbox.com', + 'Second Draft' + ); + const unsavedDraft = DraftFormModel.create( + -1, + mockProfileService.composeProfile, + 'to@runbox.com', + 'Unsaved Draft' + ); + draftDeskService.draftModels.next([firstDraft, secondDraft, unsavedDraft]); + + draftDeskService.deleteDrafts([firstDraft.mid, secondDraft.mid, unsavedDraft.mid]).subscribe(() => { + expect(mockRmmapi.deleteMessages).toHaveBeenCalledOnceWith([firstDraft.mid, secondDraft.mid]); + expect(draftDeskService.draftModels.value).toEqual([unsavedDraft]); + done(); + }); + }); + + it('should not call the backend when there are no saved drafts', (done) => { + const unsavedDraft = DraftFormModel.create( + -1, + mockProfileService.composeProfile, + 'to@runbox.com', + 'Unsaved Draft' + ); + draftDeskService.draftModels.next([unsavedDraft]); + mockRmmapi.deleteMessages.calls.reset(); + + draftDeskService.deleteDrafts([unsavedDraft.mid]).subscribe(() => { + expect(mockRmmapi.deleteMessages).not.toHaveBeenCalled(); + expect(draftDeskService.draftModels.value).toEqual([unsavedDraft]); + done(); + }); + }); + }); + describe('newBugReport with firstValueFrom', () => { it('should create bug report draft with template from HTTP', async () => { mockHttp.get.and.returnValue(of('Username: %%USERNAME%%\nUser Agent: %%USERAGENT%%')); diff --git a/src/app/compose/draftdesk.service.ts b/src/app/compose/draftdesk.service.ts index 6f1efa0be..cb8303346 100644 --- a/src/app/compose/draftdesk.service.ts +++ b/src/app/compose/draftdesk.service.ts @@ -26,7 +26,7 @@ import { MailAddressInfo } from '../common/mailaddressinfo'; import { MessageListService } from '../rmmapi/messagelist.service'; import { MessageTableRowTool} from '../messagetable/messagetablerow'; import { Identity, ProfileService } from '../profiles/profile.service'; -import { from, of, BehaviorSubject, firstValueFrom } from 'rxjs'; +import { from, of, BehaviorSubject, firstValueFrom, Observable } from 'rxjs'; import { map, mergeMap, bufferCount, take, distinctUntilChanged } from 'rxjs/operators'; import moment from 'moment'; @@ -307,9 +307,27 @@ export class DraftDeskService { } public deleteDraft(messageId: number) { - let models = this.draftModels.value; - models = models.filter(dm => dm.mid !== messageId); - this.draftModels.next(models); + this.removeDrafts([messageId]); + } + + public deleteDrafts(messageIds: number[]): Observable