From e25b05d9914d4752960ec12ce04fc6f91bae8ad6 Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Mon, 24 Apr 2017 14:39:10 +0100 Subject: [PATCH] rating component #521 (#1810) * rating component #521 * use adf prefix --- .travis.yml | 1 + appveyor.yml | 1 + demo-shell-ng2/app/app.component.html | 1 + demo-shell-ng2/app/app.module.ts | 4 + demo-shell-ng2/app/app.routes.ts | 6 + demo-shell-ng2/app/components/index.ts | 1 + .../app/components/social/social.component.ts | 39 +++ demo-shell-ng2/app/vendor.ts | 1 + demo-shell-ng2/package.json | 1 + .../ng2-alfresco-social/.editorconfig | 23 ++ ng2-components/ng2-alfresco-social/.gitignore | 19 ++ ng2-components/ng2-alfresco-social/.npmignore | 16 + ng2-components/ng2-alfresco-social/LICENSE | 13 + ng2-components/ng2-alfresco-social/README.md | 291 +++++++++++++++++ .../assets/license_header.txt | 16 + .../ng2-alfresco-social/demo/.editorconfig | 23 ++ .../ng2-alfresco-social/demo/.gitignore | 6 + .../ng2-alfresco-social/demo/README.md | 19 ++ .../ng2-alfresco-social/demo/index.html | 47 +++ .../ng2-alfresco-social/demo/package.json | 68 ++++ .../ng2-alfresco-social/demo/src/main.ts | 117 +++++++ .../demo/systemjs.config.js | 48 +++ .../ng2-alfresco-social/demo/tsconfig.json | 32 ++ .../ng2-alfresco-social/demo/tslint.json | 124 +++++++ .../ng2-alfresco-social/demo/wsrv-config.json | 5 + .../docs/assets/social1.png | Bin 0 -> 7278 bytes .../docs/assets/social2.png | Bin 0 -> 6774 bytes .../ng2-alfresco-social/gulpfile.ts | 307 ++++++++++++++++++ ng2-components/ng2-alfresco-social/index.ts | 61 ++++ .../ng2-alfresco-social/karma-test-shim.js | 115 +++++++ .../ng2-alfresco-social/karma.conf.js | 127 ++++++++ .../ng2-alfresco-social/package.json | 114 +++++++ .../src/components/like.component.css | 41 +++ .../src/components/like.component.html | 11 + .../src/components/like.component.spec.ts | 208 ++++++++++++ .../src/components/like.component.ts | 80 +++++ .../src/components/rating.component.css | 30 ++ .../src/components/rating.component.html | 10 + .../src/components/rating.component.spec.ts | 165 ++++++++++ .../src/components/rating.component.ts | 85 +++++ .../src/services/rating.service.spec.ts | 102 ++++++ .../src/services/rating.service.ts | 55 ++++ .../ng2-alfresco-social/tsconfig.json | 40 +++ .../ng2-alfresco-social/tslint.json | 121 +++++++ scripts/npm-build-all.sh | 1 + scripts/npm-clean.sh | 1 + scripts/npm-link-all-components-demo.sh | 1 + scripts/npm-link-demo-shell.sh | 2 + scripts/npm-publish.sh | 1 + scripts/update-version.sh | 88 ++--- 50 files changed, 2622 insertions(+), 66 deletions(-) create mode 100644 demo-shell-ng2/app/components/social/social.component.ts create mode 100644 ng2-components/ng2-alfresco-social/.editorconfig create mode 100644 ng2-components/ng2-alfresco-social/.gitignore create mode 100644 ng2-components/ng2-alfresco-social/.npmignore create mode 100644 ng2-components/ng2-alfresco-social/LICENSE create mode 100644 ng2-components/ng2-alfresco-social/README.md create mode 100644 ng2-components/ng2-alfresco-social/assets/license_header.txt create mode 100644 ng2-components/ng2-alfresco-social/demo/.editorconfig create mode 100644 ng2-components/ng2-alfresco-social/demo/.gitignore create mode 100644 ng2-components/ng2-alfresco-social/demo/README.md create mode 100644 ng2-components/ng2-alfresco-social/demo/index.html create mode 100644 ng2-components/ng2-alfresco-social/demo/package.json create mode 100644 ng2-components/ng2-alfresco-social/demo/src/main.ts create mode 100644 ng2-components/ng2-alfresco-social/demo/systemjs.config.js create mode 100644 ng2-components/ng2-alfresco-social/demo/tsconfig.json create mode 100644 ng2-components/ng2-alfresco-social/demo/tslint.json create mode 100644 ng2-components/ng2-alfresco-social/demo/wsrv-config.json create mode 100644 ng2-components/ng2-alfresco-social/docs/assets/social1.png create mode 100644 ng2-components/ng2-alfresco-social/docs/assets/social2.png create mode 100755 ng2-components/ng2-alfresco-social/gulpfile.ts create mode 100644 ng2-components/ng2-alfresco-social/index.ts create mode 100644 ng2-components/ng2-alfresco-social/karma-test-shim.js create mode 100644 ng2-components/ng2-alfresco-social/karma.conf.js create mode 100644 ng2-components/ng2-alfresco-social/package.json create mode 100644 ng2-components/ng2-alfresco-social/src/components/like.component.css create mode 100644 ng2-components/ng2-alfresco-social/src/components/like.component.html create mode 100644 ng2-components/ng2-alfresco-social/src/components/like.component.spec.ts create mode 100644 ng2-components/ng2-alfresco-social/src/components/like.component.ts create mode 100644 ng2-components/ng2-alfresco-social/src/components/rating.component.css create mode 100644 ng2-components/ng2-alfresco-social/src/components/rating.component.html create mode 100644 ng2-components/ng2-alfresco-social/src/components/rating.component.spec.ts create mode 100644 ng2-components/ng2-alfresco-social/src/components/rating.component.ts create mode 100644 ng2-components/ng2-alfresco-social/src/services/rating.service.spec.ts create mode 100644 ng2-components/ng2-alfresco-social/src/services/rating.service.ts create mode 100644 ng2-components/ng2-alfresco-social/tsconfig.json create mode 100644 ng2-components/ng2-alfresco-social/tslint.json diff --git a/.travis.yml b/.travis.yml index 3aca566204..d1a00422a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,7 @@ env: - MODULE=ng2-activiti-diagrams - MODULE=ng2-activiti-analytics - MODULE=ng2-alfresco-userinfo + - MODULE=ng2-alfresco-social before_script: - if ([ "$MODULE" != "ng2-alfresco-core" ]); then diff --git a/appveyor.yml b/appveyor.yml index 1ff6eb8387..2e00efed22 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,6 +24,7 @@ environment: - COMPONENT_NAME: ng2-activiti-diagrams - COMPONENT_NAME: ng2-activiti-analytics - COMPONENT_NAME: ng2-alfresco-userinfo + - COMPONENT_NAME: ng2-alfresco-social # Install scripts. (runs after repo cloning) install: diff --git a/demo-shell-ng2/app/app.component.html b/demo-shell-ng2/app/app.component.html index 131f0aeb30..d052ae1f88 100644 --- a/demo-shell-ng2/app/app.component.html +++ b/demo-shell-ng2/app/app.component.html @@ -58,6 +58,7 @@ Process Services Webscript Tag + Social About Settings diff --git a/demo-shell-ng2/app/app.module.ts b/demo-shell-ng2/app/app.module.ts index 0cc24ac864..e7d6029f49 100644 --- a/demo-shell-ng2/app/app.module.ts +++ b/demo-shell-ng2/app/app.module.ts @@ -25,6 +25,7 @@ import { DataTableModule } from 'ng2-alfresco-datatable'; import { DocumentListModule } from 'ng2-alfresco-documentlist'; import { UploadModule } from 'ng2-alfresco-upload'; import { TagModule } from 'ng2-alfresco-tag'; +import { SocialModule } from 'ng2-alfresco-social'; import { WebScriptModule } from 'ng2-alfresco-webscript'; import { ViewerModule } from 'ng2-alfresco-viewer'; import { ActivitiFormModule } from 'ng2-activiti-form'; @@ -50,6 +51,7 @@ import { FormViewer, WebscriptComponent, TagComponent, + SocialComponent, AboutComponent, FilesComponent, FormNodeViewer, @@ -68,6 +70,7 @@ import { DocumentListModule.forRoot(), UploadModule.forRoot(), TagModule.forRoot(), + SocialModule.forRoot(), WebScriptModule.forRoot(), ViewerModule.forRoot(), ActivitiFormModule.forRoot(), @@ -91,6 +94,7 @@ import { FormViewer, WebscriptComponent, TagComponent, + SocialComponent, AboutComponent, FilesComponent, FormNodeViewer, diff --git a/demo-shell-ng2/app/app.routes.ts b/demo-shell-ng2/app/app.routes.ts index 139c70467b..08ff178d0f 100644 --- a/demo-shell-ng2/app/app.routes.ts +++ b/demo-shell-ng2/app/app.routes.ts @@ -29,6 +29,7 @@ import { ActivitiAppsView, WebscriptComponent, TagComponent, + SocialComponent, AboutComponent, FormViewer, FormNodeViewer, @@ -117,6 +118,11 @@ export const appRoutes: Routes = [ component: TagComponent, canActivate: [AuthGuardEcm] }, + { + path: 'social', + component: SocialComponent, + canActivate: [AuthGuardEcm] + }, { path: 'about', component: AboutComponent }, { path: 'settings', component: SettingComponent } ]; diff --git a/demo-shell-ng2/app/components/index.ts b/demo-shell-ng2/app/components/index.ts index fb66f819f6..95e9466cd1 100644 --- a/demo-shell-ng2/app/components/index.ts +++ b/demo-shell-ng2/app/components/index.ts @@ -24,6 +24,7 @@ export { ActivitiDemoComponent } from './activiti/activiti-demo.component'; export { FormViewer } from './activiti/form-viewer.component'; export { WebscriptComponent } from './webscript/webscript.component'; export { TagComponent } from './tag/tag.component'; +export { SocialComponent } from './social/social.component'; export { AboutComponent } from './about/about.component'; export { FilesComponent } from './files/files.component'; export { FormNodeViewer } from './activiti/form-node-viewer.component'; diff --git a/demo-shell-ng2/app/components/social/social.component.ts b/demo-shell-ng2/app/components/social/social.component.ts new file mode 100644 index 0000000000..af40a06f6c --- /dev/null +++ b/demo-shell-ng2/app/components/social/social.component.ts @@ -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 { Component } from '@angular/core'; + +@Component({ + selector: 'alfresco-social-demo', + template: ` +
+
+
+
+ Like component +
+
+ Rating component + +
+
+ ` +}) +export class SocialComponent { + + nodeId: string = '74cd8a96-8a21-47e5-9b3b-a1b3e296787d'; +} diff --git a/demo-shell-ng2/app/vendor.ts b/demo-shell-ng2/app/vendor.ts index 55f232dee5..91d7764380 100644 --- a/demo-shell-ng2/app/vendor.ts +++ b/demo-shell-ng2/app/vendor.ts @@ -25,6 +25,7 @@ import 'ng2-alfresco-documentlist'; import 'ng2-alfresco-login'; import 'ng2-alfresco-search'; import 'ng2-alfresco-tag'; +import 'ng2-alfresco-social'; import 'ng2-alfresco-upload'; import 'ng2-alfresco-viewer'; import 'ng2-alfresco-webscript'; diff --git a/demo-shell-ng2/package.json b/demo-shell-ng2/package.json index a8655859dc..3bed7b0f9f 100644 --- a/demo-shell-ng2/package.json +++ b/demo-shell-ng2/package.json @@ -85,6 +85,7 @@ "ng2-alfresco-login": "1.3.0", "ng2-alfresco-search": "1.3.0", "ng2-alfresco-tag": "1.3.0", + "ng2-alfresco-social": "1.3.0", "ng2-alfresco-upload": "1.3.0", "ng2-alfresco-userinfo": "1.3.0", "ng2-alfresco-viewer": "1.3.0", diff --git a/ng2-components/ng2-alfresco-social/.editorconfig b/ng2-components/ng2-alfresco-social/.editorconfig new file mode 100644 index 0000000000..75a2477db7 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/.editorconfig @@ -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 diff --git a/ng2-components/ng2-alfresco-social/.gitignore b/ng2-components/ng2-alfresco-social/.gitignore new file mode 100644 index 0000000000..fb23a7fef5 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/.gitignore @@ -0,0 +1,19 @@ +npm-debug.log +node_modules +.idea +typings +coverage +dist +src/**/*.js +src/**/*.js.map +src/**/*.d.ts +demo/**/*.js +demo/**/*.js.map +demo/**/*.d.ts +index.js +index.js.map +!systemjs.config.js +*.tgz +/package/ +/bundles/ +index.d.ts diff --git a/ng2-components/ng2-alfresco-social/.npmignore b/ng2-components/ng2-alfresco-social/.npmignore new file mode 100644 index 0000000000..8bb008aff4 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/.npmignore @@ -0,0 +1,16 @@ +npm-debug.log +.idea + +coverage/ +demo/ +node_modules +typings/ +fonts/ + +/.editorconfig +/.travis.yml +/*.json +/karma-test-shim.js +/karma.conf.js +/gulpfile.ts +/.npmignore diff --git a/ng2-components/ng2-alfresco-social/LICENSE b/ng2-components/ng2-alfresco-social/LICENSE new file mode 100644 index 0000000000..de3d8c60b8 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/LICENSE @@ -0,0 +1,13 @@ +Copyright 2016 Alfresco + +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. diff --git a/ng2-components/ng2-alfresco-social/README.md b/ng2-components/ng2-alfresco-social/README.md new file mode 100644 index 0000000000..4ded788814 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/README.md @@ -0,0 +1,291 @@ +# Alfresco Social Component for Angular 2 + +

+ + travis
+    Status + + + travis
+    Status + + + Coverage Status + + + npm downloads + + + license + + + alfresco component + + + angular 2 + + + typescript + + + node version + +

+ + +## Prerequisites + +Before you start using this development framework, make sure you have installed all required software and done all the +necessary configuration [prerequisites](https://github.com/Alfresco/alfresco-ng2-components/blob/master/PREREQUISITES.md). + +## Install + +Follow the 3 steps below: + +1. Npm + + ```sh + npm install ng2-alfresco-social --save + ``` + +2. Html + + Include these dependencies in your index.html page: + + ```html + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ``` + +3. SystemJs + + Add the following components to your systemjs.config.js file: + + - ng2-translate + - alfresco-js-api + - ng2-alfresco-core + - ng2-alfresco-social + + Please refer to the following example file: [systemjs.config.js](demo/systemjs.config.js) . + + +#### Basic usage + +In this component are present two different components : + +* adf-like +* adf-rating + + + +## adf-like + +```html + +``` + +```ts +import { NgModule, Component } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { CoreModule, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core'; +import { SocialModule } from 'ng2-alfresco-social'; + +@Component({ + selector: 'alfresco-app-demo', + template: ` + ` +}) +class LikeDemo { + + constructor(private authService: AlfrescoAuthenticationService, private settingsService: AlfrescoSettingsService) { + settingsService.ecmHost = 'http://localhost:8080'; + + this.authService.login('admin', 'admin').subscribe( + ticket => { + console.log(ticket); + }, + error => { + console.log(error); + }); + } +} + +@NgModule({ + imports: [ + BrowserModule, + CoreModule.forRoot(), + SocialModule + ], + declarations: [ LikeDemo ], + bootstrap: [ LikeDemo ] +}) +export class AppModule { } + +platformBrowserDynamic().bootstrapModule(AppModule); +``` + +### Options + +Attribute | Options | Default | Description | Mandatory +--- | --- | --- | --- | --- +`nodeId` | *string* | | The identifier of a node.| + +#### Events + +| Name | Description | +| --- | --- | +| `changeVote` | The event is emitted when vote change | + + +![Custom columns](docs/assets/social1.png) + +## adf-rating + +```html + +``` + +```ts +import { NgModule, Component } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { CoreModule, AlfrescoSettingsService, AlfrescoAuthenticationService } from 'ng2-alfresco-core'; +import { SocialModule } from 'ng2-alfresco-social'; + +@Component({ + selector: 'alfresco-app-demo', + template: ` + + + + Alfresco Angular 2 Social - Demo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ng2-components/ng2-alfresco-social/demo/package.json b/ng2-components/ng2-alfresco-social/demo/package.json new file mode 100644 index 0000000000..062a9cd6ba --- /dev/null +++ b/ng2-components/ng2-alfresco-social/demo/package.json @@ -0,0 +1,68 @@ +{ + "name": "ng2-alfresco-social-demo", + "description": "Alfresco Angular2 Rating - Demo", + "version": "0.3.0", + "author": "Alfresco Software, Ltd.", + "main": "index.js", + "scripts": { + "clean": "npm install rimraf && npm run clean-build && rimraf dist node_modules typings dist", + "clean-build" : "rimraf 'src/{,**/}**.js' 'src/{,**/}**.js.map' 'src/{,**/}**.d.ts'", + "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 && npm run clean-build && npm run tsc", + "build:w": "npm run tslint && rimraf dist && npm run tsc:w", + "travis": "npm link ng2-alfresco-core", + "tsc": "tsc", + "tsc:w": "tsc -w", + "tslint": "tslint -c tslint.json *.ts && tslint -c tslint.json src/{,**/}**.ts -e '{,**/}**.d.ts'" + }, + "license": "Apache-2.0", + "dependencies": { + "@angular/common": "2.2.2", + "@angular/compiler": "2.2.2", + "@angular/compiler-cli": "2.2.2", + "@angular/core": "2.2.2", + "@angular/forms": "2.2.2", + "@angular/http": "2.2.2", + "@angular/platform-browser": "2.2.2", + "@angular/platform-browser-dynamic": "2.2.2", + "@angular/material": "2.0.0-beta.1", + "@angular/router": "3.2.2", + "@angular/upgrade": "2.2.2", + "core-js": "2.4.1", + "reflect-metadata": "0.1.10", + "rxjs": "5.0.0-beta.12", + "systemjs": "0.19.27", + "zone.js": "0.6.26", + "intl": "1.2.4", + "dialog-polyfill": "0.4.7", + "element.scrollintoviewifneeded-polyfill": "1.0.1", + "material-design-icons": "2.2.3", + "material-design-lite": "1.2.1", + "ng2-translate": "4.0.0", + "alfresco-js-api": "~1.3.0", + "ng2-alfresco-core": "1.3.0", + "ng2-alfresco-social": "1.3.0" + }, + "devDependencies": { + "@types/jasmine": "^2.2.33", + "@types/node": "^6.0.42", + "concurrently": "^2.2.0", + "rimraf": "2.5.2", + "tslint": "3.15.1", + "typescript": "^2.0.3", + "wsrv": "^0.1.5" + }, + "contributors": [ + { + "name": "Eugenio Romano", + "email": "eugenio.romano@alfresco.com" + } + ], + "keywords": [ + "angular2", + "typescript", + "alfresco" + ] +} diff --git a/ng2-components/ng2-alfresco-social/demo/src/main.ts b/ng2-components/ng2-alfresco-social/demo/src/main.ts new file mode 100644 index 0000000000..2929533fb1 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/demo/src/main.ts @@ -0,0 +1,117 @@ +/*! + * @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, Input, OnInit } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { CoreModule, AlfrescoSettingsService, AlfrescoAuthenticationService, StorageService, LogService } from 'ng2-alfresco-core'; +import { SocialModule } from 'ng2-alfresco-social'; + +@Component({ + selector: 'alfresco-app-demo', + template: ` +
+
+
+

+
+ Authentication failed to ip {{ ecmHost }} with user: admin, admin, you can still try to add a valid ticket to perform + operations. +
+
+
+
+
+
+
+ Like component +
+
+ Rating component + +
+
+
+ ` +}) +class SocialDemo implements OnInit { + + @Input() + nodeId: string = '74cd8a96-8a21-47e5-9b3b-a1b3e296787d'; + + authenticated: boolean; + ecmHost: string = 'http://127.0.0.1:8080'; + ticket: string; + + constructor(private authService: AlfrescoAuthenticationService, + private settingsService: AlfrescoSettingsService, + private storage: StorageService, + private logService: LogService) { + + settingsService.ecmHost = this.ecmHost; + settingsService.setProviders('ECM'); + + if (this.authService.getTicketEcm()) { + this.ticket = this.authService.getTicketEcm(); + } + } + + ngOnInit() { + this.login(); + } + + login() { + this.authService.login('admin', 'admin').subscribe( + ticket => { + this.logService.info(ticket); + this.ticket = this.authService.getTicketEcm(); + this.authenticated = true; + }, + error => { + this.logService.error(error); + this.authenticated = false; + }); + } + + public updateTicket(): void { + this.storage.setItem('ticket-ECM', this.ticket); + } + + public updateHost(): void { + this.settingsService.ecmHost = this.ecmHost; + this.login(); + } + + logData(data) { + this.logService.info(data); + } +} + +@NgModule({ + imports: [ + BrowserModule, + CoreModule.forRoot(), + SocialModule + ], + declarations: [SocialDemo], + bootstrap: [SocialDemo] +}) +export class AppModule { +} + +platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/ng2-components/ng2-alfresco-social/demo/systemjs.config.js b/ng2-components/ng2-alfresco-social/demo/systemjs.config.js new file mode 100644 index 0000000000..b449fbd000 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/demo/systemjs.config.js @@ -0,0 +1,48 @@ +/** + * 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: 'src', + // 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', + '@angular/material': 'npm:@angular/material/bundles/material.umd.js', + + // other libraries + 'rxjs': 'npm:rxjs', + 'ng2-translate': 'npm:ng2-translate', + 'alfresco-js-api': 'npm:alfresco-js-api/dist', + 'ng2-alfresco-core': 'npm:ng2-alfresco-core', + 'ng2-alfresco-social': 'npm:ng2-alfresco-social' + }, + // 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' }, + 'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'}, + 'ng2-alfresco-core': { main: './index.js', defaultExtension: 'js'}, + 'ng2-alfresco-social': { main: './index.js', defaultExtension: 'js'} + } + }); +})(this); diff --git a/ng2-components/ng2-alfresco-social/demo/tsconfig.json b/ng2-components/ng2-alfresco-social/demo/tsconfig.json new file mode 100644 index 0000000000..524fcfda8e --- /dev/null +++ b/ng2-components/ng2-alfresco-social/demo/tsconfig.json @@ -0,0 +1,32 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "noLib": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitUseStrict": false, + "noFallthroughCasesInSwitch": true, + "removeComments": true, + "declaration": true, + "lib": [ + "es2015", + "dom" + ], + "suppressImplicitAnyIndexErrors": true + }, + "exclude": [ + "node_modules" + ], + "angularCompilerOptions": { + "strictMetadataEmit": false, + "skipTemplateCodegen": true + } +} diff --git a/ng2-components/ng2-alfresco-social/demo/tslint.json b/ng2-components/ng2-alfresco-social/demo/tslint.json new file mode 100644 index 0000000000..8c9703b9de --- /dev/null +++ b/ng2-components/ng2-alfresco-social/demo/tslint.json @@ -0,0 +1,124 @@ +{ + "rules": { + "align": [ + true, + "parameters", + "arguments", + "statements" + ], + "ban": false, + "class-name": true, + "comment-format": [ + true, + "check-space", + "check-lowercase" + ], + "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, + "public-before-private", + "static-before-instance", + "variables-before-functions" + ], + "no-any": false, + "no-arg": true, + "no-bitwise": true, + "no-conditional-assignment": true, + "no-consecutive-blank-lines": true, + "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": true, + "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" + ] + } +} diff --git a/ng2-components/ng2-alfresco-social/demo/wsrv-config.json b/ng2-components/ng2-alfresco-social/demo/wsrv-config.json new file mode 100644 index 0000000000..1ad5de60f0 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/demo/wsrv-config.json @@ -0,0 +1,5 @@ +{ + "watch": [ + "node_modules/ng2-alfresco-social/dist/**/*.{html,htm,css,js}" + ] +} diff --git a/ng2-components/ng2-alfresco-social/docs/assets/social1.png b/ng2-components/ng2-alfresco-social/docs/assets/social1.png new file mode 100644 index 0000000000000000000000000000000000000000..55984b8db0a9aacd590a6ed890555e002631360b GIT binary patch literal 7278 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 literal 0 HcmV?d00001 diff --git a/ng2-components/ng2-alfresco-social/gulpfile.ts b/ng2-components/ng2-alfresco-social/gulpfile.ts new file mode 100755 index 0000000000..7f7285181b --- /dev/null +++ b/ng2-components/ng2-alfresco-social/gulpfile.ts @@ -0,0 +1,307 @@ +import * as gulp from 'gulp'; +import * as util from 'gulp-util'; +import * as runSequence from 'run-sequence'; +import * as gulpLoadPlugins from 'gulp-load-plugins'; +import * as merge from 'merge-stream'; +import * as rimraf from 'rimraf'; +import { join } from 'path'; +import * as Builder from 'systemjs-builder'; +var autoprefixer = require('autoprefixer'); +import * as cssnano from 'cssnano'; +import * as filter from 'gulp-filter'; +import * as sourcemaps from 'gulp-sourcemaps'; + +var APP_SRC = `.`; +var CSS_PROD_BUNDLE = 'main.css'; +var JS_PROD_SHIMS_BUNDLE = 'shims.js'; +var NG_FACTORY_FILE = 'main-prod'; + +const BUILD_TYPES = { + DEVELOPMENT: 'dev', + PRODUCTION: 'prod' +}; + +function normalizeDependencies(deps) { + deps + .filter((d) => !/\*/.test(d.src)) // Skip globs + .forEach((d) => d.src = require.resolve(d.src)); + return deps; +} + +function filterDependency(type: string, d): boolean { + const t = d.buildType || d.env; + d.buildType = t; + if (!t) { + d.buildType = Object.keys(BUILD_TYPES).map(k => BUILD_TYPES[k]); + } + if (!(d.buildType instanceof Array)) { + (d).env = [d.buildType]; + } + return d.buildType.indexOf(type) >= 0; +} + +function getInjectableDependency() { + var APP_ASSETS = [ + {src: `src/css/main.css`, inject: true, vendor: false}, + ]; + + var NPM_DEPENDENCIES = [ + {src: 'zone.js/dist/zone.js', inject: 'libs'}, + {src: 'core-js/client/shim.min.js', inject: 'shims'}, + {src: 'systemjs/dist/system.src.js', inject: 'shims', buildType:'dev'} + ]; + + return normalizeDependencies(NPM_DEPENDENCIES.filter(filterDependency.bind(null, 'dev'))) + .concat(APP_ASSETS.filter(filterDependency.bind(null, 'dev'))); +} + +const plugins = gulpLoadPlugins(); + +let tsProjects: any = {}; + +function makeTsProject(options: Object = {}) { + let optionsHash = JSON.stringify(options); + if (!tsProjects[optionsHash]) { + let config = Object.assign({ + typescript: require('typescript') + }, options); + tsProjects[optionsHash] = + plugins.typescript.createProject('tsconfig.json', config); + } + return tsProjects[optionsHash]; +} + +gulp.task('build.html_css', () => { + const gulpConcatCssConfig = { + targetFile: CSS_PROD_BUNDLE, + options: { + rebaseUrls: false + } + }; + + const processors = [ + autoprefixer({ + browsers: [ + 'ie >= 10', + 'ie_mob >= 10', + 'ff >= 30', + 'chrome >= 34', + 'safari >= 7', + 'opera >= 23', + 'ios >= 7', + 'android >= 4.4', + 'bb >= 10' + ] + }) + ]; + + const reportPostCssError = (e: any) => util.log(util.colors.red(e.message)); + + processors.push( + cssnano({ + discardComments: {removeAll: true}, + discardUnused: false, // unsafe, see http://goo.gl/RtrzwF + zindex: false, // unsafe, see http://goo.gl/vZ4gbQ + reduceIdents: false // unsafe, see http://goo.gl/tNOPv0 + }) + ); + + /** + * Processes the CSS files within `src/client` excluding those in `src/client/assets` using `postcss` with the + * configured processors + * Execute the appropriate component-stylesheet processing method based on user stylesheet preference. + */ + function processComponentStylesheets() { + return gulp.src(join('src/**', '*.css')) + .pipe(plugins.cached('process-component-css')) + .pipe(plugins.postcss(processors)) + .on('error', reportPostCssError); + } + + + /** + * Get a stream of external css files for subsequent processing. + */ + function getExternalCssStream() { + return gulp.src(getExternalCss()) + .pipe(plugins.cached('process-external-css')); + } + + /** + * Get an array of filenames referring to all external css stylesheets. + */ + function getExternalCss() { + return getInjectableDependency().filter(dep => /\.css$/.test(dep.src)).map(dep => dep.src); + } + + /** + * Processes the external CSS files using `postcss` with the configured processors. + */ + function processExternalCss() { + return getExternalCssStream() + .pipe(plugins.postcss(processors)) + .pipe(plugins.concatCss(gulpConcatCssConfig.targetFile, gulpConcatCssConfig.options)) + .on('error', reportPostCssError); + } + + return merge(processComponentStylesheets(), processExternalCss()); + +}); + +gulp.task('build.bundles.app', (done) => { + var BUNDLER_OPTIONS = { + format: 'umd', + minify: false, + mangle: false, + sourceMaps: true + }; + var CONFIG_TYPESCRIPT = { + baseURL: '.', + transpiler: 'typescript', + typescriptOptions: { + module: 'cjs' + }, + map: { + typescript: 'node_modules/typescript/lib/typescript.js', + '@angular': 'node_modules/@angular', + rxjs: 'node_modules/rxjs', + 'ng2-translate': 'node_modules/ng2-translate', + 'alfresco-js-api': 'node_modules/alfresco-js-api/dist/alfresco-js-api', + 'ng2-alfresco-core': 'node_modules/ng2-alfresco-core/', + 'ng2-activiti-diagrams': 'node_modules/ng2-activiti-diagrams/', + 'ng2-activiti-analytics': 'node_modules/ng2-activiti-analytics/', + 'ng2-alfresco-datatable': 'node_modules/ng2-alfresco-datatable/', + 'ng2-alfresco-documentlist': 'node_modules/ng2-alfresco-documentlist/', + 'ng2-activiti-form': 'node_modules/ng2-activiti-form/', + 'ng2-alfresco-login': 'node_modules/ng2-alfresco-login/', + 'ng2-activiti-processlist': 'node_modules/ng2-activiti-processlist/', + 'ng2-alfresco-search': 'node_modules/ng2-alfresco-search/', + 'ng2-activiti-tasklist': 'node_modules/ng2-activiti-tasklist/', + 'ng2-alfresco-social': 'node_modules/ng2-alfresco-social/', + 'ng2-alfresco-upload': 'node_modules/ng2-alfresco-upload/', + 'ng2-alfresco-userinfo': 'node_modules/ng2-alfresco-userinfo/', + 'ng2-alfresco-viewer': 'node_modules/ng2-alfresco-viewer/', + 'ng2-alfresco-webscript': 'node_modules/ng2-alfresco-webscript/' + }, + paths: { + '*': '*.js' + }, + meta: { + 'node_modules/@angular/*': {build: false}, + 'node_modules/rxjs/*': {build: false}, + 'node_modules/ng2-translate/*': {build: false}, + 'node_modules/ng2-alfresco-core/*': {build: false}, + 'node_modules/ng2-activiti-diagrams/*': {build: false}, + 'node_modules/ng2-activiti-analytics/*': {build: false}, + 'node_modules/ng2-alfresco-datatable/*': {build: false}, + 'node_modules/ng2-alfresco-documentlist/*': {build: false}, + 'node_modules/ng2-activiti-form/*': {build: false}, + 'node_modules/ng2-alfresco-login/*': {build: false}, + 'node_modules/ng2-activiti-processlist/*': {build: false}, + 'node_modules/ng2-alfresco-search/*': {build: false}, + 'node_modules/ng2-activiti-tasklist/*': {build: false}, + 'node_modules/ng2-alfresco-social/*': {build: false}, + 'node_modules/ng2-alfresco-upload/*': {build: false}, + 'node_modules/ng2-alfresco-userinfo/*': {build: false}, + 'node_modules/ng2-alfresco-viewer/*': {build: false}, + 'node_modules/ng2-alfresco-webscript/*': {build: false} + } + }; + + var pkg = require('./package.json'); + var namePkg = pkg.name; + + var builder = new Builder(CONFIG_TYPESCRIPT); + builder + .buildStatic(APP_SRC + "/index", 'bundles/' + namePkg + '.js', BUNDLER_OPTIONS) + .then(function () { + return done(); + }) + .catch(function (err) { + return done(err); + }); +}); + +gulp.task('build.assets.prod', () => { + return gulp.src([ + join('src/**', '*.ts'), + 'index.ts', + join('src/**', '*.css'), + join('src/**', '*.html'), + '!'+join('*/**', '*.d.ts'), + '!'+join('*/**', '*.spec.ts'), + '!gulpfile.ts']) + +}); + +gulp.task('build.bundles', () => { + merge(bundleShims()); + + /** + * Returns the shim files to be injected. + */ + function getShims() { + let libs = getInjectableDependency() + .filter(d => /\.js$/.test(d.src)); + + return libs.filter(l => l.inject === 'shims') + .concat(libs.filter(l => l.inject === 'libs')) + .concat(libs.filter(l => l.inject === true)) + .map(l => l.src); + } + + /** + * Bundles the shim files. + */ + function bundleShims() { + return gulp.src(getShims()) + .pipe(plugins.concat(JS_PROD_SHIMS_BUNDLE)) + // Strip the first (global) 'use strict' added by reflect-metadata, but don't strip any others to avoid unintended scope leaks. + .pipe(plugins.replace(/('|")use strict\1;var Reflect;/, 'var Reflect;')) + .pipe(gulp.dest('bundles')); + } + +}); + +gulp.task('build.js.prod', () => { + const INLINE_OPTIONS = { + base: APP_SRC, + target: 'es5', + useRelativePaths: true, + removeLineBreaks: true + }; + + let tsProject = makeTsProject(); + let src = [ + join('src/**/*.ts'), + join('!src/**/*.d.ts'), + join('!src/**/*.spec.ts'), + `!src/**/${NG_FACTORY_FILE}.ts` + ]; + + let result = gulp.src(src) + .pipe(plugins.plumber()) + .pipe(plugins.inlineNg2Template(INLINE_OPTIONS)) + .pipe(sourcemaps.init()) + .pipe(tsProject()) + .once('error', function (e: any) { + this.once('finish', () => process.exit(1)); + }); + + return result.js + .pipe(plugins.template()) + .pipe(sourcemaps.write()) + .pipe(gulp.dest('src')) + .on('error', (e: any) => { + console.log(e); + }); +}); + +gulp.task('build.prod', (done: any) => + runSequence( + 'build.assets.prod', + 'build.html_css', + 'build.js.prod', + 'build.bundles', + 'build.bundles.app', + done)); diff --git a/ng2-components/ng2-alfresco-social/index.ts b/ng2-components/ng2-alfresco-social/index.ts new file mode 100644 index 0000000000..3716ab32fa --- /dev/null +++ b/ng2-components/ng2-alfresco-social/index.ts @@ -0,0 +1,61 @@ +/*! + * @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 { RatingComponent } from './src/components/rating.component'; +import { LikeComponent } from './src/components/like.component'; +import { RatingService } from './src/services/rating.service'; + +export * from './src/components/rating.component'; +export * from './src/components/like.component'; +export * from './src/services/rating.service'; + +export const RATING_DIRECTIVES: any[] = [ + RatingComponent, + LikeComponent +]; + +export const RATING_PROVIDERS: any[] = [ + RatingService +]; + +@NgModule({ + imports: [ + CoreModule + ], + declarations: [ + ...RATING_DIRECTIVES + ], + providers: [ + ...RATING_PROVIDERS + ], + exports: [ + ...RATING_DIRECTIVES + ] +}) +export class SocialModule { + static forRoot(): ModuleWithProviders { + return { + ngModule: SocialModule, + providers: [ + ...RATING_DIRECTIVES + ] + }; + } +} diff --git a/ng2-components/ng2-alfresco-social/karma-test-shim.js b/ng2-components/ng2-alfresco-social/karma-test-shim.js new file mode 100644 index 0000000000..8696dd2b16 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/karma-test-shim.js @@ -0,0 +1,115 @@ +// Tun on full stack traces in errors to help debugging +Error.stackTraceLimit = Infinity; + +jasmine.DEFAULT_TIMEOUT_INTERVAL = 100000; + +window.componentHandler = { + upgradeAllRegistered: function () { + }, + upgradeElement: function () { + } +}; + +__karma__.loaded = function() {}; + +var builtPath = '/base/src/'; + +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/src', + // 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', + '@angular/material': 'npm:@angular/material/bundles/material.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', + 'hammerjs': 'npm:hammerjs', + + 'alfresco-js-api': 'npm:alfresco-js-api/dist', + 'ng2-alfresco-core': 'npm:ng2-alfresco-core' +}; + +var packages = { + 'app': { main: 'main.js', defaultExtension: 'js' }, + 'rxjs': { defaultExtension: 'js' }, + 'ng2-translate': { defaultExtension: 'js' }, + 'hammerjs': {main: './hammerjs.js', defaultExtension: 'js'}, + + 'alfresco-js-api': { main: './alfresco-js-api.js', defaultExtension: 'js'}, + 'ng2-alfresco-core': { 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); +} diff --git a/ng2-components/ng2-alfresco-social/karma.conf.js b/ng2-components/ng2-alfresco-social/karma.conf.js new file mode 100644 index 0000000000..b3920fc80c --- /dev/null +++ b/ng2-components/ng2-alfresco-social/karma.conf.js @@ -0,0 +1,127 @@ +'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', + 'node_modules/hammerjs/hammer.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}, + + 'karma-test-shim.js', + + // paths loaded via module imports + {pattern: 'src/**/*.js', included: false, watched: true}, + {pattern: 'src/**/*.html', included: true, served: true, watched: true}, + {pattern: 'src/**/*.css', included: true, served: true, watched: true}, + + // ng2-components + { pattern: 'node_modules/ng2-alfresco-core/src/**/*.js', included: false, served: true, watched: false }, + { pattern: 'node_modules/ng2-alfresco-core/index.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: 'src/**/*.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, + + captureTimeout: 180000, + browserDisconnectTimeout: 180000, + browserDisconnectTolerance: 3, + browserNoActivityTimeout: 300000, + + 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: { + 'src/**/!(*spec|index|*mock|*model|*event).js': 'coverage' + }, + + coverageReporter: { + includeAllSources: true, + 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) +}; diff --git a/ng2-components/ng2-alfresco-social/package.json b/ng2-components/ng2-alfresco-social/package.json new file mode 100644 index 0000000000..a360ad0f6d --- /dev/null +++ b/ng2-components/ng2-alfresco-social/package.json @@ -0,0 +1,114 @@ +{ + "name": "ng2-alfresco-social", + "description": "Alfresco rating component", + "version": "1.3.0", + "author": "Alfresco Software, Ltd.", + "scripts": { + "clean": "npm install rimraf && npm run clean-build && rimraf dist node_modules typings", + "clean-build": "rimraf index.js index.js.map index.d.ts 'src/{,**/}**.js' 'src/{,**/}**.js.map' 'src/{,**/}**.d.ts' bundles", + "build": "npm run clean-build && npm run tslint && tsc && license-check && npm run build.umd", + "build:w": "npm run clean-build && npm run tslint && npm run tsc:w && license-check && npm run build.umd", + "tslint": "tslint -c tslint.json 'src/{,**/}**.ts' 'index.ts' -e '{,**/}**.d.ts' -e './gulpfile.ts'", + "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", + "publish:prod": "npm run test && npm publish", + "travis": "npm link ng2-alfresco-core", + "gulp": "gulp", + "build.umd": "gulp build.prod --color --env-config prod --build-type prod", + "reinstall": "npm cache clean && npm install" + }, + "main": "./index.js", + "module": "./index.js", + "typings": "./index.d.ts", + "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.2.2", + "@angular/compiler": "2.2.2", + "@angular/core": "2.2.2", + "@angular/forms": "2.2.2", + "@angular/http": "2.2.2", + "@angular/material": "2.0.0-beta.1", + "@angular/platform-browser": "2.2.2", + "@angular/platform-browser-dynamic": "2.2.2", + "@angular/router": "3.2.2", + "alfresco-js-api": "~1.3.0", + "core-js": "2.4.1", + "hammerjs": "2.0.8", + "ng2-alfresco-core": "1.3.0", + "ng2-translate": "2.5.0", + "reflect-metadata": "0.1.10", + "rxjs": "5.0.0-beta.12", + "systemjs": "0.19.27", + "zone.js": "0.6.26" + }, + "devDependencies": { + "@types/hammerjs": "^2.0.34", + "@types/jasmine": "2.5.35", + "@types/node": "6.0.45", + "autoprefixer": "^6.5.4", + "concurrently": "^2.2.0", + "cpx": "^1.3.1", + "cssnano": "^3.8.1", + "gulp": "^3.9.1", + "gulp-autoprefixer": "^3.1.1", + "gulp-cached": "^1.1.1", + "gulp-concat": "^2.6.1", + "gulp-concat-css": "^2.3.0", + "gulp-filter": "^4.0.0", + "gulp-inline-ng2-template": "^4.0.0", + "gulp-load-plugins": "^1.4.0", + "gulp-plumber": "^1.1.0", + "gulp-postcss": "^6.2.0", + "gulp-replace": "^0.5.4", + "gulp-sourcemaps": "^1.9.1", + "gulp-template": "^4.0.0", + "gulp-typescript": "^3.1.3", + "gulp-uglify": "^2.0.0", + "gulp-util": "^3.0.7", + "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", + "merge-stream": "^1.0.1", + "remap-istanbul": "^0.6.3", + "rimraf": "2.5.2", + "run-sequence": "^1.2.2", + "systemjs-builder": "^0.15.34", + "traceur": "^0.0.91", + "ts-node": "^1.7.0", + "tslint": "^3.8.1", + "typescript": "^2.0.3", + "wsrv": "^0.1.5" + }, + "keywords": [ + "rating", + "alfresco-component" + ], + "license-check-config": { + "src": [ + "./src/**/*.js" + ], + "path": "assets/license_header.txt", + "blocking": true, + "logInfo": false, + "logError": true + }, + "license": "Apache-2.0" +} diff --git a/ng2-components/ng2-alfresco-social/src/components/like.component.css b/ng2-components/ng2-alfresco-social/src/components/like.component.css new file mode 100644 index 0000000000..b6e3833506 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/like.component.css @@ -0,0 +1,41 @@ +.adf-like-container { + overflow: hidden; + width: 100%; +} + +.adf-like { + padding: 5px; + cursor: pointer; + float: left; + margin: 5px 0px 5px 5px; +} + +.adf-like-select { + cursor: pointer; + color: #2196f3; +} + +.adf-like-select:hover { + cursor: pointer; + color: #808080; +} + +.adf-like-grey { + cursor: pointer; + color: #808080; +} + +.adf-like-grey:hover { + cursor: pointer; + color: #2196f3; +} + +.adf-like-counter { + float: left; + padding: 13px 0 0 0; +} + +.adf-left{ + float: left; + padding: 13px 0 0 4px; +} diff --git a/ng2-components/ng2-alfresco-social/src/components/like.component.html b/ng2-components/ng2-alfresco-social/src/components/like.component.html new file mode 100644 index 0000000000..b9e462fcea --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/like.component.html @@ -0,0 +1,11 @@ +
+
+ + thumb_up + +
+
{{likesCounter}}
+
Like
+
Likes
+
diff --git a/ng2-components/ng2-alfresco-social/src/components/like.component.spec.ts b/ng2-components/ng2-alfresco-social/src/components/like.component.spec.ts new file mode 100644 index 0000000000..4b2e201768 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/like.component.spec.ts @@ -0,0 +1,208 @@ +/*! + * @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 { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { LikeComponent } from '../components/like.component'; +import { DebugElement } from '@angular/core'; +import { CoreModule } from 'ng2-alfresco-core'; +import { RatingService } from '../services/rating.service'; + +declare let jasmine: any; + +describe('Like component', () => { + + let component: any; + let fixture: ComponentFixture; + let debug: DebugElement; + let element: HTMLElement; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + CoreModule.forRoot() + ], + declarations: [ + LikeComponent + ], + providers: [ + RatingService + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LikeComponent); + + debug = fixture.debugElement; + element = fixture.nativeElement; + component = fixture.componentInstance; + component.nodeId = 'test-id'; + + fixture.detectChanges(); + }); + + describe('Rendering tests', () => { + + beforeEach(() => { + jasmine.Ajax.install(); + }); + + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('should like component should be present', (done) => { + fixture.detectChanges(); + + component.ngOnChanges().subscribe(() => { + expect(element.querySelector('#adf-like-test-id')).not.toBe(null); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + entry: { + id: 'likes', + aggregate: { + numberOfRatings: 1 + } + } + } + }); + + }); + + it('should like component show the number of likes', (done) => { + fixture.detectChanges(); + + component.ngOnChanges().subscribe(() => { + expect(element.querySelector('#adf-like-counter').innerHTML).not.toBe(1); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + entry: { + id: 'likes', + aggregate: { + numberOfRatings: 1 + } + } + } + }); + }); + + describe('User actions', () => { + + it('should like component update the number of likes when clicked', (done) => { + fixture.detectChanges(); + + expect(element.querySelector('#adf-like-counter').innerHTML).toBe('0'); + + component.ngOnChanges().subscribe(() => { + component.changeVote.subscribe(() => { + fixture.detectChanges(); + expect(element.querySelector('#adf-like-counter').innerHTML).toBe('1'); + }); + + let likeButton: any = element.querySelector('#adf-like-test-id'); + likeButton.click(); + + component.changeVote.subscribe(() => { + fixture.detectChanges(); + expect(element.querySelector('#adf-like-counter').innerHTML).toBe('2'); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + 'entry': { + 'myRating': true, + 'ratedAt': '2017-04-06T15:25:50.305+0000', + 'id': 'likes', + 'aggregate': {'numberOfRatings': 2} + } + } + }); + + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + entry: { + id: 'likes', + aggregate: { + numberOfRatings: 1 + } + } + } + }); + }); + + it('should like component decrease the number of likes when clicked and is already liked', (done) => { + fixture.detectChanges(); + + expect(element.querySelector('#adf-like-counter').innerHTML).toBe('0'); + + component.ngOnChanges().subscribe(() => { + fixture.detectChanges(); + + let likeButton: any = element.querySelector('#adf-like-test-id'); + likeButton.click(); + + component.changeVote.subscribe(() => { + fixture.detectChanges(); + expect(element.querySelector('#adf-like-counter').innerHTML).toBe('0'); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 204, + contentType: 'json' + }); + + done(); + }); + + component.changeVote.subscribe(() => { + fixture.detectChanges(); + expect(element.querySelector('#adf-like-counter').innerHTML).toBe('1'); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + 'entry': { + 'myRating': true, + 'ratedAt': '2017-04-06T15:41:01.851+0000', + 'id': 'likes', + 'aggregate': {'numberOfRatings': 1} + } + } + }); + }); + }); + }); +}); diff --git a/ng2-components/ng2-alfresco-social/src/components/like.component.ts b/ng2-components/ng2-alfresco-social/src/components/like.component.ts new file mode 100644 index 0000000000..514488c703 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/like.component.ts @@ -0,0 +1,80 @@ +/*! + * @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, Input, Output, EventEmitter } from '@angular/core'; +import { RatingService } from './../services/rating.service'; + +@Component({ + selector: 'adf-like', + styleUrls: ['./like.component.css'], + templateUrl: './like.component.html', + providers: [RatingService] +}) +export class LikeComponent { + + @Input() + nodeId: string; + + likesCounter: number = 0; + + ratingType: string = 'likes'; + + isLike: boolean = false; + + @Output() + changeVote = new EventEmitter(); + + constructor(private ratingService: RatingService) { + } + + ngOnChanges() { + let ratingObserver = this.ratingService.getRating(this.nodeId, this.ratingType); + + ratingObserver.subscribe( + (data) => { + if (data.entry.aggregate) { + this.likesCounter = data.entry.aggregate.numberOfRatings; + if (data.entry.ratedAt) { + this.isLike = true; + } + } + } + ); + + return ratingObserver; + } + + likeClick() { + if (this.isLike) { + this.ratingService.deleteRating(this.nodeId, this.ratingType).subscribe( + () => { + this.likesCounter -= 1; + this.isLike = false; + } + ); + } else { + this.ratingService.postRating(this.nodeId, this.ratingType, true).subscribe( + (data) => { + this.likesCounter = data.entry.aggregate.numberOfRatings; + this.isLike = true; + } + ); + } + + this.changeVote.emit(this.likesCounter); + } +} diff --git a/ng2-components/ng2-alfresco-social/src/components/rating.component.css b/ng2-components/ng2-alfresco-social/src/components/rating.component.css new file mode 100644 index 0000000000..a240c62f75 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/rating.component.css @@ -0,0 +1,30 @@ +.adf-rating-container { + overflow: hidden; + width: 100%; +} + +.adf-rating-star { + float: left; + transition: all .3s; + padding: 1px; + cursor: pointer; +} + +.adf-colored-star { + color: #ffe944; +} + +.adf-grey-star { + color: #808080; +} + +.adf-stars-container { + padding: 0!important; + margin: 0!important; + display: inline-block; +} + +.adf-rating-star:hover { + transform: rotate(13deg) scale(1.2); +} + diff --git a/ng2-components/ng2-alfresco-social/src/components/rating.component.html b/ng2-components/ng2-alfresco-social/src/components/rating.component.html new file mode 100644 index 0000000000..f4e9df056f --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/rating.component.html @@ -0,0 +1,10 @@ +
+
    +
  • + + star_rate + star_border + +
  • +
+
diff --git a/ng2-components/ng2-alfresco-social/src/components/rating.component.spec.ts b/ng2-components/ng2-alfresco-social/src/components/rating.component.spec.ts new file mode 100644 index 0000000000..a8a5ecbb64 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/rating.component.spec.ts @@ -0,0 +1,165 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ComponentFixture, TestBed, async } from '@angular/core/testing'; +import { RatingComponent } from '../components/rating.component'; +import { DebugElement } from '@angular/core'; +import { CoreModule } from 'ng2-alfresco-core'; +import { RatingService } from '../services/rating.service'; + +declare let jasmine: any; + +describe('Rating component', () => { + + let component: any; + let fixture: ComponentFixture; + let debug: DebugElement; + let element: HTMLElement; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + CoreModule.forRoot() + ], + declarations: [ + RatingComponent + ], + providers: [ + RatingService + ] + }).compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(RatingComponent); + + debug = fixture.debugElement; + element = fixture.nativeElement; + component = fixture.componentInstance; + component.nodeId = 'test-id'; + + fixture.detectChanges(); + }); + + describe('Rendering tests', () => { + + beforeEach(() => { + jasmine.Ajax.install(); + }); + + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('should rating component should be present', (done) => { + fixture.detectChanges(); + + component.ngOnChanges().subscribe(() => { + expect(element.querySelector('#adf-rating-container')).not.toBe(null); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + entry: { + id: 'fiveStar', + aggregate: { + numberOfRatings: 1, + average: 4 + } + } + } + }); + }); + + it('should the star rating filled with the right grey/colored star', (done) => { + fixture.detectChanges(); + + component.ngOnChanges().subscribe(() => { + fixture.detectChanges(); + + expect(element.querySelectorAll('.adf-colored-star').length).toBe(3); + expect(element.querySelectorAll('.adf-grey-star').length).toBe(2); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + entry: { + id: 'fiveStar', + aggregate: { + numberOfRatings: 4, + average: 3 + } + } + } + }); + }); + + it('should click on a star change your vote', (done) => { + fixture.detectChanges(); + + component.ngOnChanges().subscribe(() => { + fixture.detectChanges(); + + expect(element.querySelectorAll('.adf-colored-star').length).toBe(1); + + component.changeVote.subscribe(() => { + fixture.detectChanges(); + + expect(element.querySelectorAll('.adf-colored-star').length).toBe(3); + + done(); + }); + + let starThree: any = element.querySelector('#adf-colored-star-3'); + starThree.click(); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + 'entry': { + 'myRating': 3, + 'ratedAt': '2017-04-06T14:36:40.731+0000', + 'id': 'fiveStar', + 'aggregate': {'numberOfRatings': 1, 'average': 3.0} + } + } + }); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + 'entry': { + myRating: 1, + 'ratedAt': '2017-04-06T14:34:28.061+0000', + 'id': 'fiveStar', + 'aggregate': {'numberOfRatings': 1, 'average': 1.0} + } + } + }); + }); + + }); +}); diff --git a/ng2-components/ng2-alfresco-social/src/components/rating.component.ts b/ng2-components/ng2-alfresco-social/src/components/rating.component.ts new file mode 100644 index 0000000000..b1de0c7591 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/components/rating.component.ts @@ -0,0 +1,85 @@ +/*! + * @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, Input, Output, EventEmitter } from '@angular/core'; +import { RatingService } from './../services/rating.service'; + +@Component({ + selector: 'adf-rating', + styleUrls: ['./rating.component.css'], + templateUrl: './rating.component.html', + providers: [RatingService] +}) +export class RatingComponent { + + @Input() + nodeId: string; + + average: number = 0; + + ratingType: string = 'fiveStar'; + + @Output() + changeVote = new EventEmitter(); + + stars: Array = []; + + constructor(private ratingService: RatingService) { + } + + ngOnChanges() { + let ratingObserver = this.ratingService.getRating(this.nodeId, this.ratingType); + + ratingObserver.subscribe( + (data) => { + if (data.entry.aggregate) { + this.average = data.entry.aggregate.average; + this.calculateStars(); + } + } + ); + + return ratingObserver; + } + + calculateStars() { + this.stars = []; + + for (let i = 0; i < 5; i++) { + if (i < this.average) { + this.stars.push({fill: true}); + } else { + this.stars.push({fill: false}); + } + } + + this.changeVote.emit(this.average); + } + + updateVote(vote: number) { + this.ratingService.postRating(this.nodeId, this.ratingType, vote).subscribe( + (data) => { + if (data.entry.aggregate) { + if (this.average !== data.entry.aggregate.average) { + this.average = data.entry.aggregate.average; + this.calculateStars(); + } + } + } + ); + } +} diff --git a/ng2-components/ng2-alfresco-social/src/services/rating.service.spec.ts b/ng2-components/ng2-alfresco-social/src/services/rating.service.spec.ts new file mode 100644 index 0000000000..474888cf6c --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/services/rating.service.spec.ts @@ -0,0 +1,102 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { ReflectiveInjector } from '@angular/core'; +import { + AlfrescoAuthenticationService, + AlfrescoSettingsService, + AlfrescoApiService, + StorageService, + LogService +} from 'ng2-alfresco-core'; +import { RatingService } from '../services/rating.service'; + +declare let jasmine: any; + +describe('Rating service', () => { + + let service, injector; + + beforeEach(() => { + injector = ReflectiveInjector.resolveAndCreate([ + AlfrescoSettingsService, + AlfrescoApiService, + AlfrescoAuthenticationService, + RatingService, + StorageService, + LogService + ]); + }); + + beforeEach(() => { + service = injector.get(RatingService); + }); + + beforeEach(() => { + jasmine.Ajax.install(); + }); + + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('Should get rating return an Observable', (done) => { + let ratingType: string = 'fiveStar'; + let nodeId: string = 'fake-node-id'; + + service.getRating(nodeId, ratingType).subscribe((data) => { + expect(data.entry.myRating).toBe('1'); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + 'entry': { + myRating: 1, + 'ratedAt': '2017-04-06T14:34:28.061+0000', + 'id': 'fiveStar', + 'aggregate': {'numberOfRatings': 1, 'average': 1.0} + } + } + }); + }); + + it('Should post rating return an Observable', (done) => { + let ratingType: string = 'fiveStar'; + let nodeId: string = 'fake-node-id'; + + service.postRating(nodeId, ratingType, 3).subscribe((data) => { + expect(data.entry.myRating).toBe('3'); + done(); + }); + + jasmine.Ajax.requests.mostRecent().respondWith({ + status: 200, + contentType: 'json', + responseText: { + 'entry': { + 'myRating': 3, + 'ratedAt': '2017-04-06T14:36:40.731+0000', + 'id': 'fiveStar', + 'aggregate': {'numberOfRatings': 1, 'average': 3.0} + } + } + }); + }); +}); diff --git a/ng2-components/ng2-alfresco-social/src/services/rating.service.ts b/ng2-components/ng2-alfresco-social/src/services/rating.service.ts new file mode 100644 index 0000000000..9fe4b015d8 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/src/services/rating.service.ts @@ -0,0 +1,55 @@ +/*! + * @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 { Injectable } from '@angular/core'; +import { Response } from '@angular/http'; +import { Observable } from 'rxjs/Rx'; +import { AlfrescoApiService } from 'ng2-alfresco-core'; + +@Injectable() +export class RatingService { + + constructor(private apiService: AlfrescoApiService) { + } + + getRating(nodeId: string, ratingType: any): any { + return Observable.fromPromise(this.apiService.getInstance().core.ratingsApi.getRating(nodeId, ratingType)) + .map(res => res) + .catch(this.handleError); + } + + postRating(nodeId: string, ratingType: string, vote: any): any { + let ratingBody = { + 'id': ratingType, + 'myRating': vote + }; + return Observable.fromPromise(this.apiService.getInstance().core.ratingsApi.rate(nodeId, ratingBody)) + .map(res => res) + .catch(this.handleError); + } + + deleteRating(nodeId: string, ratingId: string): any { + return Observable.fromPromise(this.apiService.getInstance().core.ratingsApi.removeRating(nodeId, ratingId)) + .map(res => res) + .catch(this.handleError); + } + + private handleError(error: Response): any { + console.error(error); + return Observable.throw(error || 'Server error'); + } +} diff --git a/ng2-components/ng2-alfresco-social/tsconfig.json b/ng2-components/ng2-alfresco-social/tsconfig.json new file mode 100644 index 0000000000..28919f9cc5 --- /dev/null +++ b/ng2-components/ng2-alfresco-social/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "skipLibCheck": true, + "noLib": false, + "allowUnreachableCode": false, + "allowUnusedLabels": false, + "noImplicitAny": false, + "noImplicitReturns": false, + "noImplicitUseStrict": false, + "noFallthroughCasesInSwitch": true, + "removeComments": true, + "declaration": true, + "lib": [ + "es2015", + "dom" + ], + "typeRoots": [ + "node_modules/@types" + ], + "suppressImplicitAnyIndexErrors": true + }, + "exclude": [ + "demo", + "node_modules", + "dist", + "tools", + "gulpfile.ts", + "gulpfile.d.ts" + ], + "angularCompilerOptions": { + "strictMetadataEmit": false, + "skipTemplateCodegen": true + } +} diff --git a/ng2-components/ng2-alfresco-social/tslint.json b/ng2-components/ng2-alfresco-social/tslint.json new file mode 100644 index 0000000000..acc666937e --- /dev/null +++ b/ng2-components/ng2-alfresco-social/tslint.json @@ -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": true, + "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": false, + "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" + ] + } +} diff --git a/scripts/npm-build-all.sh b/scripts/npm-build-all.sh index 3e76086b1c..0b3369e834 100755 --- a/scripts/npm-build-all.sh +++ b/scripts/npm-build-all.sh @@ -15,6 +15,7 @@ eval projects=( "ng2-alfresco-core" "ng2-alfresco-login" "ng2-alfresco-search" "ng2-alfresco-tag" + "ng2-alfresco-social" "ng2-alfresco-upload" "ng2-alfresco-viewer" "ng2-alfresco-webscript" diff --git a/scripts/npm-clean.sh b/scripts/npm-clean.sh index b91689a2be..b1b50bc6e3 100755 --- a/scripts/npm-clean.sh +++ b/scripts/npm-clean.sh @@ -13,6 +13,7 @@ eval projects=( "ng2-activiti-diagrams" "ng2-alfresco-login" "ng2-alfresco-search" "ng2-alfresco-tag" + "ng2-alfresco-social" "ng2-alfresco-upload" "ng2-alfresco-viewer" "ng2-alfresco-webscript" diff --git a/scripts/npm-link-all-components-demo.sh b/scripts/npm-link-all-components-demo.sh index 6120c96caa..bd27ca4483 100755 --- a/scripts/npm-link-all-components-demo.sh +++ b/scripts/npm-link-all-components-demo.sh @@ -21,6 +21,7 @@ for PACKAGE in \ ng2-alfresco-tag \ ng2-alfresco-upload \ ng2-alfresco-viewer \ + ng2-alfresco-social \ ng2-alfresco-webscript \ ng2-alfresco-userinfo do diff --git a/scripts/npm-link-demo-shell.sh b/scripts/npm-link-demo-shell.sh index b999ab85db..dcdedb110e 100755 --- a/scripts/npm-link-demo-shell.sh +++ b/scripts/npm-link-demo-shell.sh @@ -15,6 +15,7 @@ for PACKAGE in \ ng2-alfresco-login \ ng2-alfresco-search \ ng2-alfresco-tag \ + ng2-alfresco-social \ ng2-alfresco-upload \ ng2-alfresco-viewer \ ng2-alfresco-webscript \ @@ -41,6 +42,7 @@ for PACKAGE in \ ng2-alfresco-login \ ng2-alfresco-search \ ng2-alfresco-tag \ + ng2-alfresco-social \ ng2-alfresco-upload \ ng2-alfresco-viewer \ ng2-alfresco-webscript \ diff --git a/scripts/npm-publish.sh b/scripts/npm-publish.sh index c6aa28663b..a8ea1ee0ad 100755 --- a/scripts/npm-publish.sh +++ b/scripts/npm-publish.sh @@ -16,6 +16,7 @@ for PACKAGE in \ ng2-alfresco-login \ ng2-alfresco-search \ ng2-alfresco-tag \ + ng2-alfresco-social \ ng2-alfresco-upload \ ng2-alfresco-viewer \ ng2-alfresco-webscript \ diff --git a/scripts/update-version.sh b/scripts/update-version.sh index c59aa6d4ad..68a11b8c01 100755 --- a/scripts/update-version.sh +++ b/scripts/update-version.sh @@ -14,45 +14,32 @@ then exit 1 fi -for PACKAGE in \ - ng2-activiti-diagrams \ - ng2-activiti-analytics \ - ng2-activiti-form \ - ng2-activiti-processlist \ - ng2-activiti-tasklist \ - ng2-alfresco-core \ - ng2-alfresco-datatable \ - ng2-alfresco-documentlist \ - ng2-alfresco-login \ - ng2-alfresco-search \ - ng2-alfresco-tag \ - ng2-alfresco-upload \ - ng2-alfresco-viewer \ - ng2-alfresco-webscript \ - ng2-alfresco-userinfo \ - alfresco-js-api +eval projects=( "ng2-alfresco-core" + "ng2-alfresco-datatable" + "ng2-activiti-diagrams" + "ng2-activiti-analytics" + "ng2-activiti-form" + "ng2-activiti-tasklist" + "ng2-activiti-processlist" + "ng2-alfresco-documentlist" + "ng2-alfresco-login" + "ng2-alfresco-search" + "ng2-alfresco-tag" + "ng2-alfresco-social" + "ng2-alfresco-upload" + "ng2-alfresco-viewer" + "ng2-alfresco-webscript" + "ng2-alfresco-userinfo" + "alfresco-js-api" ) + +for PACKAGE in ${projects[@]} do DESTDIR="$DIR/../ng2-components/${PACKAGE}" echo "====== UPDATE PACKAGE VERSION of ${PACKAGE} to ${VERSION} version in all the package.json ======" find ././../ -type f -maxdepth 4 -name package.json -print0 | xargs -0 sed -i '' "s/\"${PACKAGE}\": \"[0-9]\\.[0-9]\\.[0-9]\"/\"${PACKAGE}\": \"${VERSION}\"/g" done -for PACKAGE in \ - ng2-activiti-diagrams \ - ng2-activiti-analytics \ - ng2-activiti-form \ - ng2-activiti-processlist \ - ng2-activiti-tasklist \ - ng2-alfresco-core \ - ng2-alfresco-datatable \ - ng2-alfresco-documentlist \ - ng2-alfresco-login \ - ng2-alfresco-search \ - ng2-alfresco-tag \ - ng2-alfresco-upload \ - ng2-alfresco-viewer \ - ng2-alfresco-webscript \ - ng2-alfresco-userinfo +for PACKAGE in ${projects[@]} do DESTDIR="$DIR/../ng2-components/${PACKAGE}" echo "====== UPDATE VERSION OF ${PACKAGE} to ${VERSION} version ======" @@ -63,45 +50,14 @@ echo "====== UPDATE VERSION OF DEMO-SHELL to ${VERSION} version ======" sed -i '' "s/\"version\": \"[0-9]\\.[0-9]\\.[0-9]\"/\"version\": \"${VERSION}\"/g" ${DIR}/../demo-shell-ng2/package.json -for PACKAGE in \ - ng2-activiti-diagrams \ - ng2-activiti-analytics \ - ng2-activiti-form \ - ng2-activiti-processlist \ - ng2-activiti-tasklist \ - ng2-alfresco-core \ - ng2-alfresco-datatable \ - ng2-alfresco-documentlist \ - ng2-alfresco-login \ - ng2-alfresco-search \ - ng2-alfresco-tag \ - ng2-alfresco-upload \ - ng2-alfresco-viewer \ - ng2-alfresco-webscript \ - ng2-alfresco-userinfo \ - alfresco-js-api +for PACKAGE in ${projects[@]} do DESTDIR="$DIR/../ng2-components/${PACKAGE}" echo "====== UPDATE PACKAGE VERSION of ${PACKAGE} to ~${VERSION} version in all the package.json ======" find ././../ -type f -maxdepth 4 -name package.json -print0 | xargs -0 sed -i '' "s/\"${PACKAGE}\": \"~[0-9]\\.[0-9]\\.[0-9]\"/\"${PACKAGE}\": \"~${VERSION}\"/g" done -for PACKAGE in \ - ng2-activiti-diagrams \ - ng2-activiti-analytics \ - ng2-activiti-form \ - ng2-activiti-processlist \ - ng2-activiti-tasklist \ - ng2-alfresco-core \ - ng2-alfresco-datatable \ - ng2-alfresco-documentlist \ - ng2-alfresco-login \ - ng2-alfresco-search \ - ng2-alfresco-tag \ - ng2-alfresco-upload \ - ng2-alfresco-viewer \ - ng2-alfresco-webscript \ - ng2-alfresco-userinfo +for PACKAGE in ${projects[@]} do DESTDIR="$DIR/../ng2-components/${PACKAGE}" echo "====== UPDATE VERSION OF ${PACKAGE} to ~${VERSION} version ======"