Merge pull request #838 from Alfresco/dev-valbano-727

Dev valbano 727
This commit is contained in:
Mario Romano 2016-10-05 12:00:05 +02:00 committed by GitHub
commit 2a40ebd32d
53 changed files with 2532 additions and 10 deletions

4
.gitignore vendored
View File

@ -4,3 +4,7 @@ workspace.xml
.idea/ .idea/
dist/ dist/
!systemjs.config.js !systemjs.config.js
demo-shell-ng2/app/components/router/
ng2-components/ng2-alfresco-userinfo-old/demo/src/app/
ng2-components/ng2-alfresco-userinfo-old/src/services/bpm-user.service.spec.ts
ng2-components/ng2-alfresco-userinfo-old/src/services/ecm-user.service.spec.ts

View File

@ -32,6 +32,7 @@ env:
- MODULE=ng2-activiti-tasklist - MODULE=ng2-activiti-tasklist
- MODULE=ng2-activiti-processlist - MODULE=ng2-activiti-processlist
- MODULE=ng2-activiti-analytics - MODULE=ng2-activiti-analytics
- MODULE=ng2-alfresco-userinfo
before_script: before_script:
- if ([ "$MODULE" != "ng2-alfresco-core" ]); then - if ([ "$MODULE" != "ng2-alfresco-core" ]); then
@ -83,3 +84,4 @@ cache:
- ng2-components/ng2-alfresco-webscript/node_modules - ng2-components/ng2-alfresco-webscript/node_modules
- ng2-components/ng2-alfresco-tag/node_modules - ng2-components/ng2-alfresco-tag/node_modules
- ng2-components/ng2-alfresco-analytics/node_modules - ng2-components/ng2-alfresco-analytics/node_modules
- ng2-components/ng2-alfresco-userinfo/node_modules

View File

@ -7,3 +7,6 @@
.mdl-layout-title{ .mdl-layout-title{
font-size: 17px; font-size: 17px;
} }
.user-profile{
margin-right: 3px;
}

View File

@ -21,6 +21,10 @@
<a class="mdl-navigation__link" data-automation-id="login" href="" routerLink="/login">Login</a> <a class="mdl-navigation__link" data-automation-id="login" href="" routerLink="/login">Login</a>
</nav> </nav>
<div class="user-profile" *ngIf="isLoggedIn()">
<ng2-alfresco-userinfo></ng2-alfresco-userinfo>
</div>
<!-- Right aligned menu below button --> <!-- Right aligned menu below button -->
<button id="demo-menu-lower-right" data-automation-id="right-action-menu" <button id="demo-menu-lower-right" data-automation-id="right-action-menu"
class="mdl-button mdl-js-button mdl-button--icon"> class="mdl-button mdl-js-button mdl-button--icon">

View File

@ -30,6 +30,7 @@ import { ViewerModule } from 'ng2-alfresco-viewer';
import { ActivitiFormModule } from 'ng2-activiti-form'; import { ActivitiFormModule } from 'ng2-activiti-form';
import { ActivitiTaskListModule } from 'ng2-activiti-tasklist'; import { ActivitiTaskListModule } from 'ng2-activiti-tasklist';
import { ActivitiProcessListModule } from 'ng2-activiti-processlist'; import { ActivitiProcessListModule } from 'ng2-activiti-processlist';
import { UserInfoComponentModule } from 'ng2-alfresco-userinfo';
import { AppComponent } from './app.component'; import { AppComponent } from './app.component';
import { routing } from './app.routes'; import { routing } from './app.routes';
@ -63,7 +64,8 @@ import {
ViewerModule.forRoot(), ViewerModule.forRoot(),
ActivitiFormModule.forRoot(), ActivitiFormModule.forRoot(),
ActivitiTaskListModule.forRoot(), ActivitiTaskListModule.forRoot(),
ActivitiProcessListModule.forRoot() ActivitiProcessListModule.forRoot(),
UserInfoComponentModule.forRoot()
], ],
declarations: [ declarations: [
AppComponent, AppComponent,

View File

@ -36,7 +36,8 @@
'ng2-alfresco-tag': 'npm:ng2-alfresco-tag/dist', 'ng2-alfresco-tag': 'npm:ng2-alfresco-tag/dist',
'ng2-activiti-tasklist': 'npm:ng2-activiti-tasklist/dist', 'ng2-activiti-tasklist': 'npm:ng2-activiti-tasklist/dist',
'alfresco-js-api': 'npm:alfresco-js-api/dist', 'alfresco-js-api': 'npm:alfresco-js-api/dist',
'ng2-activiti-processlist': 'npm:ng2-activiti-processlist/dist' 'ng2-activiti-processlist': 'npm:ng2-activiti-processlist/dist',
'ng2-alfresco-userinfo': 'npm:ng2-alfresco-userinfo/dist'
}, },
// packages tells the System loader how to load when no filename and/or no extension // packages tells the System loader how to load when no filename and/or no extension
packages: { packages: {
@ -61,7 +62,8 @@
'ng2-activiti-tasklist': { main: './index.js', defaultExtension: 'js'}, 'ng2-activiti-tasklist': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-webscript': { main: './index.js', defaultExtension: 'js'}, 'ng2-alfresco-webscript': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-tag': { main: './index.js', defaultExtension: 'js'}, 'ng2-alfresco-tag': { main: './index.js', defaultExtension: 'js'},
'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'} 'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'},
'ng2-alfresco-userinfo': { main: './index.js', defaultExtension: 'js'}
} }
}); });
})(this); })(this);

View File

@ -74,6 +74,7 @@ describe('AlfrescoAuthentication', () => {
authService.login('fake-username', 'fake-password').subscribe(() => { authService.login('fake-username', 'fake-password').subscribe(() => {
expect(authService.isLoggedIn()).toBe(true); expect(authService.isLoggedIn()).toBe(true);
expect(authService.getTicketEcm()).toEqual('fake-post-ticket'); expect(authService.getTicketEcm()).toEqual('fake-post-ticket');
expect(authService.isEcmLoggedIn()).toBe(true);
done(); done();
}); });
@ -106,6 +107,7 @@ describe('AlfrescoAuthentication', () => {
(err: any) => { (err: any) => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketEcm()).toBe(null); expect(authService.getTicketEcm()).toBe(null);
expect(authService.isEcmLoggedIn()).toBe(false);
done(); done();
}); });
@ -141,6 +143,7 @@ describe('AlfrescoAuthentication', () => {
authService.logout().subscribe(() => { authService.logout().subscribe(() => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketEcm()).toBe(null); expect(authService.getTicketEcm()).toBe(null);
expect(authService.isEcmLoggedIn()).toBe(false);
done(); done();
}); });
@ -158,6 +161,7 @@ describe('AlfrescoAuthentication', () => {
it('should return false if the user is not logged in', () => { it('should return false if the user is not logged in', () => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.isEcmLoggedIn()).toBe(false);
}); });
}); });
@ -171,6 +175,7 @@ describe('AlfrescoAuthentication', () => {
authService.login('fake-username', 'fake-password').subscribe(() => { authService.login('fake-username', 'fake-password').subscribe(() => {
expect(authService.isLoggedIn()).toBe(true); expect(authService.isLoggedIn()).toBe(true);
expect(authService.getTicketBpm()).toEqual('Basic ZmFrZS11c2VybmFtZTpmYWtlLXBhc3N3b3Jk'); expect(authService.getTicketBpm()).toEqual('Basic ZmFrZS11c2VybmFtZTpmYWtlLXBhc3N3b3Jk');
expect(authService.isBpmLoggedIn()).toBe(true);
done(); done();
}); });
@ -201,6 +206,7 @@ describe('AlfrescoAuthentication', () => {
(err: any) => { (err: any) => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketBpm()).toBe(null); expect(authService.getTicketBpm()).toBe(null);
expect(authService.isBpmLoggedIn()).toBe(false);
done(); done();
}); });
@ -214,6 +220,7 @@ describe('AlfrescoAuthentication', () => {
authService.logout().subscribe(() => { authService.logout().subscribe(() => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketBpm()).toBe(null); expect(authService.getTicketBpm()).toBe(null);
expect(authService.isBpmLoggedIn()).toBe(false);
done(); done();
}); });
@ -280,6 +287,8 @@ describe('AlfrescoAuthentication', () => {
expect(authService.isLoggedIn()).toBe(true); expect(authService.isLoggedIn()).toBe(true);
expect(authService.getTicketEcm()).toEqual('fake-post-ticket'); expect(authService.getTicketEcm()).toEqual('fake-post-ticket');
expect(authService.getTicketBpm()).toEqual('Basic ZmFrZS11c2VybmFtZTpmYWtlLXBhc3N3b3Jk'); expect(authService.getTicketBpm()).toEqual('Basic ZmFrZS11c2VybmFtZTpmYWtlLXBhc3N3b3Jk');
expect(authService.isBpmLoggedIn()).toBe(true);
expect(authService.isEcmLoggedIn()).toBe(true);
done(); done();
}); });
@ -302,6 +311,7 @@ describe('AlfrescoAuthentication', () => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketEcm()).toBe(null); expect(authService.getTicketEcm()).toBe(null);
expect(authService.getTicketBpm()).toBe(null); expect(authService.getTicketBpm()).toBe(null);
expect(authService.isEcmLoggedIn()).toBe(false);
done(); done();
}); });
@ -322,6 +332,7 @@ describe('AlfrescoAuthentication', () => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketEcm()).toBe(null); expect(authService.getTicketEcm()).toBe(null);
expect(authService.getTicketBpm()).toBe(null); expect(authService.getTicketBpm()).toBe(null);
expect(authService.isBpmLoggedIn()).toBe(false);
done(); done();
}); });
@ -344,6 +355,8 @@ describe('AlfrescoAuthentication', () => {
expect(authService.isLoggedIn()).toBe(false); expect(authService.isLoggedIn()).toBe(false);
expect(authService.getTicketEcm()).toBe(null); expect(authService.getTicketEcm()).toBe(null);
expect(authService.getTicketBpm()).toBe(null); expect(authService.getTicketBpm()).toBe(null);
expect(authService.isBpmLoggedIn()).toBe(false);
expect(authService.isEcmLoggedIn()).toBe(false);
done(); done();
}); });

