move tag component appfest

This commit is contained in:
Eugenio Romano 2016-09-02 16:10:52 +01:00
parent 70447dcd52
commit ef20d6aafd
34 changed files with 1689 additions and 0 deletions

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,12 @@
language: node_js
node_js:
- v5
- v4
- '0.12'
- '0.10'
install: npm install
sudo: false
after_success:
npm run coverage
# Send coverage data to Coveralls
after_script: "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.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,131 @@
# Alfresco Tag Component for Angular 2
<p>
<a title='Build Status Travis' href="https://travis-ci.org/Alfresco/alfresco-ng2-components">
<img src='https://travis-ci.org/Alfresco/alfresco-ng2-components.svg?branch=master' alt='travis
Status' />
</a>
<a title='Build Status AppVeyor' href="https://ci.appveyor.com/project/alfresco/alfresco-ng2-components">
<img src='https://ci.appveyor.com/api/projects/status/github/Alfresco/alfresco-ng2-components' alt='travis
Status' />
</a>
<a href='https://codecov.io/gh/Alfresco/alfresco-ng2-components'>
<img src='https://img.shields.io/codecov/c/github/Alfresco/alfresco-ng2-components/master.svg?maxAge=2592000' alt='Coverage Status' />
</a>
<a href='https://www.npmjs.com/package/ng2-alfresco-tag'>
<img src='https://img.shields.io/npm/dt/ng2-alfresco-tag.svg' alt='npm downloads' />
</a>
<a href='https://github.com/Alfresco/alfresco-ng2-components/blob/master/LICENSE'>
<img src='https://img.shields.io/hexpm/l/plug.svg' alt='license' />
</a>
<a href='https://www.alfresco.com/'>
<img src='https://img.shields.io/badge/style-component-green.svg?label=alfresco' alt='alfresco component' />
</a>
<a href='https://angular.io/'>
<img src='https://img.shields.io/badge/style-2-red.svg?label=angular' alt='angular 2' />
</a>
<a href='https://www.typescriptlang.org/docs/tutorial.html'>
<img src='https://img.shields.io/badge/style-lang-blue.svg?label=typescript' alt='typescript' />
</a>
<a href='https://www.alfresco.com/'>
<img src='https://img.shields.io/badge/style-%3E5.0.0-blue.svg?label=node%20version' alt='node version' />
</a>
</p>
### Node
To correctly use this component check that on your machine is running Node version 5.0.0 or higher.
## Install
```sh
npm install --save ng2-alfresco-tag
```
Components included:
* Alfresco Tag Component
#### Dependencies
Add the following dependency to your index.html:
```html
<script src="node_modules/alfresco-js-api/dist/alfresco-js-api.js"></script>
```
The following component needs to be added to your systemjs.config:
- ng2-translate
- ng2-alfresco-core
- ng2-alfresco-datatable
Please refer to the following example to have an idea of how your systemjs.config should look like :
https://github.com/Alfresco/alfresco-ng2-components/blob/master/ng2-components/ng2-alfresco-webscript/demo/systemjs.config.js
#### Style
The style of this component is based on material design, 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 .html page:
```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">
```
#### Basic usage
## Build from sources
Alternatively you can build component from sources with the following commands:
```sh
npm install
npm run build
```
##Build the files and keep watching for changes
```sh
npm run build:w
```
## Running unit tests
```sh
npm test
```
## Running unit tests in browser
```sh
npm test-browser
```
This task rebuilds all the code, runs tslint, license checks and other quality check tools
before performing unit testing.
## Code coverage
```sh
npm run coverage
```
## Demo
If you want have a demo of how the component works, please check the demo folder :
```sh
cd demo
npm install
npm start
```

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 @@
typings/
node_modules/
.idea
dist/
!systemjs.config.js
!browser-sync-config.js

View File

@ -0,0 +1,19 @@
# ng2-alfresco-tag - Demo
* To install dependencies
```sh
$ npm install
```
* To provide a live demo
```sh
$ npm run start
```
* To clean npm_modules and typings folder
```sh
$ npm run clean
```

