diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.css b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.css
new file mode 100644
index 0000000000..7371ee4215
--- /dev/null
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.css
@@ -0,0 +1,19 @@
+.upload-attachment-container {
+ border: 1px solid rgb(224, 224, 224);
+ background: #fff;
+ text-align: left;
+ border-top: none;
+ padding: 10px;
+ text-align: center;
+}
+
+.drag-area {
+ border: 1px solid #eee;
+ padding: 100px 10px;
+ margin-bottom: 10px;
+}
+
+.upload-attachment-container button {
+ color: rgb(253, 145, 0);
+ opacity: 0.64;
+}
\ No newline at end of file
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.html b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.html
new file mode 100644
index 0000000000..e1d5f20345
--- /dev/null
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.html
@@ -0,0 +1,15 @@
+
+
+ Drop Files Here...
+
+
+
\ No newline at end of file
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.spec.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.spec.ts
new file mode 100644
index 0000000000..defcaf09a4
--- /dev/null
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.spec.ts
@@ -0,0 +1,102 @@
+/*!
+ * @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 { SimpleChange } from '@angular/core';
+import { ComponentFixture, TestBed, async } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { Observable } from 'rxjs/Rx';
+
+import { AlfrescoTranslationService, CoreModule } from 'ng2-alfresco-core';
+import { ActivitiContentService } from 'ng2-activiti-form';
+
+import { ActivitiCreateTaskAttachmentComponent } from './activiti-create-task-attachment.component';
+
+describe('Activiti Task Create Attachment', () => {
+
+ let componentHandler: any;
+ let service: ActivitiContentService;
+ let component: ActivitiCreateTaskAttachmentComponent;
+ let fixture: ComponentFixture;
+ let createTaskRelatedContentSpy: jasmine.Spy;
+
+ beforeEach(async(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ CoreModule.forRoot()
+ ],
+ declarations: [
+ ActivitiCreateTaskAttachmentComponent
+ ],
+ providers: [
+ { provide: AlfrescoTranslationService },
+ ActivitiContentService
+ ]
+ }).compileComponents();
+ }));
+
+ beforeEach(() => {
+
+ fixture = TestBed.createComponent(ActivitiCreateTaskAttachmentComponent);
+ component = fixture.componentInstance;
+ service = fixture.debugElement.injector.get(ActivitiContentService);
+
+ createTaskRelatedContentSpy = spyOn(service, 'createTaskRelatedContent').and.returnValue(Observable.of(
+ {
+ status: true
+ }));
+
+ componentHandler = jasmine.createSpyObj('componentHandler', [
+ 'upgradeAllRegistered',
+ 'upgradeElement'
+ ]);
+ window['componentHandler'] = componentHandler;
+ });
+
+ it('should not call createTaskRelatedContent service when taskId changed', () => {
+ let change = new SimpleChange(null, '123', true);
+ component.ngOnChanges({ 'taskId': change });
+ expect(createTaskRelatedContentSpy).not.toHaveBeenCalled();
+ });
+
+ it('should not call createTaskRelatedContent service when there is no file uploaded', () => {
+ let change = new SimpleChange(null, '123', true);
+ component.ngOnChanges({ 'taskId': change });
+ let customEvent = {
+ detail: {
+ files: [
+ ]
+ }
+ };
+ component.onFileUpload(customEvent);
+ expect(createTaskRelatedContentSpy).not.toHaveBeenCalled();
+ });
+
+ it('should call createTaskRelatedContent service when there is a file uploaded', () => {
+ let change = new SimpleChange(null, '123', true);
+ component.ngOnChanges({ 'taskId': change });
+ let file = new File([new Blob()], 'Test');
+ let customEvent = {
+ detail: {
+ files: [
+ file
+ ]
+ }
+ };
+ component.onFileUpload(customEvent);
+ expect(createTaskRelatedContentSpy).toHaveBeenCalled();
+ });
+});
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.ts
new file mode 100644
index 0000000000..5160aea40a
--- /dev/null
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-create-task-attachment.component.ts
@@ -0,0 +1,67 @@
+/*!
+ * @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, OnChanges, Input, SimpleChanges, Output, EventEmitter } from '@angular/core';
+import { AlfrescoTranslationService } from 'ng2-alfresco-core';
+import { ActivitiContentService } from 'ng2-activiti-form';
+
+@Component({
+ selector: 'activiti-create-task-attachment',
+ styleUrls: ['./activiti-create-task-attachment.component.css'],
+ templateUrl: './activiti-create-task-attachment.component.html'
+})
+export class ActivitiCreateTaskAttachmentComponent implements OnChanges {
+
+ @Input()
+ taskId: string;
+
+ @Output()
+ error: EventEmitter = new EventEmitter();
+
+ @Output()
+ success: EventEmitter = new EventEmitter();
+
+ constructor(private translateService: AlfrescoTranslationService,
+ private activitiContentService: ActivitiContentService) {
+
+ if (translateService) {
+ translateService.addTranslationFolder('ng2-activiti-tasklist', 'node_modules/ng2-activiti-tasklist/src');
+ }
+ }
+
+ ngOnChanges(changes: SimpleChanges) {
+ if (changes['taskId'] && changes['taskId'].currentValue) {
+ this.taskId = changes['taskId'].currentValue;
+ }
+ }
+
+ onFileUpload(event: any) {
+ let files: File[] = event.detail.files;
+
+ for (let i = 0; i < files.length; i++) {
+ let file: File = files[i];
+ this.activitiContentService.createTaskRelatedContent(this.taskId, file).subscribe(
+ (res) => {
+ this.success.emit(res);
+ },
+ (err) => {
+ this.error.emit(err);
+ }
+ );
+ }
+ }
+}