View File

@ -82,6 +82,7 @@ export class AlfrescoAuthenticationService {
* @returns {Observable<R>|Observable<T>} * @returns {Observable<R>|Observable<T>}
*/ */
login(username: string, password: string): Observable<{ type: string, ticket: any }> { login(username: string, password: string): Observable<{ type: string, ticket: any }> {
this.removeTicket();
return Observable.fromPromise(this.callApiLogin(username, password)) return Observable.fromPromise(this.callApiLogin(username, password))
.map((response: any) => { .map((response: any) => {
this.saveTickets(); this.saveTickets();
@ -191,6 +192,20 @@ export class AlfrescoAuthenticationService {
} }
} }
/**
* The method return true if user is logged in on ecm provider
*/
public isEcmLoggedIn() {
return this.alfrescoApi.ecmAuth && !!this.alfrescoApi.ecmAuth.isLoggedIn();
}
/**
* The method return true if user is logged in on bpm provider
*/
public isBpmLoggedIn() {
return this.alfrescoApi.bpmAuth && !!this.alfrescoApi.bpmAuth.isLoggedIn();
}
/** /**
* The method write the error in the console browser * The method write the error in the console browser
* @param error * @param error

View File

@ -0,0 +1,16 @@
/*!
* @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.
*/

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">

View File

@ -0,0 +1,23 @@
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[package.json]
indent_style = space
indent_size = 2
[karma.conf.js]
indent_style = space
indent_size = 2
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false

View File

@ -0,0 +1,13 @@
npm-debug.log
node_modules
jspm_packages
.idea
typings
coverage
src/**/*.js
src/**/*.js.map
src/**/*.d.ts
demo/**/*.js
demo/**/*.js.map
demo/**/*.d.ts
!systemjs.config.js

View File

@ -0,0 +1,13 @@
Copyright 2016 Alfresco <alfresco@alfresco.com>
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.

View File

@ -0,0 +1,73 @@
# Alfresco User Info Component for Angular 2
This component will show the user information for ECM and BPM
## Prerequisites
Before you start using this development framework, make sure you have installed all required software and done all the
necessary configuration, see this [page](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md).
## Installation
```bash
npm install ng2-alfresco-userinfo --save
```
## Dependencies
Add the following dependency to your index.html:
```html
<script src="node_modules/alfresco-js-api/dist/alfresco-js-api.js"></script>
```
You must separately install the following libraries for your application:
- [ng2-translate](https://github.com/ocombe/ng2-translate)
- [ng2-alfresco-core](https://www.npmjs.com/package/ng2-alfresco-core)
```sh
npm install --save ng2-translate ng2-alfresco-core
```
#### Material Design Lite
The style of this component is based on [material design](https://getmdl.io/), so if you want to visualize it correctly you have to add the material
design dependency to your project:
```sh
npm install --save material-design-icons material-design-lite
```
Also make sure you include these dependencies in your `index.html` file:
```html
<!-- Google Material Design Lite -->
<link rel="stylesheet" href="node_modules/material-design-lite/material.min.css">
<script src="node_modules/material-design-lite/material.min.js"></script>
<link rel="stylesheet" href="node_modules/material-design-icons/iconfont/material-icons.css">
```
## Example
```html
<ng2-alfresco-userinfo></ng2-alfresco-userinfo>
```
This will show a round icon with user and on click some user information are showed.
If user is logged in with ECM and BPM the ECM image will be showed.
## NPM scripts
| Command | Description |
| --- | --- |
| npm run build | Build component |
| npm run build:w | Build component and keep watching the changes |
| npm run test | Run unit tests in the console |
| npm run test-browser | Run unit tests in the browser
| npm run coverage | Run unit tests and display code coverage report |
## History
For detailed changelog, check [Releases](https://github.com/alfresco/ng2-alfresco-userinfo/releases).
## Contributors
[Contributors](https://github.com/alfresco/ng2-alfresco-userinfo/graphs/contributors)

View File

@ -0,0 +1,16 @@
/*!
* @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.
*/

View File

@ -0,0 +1,10 @@
root = true
[{src,scripts}/**.{ts,json,js}]
end_of_line = crlf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 4

View File

@ -0,0 +1,6 @@
node_modules
.idea
coverage
dist
typings
!systemjs.config.js

View File

@ -0,0 +1,3 @@
node_modules
dist
typings

View File

@ -0,0 +1,13 @@
# User info demo
Install:
```
npm install
```
Run the project:
```
npm start
```

View File

@ -0,0 +1,34 @@
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Angular 2 UserInfo - Demo</title>
<base href="./">
<!-- Google Material Design Lite -->
<link rel="stylesheet" href="node_modules/material-design-lite/material.min.css">
<script src="node_modules/material-design-lite/material.min.js"></script>
<link rel="stylesheet" href="node_modules/material-design-icons/iconfont/material-icons.css">
<link rel="stylesheet" href="./assets/material.orange-blue.min.css">
<!-- 1. Load libraries -->
<!-- 1. Load libraries -->
<!-- Polyfill(s) for older browsers -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/zone.js/dist/zone.js"></script>
<script src="node_modules/reflect-metadata/Reflect.js"></script>
<script src="node_modules/systemjs/dist/system.src.js"></script>
<script src="node_modules/alfresco-js-api/dist/alfresco-js-api.js"></script>
<script src="systemjs.config.js"></script>
<script>
System.import('app').catch(function(err){ console.error(err); });
</script>
</head>
<body>
<alfresco-userinfo-demo></alfresco-userinfo-demo>
</body>
</html>

View File

@ -0,0 +1,77 @@
{
"name": "ng2-alfresco-userinfo-demo",
"description": "Alfresco Angular2 User Info Component - Demo",
"version": "0.1.0",
"author": "Alfresco Software, Ltd.",
"main": "index.js",
"scripts": {
"clean": "rimraf dist node_modules",
"postinstall": "npm run build",
"start": "npm run build && concurrently \"npm run tsc:w\" \"npm run server\" ",
"server": "wsrv -o -s -l",
"build": "npm run tslint && rimraf dist && npm run tsc",
"tsc": "tsc",
"tsc:w": "tsc -w",
"tslint": "tslint -c tslint.json *.ts && tslint -c tslint.json src/{,**/}**.ts"
},
"license": "Apache-2.0",
"dependencies": {
"@angular/common": "2.0.0",
"@angular/compiler": "2.0.0",
"@angular/core": "2.0.0",
"@angular/forms": "2.0.0",
"@angular/http": "2.0.0",
"@angular/platform-browser": "2.0.0",
"@angular/platform-browser-dynamic": "2.0.0",
"@angular/router": "3.0.0",
"@angular/upgrade": "2.0.0",
"core-js": "^2.4.1",
"reflect-metadata": "^0.1.3",
"rxjs": "5.0.0-beta.12",
"systemjs": "0.19.27",
"zone.js": "^0.6.23",
"material-design-icons": "2.2.3",
"material-design-lite": "1.2.1",
"ng2-translate": "2.5.0",
"alfresco-js-api": "^0.3.0",
"ng2-alfresco-core": "^0.3.0",
"ng2-alfresco-userinfo": "0.3.2"
},
"devDependencies": {
"@types/core-js": "^0.9.32",
"@types/jasmine": "^2.2.33",
"concurrently": "^2.2.0",
"rimraf": "2.5.2",
"tslint": "3.8.1",
"license-check": "1.1.5",
"typescript": "^2.0.2",
"wsrv": "^0.1.5"
},
"keywords": [
"angular2",
"typescript"
],
"license-check-config": {
"src": [
"**/*.js",
"**/*.ts",
"!/**/coverage/**/*",
"!/**/demo/**/*",
"!/**/node_modules/**/*",
"!/**/typings/**/*",
"!*.js"
],
"contributors": [
{
"name": "Vito Albano",
"email": "vito.albano@alfresco.com"
}
],
"path": "assets/license_header.txt",
"blocking": true,
"logInfo": false,
"logError": true
}
}

View File

@ -0,0 +1,145 @@
/*!
* @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 { NgModule, Component, OnInit } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { UserInfoComponentModule } from 'ng2-alfresco-userinfo';
import { CoreModule } from 'ng2-alfresco-core';
import { AlfrescoAuthenticationService, AlfrescoSettingsService } from 'ng2-alfresco-core';
@Component({
selector: 'alfresco-userinfo-demo',
template: `<h4> START DEMO USERINFO </h4>
<div style="border-radius: 8px; position: absolute; background-color:papayawhip; color: cadetblue; left: 320px; top: 30px; z-index: 1;">
<p style="width:120px;margin: 20px;">
<label for="switch1" class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
<input type="checkbox" id="switch1" class="mdl-switch__input"
(click)="toggleECM(ecm.checked)" #ecm>
<span class="mdl-switch__label">ECM</span>
</label>
</p>
<p style="width:120px;margin: 20px;">
<label for="switch2" class="mdl-switch mdl-js-switch mdl-js-ripple-effect">
<input type="checkbox" id="switch2" class="mdl-switch__input" checked
(click)="toggleBPM(bpm.checked)" #bpm>
<span class="mdl-switch__label">BPM</span>
</label>
</p>
</div>
<div *ngIf="isLoggedIn()">
<ng2-alfresco-userinfo></ng2-alfresco-userinfo>
</div>
<p></p>
<div>
<p>
<span>Username</span>
<input id="user" type="text" [(ngModel)]="userToLogin" value="admin"/>
</p>
<p>
<span>Password</span>
<input id="passw" type="password" [(ngModel)]="password" value="admin"/>
</p>
<button type="submit" (click)="attemptLogin()"> Login !</button>
</div>
<span>{{loginErrorMessage}}</span>
<button (click)="logout()">Logout</button>`,
styles: [
':host > .container {padding: 10px}',
'.p-10 { padding: 10px; }'
]
})
class UserInfoDemo implements OnInit {
public userToLogin: string = 'admin';
public password: string = 'admin';
public loginErrorMessage: string;
public providers: string = 'BPM';
private authenticated: boolean;
private token: any;
constructor(private authService: AlfrescoAuthenticationService,
private settingsService: AlfrescoSettingsService) {
}
ngOnInit() {
this.settingsService.setProviders(this.providers);
}
attemptLogin() {
this.loginErrorMessage = '';
this.login(this.userToLogin, this.password);
}
logout() {
this.authService.logout();
}
login(user, password) {
this.settingsService.setProviders(this.providers);
this.authService.login(user, password).subscribe(
token => {
console.log(token);
this.token = token;
this.authenticated = true;
},
error => {
console.log(error);
this.authenticated = false;
this.loginErrorMessage = error;
});
}
isLoggedIn(): boolean {
return this.authService.isLoggedIn();
}
toggleECM(checked) {
if (checked && this.providers === 'BPM') {
this.providers = 'ALL';
} else if (checked) {
this.providers = 'ECM';
} else {
this.providers = undefined;
}
}
toggleBPM(checked) {
if (checked && this.providers === 'ECM') {
this.providers = 'ALL';
} else if (checked) {
this.providers = 'BPM';
} else {
this.providers = undefined;
}
}
}
@NgModule({
imports: [
BrowserModule,
CoreModule.forRoot(),
UserInfoComponentModule.forRoot()
],
declarations: [ UserInfoDemo ],
bootstrap: [ UserInfoDemo ]
})
export class AppModule { }
platformBrowserDynamic().bootstrapModule(AppModule);

View File

@ -0,0 +1,49 @@
/**
* System configuration for Angular 2 samples
* Adjust as necessary for your application needs.
*/
(function (global) {
System.config({
paths: {
// paths serve as alias
'npm:': 'node_modules/'
},
// map tells the System loader where to look for things
map: {
// our app is within the app folder
app: 'dist',
// angular bundles
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
// other libraries
'rxjs': 'npm:rxjs',
'ng2-translate': 'npm:ng2-translate',
'ng2-alfresco-core': 'npm:ng2-alfresco-core/dist',
'ng2-alfresco-login': 'npm:ng2-alfresco-login/dist',
'ng2-alfresco-userinfo': 'npm:ng2-alfresco-userinfo/dist',
'alfresco-js-api': 'npm:alfresco-js-api/dist'
},
// packages tells the System loader how to load when no filename and/or no extension
packages: {
app: {
main: './main.js',
defaultExtension: 'js'
},
rxjs: {
defaultExtension: 'js'
},
'ng2-translate': { defaultExtension: 'js' },
'ng2-alfresco-core': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-login': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-userinfo': { main: './index.js', defaultExtension: 'js'},
'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'}
}
});
})(this);

View File

@ -0,0 +1,26 @@
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"removeComments": true,
"declaration": true,
"noLib": false,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"noImplicitAny": false,
"noImplicitReturns": false,
"noImplicitUseStrict": false,
"noFallthroughCasesInSwitch": true,
"outDir": "dist",
"types": ["core-js", "jasmine"]
},
"exclude": [
"demo",
"node_modules",
"dist"
]
}

View File

@ -0,0 +1,121 @@
{
"rules": {
"align": [
true,
"parameters",
"statements"
],
"ban": false,
"class-name": true,
"comment-format": [
true,
"check-space"
],
"curly": true,
"eofline": true,
"forin": true,
"indent": [
true,
"spaces"
],
"interface-name": false,
"jsdoc-format": true,
"label-position": true,
"label-undefined": true,
"max-line-length": [
true,
180
],
"member-ordering": [
true,
"static-before-instance",
"variables-before-functions"
],
"no-any": false,
"no-arg": true,
"no-bitwise": false,
"no-conditional-assignment": true,
"no-consecutive-blank-lines": false,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-construct": true,
"no-constructor-vars": false,
"no-debugger": true,
"no-duplicate-key": true,
"no-duplicate-variable": true,
"no-empty": false,
"no-eval": true,
"no-inferrable-types": false,
"no-internal-module": true,
"no-require-imports": true,
"no-shadowed-variable": true,
"no-switch-case-fall-through": true,
"no-trailing-whitespace": true,
"no-unreachable": true,
"no-unused-expression": true,
"no-unused-variable": true,
"no-use-before-declare": true,
"no-var-keyword": true,
"no-var-requires": true,
"object-literal-sort-keys": false,
"one-line": [
true,
"check-open-brace",
"check-catch",
"check-else",
"check-whitespace"
],
"quotemark": [
true,
"single",
"avoid-escape"
],
"radix": true,
"semicolon": true,
"switch-default": true,
"trailing-comma": [
true,
{
"multiline": "never",
"singleline": "never"
}
],
"triple-equals": [
true,
"allow-null-check"
],
"typedef": false,
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"use-strict": false,
"variable-name": [
true,
"check-format",
"allow-leading-underscore",
"ban-keywords"
],
"whitespace": [
true,
"check-branch",
"check-operator",
"check-separator",
"check-type",
"check-module",
"check-decl"
]
}
}

View File

@ -0,0 +1,62 @@
/*!
* @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 { NgModule, ModuleWithProviders } from '@angular/core';
import { CoreModule } from 'ng2-alfresco-core';
import { UserInfoComponent } from './src/components/user-info.component';
import { EcmUserService } from './src/services/ecm-user.service';
import { BpmUserService } from './src/services/bpm-user.service';
export * from './src/components/user-info.component';
export * from './src/services/bpm-user.service';
export * from './src/services/ecm-user.service';
export const USER_INFO_DIRECTIVES: any[] = [
UserInfoComponent
];
export const USER_INFO_PROVIDERS: any[] = [
EcmUserService,
BpmUserService
];
@NgModule({
imports: [
CoreModule
],
declarations: [
...USER_INFO_DIRECTIVES
],
providers: [
...USER_INFO_PROVIDERS
],
exports: [
...USER_INFO_DIRECTIVES
]
})
export class UserInfoComponentModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: UserInfoComponentModule,
providers: [
...USER_INFO_PROVIDERS
]
};
}
}

View File

@ -0,0 +1,128 @@
// Tun on full stack traces in errors to help debugging
Error.stackTraceLimit = Infinity;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
__karma__.loaded = function() {};
var builtPath = '/base/dist/';
function isJsFile(path) {
return path.slice(-3) == '.js';
}
function isSpecFile(path) {
return /\.spec\.(.*\.)?js$/.test(path);
}
function isBuiltFile(path) {
return isJsFile(path) && (path.substr(0, builtPath.length) == builtPath);
}
var allSpecFiles = Object.keys(window.__karma__.files)
.filter(isSpecFile)
.filter(isBuiltFile);
var paths = {
// paths serve as alias
'npm:': 'base/node_modules/'
};
var map = {
'app': 'base/dist',
// angular bundles
'@angular/core': 'npm:@angular/core/bundles/core.umd.js',
'@angular/common': 'npm:@angular/common/bundles/common.umd.js',
'@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
'@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
'@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
'@angular/http': 'npm:@angular/http/bundles/http.umd.js',
'@angular/router': 'npm:@angular/router/bundles/router.umd.js',
'@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
// testing
'@angular/core/testing': 'npm:@angular/core/bundles/core-testing.umd.js',
'@angular/common/testing': 'npm:@angular/common/bundles/common-testing.umd.js',
'@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js',
'@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js',
'@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js',
'@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js',
'@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js',
'@angular/forms/testing': 'npm:@angular/forms/bundles/forms-testing.umd.js',
// other libraries
'rxjs': 'npm:rxjs',
'ng2-translate': 'npm:ng2-translate',
'alfresco-js-api': 'npm:alfresco-js-api/dist',
'ng2-activiti-form': 'npm:ng2-activiti-form/dist',
'ng2-activiti-processlist': 'npm:ng2-activiti-processlist/dist',
'ng2-activiti-tasklist': 'npm:ng2-activiti-tasklist/dist',
'ng2-alfresco-core': 'npm:ng2-alfresco-core/dist',
'ng2-alfresco-datatable': 'npm:ng2-alfresco-datatable/dist',
'ng2-alfresco-documentlist': 'npm:ng2-alfresco-documentlist/dist',
'ng2-alfresco-login': 'npm:ng2-alfresco-login/dist',
'ng2-alfresco-search': 'npm:ng2-alfresco-search/dist',
'ng2-alfresco-tag': 'npm:ng2-alfresco-tag/dist',
'ng2-alfresco-upload': 'npm:ng2-alfresco-upload/dist',
'ng2-alfresco-viewer': 'npm:ng2-alfresco-viewer/dist',
'ng2-alfresco-webscript': 'npm:ng2-alfresco-webscript/dist',
'ng2-alfresco-userinfo': 'npm:ng2-alfresco-userinfo/dist'
};
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'ng2-translate': { defaultExtension: 'js' },
'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'},
'ng2-activiti-form': { main: './index.js', defaultExtension: 'js'},
'ng2-activiti-processlist': { main: './index.js', defaultExtension: 'js'},
'ng2-activiti-tasklist': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-core': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-datatable': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-documentlist': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-login': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-search': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-tag': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-upload': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-viewer': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-webscript': { main: './index.js', defaultExtension: 'js'},
'ng2-alfresco-userinfo': { main: './index.js', defaultExtension: 'js'}
};
var config = {
paths: paths,
map: map,
packages: packages
};
System.config(config);
System.import('@angular/core/testing')
.then(initTestBed)
.then(initTesting);
function initTestBed(){
return Promise.all([
System.import('@angular/core/testing'),
System.import('@angular/platform-browser-dynamic/testing')
])
.then(function (providers) {
var coreTesting = providers[0];
var browserTesting = providers[1];
coreTesting.TestBed.initTestEnvironment(
browserTesting.BrowserDynamicTestingModule,
browserTesting.platformBrowserDynamicTesting());
})
}
// Import all spec files and start karma
function initTesting () {
return Promise.all(
allSpecFiles.map(function (moduleName) {
return System.import(moduleName);
})
)
.then(__karma__.start, __karma__.error);
}

View File

@ -0,0 +1,131 @@
'use strict';
module.exports = function (config) {
var configuration = {
basePath: '.',
frameworks: ['jasmine-ajax', 'jasmine'],
files: [
// System.js for module loading
'node_modules/systemjs/dist/system.src.js',
// Polyfills
'node_modules/core-js/client/shim.js',
'node_modules/reflect-metadata/Reflect.js',
// zone.js
'node_modules/zone.js/dist/zone.js',
'node_modules/zone.js/dist/long-stack-trace-zone.js',
'node_modules/zone.js/dist/proxy.js',
'node_modules/zone.js/dist/sync-test.js',
'node_modules/zone.js/dist/jasmine-patch.js',
'node_modules/zone.js/dist/async-test.js',
'node_modules/zone.js/dist/fake-async-test.js',
// RxJs
{ pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false },
{ pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false },
// Paths loaded via module imports:
// Angular itself
{pattern: 'node_modules/@angular/**/*.js', included: false, watched: false},
{pattern: 'node_modules/@angular/**/*.js.map', included: false, watched: false},
'node_modules/alfresco-js-api/dist/alfresco-js-api.js',
{pattern: 'node_modules/ng2-translate/**/*.js', included: false, watched: false},
{pattern: 'node_modules/ng2-translate/**/*.js.map', included: false, watched: false},
'karma-test-shim.js',
// paths loaded via module imports
{pattern: 'dist/**/*.js', included: false, watched: true},
{pattern: 'dist/**/*.html', included: true, served: true, watched: true},
{pattern: 'dist/**/*.css', included: true, served: true, watched: true},
// ng2-components
{ pattern: 'node_modules/ng2-activiti-form/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-activiti-processlist/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-activiti-tasklist/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-core/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-datatable/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-documentlist/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-login/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-search/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-tag/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-upload/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-viewer/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-webscript/dist/**/*.js', included: false, served: true, watched: false },
{ pattern: 'node_modules/ng2-alfresco-userinfo/dist/**/*.js', included: false, served: true, watched: false },
// paths to support debugging with source maps in dev tools
{pattern: 'src/**/*.ts', included: false, watched: false},
{pattern: 'dist/**/*.js.map', included: false, watched: false}
],
exclude: [
'node_modules/**/*spec.js'
],
// proxied base paths
proxies: {
// required for component assets fetched by Angular's compiler
'/src/': '/base/src/'
},
port: 9876,
// level of logging
// possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
logLevel: config.LOG_INFO,
colors: true,
autoWatch: true,
browsers: ['Chrome'],
customLaunchers: {
Chrome_travis_ci: {
base: 'Chrome',
flags: ['--no-sandbox']
}
},
// Karma plugins loaded
plugins: [
'karma-jasmine',
'karma-coverage',
'karma-jasmine-ajax',
'karma-chrome-launcher',
'karma-mocha-reporter',
'karma-jasmine-html-reporter'
],
// Coverage reporter generates the coverage
reporters: ['mocha', 'coverage', 'kjhtml'],
// Source files that you wanna generate coverage for.
// Do not include tests or libraries (these files will be instrumented by Istanbul)
preprocessors: {
// 'dist/**/!(*spec).js': ['coverage']
},
coverageReporter: {
dir: 'coverage/',
subdir: 'report',
reporters: [
{type: 'text'},
{type: 'json', file: 'coverage-final.json'},
{type: 'html'},
{type: 'lcov'}
]
}
};
if (process.env.TRAVIS) {
configuration.browsers = ['Chrome_travis_ci'];
}
config.set(configuration)
};

View File

@ -0,0 +1,89 @@
{
"name": "ng2-alfresco-userinfo",
"description": "Alfresco User Info component",
"version": "0.3.2",
"author": "Alfresco Software, Ltd.",
"main": "./dist/index.js",
"typings": "./dist/index.d.ts",
"scripts": {
"clean": "rimraf dist node_modules",
"build": "npm run tslint && rimraf dist && tsc && npm run copy-dist && license-check",
"build:w": "npm run tslint && rimraf dist && npm run watch-task",
"watch-task": "concurrently \"npm run tsc:w\" \"npm run copy-dist:w\" \"license-check\"",
"tslint": "tslint -c tslint.json *.ts && tslint -c tslint.json 'src/{,**/}**.ts'",
"copy-dist": "cpx \"./src/**/*.{html,css,json,png,jpg,gif,svg}\" ./dist/src",
"copy-dist:w": "cpx \"./src/**/*.{html,css,json,png,jpg,gif,svg}\" ./dist/src -w",
"tsc": "tsc",
"tsc:w": "tsc -w",
"pretest": "npm run build",
"test": "karma start karma.conf.js --reporters mocha,coverage --single-run",
"test-browser": "npm run build && concurrently \"karma start karma.conf.js --reporters kjhtml\" \"npm run watch-task\"",
"posttest": "remap-istanbul -i coverage/report/coverage-final.json -o coverage/report -t html && remap-istanbul -i coverage/report/coverage-final.json -o coverage/report/coverage-final.json",
"coverage": "npm run test && wsrv -o -p 9875 ./coverage/report",
"prepublish": "npm run build",
"travis": "echo 'placeholder'"
},
"repository": {
"type": "git",
"url": "https://github.com/Alfresco/alfresco-ng2-components.git"
},
"bugs": {
"url": "https://github.com/Alfresco/alfresco-ng2-components/issues"
},
"dependencies": {
"@angular/common": "2.0.0",
"@angular/compiler": "2.0.0",
"@angular/core": "2.0.0",
"@angular/forms": "2.0.0",
"@angular/http": "2.0.0",
"@angular/platform-browser": "2.0.0",
"@angular/platform-browser-dynamic": "2.0.0",
"@angular/router": "3.0.0",
"@angular/upgrade": "2.0.0",
"core-js": "^2.4.1",
"reflect-metadata": "^0.1.3",
"rxjs": "5.0.0-beta.12",
"systemjs": "0.19.27",
"zone.js": "^0.6.23",
"alfresco-js-api": "^0.3.0",
"ng2-translate": "2.5.0",
"ng2-alfresco-core": "0.3.2"
},
"devDependencies": {
"@types/core-js": "^0.9.32",
"@types/jasmine": "^2.2.33",
"concurrently": "^2.2.0",
"cpx": "^1.3.1",
"jasmine-ajax": "^3.2.0",
"jasmine-core": "2.4.1",
"karma": "~0.13.22",
"karma-chrome-launcher": "~1.0.1",
"karma-coverage": "^1.0.0",
"karma-jasmine": "~1.0.2",
"karma-jasmine-ajax": "^0.1.13",
"karma-jasmine-html-reporter": "^0.2.0",
"karma-mocha-reporter": "^2.0.3",
"license-check": "^1.0.4",
"remap-istanbul": "^0.6.3",
"rimraf": "2.5.2",
"traceur": "^0.0.91",
"tslint": "^3.8.1",
"typescript": "^2.0.3",
"wsrv": "^0.1.5"
},
"keywords": [
"userinfo",
"alfresco-component"
],
"license-check-config": {
"src": [
"./dist/**/*.js"
],
"path": "assets/license_header.txt",
"blocking": false,
"logInfo": false,
"logError": true
},
"license": "Apache-2.0"
}

View File

@ -0,0 +1,53 @@
.profile-image {
text-align: center;
border-radius: 90%;
width: 40px;
margin-right: 0%;
cursor: pointer;
border: 1px solid #999999;
vertical-align: middle;
}
.button-profile {
display: inline-block;
border: 0px;
vertical-align: middle;
}
.detail-user-profile-list-mdl{
margin-right: 10px;
}
.user-profile-list-mdl{
max-height: 450px;
min-width: 450px;
overflow: auto;
}
.header-profile{
color: rgb(255,152,0);
margin-left: 10px;
}
hr.title-start {
border: 0;
height: 1px;
background: #333;
background-image: linear-gradient(to right, #ccc, #333, #ccc);
}
span.role-label-user{
font-weight: 400;
line-height: 1;
letter-spacing: 0;
color: rgba(0,0,0,.87);
}
.custom-role-style{
font-size: 14px;
color: #9e9e9e;
}
.truncate-long-names{
text-overflow: ellipsis;
}

View File

@ -0,0 +1,63 @@
<div id="img_container">
<span *ngIf="ecmUser">{{ecmUser.firstName || ecmUser.lastName}}</span>
<span *ngIf="bpmUser && !ecmUser">
{{ formatValue(bpmUser.firstName) ||
formatValue(bpmUser.lastName) ||
formatValue(bpmUser.fullName) }}
</span>
<div class="button-profile" id="user-profile" data-automation-id="user-profile">
<img id="logged-user-img"
[src]="getUserAvatar()"
class="profile-image"/>
</div>
<div class="user-profile-list-mdl
mdl-menu mdl-menu--bottom-right
mdl-js-menu mdl-js-ripple-effect"
for="user-profile">
<ul class='detail-user-profile-list-mdl mdl-list'>
<div *ngIf="ecmUser">
<hr class="title-start">
<span class="header-profile"><b>ECM</b></span>
<li class="mdl-list__item mdl-list__item--two-line">
<span class="mdl-list__item-primary-content">
<i class="mdl-list__item-avatar">
<img id="logged-user-img"
[src]="getEcmUserDetailAvatarUrl()"
class="profile-image"/>
</i>
<span class="truncate-long-names">{{ecmUser.firstName}} {{ecmUser.lastName}}</span>
<span class="mdl-list__item-sub-title">{{ecmUser.email}}</span>
</span>
<span class="mdl-list__item-secondary-content custom-role-style">
<span class="role-label-user">Job Role</span>
{{ ecmUser.jobTitle ? ecmUser.jobTitle : 'N/A' }}
</span>
</li>
</div>
<br>
<div *ngIf="bpmUser">
<hr class="title-start">
<span class="header-profile"><b>BPM</b></span>
<li class="mdl-list__item mdl-list__item--two-line">
<span class="mdl-list__item-primary-content">
<i class="mdl-list__item-avatar">
<img id="logged-user-img"
[src]="getBpmUserDetailAvatarUrl()"
class="profile-image"/>
</i>
<span class="truncate-long-names">
{{formatValue(bpmUser.firstName) }} {{ formatValue(bpmUser.lastName) }}
</span>
<span class="mdl-list__item-sub-title">{{bpmUser.email}}</span>
</span>
<span class="mdl-list__item-secondary-content custom-role-style">
<span class="role-label-user">Tenant</span>
{{bpmUser.tenantName}}
</span>
</li>
</div>
</ul>
</div>
</div>

View File

@ -0,0 +1,250 @@
/*!
* @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 { UserInfoComponent } from './user-info.component';
import { EcmUserService } from '../services/ecm-user.service';
import { BpmUserService } from '../services/bpm-user.service';
import { FakeEcmUserService } from '../testing/fake-ecm-user.service';
import { FakeBpmUserService } from '../testing/fake-bpm-user.service';
import { AlfrescoAuthenticationService, AlfrescoContentService } from 'ng2-alfresco-core';
import { ComponentFixture, TestBed, async } from '@angular/core/testing';
class StubAuthentication {
isEcmConnected: boolean;
isBpmConnected: boolean;
setIsEcmLoggedIn(logged: boolean) { this.isEcmConnected = logged; };
setIsBpmLoggedIn(logged: boolean) { this.isBpmConnected = logged; };
isEcmLoggedIn() { return this.isEcmConnected; };
isBpmLoggedIn() { return this.isBpmConnected; };
}
class StubAlfrescoContentService {
getContentUrl() { return 'fake/url/image/for/ecm/user'; } ;
}
describe('User info component', () => {
let userInfoComp: UserInfoComponent;
let fixture: ComponentFixture<UserInfoComponent>;
let authStub: StubAuthentication;
let fakeEcmService: FakeEcmUserService;
let fakeBpmService: FakeBpmUserService;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ UserInfoComponent ],
providers: [{ provide: EcmUserService, useClass: FakeEcmUserService},
{ provide: BpmUserService, useClass: FakeBpmUserService},
{ provide: AlfrescoAuthenticationService, useClass: StubAuthentication },
{ provide: AlfrescoContentService, useClass: StubAlfrescoContentService }
]
}).compileComponents().then(() => {
fixture = TestBed.createComponent(UserInfoComponent);
userInfoComp = fixture.componentInstance;
});
}));
it('should NOT have users before ngOnInit only anonymous image', () => {
expect(userInfoComp.ecmUser).toBeUndefined();
expect(userInfoComp.ecmUserImage).toBeUndefined();
expect(userInfoComp.bpmUser).toBeUndefined();
expect(userInfoComp.bpmUserImage).toBeUndefined();
expect(userInfoComp.anonymouseImageUrl).toBeDefined();
});
it('should NOT have users immediately after ngOnInit', () => {
fixture.detectChanges();
expect(userInfoComp.ecmUser).toBeUndefined();
expect(userInfoComp.ecmUserImage).toBeUndefined();
expect(userInfoComp.bpmUser).toBeUndefined();
expect(userInfoComp.bpmUserImage).toBeUndefined();
expect(userInfoComp.anonymouseImageUrl).toBeDefined();
});
describe('when user is logged on ecm', () => {
beforeEach( async(() => {
authStub = fixture.debugElement.injector.get(AlfrescoAuthenticationService);
fakeEcmService = fixture.debugElement.injector.get(EcmUserService);
authStub.setIsEcmLoggedIn(true);
fixture.detectChanges(); // runs ngOnInit -> getUsers
fixture.whenStable()
.then( () => {
fixture.detectChanges();
} );
}));
it('should get the ecm current user image from the service', () => {
expect(userInfoComp.ecmUser).toBeDefined();
expect(userInfoComp.ecmUserImage).toBeDefined();
expect(userInfoComp.ecmUserImage).toEqual('fake/url/image/for/ecm/user');
});
it('should get the ecm user informations from the service', () => {
expect(userInfoComp.ecmUser).toBeDefined();
expect(userInfoComp.ecmUser.firstName).toEqual('fake-first-name');
expect(userInfoComp.ecmUser.lastName).toEqual('fake-last-name');
});
it('should return the anonynous user avatar image url when user does not have avatarId', async(() => {
fakeEcmService.respondWithTheUserWithoutImage();
userInfoComp.ngOnInit();
fixture.whenStable()
.then( () => {
fixture.detectChanges();
let res = userInfoComp.getEcmUserDetailAvatarUrl();
expect(userInfoComp.ecmUserImage).toBeUndefined();
expect(res).toEqual(userInfoComp.anonymouseImageUrl);
});
}));
});
describe('when user is logged on bpm', () => {
beforeEach( async(() => {
authStub = fixture.debugElement.injector.get(AlfrescoAuthenticationService);
fakeBpmService = fixture.debugElement.injector.get(BpmUserService);
authStub.setIsBpmLoggedIn(true);
fixture.detectChanges(); // runs ngOnInit -> getUsers
fixture.whenStable()
.then( () => {
fixture.detectChanges();
} );
}));
it('should get the bpm current user image from the service', () => {
expect(userInfoComp.bpmUser).toBeDefined();
expect(userInfoComp.bpmUserImage).toBeDefined();
expect(userInfoComp.bpmUserImage).toEqual('fake-picture-id');
});
it('should get the bpm user informations from the service', () => {
expect(userInfoComp.bpmUser).toBeDefined();
expect(userInfoComp.bpmUser.firstName).toEqual('fake-first-name');
expect(userInfoComp.bpmUser.lastName).toEqual('fake-last-name');
});
it('should return the anonynous user avatar image url when user does not have avatarId', async(() => {
fakeBpmService.respondWithTheUserWithoutImage();
userInfoComp.ngOnInit();
fixture.whenStable()
.then( () => {
fixture.detectChanges();
let res = userInfoComp.getBpmUserDetailAvatarUrl();
expect(userInfoComp.bpmUserImage).toBeUndefined();
expect(res).toEqual(userInfoComp.anonymouseImageUrl);
});
}));
});
describe('when user is logged on bpm and ecm', () => {
beforeEach( async(() => {
authStub = fixture.debugElement.injector.get(AlfrescoAuthenticationService);
fakeBpmService = fixture.debugElement.injector.get(BpmUserService);
fakeEcmService = fixture.debugElement.injector.get(EcmUserService);
authStub.setIsBpmLoggedIn(true);
authStub.setIsEcmLoggedIn(true);
fixture.detectChanges(); // runs ngOnInit -> getUsers
fixture.whenStable()
.then( () => {
fixture.detectChanges();
} );
}));
it('should get the bpm current user image from the service', () => {
expect(userInfoComp.bpmUser).toBeDefined();
expect(userInfoComp.bpmUserImage).toBeDefined();
expect(userInfoComp.bpmUserImage).toEqual('fake-picture-id');
expect(userInfoComp.ecmUser).toBeDefined();
expect(userInfoComp.ecmUserImage).toBeDefined();
expect(userInfoComp.ecmUserImage).toEqual('fake/url/image/for/ecm/user');
});
it('should get the bpm user informations from the service', () => {
expect(userInfoComp.bpmUser).toBeDefined();
expect(userInfoComp.bpmUser.firstName).toEqual('fake-first-name');
expect(userInfoComp.bpmUser.lastName).toEqual('fake-last-name');
expect(userInfoComp.ecmUser).toBeDefined();
expect(userInfoComp.ecmUser.firstName).toEqual('fake-first-name');
expect(userInfoComp.ecmUser.lastName).toEqual('fake-last-name');
});
it('should return the anonynous user avatar image url when user does not have avatarId', async(() => {
fakeBpmService.respondWithTheUserWithoutImage();
fakeEcmService.respondWithTheUserWithoutImage();
userInfoComp.ngOnInit();
fixture.whenStable()
.then( () => {
fixture.detectChanges();
let resBpm = userInfoComp.getBpmUserDetailAvatarUrl();
expect(userInfoComp.bpmUserImage).toBeUndefined();
expect(resBpm).toEqual(userInfoComp.anonymouseImageUrl);
let resEcm = userInfoComp.getEcmUserDetailAvatarUrl();
expect(userInfoComp.ecmUserImage).toBeUndefined();
expect(resEcm).toEqual(userInfoComp.anonymouseImageUrl);
});
}));
it('should return the ecm image if exists', async(() => {
fakeBpmService.respondWithTheUserWithImage();
fakeEcmService.respondWithTheUserWithImage();
userInfoComp.ngOnInit();
fixture.whenStable()
.then( () => {
fixture.detectChanges();
let res = userInfoComp.getUserAvatar();
expect(userInfoComp.bpmUserImage).toBeDefined();
expect(userInfoComp.ecmUserImage).toBeDefined();
expect(res).toEqual(userInfoComp.ecmUserImage);
});
}));
it('should return the bpm image if ecm does not have it', async(() => {
fakeBpmService.respondWithTheUserWithImage();
fakeEcmService.respondWithTheUserWithoutImage();
userInfoComp.ngOnInit();
fixture.whenStable()
.then( () => {
fixture.detectChanges();
let res = userInfoComp.getUserAvatar();
expect(userInfoComp.bpmUserImage).toBeDefined();
expect(userInfoComp.ecmUserImage).toBeUndefined();
expect(res).toEqual(userInfoComp.bpmUserImage);
});
}));
it('should return the anonynous avatar if no user has it', async(() => {
fakeBpmService.respondWithTheUserWithoutImage();
fakeEcmService.respondWithTheUserWithoutImage();
userInfoComp.ngOnInit();
fixture.whenStable()
.then( () => {
fixture.detectChanges();
let res = userInfoComp.getUserAvatar();
expect(userInfoComp.bpmUserImage).toBeUndefined();
expect(userInfoComp.ecmUserImage).toBeUndefined();
expect(res).toEqual(userInfoComp.anonymouseImageUrl);
});
}));
});
});

View File

@ -0,0 +1,94 @@
/*!
* @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, OnInit } from '@angular/core';
import { EcmUserModel } from './../models/ecm-user.model';
import { BpmUserModel } from './../models/bpm-user.model';
import { EcmUserService } from './../services/ecm-user.service';
import { BpmUserService } from './../services/bpm-user.service';
import { AlfrescoAuthenticationService } from 'ng2-alfresco-core';
declare let __moduleName: string;
@Component({
selector: 'ng2-alfresco-userinfo',
moduleId: __moduleName,
styleUrls: ['./user-info.component.css'],
templateUrl: './user-info.component.html'
})
export class UserInfoComponent implements OnInit {
private baseComponentPath = __moduleName.replace('components/user-info.component.js', '');
ecmUser: EcmUserModel;
bpmUser: BpmUserModel;
anonymouseImageUrl: string = this.baseComponentPath + 'img/anonymous.gif';
bpmUserImage: any;
ecmUserImage: any;
constructor(private ecmUserService: EcmUserService,
private bpmUserService: BpmUserService,
public authService: AlfrescoAuthenticationService) {
}
ngOnInit() {
if ( this.authService.isEcmLoggedIn() ) {
this.ecmUserService.getCurrentUserInfo()
.subscribe(
(res) => {
this.ecmUser = <EcmUserModel> res;
this.getEcmUserProfileImage();
}
);
}
if ( this.authService.isBpmLoggedIn() ) {
this.bpmUserService.getCurrentUserInfo()
.subscribe(
(res) => {
this.bpmUser = <BpmUserModel> res;
this.getBpmUserProfileImage();
}
);
}
}
private getBpmUserProfileImage() {
this.bpmUserImage = this.bpmUserService.getCurrentUserProfileImage();
}
private getEcmUserProfileImage() {
this.ecmUserImage = this.ecmUserService.getCurrentUserProfileImageUrl(this.ecmUser.avatarId);
}
public getUserAvatar() {
return this.ecmUserImage || this.bpmUserImage || this.anonymouseImageUrl;
}
public getBpmUserDetailAvatarUrl() {
return this.bpmUserImage || this.anonymouseImageUrl;
}
public getEcmUserDetailAvatarUrl() {
return this.ecmUserImage || this.anonymouseImageUrl;
}
public formatValue(value: string) {
return value === 'null' ? null : value;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,39 @@
/*!
* @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.
*/
export class BpmUserModel {
apps: any;
capabilities: string;
company: string;
created: string;
email: string;
externalId: string;
firstName: string;
lastName: string;
fullname: string;
groups: any;
id: string;
lastUpdate: string;
latestSyncTimeStamp: string;
password: string;
pictureId: string;
status: string;
tenantId: string;
tenantName: string;
tenantPictureId: string;
type: string;
}

View File

@ -0,0 +1,27 @@
/*!
* @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.
*/
export class EcmCompanyModel {
organization: string;
address1: string;
address2: string;
address3: string;
postcode: string;
telephone: string;
fax: string;
email: string;
}

View File

@ -0,0 +1,39 @@
/*!
* @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 { EcmCompanyModel } from './ecm-company.model';
export class EcmUserModel {
id: string;
firstName: string;
lastName: string;
description: string;
avatarId: string;
email: string;
skypeId: string;
googleId: string;
instantMessageId: string;
jobTitle: string;
location: string;
company: EcmCompanyModel;
mobile: string;
telephone: string;
statusUpdatedAt: string;
userStatus: string;
enabled: boolean;
emailNotificationsEnabled: boolean;
}

View File

@ -0,0 +1,146 @@
/*!
* @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 { BpmUserService } from '../services/bpm-user.service';
import { AlfrescoAuthenticationService } from 'ng2-alfresco-core';
import { TestBed, async, inject } from '@angular/core/testing';
import { BpmUserModel } from '../models/bpm-user.model';
export var fakeBpmUser: BpmUserModel = {
apps: {},
capabilities: 'fake-capability',
company: 'fake-company',
created: 'fake-create-date',
email: 'fakeBpm@fake.com',
externalId: 'fake-external-id',
firstName: 'fake-first-name',
lastName: 'fake-last-name',
fullname: 'fake-full-name',
groups: {},
id: 'fake-id',
lastUpdate: 'fake-update-date',
latestSyncTimeStamp: 'fake-timestamp',
password: 'fake-password',
pictureId: 'fake-picture-id',
status: 'fake-status',
tenantId: 'fake-tenant-id',
tenantName: 'fake-tenant-name',
tenantPictureId: 'fake-tenant-picture-id',
type: 'fake-type'
};
class StubAuthentication {
isEcmConnected: boolean;
isBpmConnected: boolean;
setIsEcmLoggedIn(logged: boolean) { this.isEcmConnected = logged; };
setIsBpmLoggedIn(logged: boolean) { this.isBpmConnected = logged; };
isEcmLoggedIn() { return this.isEcmConnected; };
isBpmLoggedIn() { return this.isBpmConnected; };
callApiGetPersonInfo() { return Promise.resolve(fakeBpmUser); };
};
describe('Bpm User service', () => {
beforeEach( async(() => {
TestBed.configureTestingModule({
providers: [ BpmUserService,
{ provide: AlfrescoAuthenticationService, useClass: StubAuthentication }
]
})
.compileComponents();
}));
it('can instantiate service when inject service',
inject([BpmUserService], (service: BpmUserService) => {
expect(service instanceof BpmUserService).toBe(true);
}));
it('can instantiate service with authorization', inject([AlfrescoAuthenticationService],
(auth: AlfrescoAuthenticationService) => {
expect(auth).not.toBeNull('authorization should be provided');
let service = new BpmUserService(auth);
expect(service instanceof BpmUserService).toBe(true, 'new service should be ok');
}));
describe('when user is logged in', () => {
let service: BpmUserService;
let authServiceForTest: AlfrescoAuthenticationService;
beforeEach(
inject(
[AlfrescoAuthenticationService ],
( authService: AlfrescoAuthenticationService ) => {
authServiceForTest = authService;
service = new BpmUserService(authService);
spyOn(authServiceForTest, 'isBpmLoggedIn').and.returnValue(true);
}));
it('should be able to retrieve current user info', (done) => {
spyOn(service, 'callApiGetProfile').and.returnValue(Promise.resolve(fakeBpmUser));
service.getCurrentUserInfo().subscribe(
(user) => {
expect(user).toBeDefined();
expect(user.firstName).toEqual('fake-first-name');
expect(user.lastName).toEqual('fake-last-name');
expect(user.email).toEqual('fakeBpm@fake.com');
done();
});
});
it('should retrieve current logged user information via js api', () => {
spyOn(service, 'callApiGetProfile');
service.getCurrentUserInfo();
expect(service.callApiGetProfile).toHaveBeenCalled();
});
it('should retrieve avatar url for current user', (done) => {
spyOn(service, 'callApiGetProfilePicture').and.returnValue(Promise.resolve('fake/img/path'));
service.getCurrentUserProfileImage().subscribe(
(path) => {
expect(path).toBeDefined();
expect(path).toEqual('fake/img/path');
done();
});
});
});
describe('when user is not logged in', () => {
let service: BpmUserService;
let authServiceForTest: AlfrescoAuthenticationService;
beforeEach(
inject(
[AlfrescoAuthenticationService],
(authService: AlfrescoAuthenticationService) => {
authServiceForTest = authService;
service = new BpmUserService(authService);
spyOn(authServiceForTest, 'isBpmLoggedIn').and.returnValue(false);
}));
it('should not retrieve the user information', () => {
spyOn(service, 'callApiGetProfile');
service.getCurrentUserInfo();
expect(service.callApiGetProfile).not.toHaveBeenCalled();
});
it('should not retrieve the user avatar', () => {
spyOn(service, 'callApiGetProfilePicture');
service.getCurrentUserInfo();
expect(service.callApiGetProfilePicture).not.toHaveBeenCalled();
});
});
});

View File

@ -0,0 +1,91 @@
/*!
* @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 { AlfrescoAuthenticationService } from 'ng2-alfresco-core';
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { BpmUserModel } from '../models/bpm-user.model';
/**
*
* BPMUserService retrieve all the information of an Ecm user.
*
* @returns {BPMUserService} .
*/
@Injectable()
export class BpmUserService {
constructor(private authService: AlfrescoAuthenticationService) {
}
/**
* get Current User information for BPM
* @param userName - the user name
*/
getCurrentUserInfo(): Observable<BpmUserModel> {
if ( this.authService.isBpmLoggedIn() ) {
return Observable.fromPromise(this.callApiGetProfile())
.map(
(data) => <BpmUserModel> data
)
.catch(this.handleError);
}
}
getCurrentUserProfileImage(): any {
if ( this.authService.isBpmLoggedIn() ) {
return Observable.fromPromise(this.callApiGetProfilePicture())
.map(
(data) => data
)
.catch(this.handleError);
}
}
/**
* Call js api to get current user profile picture
*/
callApiGetProfilePicture() {
try {
return this.authService.getAlfrescoApi().activiti.profileApi.getProfilePicture();
} catch (exc) {
console.error(exc);
return null;
}
}
/**
* Call js api to get current user information
*/
callApiGetProfile() {
return this.authService.getAlfrescoApi().activiti.profileApi.getProfile();
}
/**
* Throw the error
* @param error
* @returns {ErrorObservable}
*/
private handleError(error: Response) {
// in a real world app, we may send the error to some remote logging infrastructure
// instead of just logging it to the console
console.error(error);
return Observable.throw(error || 'Server error');
}
}

View File

@ -0,0 +1,179 @@
/*!
* @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 { EcmUserService } from '../services/ecm-user.service';
import { AlfrescoAuthenticationService, AlfrescoContentService } from 'ng2-alfresco-core';
import { TestBed, async, inject } from '@angular/core/testing';
import { EcmUserModel } from '../models/ecm-user.model';
import { EcmCompanyModel } from '../models/ecm-company.model';
export var fakeEcmCompany: EcmCompanyModel = {
organization: 'company-fake-name',
address1: 'fake-address-1',
address2: 'fake-address-2',
address3: 'fake-address-3',
postcode: 'fAk1',
telephone: '00000000',
fax: '=1111111',
email: 'fakeCompany@fake.com'
};
export var fakeEcmUser: EcmUserModel = {
id: 'fake-id',
firstName: 'fake-first-name',
lastName: 'fake-last-name',
description: 'i am a fake user for test',
avatarId: 'fake-avatar-id',
email: 'fakeEcm@ecmUser.com',
skypeId: 'fake-skype-id',
googleId: 'fake-googleId-id',
instantMessageId: 'fake-instantMessageId-id',
company: fakeEcmCompany,
jobTitle: 'test job',
location: 'fake location',
mobile: '000000000',
telephone: '11111111',
statusUpdatedAt: 'fake-date',
userStatus: 'active',
enabled: true,
emailNotificationsEnabled: true
};
class StubAuthentication {
isEcmConnected: boolean;
isBpmConnected: boolean;
setIsEcmLoggedIn(logged: boolean) { this.isEcmConnected = logged; };
setIsBpmLoggedIn(logged: boolean) { this.isBpmConnected = logged; };
isEcmLoggedIn() { return this.isEcmConnected; };
isBpmLoggedIn() { return this.isBpmConnected; };
callApiGetPersonInfo() { return Promise.resolve(fakeEcmUser); };
};
class StubAlfrescoContentService {
getContentUrl() { return 'fake/url/image/for/ecm/user'; } ;
}
describe('Ecm User service', () => {
beforeEach( async(() => {
TestBed.configureTestingModule({
providers: [ EcmUserService,
{ provide: AlfrescoAuthenticationService, useClass: StubAuthentication },
{ provide: AlfrescoContentService, useClass: StubAlfrescoContentService }
]
})
.compileComponents();
}));
it('can instantiate service when inject service',
inject([EcmUserService], (service: EcmUserService) => {
expect(service instanceof EcmUserService).toBe(true);
}));
it('can instantiate service with authorization', inject([AlfrescoAuthenticationService],
(auth: AlfrescoAuthenticationService) => {
expect(auth).not.toBeNull('authorization should be provided');
let service = new EcmUserService(auth, null);
expect(service instanceof EcmUserService).toBe(true, 'new service should be ok');
}));
it('can instantiate service with content service', inject([AlfrescoContentService],
(content: AlfrescoContentService) => {
expect(content).not.toBeNull('contentService should be provided');
let service = new EcmUserService(null, content);
expect(service instanceof EcmUserService).toBe(true, 'new service should be ok');
}));
describe('when user is logged in', () => {
let service: EcmUserService;
let authServiceForTest: AlfrescoAuthenticationService;
let contentServiceForTest: AlfrescoContentService;
beforeEach(
inject(
[AlfrescoAuthenticationService, AlfrescoContentService],
(authService: AlfrescoAuthenticationService, content: AlfrescoContentService) => {
authServiceForTest = authService;
contentServiceForTest = content;
service = new EcmUserService(authService, content);
spyOn(authServiceForTest, 'isEcmLoggedIn').and.returnValue(true);
}));
it('should be able to retrieve current user info', (done) => {
let userJsApiResponse = {entry: fakeEcmUser};
spyOn(service, 'callApiGetPersonInfo').and.returnValue(Promise.resolve(userJsApiResponse));
service.getCurrentUserInfo().subscribe(
(user) => {
expect(user).toBeDefined();
expect(user.firstName).toEqual('fake-first-name');
expect(user.lastName).toEqual('fake-last-name');
expect(user.email).toEqual('fakeEcm@ecmUser.com');
done();
});
});
it('should retrieve current logged user information', () => {
spyOn(service, 'getUserInfo');
spyOn(service, 'callApiGetPersonInfo').and.callThrough();
service.getCurrentUserInfo();
expect(service.getUserInfo).toHaveBeenCalledWith('-me-');
});
it('should retrieve avatar url for current user', () => {
spyOn(contentServiceForTest, 'getContentUrl').and.returnValue('fake/url/image/for/ecm/user');
let urlRs = service.getCurrentUserProfileImageUrl('fake-avatar-id');
expect(urlRs).toEqual('fake/url/image/for/ecm/user');
});
it('should not call content service without avatar id', () => {
spyOn(contentServiceForTest, 'getContentUrl').and.callThrough();
let urlRs = service.getCurrentUserProfileImageUrl(undefined);
expect(urlRs).toBeUndefined();
expect(contentServiceForTest.getContentUrl).not.toHaveBeenCalled();
});
it('should build the body for the content service', () => {
spyOn(contentServiceForTest, 'getContentUrl').and.callThrough();
let urlRs = service.getCurrentUserProfileImageUrl('fake-avatar-id');
expect(urlRs).toBeDefined();
expect(contentServiceForTest.getContentUrl).toHaveBeenCalledWith( {entry: {id: 'fake-avatar-id'} });
});
});
describe('when user is not logged in', () => {
let service: EcmUserService;
let authServiceForTest: AlfrescoAuthenticationService;
let contentServiceForTest: AlfrescoContentService;
beforeEach(
inject(
[AlfrescoAuthenticationService, AlfrescoContentService],
(authService: AlfrescoAuthenticationService, content: AlfrescoContentService) => {
authServiceForTest = authService;
contentServiceForTest = content;
service = new EcmUserService(authService, content);
spyOn(authServiceForTest, 'isEcmLoggedIn').and.returnValue(false);
}));
it('should not retrieve the user information', () => {
spyOn(service, 'callApiGetPersonInfo');
service.getCurrentUserInfo();
expect(service.callApiGetPersonInfo).not.toHaveBeenCalled();
});
});
});

View File

@ -0,0 +1,76 @@
/*!
* @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 { AlfrescoAuthenticationService, AlfrescoContentService } from 'ng2-alfresco-core';
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { EcmUserModel } from '../models/ecm-user.model';
/**
*
* ECMUserService retrieve all the information of an Ecm user.
*
* @returns {ECMUserService} .
*/
@Injectable()
export class EcmUserService {
constructor(private authService: AlfrescoAuthenticationService,
private contentService: AlfrescoContentService) {}
/**
* get User Information via ECM
* @param userName - the user name
*/
getUserInfo(userName: string): Observable<EcmUserModel> {
if ( this.authService.isEcmLoggedIn() ) {
return Observable.fromPromise(this.callApiGetPersonInfo(userName))
.map(
(data) => <EcmUserModel> data['entry']
)
.catch(this.handleError);
}
}
getCurrentUserInfo() {
return this.getUserInfo('-me-');
}
callApiGetPersonInfo(userName: string, opts?: any) {
return this.authService.getAlfrescoApi().core.peopleApi.getPerson(userName, opts);
}
getCurrentUserProfileImageUrl(avatarId: string) {
if ( avatarId ) {
let nodeObj = {entry: {id: avatarId}};
return this.contentService.getContentUrl(nodeObj);
}
}
/**
* Throw the error
* @param error
* @returns {ErrorObservable}
*/
private handleError(error: Response) {
// in a real world app, we may send the error to some remote logging infrastructure
// instead of just logging it to the console
console.error(error);
return Observable.throw(error || 'Server error');
}
}

View File

@ -0,0 +1,98 @@
/*!
* @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.
*/
// re-export for tester convenience
export { BpmUserModel } from '../models/bpm-user.model';
export { BpmUserService } from '../services/bpm-user.service';
import { BpmUserModel } from '../models/bpm-user.model';
import { Observable } from 'rxjs/Rx';
export var fakeBpmUserNoImage: BpmUserModel = {
apps: {},
capabilities: 'fake-capability',
company: 'fake-company',
created: 'fake-create-date',
email: 'fakeBpm@fake.com',
externalId: 'fake-external-id',
firstName: 'fake-first-name',
lastName: 'fake-last-name',
fullname: 'fake-full-name',
groups: {},
id: 'fake-id',
lastUpdate: 'fake-update-date',
latestSyncTimeStamp: 'fake-timestamp',
password: 'fake-password',
pictureId: undefined,
status: 'fake-status',
tenantId: 'fake-tenant-id',
tenantName: 'fake-tenant-name',
tenantPictureId: 'fake-tenant-picture-id',
type: 'fake-type'
};
export var fakeBpmUser: BpmUserModel = {
apps: {},
capabilities: 'fake-capability',
company: 'fake-company',
created: 'fake-create-date',
email: 'fakeBpm@fake.com',
externalId: 'fake-external-id',
firstName: 'fake-first-name',
lastName: 'fake-last-name',
fullname: 'fake-full-name',
groups: {},
id: 'fake-id',
lastUpdate: 'fake-update-date',
latestSyncTimeStamp: 'fake-timestamp',
password: 'fake-password',
pictureId: 'fake-picture-id',
status: 'fake-status',
tenantId: 'fake-tenant-id',
tenantName: 'fake-tenant-name',
tenantPictureId: 'fake-tenant-picture-id',
type: 'fake-type'
};
export class FakeBpmUserService {
lastPromise: Observable<BpmUserModel>;
public userNeeded = 0;
usersList = [fakeBpmUser, fakeBpmUserNoImage];
getUserInfo(userName: string) {
return this.lastPromise = Observable.of(this.usersList[this.userNeeded]);
};
getCurrentUserInfo() {
return this.getUserInfo('fake-id');
};
getCurrentUserProfileImage() {
return this.usersList[this.userNeeded].pictureId;
};
respondWithTheUserWithoutImage() {
this.userNeeded = 1;
}
respondWithTheUserWithImage() {
this.userNeeded = 0;
}
}

View File

@ -0,0 +1,107 @@
/*!
* @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.
*/
// re-export for tester convenience
export { EcmUserModel } from '../models/ecm-user.model';
export { EcmUserService } from '../services/ecm-user.service';
import { EcmUserModel } from '../models/ecm-user.model';
import { EcmCompanyModel } from '../models/ecm-company.model';
import { Observable } from 'rxjs/Rx';
export var fakeEcmCompany: EcmCompanyModel = {
organization: 'company-fake-name',
address1: 'fake-address-1',
address2: 'fake-address-2',
address3: 'fake-address-3',
postcode: 'fAk1',
telephone: '00000000',
fax: '11111111',
email: 'fakeCompany@fake.com'
};
export var fakeEcmUserNoImage: EcmUserModel = {
id: 'fake-id',
firstName: 'fake-first-name',
lastName: 'fake-last-name',
description: 'i am a fake user for test',
avatarId: undefined,
email: 'fakeEcm@ecmUser.com',
skypeId: 'fake-skype-id',
googleId: 'fake-googleId-id',
instantMessageId: 'fake-instantMessageId-id',
company: fakeEcmCompany,
jobTitle: 'test job',
location: 'fake location',
mobile: '000000000',
telephone: '11111111',
statusUpdatedAt: 'fake-date',
userStatus: 'active',
enabled: true,
emailNotificationsEnabled: true
};
export var fakeEcmUser: EcmUserModel = {
id: 'fake-id',
firstName: 'fake-first-name',
lastName: 'fake-last-name',
description: 'i am a fake user for test',
avatarId: 'fake-avatar-id',
email: 'fakeEcm@ecmUser.com',
skypeId: 'fake-skype-id',
googleId: 'fake-googleId-id',
instantMessageId: 'fake-instantMessageId-id',
company: fakeEcmCompany,
jobTitle: 'test job',
location: 'fake location',
mobile: '000000000',
telephone: '11111111',
statusUpdatedAt: 'fake-date',
userStatus: 'active',
enabled: true,
emailNotificationsEnabled: true
};
export class FakeEcmUserService {
lastPromise: Observable<EcmUserModel>;
public userNeeded = 0;
usersList = [fakeEcmUser, fakeEcmUserNoImage];
getUserInfo(userName: string) {
return this.lastPromise = Observable.of(this.usersList[this.userNeeded]);
};
getCurrentUserInfo() {
return this.getUserInfo('fake-id');
};
getCurrentUserProfileImageUrl(avatarId: string) {
if ( avatarId ) {
return 'fake/url/image/for/ecm/user';
}
};
respondWithTheUserWithoutImage() {
this.userNeeded = 1;
};
respondWithTheUserWithImage() {
this.userNeeded = 0;
};
}

View File

@ -0,0 +1,26 @@
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"removeComments": true,
"declaration": true,
"noLib": false,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"noImplicitAny": false,
"noImplicitReturns": false,
"noImplicitUseStrict": false,
"noFallthroughCasesInSwitch": true,
"outDir": "dist",
"types": ["core-js", "jasmine"]
},
"exclude": [
"demo",
"node_modules",
"dist"
]
}