View File

@ -0,0 +1,39 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Alfresco Angular 2 Tag - Demo</title>
<base href="./">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 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">
<!-- 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>
<!-- Additional Alfresco libraries -->
<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-tag-demo></alfresco-tag-demo>
</body>
</html>

View File

@ -0,0 +1,65 @@
{
"name": "ng2-alfresco-tag-demo",
"description": "Alfresco Angular2 Tag - Demo",
"version": "0.2.0",
"author": "Alfresco Software, Ltd.",
"main": "index.js",
"scripts": {
"clean": "rimraf dist node_modules typings",
"typings": "typings install",
"postinstall": "npm run typings && npm run build",
"start": "concurrently \"npm run build:w\" \"npm run server\" ",
"server": "wsrv -o -s -l",
"build": "npm run tslint && rimraf dist && tsc",
"build:w": "npm run tslint && rimraf dist && tsc -w",
"tslint": "npm run tslint-src && npm run tslint-root",
"tslint-src": "tslint -c tslint.json 'src/{,**/}**.ts'",
"tslint-root": "tslint -c tslint.json *.ts"
},
"license": "Apache-2.0",
"dependencies": {
"@angular/common": "2.0.0-rc.3",
"@angular/compiler": "2.0.0-rc.3",
"@angular/core": "2.0.0-rc.3",
"@angular/forms": "0.1.1",
"@angular/http": "2.0.0-rc.3",
"@angular/platform-browser": "2.0.0-rc.3",
"@angular/platform-browser-dynamic": "2.0.0-rc.3",
"@angular/router": "3.0.0-alpha.7",
"@angular/router-deprecated": "2.0.0-rc.2",
"@angular/upgrade": "2.0.0-rc.3",
"systemjs": "0.19.27",
"core-js": "2.4.0",
"reflect-metadata": "0.1.3",
"rxjs": "5.0.0-beta.6",
"zone.js": "0.6.12",
"material-design-icons": "2.2.3",
"material-design-lite": "1.1.3",
"alfresco-js-api": "^0.2.0",
"ng2-translate": "2.2.2",
"ng2-alfresco-core": "^0.2.0",
"ng2-alfresco-datatable": "^0.2.0"
},
"devDependencies": {
"concurrently": "2.0.0",
"rimraf": "2.5.2",
"tslint": "3.8.1",
"typescript": "1.8.10",
"typings": "1.0.4",
"wsrv": "0.1.3"
},
"contributors": [
{
"name": "Eugenio Romano",
"email": "eugenio.romano@alfresco.com"
}
],
"keywords": [
"angular2",
"typescript",
"alfresco"
]
}

View File

