From f6c3fafe3245729311751b2f9af21ff711b30edd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Popovics=20Andr=C3=A1s?=
Date: Thu, 13 Jul 2017 15:49:21 +0100
Subject: [PATCH] [ADF-112] Change task details feature (due date) (#2071)
* Add Assignee to readonly mode
* Style adoption and first steps to editable mode
* Switch between mode coverage
* Rebase fix
* Because of design and requirement changes, revert unnecessary parts
* Small refactoring before the introduction of CardViewDateItem
* Fix AdfCardView tests
* Editable Card date item
* Do not allow edit on task details after the task is completed.
* Update task details request
* Login footer switch fix
* Login customisable copyright text
* Card text item (first sketches)
* Small fix for supported card items' template
* Dynamic component loading for card view items
* Test and linting fixes
* Updating Readme.md
* Update Readme.md
* Fix Readme.md errors
* CardViewTextItemComponent tests
* Rebase fix
---
.../login/login-demo.component.html | 5 +-
.../components/login/login-demo.component.ts | 4 +
.../config/webpack.common.js | 13 +-
ng2-components/ng2-activiti-tasklist/index.ts | 2 +
.../activiti-task-details.component.css | 2 +-
.../activiti-task-details.component.ts | 36 +++-
.../activiti-task-header.component.css | 15 --
.../activiti-task-header.component.html | 16 +-
.../activiti-task-header.component.scss | 24 +++
.../activiti-task-header.component.spec.ts | 57 ++++-
.../activiti-task-header.component.ts | 44 ++--
.../no-task-detail-template.component.spec.ts | 2 +-
.../activiti-tasklist.service.spec.ts | 16 ++
.../src/services/activiti-tasklist.service.ts | 9 +
ng2-components/ng2-alfresco-core/README.md | 198 ++++++++++++++++--
.../config/webpack.common.js | 13 +-
.../docs/assets/adf-custom-view.png | Bin 58682 -> 75458 bytes
ng2-components/ng2-alfresco-core/index.ts | 1 +
.../adf-card-view-content-proxy.directive.ts | 25 +++
.../adf-card-view-dateitem.component.html | 23 ++
.../adf-card-view-dateitem.component.scss | 28 +++
.../adf-card-view-dateitem.component.spec.ts | 151 +++++++++++++
.../view/adf-card-view-dateitem.component.ts | 51 +++++
...ard-view-item-dispatcher.component.spec.ts | 155 ++++++++++++++
...adf-card-view-item-dispatcher.component.ts | 97 +++++++++
.../adf-card-view-textitem.component.html | 39 ++++
.../adf-card-view-textitem.component.scss | 80 +++++++
.../adf-card-view-textitem.component.spec.ts | 147 +++++++++++++
.../view/adf-card-view-textitem.component.ts | 65 ++++++
.../view/adf-card-view.component.css | 18 --
.../view/adf-card-view.component.html | 11 +-
.../view/adf-card-view.component.scss | 32 +++
.../view/adf-card-view.component.spec.ts | 77 +++++--
.../view/adf-card-view.component.ts | 19 +-
.../src/components/view/card-view.module.ts | 24 ++-
.../src/interface/card-view-item.interface.ts | 26 +++
...w.model.ts => card-view-baseitem.model.ts} | 20 +-
.../src/models/card-view-dateitem.model.ts | 50 +++++
.../src/models/card-view-textitem.model.ts | 44 ++++
.../ng2-alfresco-core/src/models/index.ts | 3 +-
.../services/adf-card-view-update.service.ts | 42 ++++
.../ng2-alfresco-core/src/services/index.ts | 1 +
ng2-components/ng2-alfresco-login/README.md | 1 +
.../config/webpack.common.js | 13 +-
.../components/alfresco-login.component.html | 4 +-
.../alfresco-login.component.spec.ts | 16 ++
.../components/alfresco-login.component.ts | 3 +
47 files changed, 1571 insertions(+), 151 deletions(-)
delete mode 100644 ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.css
create mode 100644 ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.scss
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-content-proxy.directive.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-dateitem.component.html
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-dateitem.component.scss
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-dateitem.component.spec.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-dateitem.component.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-item-dispatcher.component.spec.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-item-dispatcher.component.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-textitem.component.html
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-textitem.component.scss
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-textitem.component.spec.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view-textitem.component.ts
delete mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view.component.css
create mode 100644 ng2-components/ng2-alfresco-core/src/components/view/adf-card-view.component.scss
create mode 100644 ng2-components/ng2-alfresco-core/src/interface/card-view-item.interface.ts
rename ng2-components/ng2-alfresco-core/src/models/{card-view.model.ts => card-view-baseitem.model.ts} (72%)
create mode 100644 ng2-components/ng2-alfresco-core/src/models/card-view-dateitem.model.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/models/card-view-textitem.model.ts
create mode 100644 ng2-components/ng2-alfresco-core/src/services/adf-card-view-update.service.ts
diff --git a/demo-shell-ng2/app/components/login/login-demo.component.html b/demo-shell-ng2/app/components/login/login-demo.component.html
index 4203567ec1..05c0f2bbcb 100644
--- a/demo-shell-ng2/app/components/login/login-demo.component.html
+++ b/demo-shell-ng2/app/components/login/login-demo.component.html
@@ -23,7 +23,7 @@
@@ -67,7 +68,7 @@
diff --git a/demo-shell-ng2/app/components/login/login-demo.component.ts b/demo-shell-ng2/app/components/login/login-demo.component.ts
index 010f7b83b6..9009b4982e 100644
--- a/demo-shell-ng2/app/components/login/login-demo.component.ts
+++ b/demo-shell-ng2/app/components/login/login-demo.component.ts
@@ -95,6 +95,10 @@ export class LoginDemoComponent implements OnInit {
this.disableCsrf = !this.disableCsrf;
}
+ toggleFooter() {
+ this.showFooter = !this.showFooter;
+ }
+
updateProvider() {
if (this.isBPM && this.isECM) {
this.providers = 'ALL';
diff --git a/ng2-components/ng2-activiti-tasklist/config/webpack.common.js b/ng2-components/ng2-activiti-tasklist/config/webpack.common.js
index b872863854..7902fbfc1c 100644
--- a/ng2-components/ng2-activiti-tasklist/config/webpack.common.js
+++ b/ng2-components/ng2-activiti-tasklist/config/webpack.common.js
@@ -65,8 +65,17 @@ module.exports = {
exclude: [/node_modules/, /bundles/, /dist/, /demo/]
},
{
- test: /\.component.scss$/,
- use: ['to-string-loader', 'raw-loader', 'sass-loader'],
+ test: /\.scss$/,
+ use: [{
+ loader: "to-string-loader"
+ }, {
+ loader: "raw-loader"
+ }, {
+ loader: "sass-loader",
+ options: {
+ includePaths: [ path.resolve(__dirname, '../../ng2-alfresco-core/styles')]
+ }
+ }],
exclude: [/node_modules/, /bundles/, /dist/, /demo/]
},
{
diff --git a/ng2-components/ng2-activiti-tasklist/index.ts b/ng2-components/ng2-activiti-tasklist/index.ts
index 345da37133..1f193854e7 100644
--- a/ng2-components/ng2-activiti-tasklist/index.ts
+++ b/ng2-components/ng2-activiti-tasklist/index.ts
@@ -20,6 +20,7 @@ import { ModuleWithProviders, NgModule } from '@angular/core';
import {
MdAutocompleteModule,
MdButtonModule,
+ MdCardModule,
MdDatepickerModule,
MdGridListModule,
MdIconModule,
@@ -91,6 +92,7 @@ export const ACTIVITI_TASKLIST_PROVIDERS: any[] = [
MdIconModule,
MdButtonModule,
MdInputModule,
+ MdCardModule,
MdProgressSpinnerModule,
MdDatepickerModule,
MdNativeDateModule,
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.css b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.css
index 6ed0c48abd..9ed5ae7394 100644
--- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.css
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.css
@@ -13,7 +13,7 @@
font-weight: 300;
line-height: normal;
overflow: hidden;
- margin: 0;
+ margin: 0 0 8px 0;
cursor: pointer;
user-select: none;
-moz-user-select: none;
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts
index d3865518ab..83d4eeedc1 100644
--- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-details.component.ts
@@ -27,7 +27,7 @@ import { Component,
ViewChild
} from '@angular/core';
import { ContentLinkModel, FormModel, FormOutcomeEvent, FormService } from 'ng2-activiti-form';
-import { AlfrescoAuthenticationService, AlfrescoTranslationService, LogService } from 'ng2-alfresco-core';
+import { AlfrescoAuthenticationService, AlfrescoTranslationService, CardViewUpdateService, LogService, UpdateNotification } from 'ng2-alfresco-core';
import { TaskQueryRequestRepresentationModel } from '../models/filter.model';
import { TaskDetailsModel } from '../models/task-details.model';
import { User } from '../models/user.model';
@@ -39,7 +39,10 @@ declare let dialogPolyfill: any;
@Component({
selector: 'adf-task-details, activiti-task-details',
templateUrl: './activiti-task-details.component.html',
- styleUrls: ['./activiti-task-details.component.css']
+ styleUrls: ['./activiti-task-details.component.css'],
+ providers: [
+ CardViewUpdateService
+ ]
})
export class ActivitiTaskDetailsComponent implements OnInit, OnChanges {
@@ -132,17 +135,20 @@ export class ActivitiTaskDetailsComponent implements OnInit, OnChanges {
noTaskDetailsTemplateComponent: TemplateRef
;
/**
- * Constructor
- * @param auth Authentication service
- * @param translate Translation service
- * @param activitiForm Form service
- * @param activitiTaskList Task service
+ *
+ * @param translateService
+ * @param activitiForm
+ * @param activitiTaskList
+ * @param logService
+ * @param authService
*/
constructor(private translateService: AlfrescoTranslationService,
private activitiForm: FormService,
private activitiTaskList: ActivitiTaskListService,
private logService: LogService,
- private authService: AlfrescoAuthenticationService) {
+ private authService: AlfrescoAuthenticationService,
+ private cardViewUpdateService: CardViewUpdateService
+) {
if (translateService) {
translateService.addTranslationFolder('ng2-activiti-tasklist', 'assets/ng2-activiti-tasklist');
@@ -153,6 +159,8 @@ export class ActivitiTaskDetailsComponent implements OnInit, OnChanges {
if (this.taskId) {
this.loadDetails(this.taskId);
}
+
+ this.cardViewUpdateService.itemUpdated$.subscribe(this.updateTaskDetails.bind(this));
}
ngOnChanges(changes: SimpleChanges): void {
@@ -186,6 +194,18 @@ export class ActivitiTaskDetailsComponent implements OnInit, OnChanges {
return this.taskDetails && this.taskDetails.duration === null;
}
+ /**
+ * Save a task detail and update it after a successful response
+ *
+ * @param updateNotification
+ */
+ private updateTaskDetails(updateNotification: UpdateNotification) {
+ this.activitiTaskList.updateTask(this.taskId, updateNotification.changed)
+ .subscribe(
+ () => { this.loadDetails(this.taskId); }
+ );
+ }
+
/**
* Load the activiti task details
* @param taskId
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.css b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.css
deleted file mode 100644
index 6b3b1c13f4..0000000000
--- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.css
+++ /dev/null
@@ -1,15 +0,0 @@
-:host {
- width: 100%;
-}
-
-.activiti-task-header__label {
- font-weight: bold;
-}
-
-.activiti-task-header__value {
- color: rgb(68, 138, 255);
-}
-
-.material-icons {
- cursor: pointer;
-}
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html
index 8922608c4e..70033b0f08 100644
--- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.html
@@ -1,11 +1,13 @@
-
-
+
-
+
+
+
-
-
+
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.scss b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.scss
new file mode 100644
index 0000000000..488457f6ca
--- /dev/null
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.scss
@@ -0,0 +1,24 @@
+@import 'theming';
+
+.#{$ADF} {
+ &-controls {
+ display: flex;
+ justify-content: space-between;
+ }
+
+ &-edit-controls {
+ display: flex;
+ justify-content: flex-end;
+ margin-left: auto;
+ }
+
+ &-switch-to-edit-mode,
+ &-save-edit-mode {
+ color: rgb(255, 152, 0);
+ }
+
+ &-cancel-edit-mode,
+ &-claim-controls {
+ color: rgb(131, 131, 131);
+ }
+}
\ No newline at end of file
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts
index e6ffa9cbdf..a7780a4e08 100644
--- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.spec.ts
@@ -15,9 +15,10 @@
* limitations under the License.
*/
+import { DebugElement } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
-import { AlfrescoTranslationService, CoreModule } from 'ng2-alfresco-core';
+import { AlfrescoTranslationService, CardViewUpdateService, CoreModule } from 'ng2-alfresco-core';
import { Observable } from 'rxjs/Rx';
import { TaskDetailsModel } from '../models/task-details.model';
@@ -31,6 +32,7 @@ describe('ActivitiTaskHeaderComponent', () => {
let componentHandler: any;
let component: ActivitiTaskHeaderComponent;
let fixture: ComponentFixture;
+ let debugElement: DebugElement;
beforeEach(async(() => {
TestBed.configureTestingModule({
@@ -41,7 +43,8 @@ describe('ActivitiTaskHeaderComponent', () => {
ActivitiTaskHeaderComponent
],
providers: [
- ActivitiTaskListService
+ ActivitiTaskListService,
+ CardViewUpdateService
]
}).compileComponents();
@@ -54,6 +57,7 @@ describe('ActivitiTaskHeaderComponent', () => {
fixture = TestBed.createComponent(ActivitiTaskHeaderComponent);
component = fixture.componentInstance;
service = TestBed.get(ActivitiTaskListService);
+ debugElement = fixture.debugElement;
component.taskDetails = new TaskDetailsModel(taskDetailsMock);
@@ -73,7 +77,7 @@ describe('ActivitiTaskHeaderComponent', () => {
it('should display assignee', () => {
component.ngOnChanges({});
fixture.detectChanges();
- let formNameEl = fixture.debugElement.query(By.css('[data-automation-id="header-assignee"] .adf-header__value'));
+ let formNameEl = fixture.debugElement.query(By.css('[data-automation-id="header-assignee"] .adf-property-value'));
expect(formNameEl.nativeElement.innerText).toBe('Wilbur Adams');
});
@@ -81,10 +85,43 @@ describe('ActivitiTaskHeaderComponent', () => {
component.taskDetails.assignee = null;
component.ngOnChanges({});
fixture.detectChanges();
- let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-assignee"] .adf-header__value'));
+ let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-assignee"] .adf-property-value'));
expect(valueEl.nativeElement.innerText).toBe('No assignee');
});
+ it('should display created-by', () => {
+ component.ngOnChanges({});
+ fixture.detectChanges();
+ let formNameEl = fixture.debugElement.query(By.css('[data-automation-id="header-created-by"] .adf-property-value'));
+ expect(formNameEl.nativeElement.innerText).toBe('Wilbur Adams');
+ });
+
+ it('should display placeholder if no created-by', () => {
+ component.taskDetails.assignee = null;
+ component.ngOnChanges({});
+ fixture.detectChanges();
+ let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-created-by"] .adf-property-value'));
+ expect(valueEl.nativeElement.innerText).toBe('No assignee');
+ });
+
+ it('should set editable to false if the task has already completed', () => {
+ component.taskDetails.endDate = '05/05/2002';
+ component.ngOnChanges({});
+ fixture.detectChanges();
+
+ let datePicker = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-dueDate"]`));
+ expect(datePicker).toBeNull('Datepicker should NOT be in DOM');
+ });
+
+ it('should set editable to true if the task has not completed yet', () => {
+ component.taskDetails.endDate = undefined;
+ component.ngOnChanges({});
+ fixture.detectChanges();
+
+ let datePicker = fixture.debugElement.query(By.css(`[data-automation-id="datepicker-dueDate"]`));
+ expect(datePicker).not.toBeNull('Datepicker should be in DOM');
+ });
+
it('should display the claim button if no assignee', () => {
component.taskDetails.assignee = null;
component.ngOnChanges({});
@@ -97,30 +134,30 @@ describe('ActivitiTaskHeaderComponent', () => {
component.taskDetails.dueDate = '2016-11-03';
component.ngOnChanges({});
fixture.detectChanges();
- let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-dueDate"] .adf-header__value'));
- expect(valueEl.nativeElement.innerText).toBe('Nov 03 2016');
+ let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-dueDate"] .adf-property-value'));
+ expect(valueEl.nativeElement.innerText.trim()).toBe('Nov 03 2016');
});
it('should display placeholder if no due date', () => {
component.taskDetails.dueDate = null;
component.ngOnChanges({});
fixture.detectChanges();
- let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-dueDate"] .adf-header__value'));
- expect(valueEl.nativeElement.innerText).toBe('No date');
+ let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-dueDate"] .adf-property-value'));
+ expect(valueEl.nativeElement.innerText.trim()).toBe('No date');
});
it('should display form name', () => {
component.formName = 'test form';
component.ngOnChanges({});
fixture.detectChanges();
- let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-formName"] .adf-header__value'));
+ let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-formName"] .adf-property-value'));
expect(valueEl.nativeElement.innerText).toBe('test form');
});
it('should not display form name if no form name provided', () => {
component.ngOnChanges({});
fixture.detectChanges();
- let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-formName"] .adf-header__value'));
+ let valueEl = fixture.debugElement.query(By.css('[data-automation-id="header-formName"] .adf-property-value'));
expect(valueEl.nativeElement.innerText).toBe('No form');
});
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts
index e3415109a4..539326579c 100644
--- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts
+++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-task-header.component.ts
@@ -16,14 +16,14 @@
*/
import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';
-import { AlfrescoTranslationService, CardViewModel, LogService } from 'ng2-alfresco-core';
+import { AlfrescoTranslationService, CardViewDateItemModel, CardViewItem, CardViewTextItemModel, LogService } from 'ng2-alfresco-core';
import { TaskDetailsModel } from '../models/index';
import { ActivitiTaskListService } from './../services/activiti-tasklist.service';
@Component({
selector: 'adf-task-header, activiti-task-header',
templateUrl: './activiti-task-header.component.html',
- styleUrls: ['./activiti-task-header.component.css']
+ styleUrls: ['./activiti-task-header.component.scss']
})
export class ActivitiTaskHeaderComponent implements OnChanges {
@@ -36,7 +36,8 @@ export class ActivitiTaskHeaderComponent implements OnChanges {
@Output()
claim: EventEmitter = new EventEmitter();
- properties: CardViewModel [];
+ properties: CardViewItem [];
+ inEdit: boolean = false;
constructor(private translateService: AlfrescoTranslationService,
private activitiTaskService: ActivitiTaskListService,
@@ -47,6 +48,7 @@ export class ActivitiTaskHeaderComponent implements OnChanges {
}
ngOnChanges(changes: SimpleChanges) {
+ console.log('change van:', changes, this.taskDetails);
this.refreshData();
}
@@ -54,20 +56,22 @@ export class ActivitiTaskHeaderComponent implements OnChanges {
if (this.taskDetails) {
this.properties = [
- new CardViewModel({label: 'Status:', value: this.getTaskStatus(), key: 'status'}),
- new CardViewModel({label: 'Due Date:', value: this.taskDetails.dueDate, format: 'MMM DD YYYY', key: 'dueDate', default: 'No date'}),
- new CardViewModel({label: 'Category:', value: this.taskDetails.category, key: 'category', default: 'No category'}),
- new CardViewModel(
- {
- label: 'Created By:',
- value: this.taskDetails.getFullName(),
- key: 'assignee',
- default: 'No assignee'
- }),
- new CardViewModel({label: 'Created:', value: this.taskDetails.created, format: 'MMM DD YYYY', key: 'created'}),
- new CardViewModel({label: 'Id:', value: this.taskDetails.id, key: 'id'}),
- new CardViewModel({label: 'Description:', value: this.taskDetails.description, key: 'description', default: 'No description'}),
- new CardViewModel({label: 'Form name:', value: this.formName, key: 'formName', default: 'No form'})
+ new CardViewTextItemModel({ label: 'Assignee', value: this.taskDetails.getFullName(), key: 'assignee', default: 'No assignee' } ),
+ new CardViewTextItemModel({ label: 'Status', value: this.getTaskStatus(), key: 'status' }),
+ new CardViewDateItemModel({ label: 'Due Date', value: this.taskDetails.dueDate, key: 'dueDate', default: 'No date', editable: true }),
+ new CardViewTextItemModel({ label: 'Category', value: this.taskDetails.category, key: 'category', default: 'No category' }),
+ new CardViewTextItemModel({ label: 'Created By', value: this.taskDetails.getFullName(), key: 'created-by', default: 'No assignee' }),
+ new CardViewDateItemModel({ label: 'Created', value: this.taskDetails.created, key: 'created' }),
+ new CardViewTextItemModel({ label: 'Id', value: this.taskDetails.id, key: 'id' }),
+ new CardViewTextItemModel({
+ label: 'Description',
+ value: this.taskDetails.description,
+ key: 'description',
+ default: 'No description',
+ multiline: true,
+ editable: true
+ }),
+ new CardViewTextItemModel({ label: 'Form name', value: this.formName, key: 'formName', default: 'No form' })
];
}
}
@@ -81,7 +85,7 @@ export class ActivitiTaskHeaderComponent implements OnChanges {
}
getTaskStatus(): string {
- return this.taskDetails.endDate ? 'Completed' : 'Running';
+ return this.isCompleted() ? 'Completed' : 'Running';
}
claimTask(taskId: string) {
@@ -91,4 +95,8 @@ export class ActivitiTaskHeaderComponent implements OnChanges {
this.claim.emit(taskId);
});
}
+
+ isCompleted() {
+ return !!this.taskDetails.endDate;
+ }
}
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/no-task-detail-template.component.spec.ts b/ng2-components/ng2-activiti-tasklist/src/components/no-task-detail-template.component.spec.ts
index f47f34faf9..a5e88d3eec 100644
--- a/ng2-components/ng2-activiti-tasklist/src/components/no-task-detail-template.component.spec.ts
+++ b/ng2-components/ng2-activiti-tasklist/src/components/no-task-detail-template.component.spec.ts
@@ -24,7 +24,7 @@ describe('NoTaskDetailsTemplateDirective', () => {
let detailsComponent: ActivitiTaskDetailsComponent;
beforeEach(() => {
- detailsComponent = new ActivitiTaskDetailsComponent(null, null, null, null, null);
+ detailsComponent = new ActivitiTaskDetailsComponent(null, null, null, null, null, null);
component = new NoTaskDetailsTemplateDirective(detailsComponent);
});
diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts
index 0ebaa7e91a..a5913a5d73 100644
--- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts
+++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.spec.ts
@@ -562,6 +562,22 @@ describe('Activiti TaskList Service', () => {
});
});
+ it('should update a task', (done) => {
+ let taskId = '111';
+
+ service.updateTask(taskId, {property: 'value'}).subscribe(
+ (res: any) => {
+ done();
+ }
+ );
+
+ jasmine.Ajax.requests.mostRecent().respondWith({
+ 'status': 200,
+ contentType: 'application/json',
+ responseText: JSON.stringify({})
+ });
+ });
+
it('should return the filter if it contains task id', (done) => {
let taskId = '1';
let filterFake = new FilterRepresentationModel({
diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts
index 61b9adec5c..5000d9a8a3 100644
--- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts
+++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-tasklist.service.ts
@@ -375,6 +375,15 @@ export class ActivitiTaskListService {
.catch(err => this.handleError(err));
}
+ /**
+ * Update due date
+ * @param dueDate - the new due date
+ */
+ updateTask(taskId: any, updated): Observable {
+ return Observable.fromPromise(this.apiService.getInstance().activiti.taskApi.updateTask(taskId, updated))
+ .catch(err => this.handleError(err));
+ }
+
private callApiTasksFiltered(requestNode: TaskQueryRequestRepresentationModel) {
return this.apiService.getInstance().activiti.taskApi.listTasks(requestNode);
}
diff --git a/ng2-components/ng2-alfresco-core/README.md b/ng2-components/ng2-alfresco-core/README.md
index 1ac570ba82..6d666b238b 100644
--- a/ng2-components/ng2-alfresco-core/README.md
+++ b/ng2-components/ng2-alfresco-core/README.md
@@ -29,7 +29,16 @@
* [Events](#events-1)
- [ADF Card View](#adf-card-view)
* [Properties](#properties-2)
- * [CardViewModel](#cardviewmodel)
+ * [Editing](#editing)
+ * [Defining properties](#defining-properties)
+ * [Card Text Item](#card-text-item)
+ + [Options](#options)
+ * [Card Date Item](#card-date-item)
+ + [Options](#options-1)
+ * [Defining your custom card Item](#defining-your-custom-card-item)
+ + [1. Define the model for the custom type](#1-define-the-model-for-the-custom-type)
+ + [2. Define the component for the custom type](#2-define-the-component-for-the-custom-type)
+ + [3. Add you custom component to your module's entryComponents list](#3-add-you-custom-component-to-your-modules-entrycomponents-list)
- [AlfrescoTranslationService](#alfrescotranslationservice)
- [Renditions Service](#renditions-service)
- [Build from sources](#build-from-sources)
@@ -593,40 +602,193 @@ export class AppComponent {
## ADF Card View
-The component shows the [CardViewModel](#cardviewmodel)} object.
+The CardViewComponent is a configurable property list renderer. You define the property list, the CardViewComponent does the rest. Each property represents a card view item (a row) in the card view component. At the time of writing two different kind of card view item (property type) is supported out of the box ([text](#card-text-item) item and [date](#card-date-item) item) but you can define your own custom types as well.
```html
+ [properties]="[{label: 'My Label', value: 'My value'}]"
+ [editable]="false">
```
+
+
### Properties
| Name | Type | Description |
| --- | --- | --- |
-| properties | {array[CardViewModel](#cardviewmodel)} | (**required**) The custom view to render |
+| properties | [CardViewItem](#cardviewitem)[] | (**required**) The custom view to render |
+| editable | boolean | If the component editable or not |
-### CardViewModel
+### Editing
-```json
-{
- "label": "string",
- "value": "any",
- "format": "string",
- "default": "string"
+The card view can optionally allow its properties to be edited. You can control the editing of the properties in two level.
+- **global level** - *via the editable paramter of the adf-card-view component*
+- **property level** - *in each property via the editable attribute*
+
+If you set the global editable parameter to false, no properties can be edited regardless of what is set inside the property.
+
+### Defining properties
+
+Properties is an array of models which one by one implements the CardViewItem interface.
+
+```js
+export interface CardViewItem {
+ label: string;
+ value: any;
+ key: string;
+ default?: any;
+ type: string;
+ displayValue: string;
+ editable?: boolean;
}
```
-| Name | Type | Description |
-| --- | --- | --- |
-| label | string | The label to render |
-| value | string | The value to render |
-| format | string | The format to use in case the value is a date |
-| default | string | The default value to render in case the value is empty |
+At the moment two models are defined out of the box:
-
+- **[CardViewTextItemModel](#card-text-item)** - *for text items*
+- **[CardViewDateItemModel](#card-date-item)** - *for date items*
+
+Each of them are extending the abstract CardViewBaseItemModel class, and each of them are adding some custom functionality to the basic behaviour.
+
+```js
+ this.properties = [
+ new CardViewTextItemModel({
+ label: 'Name',
+ value: 'Spock',
+ key: 'name',
+ default: 'default bar' ,
+ multiline: false
+ }),
+ new CardViewDateItemModel({
+ label: 'Birth of date',
+ value: someDate,
+ key: 'birth-of-date',
+ default: new Date(),
+ format: '',
+ editable: true
+ }),
+ ...
+]
+```
+
+### Card Text Item
+
+CardViewTextItemModel is a property type for text properties.
+
+```js
+const textItemProperty = new CardViewTextItemModel(options);
+```
+
+#### Options
+
+| Name | Type | Default | Description |
+| --- | --- | --- | --- |
+| label* | string | --- | The label to render |
+| value* | any | --- | The original value |
+| key* | string | --- | the key of the property. Have an important role when editing the property. |
+| default | any | --- | The default value to render in case the value is empty |
+| displayValue* | string | --- | The value to render |
+| editable | boolean | false | Whether the property editable or not |
+| multiline | string | false | Single or multiline text |
+
+### Card Date Item
+
+CardViewDateItemModel is a property type for date properties.
+
+```js
+const dateItemProperty = new CardViewDateItemModel(options);
+```
+
+#### Options
+
+| Name | Type | Default | Description |
+| --- | --- | --- | --- |
+| label* | string | --- | The label to render |
+| value* | any | --- | The original value |
+| key* | string | --- | the key of the property. Have an important role when editing the property. |
+| default | any | --- | The default value to render in case the value is empty |
+| displayValue* | string | --- | The value to render |
+| editable | boolean | false | Whether the property editable or not |
+| format | boolean | "MMM DD YYYY" | any format that momentjs accepts |
+
+### Defining your custom card Item
+
+Card item components are loaded dynamically, which makes you able to define your own custom component for the custom card item type.
+
+Let's consider you want to have a **stardate** type to display Captain Picard's birthday (47457.1). For this, you need to do the following steps.
+
+#### 1. Define the model for the custom type
+
+Your model has to extend the CardViewBaseItemModel and implement the CardViewItem interface.
+*(You can check how the CardViewTextItemModel is implemented for further guidance.)*
+
+```js
+export class CardViewStarDateItemModel extends CardViewBaseItemModel implements CardViewItem {
+ type: string = 'star-date';
+
+ get displayValue() {
+ return this.convertToStarDate(this.value) || this.default;
+ }
+
+ private convertToStarDate(starTimeStamp: number): string {
+ // Do the magic
+ }
+}
+```
+
+The most important part of this model is the value of the **type** attribute. This is how the Card View component will be able to recognise which component is needed to render it dynamically.
+
+The type is a **hyphen-separated-lowercase-words** string (just like how I wrote it). This will be converted to a PascalCase (or UpperCamelCase) string to find the right component. In our case the Card View component will look for the CardView**StarDate**ItemComponent.
+
+#### 2. Define the component for the custom type
+
+As discussed in the previous step the only important thing here is the naming of your component class ( **CardViewStarDateItemComponent**). Since the selector is not used in this case, you can give any selector name to it, but it make sense to follow the angular standards.
+
+```js
+@Component({
+ selector: 'card-view-stardateitem' // For example
+ ...
+})
+export class CardViewStarDateItemComponent {
+ @Input()
+ property: CardViewStarDateItemModel;
+
+ @Input()
+ editable: boolean;
+
+ constructor(private cardViewUpdateService: CardViewUpdateService) {}
+
+ isEditble() {
+ return this.editable && this.property.editable;
+ }
+
+ showStarDatePicker() {
+ ...
+ }
+}
+
+```
+To make your component editable, you can have a look on either the CardViewTextItemComponent' or on the CardViewDateItemComponent's source.
+
+#### 3. Add you custom component to your module's entryComponents list
+
+For Angular to be able to load your custom component dynamically, you have to register your component in your modules entryComponents.
+
+```js
+@NgModule({
+ imports: [...],
+ declarations: [
+ CardViewStarDateItemComponent
+ ],
+ entryComponents: [
+ CardViewStarDateItemComponent
+ ],
+ exports: [...]
+})
+export class MyModule {}
+```
## AlfrescoTranslationService
diff --git a/ng2-components/ng2-alfresco-core/config/webpack.common.js b/ng2-components/ng2-alfresco-core/config/webpack.common.js
index 5c1dc42fe3..c4f1184dd6 100644
--- a/ng2-components/ng2-alfresco-core/config/webpack.common.js
+++ b/ng2-components/ng2-alfresco-core/config/webpack.common.js
@@ -60,8 +60,17 @@ module.exports = {
exclude: [/node_modules/, /bundles/, /dist/, /demo/]
},
{
- test: /\.component.scss$/,
- use: ['to-string-loader', 'raw-loader', 'sass-loader'],
+ test: /\.scss$/,
+ use: [{
+ loader: "to-string-loader"
+ }, {
+ loader: "raw-loader"
+ }, {
+ loader: "sass-loader",
+ options: {
+ includePaths: [ path.resolve(__dirname, '../styles')]
+ }
+ }],
exclude: [/node_modules/, /bundles/, /dist/, /demo/]
},
{
diff --git a/ng2-components/ng2-alfresco-core/docs/assets/adf-custom-view.png b/ng2-components/ng2-alfresco-core/docs/assets/adf-custom-view.png
index 41ed32afb9f5642a1e3a4cedf04494954f8842a6..4b99842c33f4c8183c9ae326633cdc65ca3421c2 100644
GIT binary patch
literal 75458
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 AEZHU|^
zJC-3k4A*o##fOaA%q2y@C!v@?^CYS
$nz8~^J?pL0rVZYWQmdTC;lbzGH34|Z+DsgEuL
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