View File

@ -0,0 +1,121 @@
{
"rules": {
"align": [
true,
"parameters",
"statements"
],
"ban": false,
"class-name": true,
"comment-format": [
true,
"check-space"
],
"curly": true,
"eofline": true,
"forin": true,
"indent": [
true,
"spaces"
],
"interface-name": false,
"jsdoc-format": true,
"label-position": true,
"label-undefined": true,
"max-line-length": [
true,
180
],
"member-ordering": [
true,
"static-before-instance",
"variables-before-functions"
],
"no-any": false,
"no-arg": true,
"no-bitwise": false,
"no-conditional-assignment": true,
"no-consecutive-blank-lines": false,
"no-console": [
true,
"debug",
"info",
"time",
"timeEnd",
"trace"
],
"no-construct": true,
"no-constructor-vars": false,
"no-debugger": true,
"no-duplicate-key": true,
"no-duplicate-variable": true,
"no-empty": false,
"no-eval": true,
"no-inferrable-types": false,
"no-internal-module": true,
"no-require-imports": true,
"no-shadowed-variable": true,
"no-switch-case-fall-through": true,
"no-trailing-whitespace": true,
"no-unreachable": true,
"no-unused-expression": true,
"no-unused-variable": true,
"no-use-before-declare": true,
"no-var-keyword": true,
"no-var-requires": true,
"object-literal-sort-keys": false,
"one-line": [
true,
"check-open-brace",
"check-catch",
"check-else",
"check-whitespace"
],
"quotemark": [
true,
"single",
"avoid-escape"
],
"radix": true,
"semicolon": true,
"switch-default": true,
"trailing-comma": [
true,
{
"multiline": "never",
"singleline": "never"
}
],
"triple-equals": [
true,
"allow-null-check"
],
"typedef": false,
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"use-strict": false,
"variable-name": [
true,
"check-format",
"allow-leading-underscore",
"ban-keywords"
],
"whitespace": [
true,
"check-branch",
"check-operator",
"check-separator",
"check-type",
"check-module",
"check-decl"
]
}
}