@ -0,0 +1,121 @@
/*!
* @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, Input} from '@angular/core';
import {bootstrap} from '@angular/platform-browser-dynamic';
import {HTTP_PROVIDERS} from '@angular/http';
import {
ALFRESCO_CORE_PROVIDERS,
AlfrescoSettingsService,
AlfrescoAuthenticationService,
CONTEXT_MENU_DIRECTIVES
} from 'ng2-alfresco-core';
import {TAGCOMPONENT, TAGSERVICES} from 'ng2-alfresco-tag';
@Component({
selector: 'alfresco-tag-demo',
template: `
<label for="token"><b>Insert a valid access token / ticket:</b></label><br>
<input id="token" type="text" size="48" (change)="updateToken();documentList.reload()" [(ngModel)]="token"><br>
<label for="token"><b>Insert the ip of your Alfresco instance:</b></label><br>
<input id="token" type="text" size="48" (change)="updateHost();documentList.reload()" [(ngModel)]="ecmHost"><br><br>
<div *ngIf="!authenticated" style="color:#FF2323">
Authentication failed to ip {{ ecmHost }} with user: admin, admin, you can still try to add a valid token to perform
operations.
</div>
<hr>
<label for="nodeId"><b>Insert Node Id</b></label><br>
<input id="nodeId" type="text" size="48" [(ngModel)]="nodeId"><br>
<div class="container" *ngIf="authenticated">
<div class="mdl-grid">
<div class="mdl-cell mdl-cell--4-col"><alfresco-tag-node-actions-list [nodeId]="nodeId"></alfresco-tag-node-actions-list></div>
<div class="mdl-cell mdl-cell--4-col">List Tags ECM <alfresco-tag-list></alfresco-tag-list></div>
<div class="mdl-cell mdl-cell--4-col">
Tag list By Node ID
<alfresco-tag-node-list [nodeId]="nodeId"></alfresco-tag-node-list>
</div>
<div class="mdl-cell mdl-cell--4-col">
Tag list By Node Properties
<alfresco-tag-node-list [properties]="propertiesDemo"></alfresco-tag-node-list>
</div>
</div>
</div>
`,
directives: [TAGCOMPONENT, CONTEXT_MENU_DIRECTIVES],
providers: [TAGSERVICES]
})
class TagDemo implements OnInit {
propertiesDemo: string = '{"cm:taggable": ["008e722c-bf2a-4426-832c-29d1a9b174a8", "0350ff75-badb-40e5-b7de-1091a855dd70"]}';
@Input()
nodeId: string = '1a0b110f-1e09-4ca2-b367-fe25e4964a4e';
currentPath: string = '/';
authenticated: boolean;
ecmHost: string = 'http://127.0.0.1:8080';
token: string;
constructor(private authService: AlfrescoAuthenticationService,
private settingsService: AlfrescoSettingsService) {
settingsService.ecmHost = this.ecmHost;
if (this.authService.getTicket()) {
this.token = this.authService.getTicket();
}
}
public updateToken(): void {
localStorage.setItem('token', this.token);
}
public updateHost(): void {
this.settingsService.ecmHost = this.ecmHost;
this.login();
}
ngOnInit() {
this.login();
}
login() {
this.authService.login('admin', 'admin', ['ECM']).subscribe(
token => {
console.log(token);
this.token = token;
this.authenticated = true;
},
error => {
console.log(error);
this.authenticated = false;
});
}
logData(data) {
console.log(data);
}
}
bootstrap(TagDemo, [
HTTP_PROVIDERS,
ALFRESCO_CORE_PROVIDERS
]);

View File

@ -0,0 +1,57 @@
/**
* System configuration for Angular 2 samples
* Adjust as necessary for your application needs.
*/
(function(global) {
// map tells the System loader where to look for things
var map = {
'app': 'dist', // 'dist',
'@angular': 'node_modules/@angular',
'angular2-in-memory-web-api': 'node_modules/angular2-in-memory-web-api',
'rxjs': 'node_modules/rxjs',
'ng2-translate': 'node_modules/ng2-translate',
'ng2-alfresco-core': 'node_modules/ng2-alfresco-core/dist',
'ng2-alfresco-datatable': 'node_modules/ng2-alfresco-datatable/dist',
'ng2-alfresco-tag': 'node_modules/ng2-alfresco-tag/dist'
};
// packages tells the System loader how to load when no filename and/or no extension
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'angular2-in-memory-web-api': { main: 'index.js', defaultExtension: 'js' },
'ng2-translate': { defaultExtension: 'js' },
'ng2-alfresco-core': { main: 'index.js', defaultExtension: 'js' },
'ng2-alfresco-datatable': { main: 'index.js', defaultExtension: 'js' },
'ng2-alfresco-tag': { main: 'index.js', defaultExtension: 'js' }
};
var ngPackageNames = [
'common',
'compiler',
'core',
'http',
'platform-browser',
'platform-browser-dynamic',
'router',
'router-deprecated',
'upgrade'
];
// Individual files (~300 requests):
function packIndex(pkgName) {
packages['@angular/'+pkgName] = { main: 'index.js', defaultExtension: 'js' };
}
// Bundled (~40 requests):
function packUmd(pkgName) {
packages['@angular/'+pkgName] = { main: '/bundles/' + pkgName + '.umd.js', defaultExtension: 'js' };
}
// Most environments should use UMD; some (Karma) need the individual index files
var setPackageConfig = System.packageWithIndex ? packIndex : packUmd;
// Add package entries for angular packages
ngPackageNames.forEach(setPackageConfig);
var config = {
map: map,
packages: packages
};
System.config(config);
})(this);

