From 7a0f17b07813fa787493893f444f2ae421d4af2c Mon Sep 17 00:00:00 2001 From: Maurizio Vitale Date: Thu, 3 Aug 2017 10:42:43 +0100 Subject: [PATCH] [ADF-1261] Task audit log directive (#2162) * Create task audit directive * Remove fit * Add services * Add adf-task-audit documentation --- .../activiti/activiti-demo.component.html | 11 ++ .../activiti/activiti-demo.component.ts | 10 ++ .../ng2-activiti-tasklist/README.md | 35 ++++ .../docs/assets/adf-task-audit-directive.png | Bin 0 -> 10769 bytes ng2-components/ng2-activiti-tasklist/index.ts | 3 + .../components/task-audit.directive.spec.ts | 165 ++++++++++++++++++ .../src/components/task-audit.directive.ts | 123 +++++++++++++ .../src/services/tasklist.service.ts | 18 ++ 8 files changed, 365 insertions(+) create mode 100644 ng2-components/ng2-activiti-tasklist/docs/assets/adf-task-audit-directive.png create mode 100644 ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.spec.ts create mode 100644 ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.ts diff --git a/demo-shell-ng2/app/components/activiti/activiti-demo.component.html b/demo-shell-ng2/app/components/activiti/activiti-demo.component.html index 3bd65059d7..a8ea49a6dd 100644 --- a/demo-shell-ng2/app/components/activiti/activiti-demo.component.html +++ b/demo-shell-ng2/app/components/activiti/activiti-demo.component.html @@ -74,6 +74,17 @@ (taskDeleted)="onTaskDeleted($event)">
+ Task Audit log + + + Download +
+ assignment_ind + +``` + +![adf-task-audit-directive](docs/assets/adf-task-audit-directive.png) + +### Properties + +| Name | Type | Default | Description | +| --- | --- | --- | --- | +| taskId | string | | (**required**) The id of the task. | +| format | string | pdf | In whitch format you want the task audit information (pdf or json). | +| download | boolean | false | True If you want download the file on the click event. | +| fileName | string | Audit | Represent the name of the file to download in case the format is pdf. | + +#### Events + +| Name | Description | +| --- | --- | +| clicked | Raised when the task audit info is ready | +| error | Raised if there is an error during fetching task information | + ## Build from sources You can build component from sources with the following commands: diff --git a/ng2-components/ng2-activiti-tasklist/docs/assets/adf-task-audit-directive.png b/ng2-components/ng2-activiti-tasklist/docs/assets/adf-task-audit-directive.png new file mode 100644 index 0000000000000000000000000000000000000000..acf07e2c4a35cfa2570ba1eb7bf2b8d7fc005506 GIT binary patch literal 10769 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 J-*@!`{}+Qtha><1 literal 0 HcmV?d00001 diff --git a/ng2-components/ng2-activiti-tasklist/index.ts b/ng2-components/ng2-activiti-tasklist/index.ts index b98e003e70..917202478c 100644 --- a/ng2-components/ng2-activiti-tasklist/index.ts +++ b/ng2-components/ng2-activiti-tasklist/index.ts @@ -38,6 +38,7 @@ import { PeopleComponent } from './src/components/people.component'; import { StartTaskComponent } from './src/components/start-task.component'; import { TaskAttachmentListComponent } from './src/components/task-attachment-list.component'; import { TaskDetailsComponent } from './src/components/task-details.component'; +import { TaskAuditDirective } from './src/components/task-audit.directive'; import { TaskFiltersComponent } from './src/components/task-filters.component'; import { TaskHeaderComponent } from './src/components/task-header.component'; import { TaskListComponent } from './src/components/tasklist.component'; @@ -52,6 +53,7 @@ export {TaskHeaderComponent } from './src/components/task-header.component'; export {NoTaskDetailsTemplateDirective } from './src/components/no-task-detail-template.directive'; export {TaskFiltersComponent } from './src/components/task-filters.component'; export {TaskDetailsComponent } from './src/components/task-details.component'; +export {TaskAuditDirective } from './src/components/task-audit.directive'; export {StartTaskComponent } from './src/components/start-task.component'; export {PeopleSearchComponent } from './src/components/people-search.component'; export {AttachmentComponent } from './src/components/create-task-attachment.component'; @@ -109,6 +111,7 @@ export const ACTIVITI_TASKLIST_DIRECTIVES: any[] = [ TaskFiltersComponent, TaskListComponent, TaskDetailsComponent, + TaskAuditDirective, ChecklistComponent, CommentsComponent, PeopleComponent, diff --git a/ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.spec.ts b/ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.spec.ts new file mode 100644 index 0000000000..341df401cb --- /dev/null +++ b/ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.spec.ts @@ -0,0 +1,165 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component } from '@angular/core'; +import { + async, + ComponentFixture, + fakeAsync, + TestBed +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { CoreModule } from 'ng2-alfresco-core'; +import { Observable } from 'rxjs/Rx'; +import { TaskListService } from './../services/tasklist.service'; +import { TaskAuditDirective } from './task-audit.directive'; + +declare let jasmine: any; + +describe('TaskAuditDirective', () => { + + let fixture: ComponentFixture; + let component: BasicButtonComponent; + let auditDirective: TaskAuditDirective; + let service: TaskListService; + + function createFakePdfBlob(): Blob { + let pdfData = atob( + 'JVBERi0xLjcKCjEgMCBvYmogICUgZW50cnkgcG9pbnQKPDwKICAvVHlwZSAvQ2F0YWxvZwog' + + 'IC9QYWdlcyAyIDAgUgo+PgplbmRvYmoKCjIgMCBvYmoKPDwKICAvVHlwZSAvUGFnZXMKICAv' + + 'TWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCiAgL0NvdW50IDEKICAvS2lkcyBbIDMgMCBSIF0K' + + 'Pj4KZW5kb2JqCgozIDAgb2JqCjw8CiAgL1R5cGUgL1BhZ2UKICAvUGFyZW50IDIgMCBSCiAg' + + 'L1Jlc291cmNlcyA8PAogICAgL0ZvbnQgPDwKICAgICAgL0YxIDQgMCBSIAogICAgPj4KICA+' + + 'PgogIC9Db250ZW50cyA1IDAgUgo+PgplbmRvYmoKCjQgMCBvYmoKPDwKICAvVHlwZSAvRm9u' + + 'dAogIC9TdWJ0eXBlIC9UeXBlMQogIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KPj4KZW5kb2Jq' + + 'Cgo1IDAgb2JqICAlIHBhZ2UgY29udGVudAo8PAogIC9MZW5ndGggNDQKPj4Kc3RyZWFtCkJU' + + 'CjcwIDUwIFRECi9GMSAxMiBUZgooSGVsbG8sIHdvcmxkISkgVGoKRVQKZW5kc3RyZWFtCmVu' + + 'ZG9iagoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDEwIDAwMDAwIG4g' + + 'CjAwMDAwMDAwNzkgMDAwMDAgbiAKMDAwMDAwMDE3MyAwMDAwMCBuIAowMDAwMDAwMzAxIDAw' + + 'MDAwIG4gCjAwMDAwMDAzODAgMDAwMDAgbiAKdHJhaWxlcgo8PAogIC9TaXplIDYKICAvUm9v' + + 'dCAxIDAgUgo+PgpzdGFydHhyZWYKNDkyCiUlRU9G'); + return new Blob([pdfData], {type: 'application/pdf'}); + } + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [CoreModule.forRoot()], + declarations: [BasicButtonComponent, TaskAuditDirective], + providers: [TaskListService] + }); + + TestBed.compileComponents(); + + fixture = TestBed.createComponent(BasicButtonComponent); + component = fixture.componentInstance; + service = TestBed.get(TaskListService); + + jasmine.Ajax.install(); + })); + + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('should fetch the pdf Blob when the format is pdf', fakeAsync(() => { + component.fileName = 'FakeAuditName'; + component.format = 'pdf'; + let blob = createFakePdfBlob(); + spyOn(service, 'fetchTaskAuditPdfById').and.returnValue(Observable.of(blob)); + spyOn(component, 'onAuditClick').and.callThrough(); + + fixture.detectChanges(); + + let button = fixture.nativeElement.querySelector('#auditButton'); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(component.onAuditClick).toHaveBeenCalledWith({ format: 'pdf', value: blob, fileName: 'FakeAuditName' }); + }); + + button.click(); + + })); + + it('should fetch the json info when the format is json', fakeAsync(() => { + component.fileName = 'FakeAuditName'; + component.format = 'json'; + component.download = true; + const auditJson = { taskId: '77', taskName: 'Fake Task Naem', assignee: 'FirstName LastName', formData: [], selectedOutcome: null, comments: [] }; + spyOn(service, 'fetchTaskAuditJsonById').and.returnValue(Observable.of(auditJson)); + spyOn(component, 'onAuditClick').and.callThrough(); + + fixture.detectChanges(); + + let button = fixture.nativeElement.querySelector('#auditButton'); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(component.onAuditClick).toHaveBeenCalledWith({ format: 'json', value: auditJson, fileName: 'FakeAuditName' }); + }); + + button.click(); + + })); + + it('should fetch the pdf Blob as default when the format is UNKNOW', fakeAsync(() => { + component.fileName = 'FakeAuditName'; + component.format = 'fakeFormat'; + let blob = createFakePdfBlob(); + spyOn(service, 'fetchTaskAuditPdfById').and.returnValue(Observable.of(blob)); + spyOn(component, 'onAuditClick').and.callThrough(); + + fixture.detectChanges(); + + let button = fixture.nativeElement.querySelector('#auditButton'); + + fixture.whenStable().then(() => { + fixture.detectChanges(); + expect(component.onAuditClick).toHaveBeenCalledWith({ format: 'pdf', value: blob, fileName: 'FakeAuditName' }); + }); + + button.click(); + + })); + +}); + +@Component({ + selector: 'adf-basic-button', + template: ` + ` +}) +class BasicButtonComponent { + + download: boolean = false; + fileName: string; + format: string; + constructor() { + + } + + onAuditClick(event: any) { + console.log(event); + } +} diff --git a/ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.ts b/ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.ts new file mode 100644 index 0000000000..d08e584802 --- /dev/null +++ b/ng2-components/ng2-activiti-tasklist/src/components/task-audit.directive.ts @@ -0,0 +1,123 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Directive, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core'; +import { ContentService } from 'ng2-alfresco-core'; +import { TaskListService } from './../services/tasklist.service'; + +const JSON_FORMAT: string = 'json'; +const PDF_FORMAT: string = 'pdf'; + +@Directive({ + selector: 'button[adf-task-audit]', + host: { + 'role': 'button', + '(click)': 'onClickAudit()' + } +}) +export class TaskAuditDirective implements OnInit, OnChanges { + + @Input('task-id') + taskId: string; + + @Input() + fileName: string = 'Audit'; + + @Input() + format: string = 'pdf'; + + @Input() + download: boolean = true; + + @Output() + clicked: EventEmitter = new EventEmitter(); + + @Output() + error: EventEmitter = new EventEmitter(); + + public audit: any; + + /** + * + * @param translateService + * @param taskListService + */ + constructor(private contentService: ContentService, + private taskListService: TaskListService) { + } + + ngOnInit() { + console.log('OnInit'); + } + ngOnChanges(changes: SimpleChanges): void { + if (!this.isValidType()) { + this.setDefaultFormatType(); + } + } + + isValidType() { + if (this.format && (this.isJsonFormat() || this.isPdfFormat())) { + return true; + } + return false; + } + + setDefaultFormatType(): void { + this.format = PDF_FORMAT; + } + + /** + * fetch the audit information in the requested format + */ + fetchAuditInfo(): void { + if (this.isPdfFormat()) { + this.taskListService.fetchTaskAuditPdfById(this.taskId).subscribe( + (blob: Blob) => { + this.audit = blob; + if (this.download) { + this.contentService.downloadBlob(this.audit, this.fileName + '.pdf'); + } + this.clicked.emit({ format: this.format, value: this.audit, fileName: this.fileName }); + }, + (err) => { + this.error.emit(err); + }); + } else { + this.taskListService.fetchTaskAuditJsonById(this.taskId).subscribe( + (res) => { + this.audit = res; + this.clicked.emit({ format: this.format, value: this.audit, fileName: this.fileName }); + }, + (err) => { + this.error.emit(err); + }); + } + } + + onClickAudit() { + this.fetchAuditInfo(); + } + + isJsonFormat() { + return this.format === JSON_FORMAT; + } + + isPdfFormat() { + return this.format === PDF_FORMAT; + } + +} diff --git a/ng2-components/ng2-activiti-tasklist/src/services/tasklist.service.ts b/ng2-components/ng2-activiti-tasklist/src/services/tasklist.service.ts index d2c110d80f..8eec2d7443 100644 --- a/ng2-components/ng2-activiti-tasklist/src/services/tasklist.service.ts +++ b/ng2-components/ng2-activiti-tasklist/src/services/tasklist.service.ts @@ -398,6 +398,24 @@ export class TaskListService { .catch(err => this.handleError(err)); } + /** + * fetch the Task Audit information as a pdf + * @param taskId - the task id + */ + fetchTaskAuditPdfById(taskId: string): Observable { + return Observable.fromPromise(this.apiService.getInstance().activiti.taskApi.getTaskAuditPdf(taskId)) + .catch(err => this.handleError(err)); + } + + /** + * fetch the Task Audit information in a json format + * @param taskId - the task id + */ + fetchTaskAuditJsonById(taskId: string): Observable { + return Observable.fromPromise(this.apiService.getInstance().activiti.taskApi.getTaskAuditJson(taskId)) + .catch(err => this.handleError(err)); + } + private callApiTasksFiltered(requestNode: TaskQueryRequestRepresentationModel) { return this.apiService.getInstance().activiti.taskApi.listTasks(requestNode); }