View File

@ -34,3 +34,6 @@
(cd ng2-alfresco-tag; npm update;) (cd ng2-alfresco-tag; npm update;)
(cd ng2-alfresco-tag/demo; npm update;) (cd ng2-alfresco-tag/demo; npm update;)
(cd ng2-alfresco-userinfo; npm update;)
(cd ng2-alfresco-userinfo/demo; npm update;)

View File

@ -22,6 +22,7 @@ for PACKAGE in \
ng2-alfresco-search \ ng2-alfresco-search \
ng2-alfresco-tag \ ng2-alfresco-tag \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-userinfo \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript ng2-alfresco-webscript
do do

View File

@ -19,7 +19,8 @@ for PACKAGE in \
ng2-alfresco-tag \ ng2-alfresco-tag \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript ng2-alfresco-webscript \
ng2-alfresco-userinfo
do do
echo "====== Check component: ${PACKAGE} =====" echo "====== Check component: ${PACKAGE} ====="
cd "$DIR/../ng2-components/${PACKAGE}" cd "$DIR/../ng2-components/${PACKAGE}"

View File

@ -15,7 +15,8 @@ for PACKAGE in \
ng2-alfresco-tag \ ng2-alfresco-tag \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript ng2-alfresco-webscript \
ng2-alfresco-userinfo
do do
echo "====== clean component: ${PACKAGE} =====" echo "====== clean component: ${PACKAGE} ====="
cd "$DIR/../ng2-components/${PACKAGE}" cd "$DIR/../ng2-components/${PACKAGE}"