View File

@ -0,0 +1,19 @@
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"removeComments": true,
"declaration": true,
"outDir": "dist"
},
"exclude": [
"dist",
"node_modules",
"typings/main",
"typings/main.d.ts"
]
}

View File

@ -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": 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": 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"
]
}
}

View File

@ -0,0 +1,7 @@
{
"globalDependencies": {
"core-js": "registry:dt/core-js#0.0.0+20160317120654",
"jasmine": "registry:dt/jasmine#2.2.0+20160505161446",
"node": "registry:dt/node#4.0.0+20160509154515"
}
}

View File

@ -0,0 +1,5 @@
{
"watch": [
"node_modules/ng2-alfresco-tag/dist/**/*.{html,htm,css,js}"
]
}

View File

@ -0,0 +1,41 @@
/*!
* @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 { TagActionsComponent } from './src/components/tag-actions.component';
import { TagList } from './src/components/tag-list.component';
import { TagNodeList } from './src/components/tag-node-list.component';
import { TagService } from './src/services/tag.service';
export * from './src/components/tag-actions.component';
export * from './src/components/tag-list.component';
export * from './src/components/tag-node-list.component';
export * from './src/services/tag.service';
export default {
components: [TagActionsComponent, TagList, TagNodeList]
};
export const TAGCOMPONENT: [any] = [
TagActionsComponent,
TagList,
TagNodeList
];
export const TAGSERVICES: [any] = [
TagService
];

View File

@ -0,0 +1,107 @@
// Tun on full stack traces in errors to help debugging
Error.stackTraceLimit = Infinity;
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
__karma__.loaded = function() {};
var map = {
'app': 'base/dist',
'rxjs': 'base/node_modules/rxjs',
'@angular': 'base/node_modules/@angular',
'ng2-translate' : '/base/node_modules/ng2-translate',
'ng2-alfresco-core': '/base/node_modules/ng2-alfresco-core/dist'
};
var packages = {
'app': { main: 'main.js', defaultExtension: 'js' },
'rxjs': { defaultExtension: 'js' },
'ng2-translate': { defaultExtension: 'js' },
'ng2-alfresco-core': { main: 'index.js', defaultExtension: 'js' }
};
var packageNames = [
'@angular/common',
'@angular/compiler',
'@angular/core',
'@angular/http',
'@angular/platform-browser',
'@angular/platform-browser-dynamic',
'@angular/router',
'@angular/router-deprecated',
'@angular/testing',
'@angular/upgrade'
];
packageNames.forEach(function(pkgName) {
packages[pkgName] = { main: 'index.js', defaultExtension: 'js' };
});
packages['base/dist'] = {
defaultExtension: 'js',
format: 'register',
map: Object.keys(window.__karma__.files).filter(onlyAppFiles).reduce(createPathRecords, {})
};
var config = {
map: map,
packages: packages
};
System.config(config);
System.import('@angular/platform-browser/src/browser/browser_adapter')
.then(function(browser_adapter) { browser_adapter.BrowserDomAdapter.makeCurrent(); })
.then(function () {
return Promise.all([
System.import('@angular/core/testing'),
System.import('@angular/platform-browser-dynamic/testing')
])
})
.then(function (providers) {
var testing = providers[0];
var testingBrowser = providers[1];
testing.setBaseTestProviders(
testingBrowser.TEST_BROWSER_DYNAMIC_PLATFORM_PROVIDERS,
testingBrowser.TEST_BROWSER_DYNAMIC_APPLICATION_PROVIDERS);
})
.then(function() { return Promise.all(resolveTestFiles()); })
.then(
function() {
__karma__.start();
},
function(error) {
if(typeof __karma__.error == 'function') {
__karma__.error(error.stack || error);
}else{
console.error(error);
}
}
);
function createPathRecords(pathsMapping, appPath) {
var pathParts = appPath.split('/');
var moduleName = './' + pathParts.slice(Math.max(pathParts.length - 2, 1)).join('/');
moduleName = moduleName.replace(/\.js$/, '');
pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath];
return pathsMapping;
}
function onlyAppFiles(filePath) {
return /\/base\/dist\/(?!.*\.spec\.js$).*\.js$/.test(filePath);
}
function onlySpecFiles(path) {
return /\.spec\.js$/.test(path);
}
function resolveTestFiles() {
return Object.keys(window.__karma__.files) // All files served by Karma.
.filter(onlySpecFiles)
.map(function(moduleName) {
// loads all spec files via their global module names (e.g.
// 'base/dist/vg-player/vg-player.spec')
return System.import(moduleName);
});
}

View File

@ -0,0 +1,88 @@
'use strict';
module.exports = function (config) {
config.set({
basePath: '.',
frameworks: ['jasmine-ajax', 'jasmine'],
files: [
// paths loaded by Karma
{pattern: 'node_modules/reflect-metadata/Reflect.js', included: true, watched: true},
{pattern: 'node_modules/systemjs/dist/system.src.js', included: true, watched: false},
{pattern: 'node_modules/zone.js/dist/zone.js', included: true, watched: true},
{pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false},
{pattern: 'node_modules/rxjs/**/*.map', included: false, watched: false},
{pattern: 'node_modules/@angular/**/*.js', included: false, watched: false},
{pattern: 'node_modules/@angular/**/*.map', included: false, watched: false},
{pattern: 'node_modules/ng2-alfresco-core/dist/**/*.js', included: false, served: true, watched: false},
{pattern: 'node_modules/alfresco-js-api/dist/alfresco-js-api.js', included: true, watched: false},
{pattern: 'node_modules/material-design-lite/material.min.js', included: true, watched: false},
{pattern: 'karma-test-shim.js', included: true, watched: true},
// 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},
// 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}
],
// proxied base paths
proxies: {
// required for component assets fetched by Angular's compiler
'/src/': '/base/src/'
},
// list of files to exclude
exclude: [
'node_modules/**/*spec.js'
],
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'],
// 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: 'text-summary'},
{type: 'json', file: 'coverage-final.json'},
{type: 'html'}
]
}
})
};