View File

@ -75,7 +75,8 @@ for PACKAGE in \
ng2-alfresco-login \ ng2-alfresco-login \
ng2-alfresco-search \ ng2-alfresco-search \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-activiti-analytics ng2-activiti-analytics \
ng2-alfresco-userinfo
do do
DESTDIR="$DIR/../ng2-components/${PACKAGE}" DESTDIR="$DIR/../ng2-components/${PACKAGE}"
echo "====== linking component: ${PACKAGE} =====" echo "====== linking component: ${PACKAGE} ====="
@ -102,6 +103,7 @@ for PACKAGE in \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript \ ng2-alfresco-webscript \
ng2-alfresco-userinfo
do do
DESTDIR="$DIR/../ng2-components/${PACKAGE}" DESTDIR="$DIR/../ng2-components/${PACKAGE}"
echo "====== demo shell linking: ${PACKAGE} =====" echo "====== demo shell linking: ${PACKAGE} ====="

View File

@ -17,7 +17,8 @@ for PACKAGE in \
ng2-alfresco-tag \ ng2-alfresco-tag \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript ng2-alfresco-webscript \
ng2-alfresco-userinfo
do do
DESTDIR="$DIR/../ng2-components/${PACKAGE}" DESTDIR="$DIR/../ng2-components/${PACKAGE}"
echo "====== PUBLISHING: ${DESTDIR} =====" echo "====== PUBLISHING: ${DESTDIR} ====="

View File

@ -27,7 +27,8 @@ for PACKAGE in \
ng2-alfresco-tag \ ng2-alfresco-tag \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript ng2-alfresco-webscript \
ng2-alfresco-userinfo
do do
DESTDIR="$DIR/../ng2-components/${PACKAGE}" DESTDIR="$DIR/../ng2-components/${PACKAGE}"
echo "====== UPDATE VERSION of ${PACKAGE} to ${VERSION} version in all the package.json ======" echo "====== UPDATE VERSION of ${PACKAGE} to ${VERSION} version in all the package.json ======"
@ -47,7 +48,8 @@ for PACKAGE in \
ng2-alfresco-tag \ ng2-alfresco-tag \
ng2-alfresco-upload \ ng2-alfresco-upload \
ng2-alfresco-viewer \ ng2-alfresco-viewer \
ng2-alfresco-webscript ng2-alfresco-webscript \
ng2-alfresco-userinfo
do do
DESTDIR="$DIR/../ng2-components/${PACKAGE}" DESTDIR="$DIR/../ng2-components/${PACKAGE}"
echo "====== UPDATE VERSION OF ${PACKAGE} to ${VERSION} version ======" echo "====== UPDATE VERSION OF ${PACKAGE} to ${VERSION} version ======"