View File

@ -0,0 +1,93 @@
{
"name": "ng2-alfresco-tag",
"description": "Alfresco tag component",
"version": "0.2.0",
"author": "Alfresco Software, Ltd.",
"main": "./dist/index.js",
"typings": "./dist/index.d.ts",
"scripts": {
"postinstall": "typings install",
"clean": "rimraf dist node_modules typings",
"typings": "typings install",
"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-rc.3",
"@angular/compiler": "2.0.0-rc.3",
"@angular/core": "2.0.0-rc.3",
"@angular/http": "2.0.0-rc.3",
"@angular/platform-browser": "2.0.0-rc.3",
"@angular/platform-browser-dynamic": "2.0.0-rc.3",
"@angular/router": "3.0.0-alpha.7",
"@angular/router-deprecated": "2.0.0-rc.2",
"@angular/upgrade": "2.0.0-rc.3",
"systemjs": "0.19.27",
"core-js": "^2.4.0",
"alfresco-js-api": "^0.2.0",
"ng2-translate": "2.2.2",
"ng2-alfresco-core": "^0.2.0",
"ng2-alfresco-datatable": "^0.2.0",
"reflect-metadata": "^0.1.3",
"rxjs": "5.0.0-beta.6",
"zone.js": "^0.6.12"
},
"devDependencies": {
"concurrently": "^2.1.0",
"coveralls": "^2.11.9",
"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",
"material-design-lite": "^1.1.3",
"remap-istanbul": "^0.6.3",
"rimraf": "2.5.2",
"traceur": "^0.0.91",
"tslint": "^3.8.1",
"typescript": "^1.8.10",
"typings": "^1.0.4",
"wsrv": "0.1.3"
},
"keywords": [
"tag",
"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,23 @@
.tag-container {
width: 300px;
}
.tag-element {
padding: 0px 0px 0px 9px!important;
}
.tag-input {
float: left;
margin-left: 11px!important;
}
.tag-container-input{
padding-top: 11px;
width: 190px;
float: left;
margin-right: 15px;
}
.tag-button{
float:left
}

View File

@ -0,0 +1,40 @@
<!--isContextMenu-->
<div *ngIf="isContextMenu">
<li class="mdl-menu__item" *ngFor="let currentEntry of tagsEntries">
<span class="mdl-list__item-primary-content">
{{currentEntry.entry.tag}}
</span>
<span class="mdl-list__item-secondary-action">
<i class="material-icons" (click)="removeTag(currentEntry.entry.id)">delete</i>
</span>
</li>
<li>
<div class="mdl-textfield mdl-js-textfield tag-container-input">
<input class="mdl-textfield__input tag-input" type="tag" id="new-tag-text" [(ngModel)]="newTagName"/>
</div>
<button class="mdl-button mdl-js-button mdl-button--raised button" (click)="addTag()">
Add tag
</button>
</li>
</div>
<!--not ContextMenu-->
<ul *ngIf="!isContextMenu" class="mdl-menu--bottom-right">
<li class="mdl-menu__item" *ngFor="let currentEntry of tagsEntries">
<span class="mdl-list__item-primary-content">
{{currentEntry.entry.tag}}
</span>
<span class="mdl-list__item-secondary-action">
<i class="material-icons" (click)="removeTag(currentEntry.entry.id)">delete</i>
</span>
</li>
<li>
<div class="mdl-textfield mdl-js-textfield tag-container-input">
<input class="mdl-textfield__input tag-input" type="tag" id="new-tag-text" [(ngModel)]="newTagName"/>
</div>
<button class="mdl-button mdl-js-button mdl-button--raised button" (click)="addTag()">
Add tag
</button>
</li>
</ul>

View File

@ -0,0 +1,17 @@
/*!
* @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,82 @@
/*!
* @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 {AlfrescoAuthenticationService} from 'ng2-alfresco-core';
import {TagService} from '../services/tag.service';
/**
*
* This component, provide a list of the tags relative a node with actions button to add or remove new tag
*
* @returns {TagComponent} .
*/
declare let __moduleName: string;
@Component({
moduleId: __moduleName,
selector: 'alfresco-tag-node-actions-list',
templateUrl: './tag-actions.component.html',
styleUrls: ['./tag-actions.component.css']
})
export class TagActionsComponent {
@Input()
nodeId: string;
@Input()
isContextMenu: boolean = false;
@Output()
onSuccess: EventEmitter<any> = new EventEmitter();
newTagName: string;
tagsEntries: any;
/**
* Constructor
* @param authService
*/
constructor(public authService: AlfrescoAuthenticationService, private tagService: TagService) {
}
ngOnChanges(changes) {
return this.refreshTag();
}
refreshTag() {
this.tagService.getTagsByNodeId(this.nodeId).then((data) => {
this.tagsEntries = data;
});
}
addTag() {
this.tagService.addTag(this.nodeId, this.newTagName).then((res) => {
this.refreshTag();
this.onSuccess.emit(res.entry.id);
});
}
removeTag(tag: string) {
this.tagService.removeTag(this.nodeId, tag).then(() => {
this.refreshTag();
});
}
}

View File

@ -0,0 +1,11 @@
<div class="tag-container">
<div id="table-cards-container">
<ul class="tag-list-control mdl-list">
<li class="mdl-list__item tag-element" *ngFor="let currentEntry of tagsEntries">
<span class="mdl-list__item-primary-content">
{{currentEntry.entry.tag}}
</span>
</li>
</ul>
</div>
</div>

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 {Component, Input} from '@angular/core';
import { AlfrescoAuthenticationService } from 'ng2-alfresco-core';
import { TagService} from '../services/tag.service';
/**
*
* This component provide a list of all the tag inside the ECM
*
* @returns {TagList} .
*/
declare let __moduleName: string;
@Component({
moduleId: __moduleName,
selector: 'alfresco-tag-list',
templateUrl: './tag-list.component.html',
styleUrls: ['./tag.component.css']
})
export class TagList {
tagsEntries: any;
@Input()
tagUlId: string = 'tg-id';
/**
* Constructor
* @param authService
*/
constructor(public authService: AlfrescoAuthenticationService, private tagService: TagService) {
}
ngOnInit(changes) {
return this.refreshTagEcm();
}
refreshTagEcm() {
this.tagService.getAllTheTags().then((data) => {
this.tagsEntries = data;
});
}
}

View File

@ -0,0 +1,65 @@
.tags {
padding-left: 7px;
padding-right: 7px;
}
.tags li {
display: inline;
}
.tag-name {
cursor: default;
float:left;
max-height: 22px;
max-width: 100px;
background-color: #8EC44B;
-webkit-border-radius: 4px 0px 0px 4px;
-moz-border-radius: 4px 0px 0px 4px;
border-radius: 4px 0px 0px 4px;
position: relative;
color: #fff;
display: inline-block;
text-decoration: none;
font-family: arial, helvetica, sans-serif;
font-size: 14px;
zoom: 1;
line-height: 22px;
padding: 0 0px 0 10px;
margin: 4px 0px 4px 8px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.tag-delete {
cursor: pointer;
float:left;
max-height: 22px;
max-width: 30px;
background-color: #8EC44B;
-webkit-border-radius: 0px 4px 4px 0px;
-moz-border-radius: 0px 4px 4px 0px;
border-radius: 0px 4px 4px 0px;
position: relative;
color: #fff;
display: inline-block;
text-decoration: none;
font-family: arial, helvetica, sans-serif;
font-size: 14px;
zoom: 1;
line-height: 22px;
padding: 0 4px 0 6px;
margin: 4px 4px 4px 0px;
white-space: nowrap;
overflow: hidden;
}
.tag-delete:hover{
color: lightgray;
}
.delete-icon{
font-size: 22px!important;
}

View File

@ -0,0 +1,8 @@
<div class="tag-list-container">
<ul class="tags">
<li *ngFor="let currentEntry of tagsEntries">
<a href="#" class="tag-name">{{currentEntry.entry.tag}}</a>
<div class="tag-delete" (click)="removeTag(currentEntry.entry.id)" ><i class="material-icons delete-icon">close</i></div>
</li>
</ul>
</div>

View File

@ -0,0 +1,75 @@
/*!
* @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} from '@angular/core';
import {AlfrescoAuthenticationService} from 'ng2-alfresco-core';
import {TagService} from '../services/tag.service';
/**
*
* This component, ShowNodeTag a list of the tag on relative a node
*
* @returns {TagNodeList} .
*/
declare let __moduleName: string;
@Component({
moduleId: __moduleName,
selector: 'alfresco-tag-node-list',
templateUrl: './tag-node-list.component.html',
styleUrls: ['./tag-node-list.component.css']
})
export class TagNodeList {
@Input()
nodeId: string;
@Input()
properties: string;
tagsEntries: any;
/**
* Constructor
* @param authService
*/
constructor(public authService: AlfrescoAuthenticationService, private tagService: TagService) {
}
ngOnChanges(changes) {
return this.refreshTag();
}
refreshTag() {
if (this.nodeId) {
this.tagService.getTagsByNodeId(this.nodeId).then((data) => {
this.tagsEntries = data;
});
} else if (this.properties) {
this.tagService.getTagsByProperties(this.properties).then((data) => {
this.tagsEntries = data;
});
}
}
removeTag(tag: string) {
this.tagService.removeTag(this.nodeId, tag).then(() => {
this.refreshTag();
});
}
}

View File

@ -0,0 +1,142 @@
/*!
* @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 {AlfrescoAuthenticationService} from 'ng2-alfresco-core';
/**
*
* This component, provide a list of the tags relative a node with actions button to add or remove new tag
*
* @returns {TagComponent} .
*/
declare let __moduleName: string;
@Injectable()
export class TagService {
cacheTagList: any = [];
promiseCache: any;
/**
* Constructor
* @param authService
*/
constructor(public authService: AlfrescoAuthenticationService) {
this.promiseCache = new Promise((resolve) => {
this.getAllTheTags().then((data) => {
this.cacheTagList = data;
resolve(data);
});
});
}
getTagsByProperties(properties: string) {
return new Promise((resolve) => {
if (!this.cacheTagList) {
this.promiseCache.then((data) => {
this.cacheTagList = data;
resolve(this._associateTagByNodeProperties(properties, data));
});
} else {
resolve(this._associateTagByNodeProperties(properties, this.cacheTagList));
}
});
}
_associateTagByNodeProperties(properties: any, tagList: any) {
let tagsArray = [];
if (properties) {
try {
let jsonProps;
if (typeof properties !== 'object') {
jsonProps = JSON.parse(properties);
} else {
jsonProps = properties;
}
if (jsonProps.hasOwnProperty('cm:taggable')) {
jsonProps['cm:taggable'].forEach((currentTagId) => {
if (tagList && tagList.length > 0) {
let tag = tagList.filter((currentCacheTag) => {
if (currentCacheTag.entry.id === currentTagId) {
return currentCacheTag.entry;
}
});
if (tag && tag.length > 0) {
tagsArray.push(tag[0]);
}
}
});
}
} catch (error) {
console.log('error' + error);
}
}
return tagsArray;
}
getTagsByNodeId(nodeId: string): any {
return new Promise((resolve, reject) => {
this.authService.getAlfrescoApi().core.tagsApi.getNodeTags(nodeId).then((data) => {
resolve(data.list.entries);
}, function (error) {
console.log('Error' + error);
reject();
});
});
}
getAllTheTags() {
return new Promise((resolve, reject) => {
this.authService.getAlfrescoApi().core.tagsApi.getTags().then((data) => {
resolve(data.list.entries);
}, function (error) {
console.log('Error' + error);
reject();
});
});
}
addTag(nodeId: string, tagName: string): any {
return new Promise((resolve, reject) => {
let alfrescoApi = this.authService.getAlfrescoApi();
let tagBody = new alfrescoApi.core.TagBody();
tagBody.tag = tagName;
this.authService.getAlfrescoApi().core.tagsApi.addTag(nodeId, tagBody).then((res) => {
this.cacheTagList.push(res);
resolve(res);
}, function (error) {
console.log('Error' + error);
reject();
});
});
}
removeTag(nodeId: string, tag: string): any {
return new Promise((resolve, reject) => {
this.authService.getAlfrescoApi().core.tagsApi.removeTag(nodeId, tag).then(() => {
resolve();
}, function (error) {
console.log('Error' + error);
reject();
});
});
}
}

View File

@ -0,0 +1,27 @@
{
"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"
},
"exclude": [
"demo",
"node_modules",
"typings/main",
"typings/main.d.ts",
"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,7 @@
{
"globalDependencies": {
"core-js": "registry:dt/core-js#0.0.0+20160317120654",
"jasmine": "registry:dt/jasmine#2.2.0+20160505161446",
"node": "registry:dt/node#4.0.0+20160509154515"
}
}