mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-05-12 17:04:46 +00:00
remove obsolete projects from the repository (#648)
* use published version of dev tools * remove obsolete projects * fix spellcheck
This commit is contained in:
parent
57501a0ad7
commit
42d1040a82
@ -1,3 +1,4 @@
|
||||
node_modules
|
||||
src/assets/i18n
|
||||
e2e
|
||||
/angular.json
|
||||
|
112
angular.json
112
angular.json
@ -57,9 +57,9 @@
|
||||
"output": "./assets/workers"
|
||||
},
|
||||
{
|
||||
"glob": "**/*.json",
|
||||
"input": "dist/my-extension/assets",
|
||||
"output": "/assets/plugins"
|
||||
"glob": "dev.tools.json",
|
||||
"input": "node_modules/@denysvuika/aca-dev-tools/assets",
|
||||
"output": "./assets/plugins"
|
||||
}
|
||||
],
|
||||
"styles": [
|
||||
@ -207,112 +207,6 @@
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"aca-dev-tools": {
|
||||
"root": "projects/aca-dev-tools",
|
||||
"sourceRoot": "projects/aca-dev-tools/src",
|
||||
"projectType": "library",
|
||||
"prefix": "lib",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||
"options": {
|
||||
"tsConfig": "projects/aca-dev-tools/tsconfig.lib.json",
|
||||
"project": "projects/aca-dev-tools/ng-package.json"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"main": "projects/aca-dev-tools/src/test.ts",
|
||||
"tsConfig": "projects/aca-dev-tools/tsconfig.spec.json",
|
||||
"karmaConfig": "projects/aca-dev-tools/karma.conf.js"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"projects/aca-dev-tools/tsconfig.lib.json",
|
||||
"projects/aca-dev-tools/tsconfig.spec.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"adf-extensions": {
|
||||
"root": "projects/adf-extensions",
|
||||
"sourceRoot": "projects/adf-extensions/src",
|
||||
"projectType": "library",
|
||||
"prefix": "lib",
|
||||
"architect": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||
"options": {
|
||||
"tsConfig": "projects/adf-extensions/tsconfig.lib.json",
|
||||
"project": "projects/adf-extensions/ng-package.json"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"main": "projects/adf-extensions/src/test.ts",
|
||||
"tsConfig": "projects/adf-extensions/tsconfig.spec.json",
|
||||
"karmaConfig": "projects/adf-extensions/karma.conf.js",
|
||||
"sourceMap": true
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"projects/adf-extensions/tsconfig.lib.json",
|
||||
"projects/adf-extensions/tsconfig.spec.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"my-extension": {
|
||||
"root": "projects/my-extension",
|
||||
"sourceRoot": "projects/my-extension/src",
|
||||
"projectType": "library",
|
||||
"prefix": "lib",
|
||||
"targets": {
|
||||
"build": {
|
||||
"builder": "@angular-devkit/build-ng-packagr:build",
|
||||
"options": {
|
||||
"tsConfig": "projects/my-extension/tsconfig.lib.json",
|
||||
"project": "projects/my-extension/ng-package.json"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
"builder": "@angular-devkit/build-angular:karma",
|
||||
"options": {
|
||||
"main": "projects/my-extension/src/test.ts",
|
||||
"tsConfig": "projects/my-extension/tsconfig.spec.json",
|
||||
"karmaConfig": "projects/my-extension/karma.conf.js"
|
||||
}
|
||||
},
|
||||
"lint": {
|
||||
"builder": "@angular-devkit/build-angular:tslint",
|
||||
"options": {
|
||||
"tsConfig": [
|
||||
"projects/my-extension/tsconfig.lib.json",
|
||||
"projects/my-extension/tsconfig.spec.json"
|
||||
],
|
||||
"exclude": [
|
||||
"**/node_modules/**"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"defaultProject": "app",
|
||||
|
@ -47,11 +47,8 @@
|
||||
"exif",
|
||||
"cardview",
|
||||
"webm",
|
||||
"keycodes"
|
||||
"keycodes",
|
||||
"denysvuika"
|
||||
],
|
||||
"dictionaries": [
|
||||
"html",
|
||||
"en-gb",
|
||||
"en_US"
|
||||
]
|
||||
"dictionaries": ["html", "en-gb", "en_US"]
|
||||
}
|
||||
|
34
package-lock.json
generated
34
package-lock.json
generated
@ -1621,6 +1621,14 @@
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"@denysvuika/aca-dev-tools": {
|
||||
"version": "0.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@denysvuika/aca-dev-tools/-/aca-dev-tools-0.1.0.tgz",
|
||||
"integrity": "sha512-gk/Ryeq9T47vpLRSC4FIqbq/Z9YMYvQ6BmUNcgTbT9GfofCsEK8UQM4uBq29bS8k6Cs9X79HfTBOJAfXBDrnUg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"@mat-datetimepicker/core": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@mat-datetimepicker/core/-/core-2.0.1.tgz",
|
||||
@ -2578,12 +2586,6 @@
|
||||
"integrity": "sha512-ikB0JHv6vCR1KYUQAzTO4gi/lXLElT4Tx+6De2pc/OZwizE9LRNiTa+U8TBFKBD/nntPnr/MPSHSnOTybjhqNA==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/showdown": {
|
||||
"version": "1.7.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/showdown/-/showdown-1.7.5.tgz",
|
||||
"integrity": "sha512-uUSUP6XtyTclRzTH0NLkEIiEowxYXOWDeulpngrPltEceOmsGdhfrl8xr3D4QfJA7FuUUyHwFQuWWURLFg3hgg==",
|
||||
"dev": true
|
||||
},
|
||||
"@types/strip-bom": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz",
|
||||
@ -4526,26 +4528,6 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"cpr": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/cpr/-/cpr-3.0.1.tgz",
|
||||
"integrity": "sha1-uaVQOLfNgaNcF7l2GJW9hJau8eU=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"graceful-fs": "^4.1.5",
|
||||
"minimist": "^1.2.0",
|
||||
"mkdirp": "~0.5.1",
|
||||
"rimraf": "^2.5.4"
|
||||
},
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"create-ecdh": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
|
||||
|
19
package.json
19
package.json
@ -4,14 +4,12 @@
|
||||
"license": "LGPL-3.0",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
"start": "npm run server-versions && npm run build.libs && ng serve --open",
|
||||
"start:prod": "npm run server-versions && npm run build.libs && ng serve --prod --open",
|
||||
"build.libs": "ng build adf-extensions && ng build aca-dev-tools && npm run build:my-extension",
|
||||
"build": "npm run server-versions && npm run build.libs && node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng build app --prod",
|
||||
"build:dev": "npm run server-versions && npm run build.libs && ng build",
|
||||
"build:my-extension": "ng build my-extension && cpr projects/my-extension/assets dist/my-extension/assets --deleteFirst",
|
||||
"test": "npm run build.libs && ng test app --code-coverage",
|
||||
"test:ci": "npm run build.libs && ng test app --code-coverage --watch=false",
|
||||
"start": "npm run server-versions && ng serve --open",
|
||||
"start:prod": "npm run server-versions && ng serve --prod --open",
|
||||
"build": "npm run server-versions && node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng build app --prod",
|
||||
"build:dev": "npm run server-versions && ng build",
|
||||
"test": "ng test app --code-coverage",
|
||||
"test:ci": "ng test app --code-coverage --watch=false",
|
||||
"lint": "ng lint",
|
||||
"server-versions": "rimraf ./src/versions.json && npm list --depth=0 --json=true --prod=true > ./src/versions.json || exit 0",
|
||||
"__e2e": "ng e2e",
|
||||
@ -43,6 +41,7 @@
|
||||
"@angular/platform-browser": "6.1.7",
|
||||
"@angular/platform-browser-dynamic": "6.1.7",
|
||||
"@angular/router": "6.1.7",
|
||||
"@denysvuika/aca-dev-tools": "^0.1.0",
|
||||
"@mat-datetimepicker/core": "^2.0.1",
|
||||
"@mat-datetimepicker/moment": "^2.0.1",
|
||||
"@ngrx/effects": "^6.1.0",
|
||||
@ -51,8 +50,8 @@
|
||||
"@ngrx/store-devtools": "^6.1.0",
|
||||
"@ngstack/code-editor": "^0.4.3",
|
||||
"@ngx-translate/core": "^10.0.2",
|
||||
"chrome-remote-interface": "^0.26.1",
|
||||
"alfresco-js-api": "2.6.0-e0035744611f12f4f0067495615fa37ce392c810",
|
||||
"chrome-remote-interface": "^0.26.1",
|
||||
"core-js": "^2.5.7",
|
||||
"hammerjs": "2.0.8",
|
||||
"minimatch-browser": "^1.0.0",
|
||||
@ -75,10 +74,8 @@
|
||||
"@types/jasminewd2": "^2.0.2",
|
||||
"@types/node": "9.3.0",
|
||||
"@types/selenium-webdriver": "^3.0.8",
|
||||
"@types/showdown": "^1.7.5",
|
||||
"alfresco-js-api-node": "^2.5.0",
|
||||
"codelyzer": "^4.4.4",
|
||||
"cpr": "^3.0.1",
|
||||
"cspell": "^3.1.3",
|
||||
"jasmine-core": "~2.8.0",
|
||||
"jasmine-reporters": "^2.2.1",
|
||||
|
@ -1,31 +0,0 @@
|
||||
// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
module.exports = function (config) {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage-istanbul-reporter'),
|
||||
require('@angular-devkit/build-angular/plugins/karma')
|
||||
],
|
||||
client: {
|
||||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
coverageIstanbulReporter: {
|
||||
dir: require('path').join(__dirname, '../../coverage'),
|
||||
reports: ['html', 'lcovonly'],
|
||||
fixWebpackSourcePaths: true
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: config.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: false
|
||||
});
|
||||
};
|
@ -1,16 +0,0 @@
|
||||
{
|
||||
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
||||
"dest": "../../dist/aca-dev-tools",
|
||||
"deleteDestPath": false,
|
||||
"lib": {
|
||||
"entryFile": "src/public_api.ts",
|
||||
"flatModuleFile": "aca-dev-tools",
|
||||
"umdModuleIds": {
|
||||
"showdown": "showdown",
|
||||
"@alfresco/adf-core": "@alfresco/adf-core",
|
||||
"@ngstack/code-editor": "@ngstack/code-editor",
|
||||
"@alfresco/adf-content-services": "@alfresco/adf-content-services",
|
||||
"@alfresco/adf-extensions": "@alfresco/adf-extensions"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "aca-dev-tools",
|
||||
"version": "0.0.1",
|
||||
"peerDependencies": {
|
||||
"@angular/common": "^6.0.0",
|
||||
"@angular/core": "^6.0.0",
|
||||
"@ngstack/code-editor": "^0.4.1"
|
||||
}
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
<div class="inner-layout">
|
||||
<div class="inner-layout__header">
|
||||
<adf-breadcrumb root="app.extensions.json"></adf-breadcrumb>
|
||||
<adf-toolbar class="inline">
|
||||
<button
|
||||
mat-icon-button
|
||||
color="primary"
|
||||
title="Save changes"
|
||||
(click)="saveChanges()">
|
||||
<mat-icon>save_alt</mat-icon>
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
color="primary"
|
||||
title="Download"
|
||||
(click)="download()">
|
||||
<mat-icon>cloud_download</mat-icon>
|
||||
</button>
|
||||
<button
|
||||
mat-icon-button
|
||||
color="primary"
|
||||
title="Revert changes"
|
||||
(click)="revertChanges()">
|
||||
<mat-icon>history</mat-icon>
|
||||
</button>
|
||||
</adf-toolbar>
|
||||
</div>
|
||||
<div class="inner-layout__content">
|
||||
<div class="inner-layout__panel">
|
||||
|
||||
<div fxLayout="column" fxFill>
|
||||
<div fxLayout fxFlex>
|
||||
<div fxFlex="100">
|
||||
<ng-container *ngIf="model">
|
||||
<ngs-code-editor
|
||||
[codeModel]="model"
|
||||
(valueChanged)="onCodeChanged($event)">
|
||||
</ngs-code-editor>
|
||||
</ng-container>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
@ -1,23 +0,0 @@
|
||||
.lib-aca-dev-tools {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
min-height: 0;
|
||||
}
|
||||
|
||||
.ngs-code-editor {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
max-height: 100%;
|
||||
overflow: hidden;
|
||||
min-height: 0;
|
||||
|
||||
.editor {
|
||||
// border: 1px solid grey;
|
||||
// min-height: 400px;
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { AcaDevToolsComponent } from './aca-dev-tools.component';
|
||||
|
||||
describe('AcaDevToolsComponent', () => {
|
||||
let component: AcaDevToolsComponent;
|
||||
let fixture: ComponentFixture<AcaDevToolsComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ AcaDevToolsComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(AcaDevToolsComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
@ -1,89 +0,0 @@
|
||||
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
|
||||
import { CodeModel } from '@ngstack/code-editor';
|
||||
import { ActivatedRoute } from '@angular/router';
|
||||
import { HttpClient } from '@angular/common/http';
|
||||
import { forkJoin } from 'rxjs';
|
||||
|
||||
@Component({
|
||||
selector: 'aca-dev-tools-main',
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
host: { class: 'lib-aca-dev-tools' },
|
||||
templateUrl: './aca-dev-tools.component.html',
|
||||
styleUrls: ['./aca-dev-tools.component.scss']
|
||||
})
|
||||
export class AcaDevToolsComponent implements OnInit {
|
||||
model: CodeModel = null;
|
||||
|
||||
private code: string;
|
||||
|
||||
constructor(private route: ActivatedRoute, private http: HttpClient) {}
|
||||
|
||||
ngOnInit() {
|
||||
const routeData = this.route.snapshot.data;
|
||||
if (!routeData) {
|
||||
return;
|
||||
}
|
||||
|
||||
const schemaUri = routeData.schemaUri;
|
||||
const getSchema = this.http.get(routeData.schemaPath);
|
||||
const getConfig = this.http.get(routeData.configPath, {
|
||||
responseType: 'text'
|
||||
});
|
||||
|
||||
forkJoin([getSchema, getConfig]).subscribe(
|
||||
([schema, config]) => {
|
||||
let code = config;
|
||||
|
||||
const override = sessionStorage.getItem('aca.extension.config');
|
||||
if (override) {
|
||||
code = override;
|
||||
}
|
||||
|
||||
this.model = {
|
||||
language: 'json',
|
||||
uri: 'app.extensions.json',
|
||||
value: code,
|
||||
schemas: [
|
||||
{
|
||||
uri: schemaUri,
|
||||
schema
|
||||
}
|
||||
]
|
||||
};
|
||||
this.code = code;
|
||||
},
|
||||
err => {
|
||||
console.log(err);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
onCodeChanged(value: string) {
|
||||
this.code = value;
|
||||
}
|
||||
|
||||
saveChanges() {
|
||||
sessionStorage.setItem('aca.extension.config', this.code);
|
||||
// window.location.reload(true);
|
||||
}
|
||||
|
||||
revertChanges() {
|
||||
sessionStorage.removeItem('aca.extension.config');
|
||||
window.location.reload(true);
|
||||
}
|
||||
|
||||
download() {
|
||||
const element = document.createElement('a');
|
||||
element.setAttribute(
|
||||
'href',
|
||||
'data:text/plain;charset=utf-8,' + encodeURIComponent(this.code)
|
||||
);
|
||||
element.setAttribute('download', 'plugin.json');
|
||||
element.style.display = 'none';
|
||||
document.body.appendChild(element);
|
||||
|
||||
element.click();
|
||||
|
||||
document.body.removeChild(element);
|
||||
}
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { CodeEditorModule } from '@ngstack/code-editor';
|
||||
import { FlexLayoutModule } from '@angular/flex-layout';
|
||||
import { AcaDevToolsComponent } from './aca-dev-tools.component';
|
||||
import { CoreModule } from '@alfresco/adf-core';
|
||||
import { ContentModule } from '@alfresco/adf-content-services';
|
||||
import { ExtensionService } from '@alfresco/adf-extensions';
|
||||
import { MarkdownViewComponent } from './viewer/markdown-view/markdown-view.component';
|
||||
|
||||
export function components() {
|
||||
return [
|
||||
AcaDevToolsComponent,
|
||||
MarkdownViewComponent
|
||||
];
|
||||
}
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
FlexLayoutModule,
|
||||
CodeEditorModule.forChild(),
|
||||
CoreModule.forChild(),
|
||||
ContentModule.forChild()
|
||||
],
|
||||
declarations: components(),
|
||||
exports: components(),
|
||||
entryComponents: components()
|
||||
})
|
||||
export class AcaDevToolsModule {
|
||||
constructor(extensions: ExtensionService) {
|
||||
extensions.setComponents({
|
||||
'dev.tools.component': AcaDevToolsComponent,
|
||||
'dev.tools.viewer.markdown': MarkdownViewComponent
|
||||
});
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
.aca-markdown-view {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.adf-viewer-content-container {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.adf-viewer-custom-content {
|
||||
overflow: scroll;
|
||||
height: 100%;
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Alfresco Example Content Application
|
||||
*
|
||||
* Copyright (C) 2005 - 2018 Alfresco Software Limited
|
||||
*
|
||||
* This file is part of the Alfresco Example Content Application.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
OnInit,
|
||||
ViewEncapsulation
|
||||
} from '@angular/core';
|
||||
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
|
||||
import { AlfrescoApiService } from '@alfresco/adf-core';
|
||||
// import { DomSanitizer, SafeHtml } from '@angular/platform-browser';
|
||||
import { Converter } from 'showdown';
|
||||
|
||||
@Component({
|
||||
selector: 'aca-markdown-view',
|
||||
template: `<div class="content" [innerHTML]="content"></div>`,
|
||||
styleUrls: ['./markdown-view.component.scss'],
|
||||
encapsulation: ViewEncapsulation.None,
|
||||
host: { 'class': 'aca-markdown-view' }
|
||||
})
|
||||
export class MarkdownViewComponent implements OnInit {
|
||||
@Input()
|
||||
url: string;
|
||||
|
||||
@Input()
|
||||
node: MinimalNodeEntryEntity;
|
||||
|
||||
// content: SafeHtml = null;
|
||||
content: string = null;
|
||||
|
||||
constructor(
|
||||
private apiService: AlfrescoApiService
|
||||
// private sanitizer: DomSanitizer
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.apiService.nodesApi.getFileContent(this.node.id).then(
|
||||
result => {
|
||||
const converter = new Converter({
|
||||
tables: true,
|
||||
ghCodeBlocks: true,
|
||||
ghCompatibleHeaderId: true,
|
||||
simplifiedAutoLink: true
|
||||
});
|
||||
converter.setOption('metadata', true);
|
||||
converter.setFlavor('github');
|
||||
|
||||
const html = converter.makeHtml(result);
|
||||
// this.content = this.sanitizer.bypassSecurityTrustHtml(html);
|
||||
this.content = html;
|
||||
},
|
||||
err => console.log(err)
|
||||
);
|
||||
}
|
||||
}
|
@ -1,6 +0,0 @@
|
||||
/*
|
||||
* Public API Surface of aca-dev-tools
|
||||
*/
|
||||
|
||||
export * from './lib/aca-dev-tools.component';
|
||||
export * from './lib/aca-dev-tools.module';
|
@ -1,22 +0,0 @@
|
||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||
|
||||
import 'core-js/es7/reflect';
|
||||
import 'zone.js/dist/zone';
|
||||
import 'zone.js/dist/zone-testing';
|
||||
import { getTestBed } from '@angular/core/testing';
|
||||
import {
|
||||
BrowserDynamicTestingModule,
|
||||
platformBrowserDynamicTesting
|
||||
} from '@angular/platform-browser-dynamic/testing';
|
||||
|
||||
declare const require: any;
|
||||
|
||||
// First, initialize the Angular testing environment.
|
||||
getTestBed().initTestEnvironment(
|
||||
BrowserDynamicTestingModule,
|
||||
platformBrowserDynamicTesting()
|
||||
);
|
||||
// Then we find all the tests.
|
||||
const context = require.context('./', true, /\.spec\.ts$/);
|
||||
// And load the modules.
|
||||
context.keys().map(context);
|
@ -1,34 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../out-tsc/lib",
|
||||
"target": "es2015",
|
||||
"module": "es2015",
|
||||
"moduleResolution": "node",
|
||||
"declaration": true,
|
||||
"sourceMap": true,
|
||||
"inlineSources": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"importHelpers": true,
|
||||
"types": [],
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015"
|
||||
]
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotateForClosureCompiler": true,
|
||||
"skipTemplateCodegen": true,
|
||||
"strictMetadataEmit": true,
|
||||
"fullTemplateTypeCheck": true,
|
||||
"strictInjectionParameters": true,
|
||||
"flatModuleId": "AUTOGENERATED",
|
||||
"flatModuleOutFile": "AUTOGENERATED",
|
||||
"enableResourceInlining": true
|
||||
},
|
||||
"exclude": [
|
||||
"src/test.ts",
|
||||
"**/*.spec.ts"
|
||||
]
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../out-tsc/spec",
|
||||
"types": [
|
||||
"jasmine",
|
||||
"node"
|
||||
]
|
||||
},
|
||||
"files": [
|
||||
"src/test.ts"
|
||||
],
|
||||
"include": [
|
||||
"**/*.spec.ts",
|
||||
"**/*.d.ts"
|
||||
]
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": "../../tslint.json",
|
||||
"rules": {
|
||||
"directive-selector": [
|
||||
true,
|
||||
"attribute",
|
||||
"aca",
|
||||
"camelCase"
|
||||
],
|
||||
"component-selector": [
|
||||
true,
|
||||
"element",
|
||||
"aca",
|
||||
"kebab-case"
|
||||
]
|
||||
}
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
module.exports = function (config) {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage-istanbul-reporter'),
|
||||
require('@angular-devkit/build-angular/plugins/karma')
|
||||
],
|
||||
client: {
|
||||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
coverageIstanbulReporter: {
|
||||
dir: require('path').join(__dirname, '../../coverage'),
|
||||
reports: ['html', 'lcovonly'],
|
||||
fixWebpackSourcePaths: true
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: config.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: [/*'Chrome',*/ 'ChromeHeadless'],
|
||||
customLaunchers: {
|
||||
ChromeHeadless: {
|
||||
base: 'Chrome',
|
||||
flags: [
|
||||
'--no-sandbox',
|
||||
'--headless',
|
||||
'--disable-gpu',
|
||||
'--remote-debugging-port=9222'
|
||||
]
|
||||
}
|
||||
},
|
||||
singleRun: false
|
||||
});
|
||||
};
|
@ -1,9 +0,0 @@
|
||||
{
|
||||
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
||||
"dest": "../../dist/@alfresco/adf-extensions",
|
||||
"deleteDestPath": false,
|
||||
"lib": {
|
||||
"languageLevel": ["dom", "es2017"],
|
||||
"entryFile": "src/public_api.ts"
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"name": "@alfresco/adf-extensions",
|
||||
"version": "0.0.1",
|
||||
"peerDependencies": {
|
||||
"@angular/common": "^6.0.0",
|
||||
"@angular/core": "^6.0.0",
|
||||
"@angular/http": "^6.1.4",
|
||||
"alfresco-js-api": "^2.5.0"
|
||||
}
|
||||
}
|
@ -1,67 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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,
|
||||
ComponentRef,
|
||||
OnInit,
|
||||
ComponentFactoryResolver,
|
||||
ViewChild,
|
||||
ViewContainerRef,
|
||||
OnDestroy
|
||||
} from '@angular/core';
|
||||
import { ExtensionService } from '../../services/extension.service';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-dynamic-component',
|
||||
template: `<div #content></div>`
|
||||
})
|
||||
export class DynamicExtensionComponent implements OnInit, OnDestroy {
|
||||
@ViewChild('content', { read: ViewContainerRef })
|
||||
content: ViewContainerRef;
|
||||
|
||||
@Input() id: string;
|
||||
|
||||
private componentRef: ComponentRef<any>;
|
||||
|
||||
constructor(
|
||||
private extensions: ExtensionService,
|
||||
private componentFactoryResolver: ComponentFactoryResolver
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
const componentType = this.extensions.getComponentById(this.id);
|
||||
if (componentType) {
|
||||
const factory = this.componentFactoryResolver.resolveComponentFactory(
|
||||
componentType
|
||||
);
|
||||
if (factory) {
|
||||
this.content.clear();
|
||||
this.componentRef = this.content.createComponent(factory, 0);
|
||||
// this.setupWidget(this.componentRef);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
if (this.componentRef) {
|
||||
this.componentRef.destroy();
|
||||
this.componentRef = null;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,94 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Alfresco Example Content Application
|
||||
*
|
||||
* Copyright (C) 2005 - 2018 Alfresco Software Limited
|
||||
*
|
||||
* This file is part of the Alfresco Example Content Application.
|
||||
* If the software was purchased under a paid Alfresco license, the terms of
|
||||
* the paid license agreement will prevail. Otherwise, the software is
|
||||
* provided under the following open source license terms:
|
||||
*
|
||||
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import {
|
||||
Component,
|
||||
Input,
|
||||
OnInit,
|
||||
OnDestroy,
|
||||
ViewChild,
|
||||
ViewContainerRef,
|
||||
ComponentRef,
|
||||
ComponentFactoryResolver,
|
||||
OnChanges,
|
||||
SimpleChanges
|
||||
} from '@angular/core';
|
||||
import { MinimalNodeEntryEntity } from 'alfresco-js-api';
|
||||
import { ExtensionService } from '../../services/extension.service';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-dynamic-tab',
|
||||
template: `<div #content></div>`
|
||||
})
|
||||
export class DynamicTabComponent implements OnInit, OnChanges, OnDestroy {
|
||||
@ViewChild('content', { read: ViewContainerRef })
|
||||
content: ViewContainerRef;
|
||||
|
||||
@Input()
|
||||
id: string;
|
||||
|
||||
@Input()
|
||||
node: MinimalNodeEntryEntity;
|
||||
|
||||
private componentRef: ComponentRef<any>;
|
||||
|
||||
constructor(
|
||||
private extensions: ExtensionService,
|
||||
private componentFactoryResolver: ComponentFactoryResolver
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
const componentType = this.extensions.getComponentById(this.id);
|
||||
if (componentType) {
|
||||
const factory = this.componentFactoryResolver.resolveComponentFactory(
|
||||
componentType
|
||||
);
|
||||
if (factory) {
|
||||
this.content.clear();
|
||||
this.componentRef = this.content.createComponent(factory, 0);
|
||||
this.updateInstance();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ngOnChanges(changes: SimpleChanges) {
|
||||
if (changes.node) {
|
||||
this.updateInstance();
|
||||
}
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
if (this.componentRef) {
|
||||
this.componentRef.destroy();
|
||||
this.componentRef = null;
|
||||
}
|
||||
}
|
||||
|
||||
private updateInstance() {
|
||||
if (this.componentRef && this.componentRef.instance) {
|
||||
this.componentRef.instance.node = this.node;
|
||||
}
|
||||
}
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ExtensionElement } from './extension-element';
|
||||
|
||||
export enum ContentActionType {
|
||||
default = 'default',
|
||||
button = 'button',
|
||||
separator = 'separator',
|
||||
menu = 'menu',
|
||||
custom = 'custom'
|
||||
}
|
||||
|
||||
export interface ContentActionRef extends ExtensionElement {
|
||||
type: ContentActionType;
|
||||
|
||||
title?: string;
|
||||
description?: string;
|
||||
icon?: string;
|
||||
children?: Array<ContentActionRef>;
|
||||
component?: string;
|
||||
actions?: {
|
||||
click?: string;
|
||||
[key: string]: string;
|
||||
};
|
||||
rules?: {
|
||||
enabled?: string;
|
||||
visible?: string;
|
||||
[key: string]: string;
|
||||
};
|
||||
}
|
||||
|
||||
export interface ActionRef {
|
||||
id: string;
|
||||
type: string;
|
||||
payload?: string;
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export interface ExtensionElement {
|
||||
id: string;
|
||||
|
||||
order?: number;
|
||||
disabled?: boolean;
|
||||
}
|
@ -1,150 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ContentActionRef, ContentActionType } from './action.extensions';
|
||||
|
||||
export function getValue(target: any, key: string): any {
|
||||
if (!target) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const keys = key.split('.');
|
||||
key = '';
|
||||
|
||||
do {
|
||||
key += keys.shift();
|
||||
const value = target[key];
|
||||
if (
|
||||
value !== undefined &&
|
||||
(typeof value === 'object' || !keys.length)
|
||||
) {
|
||||
target = value;
|
||||
key = '';
|
||||
} else if (!keys.length) {
|
||||
target = undefined;
|
||||
} else {
|
||||
key += '.';
|
||||
}
|
||||
} while (keys.length);
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
export function filterEnabled(entry: { disabled?: boolean }): boolean {
|
||||
return !entry.disabled;
|
||||
}
|
||||
|
||||
export function sortByOrder(
|
||||
a: { order?: number | undefined },
|
||||
b: { order?: number | undefined }
|
||||
) {
|
||||
const left = a.order === undefined ? Number.MAX_SAFE_INTEGER : a.order;
|
||||
const right = b.order === undefined ? Number.MAX_SAFE_INTEGER : b.order;
|
||||
return left - right;
|
||||
}
|
||||
|
||||
export function reduceSeparators(
|
||||
acc: ContentActionRef[],
|
||||
el: ContentActionRef,
|
||||
i: number,
|
||||
arr: ContentActionRef[]
|
||||
): ContentActionRef[] {
|
||||
// remove leading separator
|
||||
if (i === 0) {
|
||||
if (arr[i].type === ContentActionType.separator) {
|
||||
return acc;
|
||||
}
|
||||
}
|
||||
// remove duplicate separators
|
||||
if (i > 0) {
|
||||
const prev = arr[i - 1];
|
||||
if (
|
||||
prev.type === ContentActionType.separator &&
|
||||
el.type === ContentActionType.separator
|
||||
) {
|
||||
return acc;
|
||||
}
|
||||
|
||||
// remove trailing separator
|
||||
if (i === arr.length - 1) {
|
||||
if (el.type === ContentActionType.separator) {
|
||||
return acc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return acc.concat(el);
|
||||
}
|
||||
|
||||
export function reduceEmptyMenus(
|
||||
acc: ContentActionRef[],
|
||||
el: ContentActionRef
|
||||
): ContentActionRef[] {
|
||||
if (el.type === ContentActionType.menu) {
|
||||
if ((el.children || []).length === 0) {
|
||||
return acc;
|
||||
}
|
||||
}
|
||||
return acc.concat(el);
|
||||
}
|
||||
|
||||
export function mergeObjects(...objects): any {
|
||||
const result = {};
|
||||
|
||||
objects.forEach(source => {
|
||||
Object.keys(source).forEach(prop => {
|
||||
if (!prop.startsWith('$')) {
|
||||
if (prop in result && Array.isArray(result[prop])) {
|
||||
// result[prop] = result[prop].concat(source[prop]);
|
||||
result[prop] = mergeArrays(result[prop], source[prop]);
|
||||
} else if (prop in result && typeof result[prop] === 'object') {
|
||||
result[prop] = mergeObjects(result[prop], source[prop]);
|
||||
} else {
|
||||
result[prop] = source[prop];
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function mergeArrays(left: any[], right: any[]): any[] {
|
||||
const result = [];
|
||||
const map = {};
|
||||
|
||||
(left || []).forEach(entry => {
|
||||
const element = entry;
|
||||
if (element && element.hasOwnProperty('id')) {
|
||||
map[element.id] = element;
|
||||
} else {
|
||||
result.push(element);
|
||||
}
|
||||
});
|
||||
|
||||
(right || []).forEach(entry => {
|
||||
const element = entry;
|
||||
if (element && element.hasOwnProperty('id') && map[element.id]) {
|
||||
const merged = mergeObjects(map[element.id], element);
|
||||
map[element.id] = merged;
|
||||
} else {
|
||||
result.push(element);
|
||||
}
|
||||
});
|
||||
|
||||
return Object.values(map).concat(result);
|
||||
}
|
@ -1,35 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { RouteRef } from './routing.extensions';
|
||||
import { RuleRef } from './rule.extensions';
|
||||
import { ActionRef } from './action.extensions';
|
||||
|
||||
export interface ExtensionConfig {
|
||||
$name: string;
|
||||
$version: string;
|
||||
$description?: string;
|
||||
$references?: Array<string>;
|
||||
|
||||
rules?: Array<RuleRef>;
|
||||
routes?: Array<RouteRef>;
|
||||
actions?: Array<ActionRef>;
|
||||
|
||||
features?: {
|
||||
[key: string]: any;
|
||||
};
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ExtensionElement } from './extension-element';
|
||||
|
||||
export interface NavBarGroupRef extends ExtensionElement {
|
||||
items: Array<NavBarLinkRef>;
|
||||
}
|
||||
|
||||
export interface NavBarLinkRef extends ExtensionElement {
|
||||
icon: string;
|
||||
title: string;
|
||||
route: string;
|
||||
|
||||
url?: string; // evaluated at runtime based on route ref
|
||||
description?: string;
|
||||
}
|
@ -1,20 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export interface NodePermissions {
|
||||
check(source: any, permissions: string[], options?: any): boolean;
|
||||
}
|
@ -1,26 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export interface RouteRef {
|
||||
id: string;
|
||||
path: string;
|
||||
component: string;
|
||||
|
||||
layout?: string;
|
||||
auth?: string[];
|
||||
data?: { [key: string]: string };
|
||||
}
|
@ -1,44 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { SelectionState } from '../store/states/selection.state';
|
||||
import { NavigationState } from '../store/states/navigation.state';
|
||||
import { NodePermissions } from './permission.extensions';
|
||||
import { ProfileState } from '../store/states/profile.state';
|
||||
|
||||
export type RuleEvaluator = (context: RuleContext, ...args: any[]) => boolean;
|
||||
|
||||
export interface RuleContext {
|
||||
selection: SelectionState;
|
||||
navigation: NavigationState;
|
||||
profile: ProfileState;
|
||||
permissions: NodePermissions;
|
||||
|
||||
getEvaluator(key: string): RuleEvaluator;
|
||||
}
|
||||
|
||||
export class RuleRef {
|
||||
type: string;
|
||||
id?: string;
|
||||
parameters?: Array<RuleParameter>;
|
||||
}
|
||||
|
||||
export interface RuleParameter {
|
||||
type: string;
|
||||
value: any;
|
||||
parameters?: Array<RuleParameter>;
|
||||
}
|
@ -1,29 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ExtensionElement } from './extension-element';
|
||||
|
||||
export interface SidebarTabRef extends ExtensionElement {
|
||||
title: string;
|
||||
component: string;
|
||||
|
||||
icon?: string;
|
||||
rules?: {
|
||||
visible?: string;
|
||||
[key: string]: string;
|
||||
};
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ExtensionElement } from './extension-element';
|
||||
|
||||
export interface ViewerExtensionRef extends ExtensionElement {
|
||||
fileExtension: string;
|
||||
component: string;
|
||||
}
|
@ -1,237 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { every, not, some } from './core.evaluators';
|
||||
import { RuleParameter } from '../config/rule.extensions';
|
||||
|
||||
describe('Core Evaluators', () => {
|
||||
|
||||
const context: any = {
|
||||
getEvaluator(key: string) {
|
||||
switch (key) {
|
||||
case 'positive':
|
||||
return () => true;
|
||||
case 'negative':
|
||||
return () => false;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
describe('not', () => {
|
||||
it('should evaluate a single rule to [true]', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const result = not(context, parameter);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when no parameters provided', () => {
|
||||
const result = not(context);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when evaluator not available', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'missing'
|
||||
};
|
||||
|
||||
const result = not(context, parameter);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate a single rule to [false]', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const result = not(context, parameter);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate multiple rules to [true]', () => {
|
||||
const parameter1: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const parameter2: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const parameter3: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const result = not(context, parameter1, parameter2, parameter3);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when one of the rules fails', () => {
|
||||
const parameter1: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const parameter2: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const parameter3: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const result = not(context, parameter1, parameter2, parameter3);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
});
|
||||
|
||||
describe('every', () => {
|
||||
it('should evaluate a single rule to [true]', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const result = every(context, parameter);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when no parameters provided', () => {
|
||||
const result = every(context);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when evaluator not available', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'missing'
|
||||
};
|
||||
|
||||
const result = every(context, parameter);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate a single rule to [false]', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const result = every(context, parameter);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate multiple rules to [true]', () => {
|
||||
const parameter1: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const parameter2: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const parameter3: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const result = every(context, parameter1, parameter2, parameter3);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when one of the rules fails', () => {
|
||||
const parameter1: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const parameter2: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const parameter3: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const result = every(context, parameter1, parameter2, parameter3);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
});
|
||||
|
||||
describe('some', () => {
|
||||
it('should evaluate a single rule to [true]', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const result = some(context, parameter);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when no parameters provided', () => {
|
||||
const result = some(context);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate to [false] when evaluator not available', () => {
|
||||
const parameter: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'missing'
|
||||
};
|
||||
|
||||
const result = some(context, parameter);
|
||||
expect(result).toBeFalsy();
|
||||
});
|
||||
|
||||
it('should evaluate to [true] if any rule succeeds', () => {
|
||||
const parameter1: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const parameter2: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'positive'
|
||||
};
|
||||
|
||||
const parameter3: RuleParameter = {
|
||||
type: 'primitive',
|
||||
value: 'negative'
|
||||
};
|
||||
|
||||
const result = some(context, parameter1, parameter2, parameter3);
|
||||
expect(result).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
@ -1,66 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { RuleContext, RuleParameter } from '../config/rule.extensions';
|
||||
|
||||
export function not(context: RuleContext, ...args: RuleParameter[]): boolean {
|
||||
if (!args || args.length === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return args
|
||||
.every(arg => {
|
||||
const evaluator = context.getEvaluator(arg.value);
|
||||
if (!evaluator) {
|
||||
console.warn('evaluator not found: ' + arg.value);
|
||||
return false;
|
||||
}
|
||||
return !evaluator(context, ...(arg.parameters || []));
|
||||
});
|
||||
}
|
||||
|
||||
export function every(context: RuleContext, ...args: RuleParameter[]): boolean {
|
||||
if (!args || args.length === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return args
|
||||
.every(arg => {
|
||||
const evaluator = context.getEvaluator(arg.value);
|
||||
if (!evaluator) {
|
||||
console.warn('evaluator not found: ' + arg.value);
|
||||
return false;
|
||||
}
|
||||
return evaluator(context, ...(arg.parameters || []));
|
||||
});
|
||||
}
|
||||
|
||||
export function some(context: RuleContext, ...args: RuleParameter[]): boolean {
|
||||
if (!args || args.length === 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return args
|
||||
.some(arg => {
|
||||
const evaluator = context.getEvaluator(arg.value);
|
||||
if (!evaluator) {
|
||||
console.warn('evaluator not found: ' + arg.value);
|
||||
return false;
|
||||
}
|
||||
return evaluator(context, ...(arg.parameters || []));
|
||||
});
|
||||
}
|
@ -1,42 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ExtensionLoaderService } from './services/extension-loader.service';
|
||||
import { ExtensionService } from './services/extension.service';
|
||||
import { DynamicExtensionComponent } from './components/dynamic-component/dynamic.component';
|
||||
import { DynamicTabComponent } from './components/dynamic-tab/dynamic-tab.component';
|
||||
|
||||
@NgModule({
|
||||
imports: [],
|
||||
declarations: [DynamicExtensionComponent, DynamicTabComponent],
|
||||
exports: [DynamicExtensionComponent, DynamicTabComponent]
|
||||
})
|
||||
export class ExtensionsModule {
|
||||
static forRoot(): ModuleWithProviders {
|
||||
return {
|
||||
ngModule: ExtensionsModule,
|
||||
providers: [ExtensionLoaderService, ExtensionService]
|
||||
};
|
||||
}
|
||||
|
||||
static forChild(): ModuleWithProviders {
|
||||
return {
|
||||
ngModule: ExtensionsModule
|
||||
};
|
||||
}
|
||||
}
|
@ -1,140 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { HttpClient } from '@angular/common/http';
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ActionRef, ContentActionRef, ContentActionType } from '../config/action.extensions';
|
||||
import { ExtensionElement } from '../config/extension-element';
|
||||
import { filterEnabled, getValue, mergeObjects, sortByOrder } from '../config/extension-utils';
|
||||
import { ExtensionConfig } from '../config/extension.config';
|
||||
import { RouteRef } from '../config/routing.extensions';
|
||||
import { RuleRef } from '../config/rule.extensions';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class ExtensionLoaderService {
|
||||
constructor(private http: HttpClient) {}
|
||||
|
||||
load(configPath: string, pluginsPath: string): Promise<ExtensionConfig> {
|
||||
return new Promise<any>(resolve => {
|
||||
this.loadConfig(configPath, 0).then(result => {
|
||||
let config = result.config;
|
||||
|
||||
const override = sessionStorage.getItem('aca.extension.config');
|
||||
if (override) {
|
||||
console.log('overriding extension config');
|
||||
config = JSON.parse(override);
|
||||
}
|
||||
|
||||
const externalPlugins =
|
||||
localStorage.getItem('experimental.external-plugins') ===
|
||||
'true';
|
||||
|
||||
if (
|
||||
externalPlugins &&
|
||||
config.$references &&
|
||||
config.$references.length > 0
|
||||
) {
|
||||
const plugins = config.$references.map((name, idx) =>
|
||||
this.loadConfig(`${pluginsPath}/${name}`, idx)
|
||||
);
|
||||
|
||||
Promise.all(plugins).then(results => {
|
||||
const configs = results
|
||||
.filter(entry => entry)
|
||||
.sort(sortByOrder)
|
||||
.map(entry => entry.config);
|
||||
|
||||
if (configs.length > 0) {
|
||||
config = mergeObjects(config, ...configs);
|
||||
}
|
||||
|
||||
resolve(config);
|
||||
});
|
||||
} else {
|
||||
resolve(config);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
protected loadConfig(
|
||||
url: string,
|
||||
order: number
|
||||
): Promise<{ order: number; config: ExtensionConfig }> {
|
||||
return new Promise(resolve => {
|
||||
this.http.get<ExtensionConfig>(url).subscribe(
|
||||
config => {
|
||||
resolve({
|
||||
order,
|
||||
config
|
||||
});
|
||||
},
|
||||
error => {
|
||||
console.log(error);
|
||||
resolve(null);
|
||||
}
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
getElements<T extends ExtensionElement>(
|
||||
config: ExtensionConfig,
|
||||
key: string,
|
||||
fallback: Array<T> = []
|
||||
): Array<T> {
|
||||
const values = getValue(config, key) || fallback || [];
|
||||
return values.filter(filterEnabled).sort(sortByOrder);
|
||||
}
|
||||
|
||||
getContentActions(
|
||||
config: ExtensionConfig,
|
||||
key: string
|
||||
): Array<ContentActionRef> {
|
||||
return this.getElements(config, key).map(this.setActionDefaults);
|
||||
}
|
||||
|
||||
getRules(config: ExtensionConfig): Array<RuleRef> {
|
||||
if (config && config.rules) {
|
||||
return config.rules;
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
getRoutes(config: ExtensionConfig): Array<RouteRef> {
|
||||
if (config) {
|
||||
return config.routes || [];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
getActions(config: ExtensionConfig): Array<ActionRef> {
|
||||
if (config) {
|
||||
return config.actions || [];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
protected setActionDefaults(action: ContentActionRef): ContentActionRef {
|
||||
if (action) {
|
||||
action.type = action.type || ContentActionType.default;
|
||||
action.icon = action.icon || 'extension';
|
||||
}
|
||||
return action;
|
||||
}
|
||||
}
|
@ -1,379 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { ExtensionService } from './extension.service';
|
||||
import { ExtensionLoaderService } from './extension-loader.service';
|
||||
import { ExtensionConfig } from '../config/extension.config';
|
||||
import { RuleRef } from '../config/rule.extensions';
|
||||
import { RouteRef } from '../config/routing.extensions';
|
||||
import { ActionRef } from '../config/action.extensions';
|
||||
|
||||
describe('ExtensionService', () => {
|
||||
const blankConfig: ExtensionConfig = {
|
||||
$name: 'test.config',
|
||||
$version: '1.0.0'
|
||||
};
|
||||
|
||||
let loader: ExtensionLoaderService;
|
||||
let service: ExtensionService;
|
||||
|
||||
beforeEach(() => {
|
||||
loader = new ExtensionLoaderService(null);
|
||||
service = new ExtensionService(loader);
|
||||
});
|
||||
|
||||
it('should load and setup a config', async () => {
|
||||
spyOn(loader, 'load').and.callFake(() => {
|
||||
return Promise.resolve(blankConfig);
|
||||
});
|
||||
|
||||
spyOn(service, 'setup').and.stub();
|
||||
|
||||
await service.load();
|
||||
|
||||
expect(loader.load).toHaveBeenCalled();
|
||||
expect(service.setup).toHaveBeenCalledWith(blankConfig);
|
||||
});
|
||||
|
||||
it('should raise warning if setting up with missing config', () => {
|
||||
spyOn(console, 'warn').and.stub();
|
||||
|
||||
service.setup(null);
|
||||
|
||||
expect(console.warn).toHaveBeenCalledWith('Extension configuration not found');
|
||||
});
|
||||
|
||||
it('should setup default evaluators', () => {
|
||||
service.setup(blankConfig);
|
||||
|
||||
const evaluators = ['core.every', 'core.some', 'core.not'];
|
||||
evaluators.forEach(key => {
|
||||
expect(service.getEvaluator(key)).toBeDefined(`Evaluator ${key} is missing`);
|
||||
});
|
||||
});
|
||||
|
||||
it('should set custom evaluators', () => {
|
||||
const evaluator1 = () => true;
|
||||
const evaluator2 = () => false;
|
||||
|
||||
service.setEvaluators({
|
||||
'eval1': evaluator1,
|
||||
'eval2': evaluator2
|
||||
});
|
||||
|
||||
expect(service.getEvaluator('eval1')).toBe(evaluator1);
|
||||
expect(service.getEvaluator('eval2')).toBe(evaluator2);
|
||||
});
|
||||
|
||||
it('should override existing evaluators', () => {
|
||||
const evaluator1 = () => true;
|
||||
const evaluator2 = () => false;
|
||||
|
||||
service.setup(blankConfig);
|
||||
expect(service.getEvaluator('core.every')).toBeDefined();
|
||||
expect(service.getEvaluator('core.every')).not.toBe(evaluator1);
|
||||
|
||||
service.setEvaluators({
|
||||
'core.every': evaluator1,
|
||||
'eval2': evaluator2
|
||||
});
|
||||
|
||||
expect(service.getEvaluator('core.every')).toBe(evaluator1);
|
||||
expect(service.getEvaluator('eval2')).toBe(evaluator2);
|
||||
});
|
||||
|
||||
it('should negate existing evaluator', () => {
|
||||
const positive = () => true;
|
||||
|
||||
service.setEvaluators({
|
||||
'positive': positive
|
||||
});
|
||||
|
||||
let evaluator = service.getEvaluator('positive');
|
||||
expect(evaluator(null)).toBe(true);
|
||||
|
||||
evaluator = service.getEvaluator('!positive');
|
||||
expect(evaluator(null, 'param1', 'param2')).toBe(false);
|
||||
});
|
||||
|
||||
it('should not update evaluators with null value', () => {
|
||||
service.setup(blankConfig);
|
||||
service.setEvaluators(null);
|
||||
|
||||
expect(service.getEvaluator('core.every')).toBeDefined();
|
||||
});
|
||||
|
||||
it('should set authentication guards', () => {
|
||||
let registered = service.getAuthGuards(['guard1']);
|
||||
expect(registered.length).toBe(0);
|
||||
|
||||
const guard1: any = {};
|
||||
const guard2: any = {};
|
||||
|
||||
service.setAuthGuards({
|
||||
'auth1': guard1,
|
||||
'auth2': guard2
|
||||
});
|
||||
|
||||
registered = service.getAuthGuards(['auth1', 'auth2']);
|
||||
expect(registered.length).toBe(2);
|
||||
expect(registered[0]).toBe(guard1);
|
||||
expect(registered[1]).toBe(guard2);
|
||||
});
|
||||
|
||||
it('should overwrite authentication guards', () => {
|
||||
const guard1: any = {};
|
||||
const guard2: any = {};
|
||||
|
||||
service.setAuthGuards({
|
||||
'auth': guard1
|
||||
});
|
||||
|
||||
expect(service.getAuthGuards(['auth'])).toEqual([guard1]);
|
||||
|
||||
service.setAuthGuards({
|
||||
'auth': guard2
|
||||
});
|
||||
|
||||
expect(service.getAuthGuards(['auth'])).toEqual([guard2]);
|
||||
});
|
||||
|
||||
it('should not set authentication guards with null value', () => {
|
||||
const guard1: any = {};
|
||||
|
||||
service.setAuthGuards({
|
||||
'auth': guard1
|
||||
});
|
||||
|
||||
service.setAuthGuards(null);
|
||||
|
||||
expect(service.getAuthGuards(['auth'])).toEqual([guard1]);
|
||||
});
|
||||
|
||||
it('should not fetch auth guards for missing ids', () => {
|
||||
const guards = service.getAuthGuards(null);
|
||||
expect(guards).toEqual([]);
|
||||
});
|
||||
|
||||
it('should set components', () => {
|
||||
const component: any = {};
|
||||
|
||||
service.setComponents({
|
||||
'component1': component
|
||||
});
|
||||
|
||||
expect(service.getComponentById('component1')).toBe(component);
|
||||
});
|
||||
|
||||
it('should overwrite components', () => {
|
||||
const component1: any = {};
|
||||
const component2: any = {};
|
||||
|
||||
service.setComponents({
|
||||
'component': component1
|
||||
});
|
||||
|
||||
expect(service.getComponentById('component')).toBe(component1);
|
||||
|
||||
service.setComponents({
|
||||
'component': component2
|
||||
});
|
||||
|
||||
expect(service.getComponentById('component')).toBe(component2);
|
||||
});
|
||||
|
||||
it('should not set components with null value', () => {
|
||||
const component: any = {};
|
||||
|
||||
service.setComponents({
|
||||
'component1': component
|
||||
});
|
||||
|
||||
expect(service.getComponentById('component1')).toBe(component);
|
||||
|
||||
service.setComponents(null);
|
||||
|
||||
expect(service.getComponentById('component1')).toBe(component);
|
||||
});
|
||||
|
||||
it('should fetch route by id', () => {
|
||||
const route: RouteRef = {
|
||||
id: 'test.route',
|
||||
component: 'component',
|
||||
path: '/ext/route1'
|
||||
};
|
||||
|
||||
spyOn(loader, 'getRoutes').and.returnValue([route]);
|
||||
service.setup(blankConfig);
|
||||
|
||||
expect(service.getRouteById('test.route')).toBe(route);
|
||||
});
|
||||
|
||||
it('should fetch action by id', () => {
|
||||
const action: ActionRef = {
|
||||
id: 'test.action',
|
||||
type: 'action'
|
||||
};
|
||||
|
||||
spyOn(loader, 'getActions').and.returnValue([action]);
|
||||
service.setup(blankConfig);
|
||||
|
||||
expect(service.getActionById('test.action')).toBe(action);
|
||||
});
|
||||
|
||||
it('should fetch rule by id', () => {
|
||||
const rule: RuleRef = {
|
||||
id: 'test.rule',
|
||||
type: 'core.every'
|
||||
};
|
||||
|
||||
spyOn(loader, 'getRules').and.returnValue([rule]);
|
||||
service.setup(blankConfig);
|
||||
|
||||
expect(service.getRuleById('test.rule')).toBe(rule);
|
||||
});
|
||||
|
||||
it('should evaluate condition', () => {
|
||||
const condition = () => true;
|
||||
|
||||
service.setEvaluators({
|
||||
'test.condition': condition
|
||||
});
|
||||
|
||||
const context: any = {
|
||||
getEvaluator(key: string) {
|
||||
return service.getEvaluator(key);
|
||||
}
|
||||
};
|
||||
|
||||
const result = service.evaluateRule('test.condition', context);
|
||||
expect(result).toBe(true);
|
||||
});
|
||||
|
||||
it('should evaluate missing condition as [false]', () => {
|
||||
const context: any = {
|
||||
getEvaluator(key: string) {
|
||||
return service.getEvaluator(key);
|
||||
}
|
||||
};
|
||||
|
||||
const result = service.evaluateRule('missing.condition', context);
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
|
||||
it('should evaluate rule by reference', () => {
|
||||
const ruleRef: RuleRef = {
|
||||
id: 'test.rule',
|
||||
type: 'core.every',
|
||||
parameters: [
|
||||
{
|
||||
type: 'rule',
|
||||
value: 'test.condition'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
spyOn(loader, 'getRules').and.returnValue([ruleRef]);
|
||||
service.setup(blankConfig);
|
||||
|
||||
const condition = () => true;
|
||||
|
||||
service.setEvaluators({
|
||||
'test.condition': condition
|
||||
});
|
||||
|
||||
const context: any = {
|
||||
getEvaluator(key: string) {
|
||||
return service.getEvaluator(key);
|
||||
}
|
||||
};
|
||||
|
||||
const result = service.evaluateRule('test.rule', context);
|
||||
expect(result).toBe(true);
|
||||
});
|
||||
|
||||
it('should evaluate rule ref with missing condition as [false]', () => {
|
||||
const ruleRef: RuleRef = {
|
||||
id: 'test.rule',
|
||||
type: 'missing.evaluator'
|
||||
};
|
||||
|
||||
spyOn(loader, 'getRules').and.returnValue([ruleRef]);
|
||||
service.setup(blankConfig);
|
||||
|
||||
const context: any = {
|
||||
getEvaluator(key: string) {
|
||||
return service.getEvaluator(key);
|
||||
}
|
||||
};
|
||||
|
||||
const result = service.evaluateRule('test.rule', context);
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
|
||||
it('should evaluate rule ref with missing evaluator as [false]', () => {
|
||||
const ruleRef: RuleRef = {
|
||||
id: 'test.rule',
|
||||
type: 'core.every',
|
||||
parameters: [
|
||||
{
|
||||
type: 'rule',
|
||||
value: 'missing.condition'
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
spyOn(loader, 'getRules').and.returnValue([ruleRef]);
|
||||
service.setup(blankConfig);
|
||||
|
||||
const context: any = {
|
||||
getEvaluator(key: string) {
|
||||
return service.getEvaluator(key);
|
||||
}
|
||||
};
|
||||
|
||||
const result = service.evaluateRule('test.rule', context);
|
||||
expect(result).toBe(false);
|
||||
});
|
||||
|
||||
describe('expressions', () => {
|
||||
it('should eval static value', () => {
|
||||
const value = service.runExpression('hello world');
|
||||
expect(value).toBe('hello world');
|
||||
});
|
||||
|
||||
it('should eval string as an expression', () => {
|
||||
const value = service.runExpression('$( "hello world" )');
|
||||
expect(value).toBe('hello world');
|
||||
});
|
||||
|
||||
it('should eval expression with no context', () => {
|
||||
const value = service.runExpression('$( 1 + 1 )');
|
||||
expect(value).toBe(2);
|
||||
});
|
||||
|
||||
it('should eval expression with context', () => {
|
||||
const context = {
|
||||
a: 'hey',
|
||||
b: 'there'
|
||||
};
|
||||
const expression = '$( context.a + " " + context.b + "!" )';
|
||||
const value = service.runExpression(expression, context);
|
||||
expect(value).toBe('hey there!');
|
||||
});
|
||||
});
|
||||
});
|
@ -1,148 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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, Type } from '@angular/core';
|
||||
import { RuleEvaluator, RuleRef, RuleContext, RuleParameter } from '../config/rule.extensions';
|
||||
import { ExtensionConfig } from '../config/extension.config';
|
||||
import { ExtensionLoaderService } from './extension-loader.service';
|
||||
import { RouteRef } from '../config/routing.extensions';
|
||||
import { ActionRef } from '../config/action.extensions';
|
||||
import * as core from '../evaluators/core.evaluators';
|
||||
|
||||
@Injectable()
|
||||
export class ExtensionService {
|
||||
configPath = 'assets/app.extensions.json';
|
||||
pluginsPath = 'assets/plugins';
|
||||
|
||||
rules: Array<RuleRef> = [];
|
||||
routes: Array<RouteRef> = [];
|
||||
actions: Array<ActionRef> = [];
|
||||
|
||||
authGuards: { [key: string]: Type<{}> } = {};
|
||||
components: { [key: string]: Type<{}> } = {};
|
||||
evaluators: { [key: string]: RuleEvaluator } = {};
|
||||
|
||||
constructor(private loader: ExtensionLoaderService) {}
|
||||
|
||||
async load(): Promise<ExtensionConfig> {
|
||||
const config = await this.loader.load(
|
||||
this.configPath,
|
||||
this.pluginsPath
|
||||
);
|
||||
this.setup(config);
|
||||
return config;
|
||||
}
|
||||
|
||||
setup(config: ExtensionConfig) {
|
||||
if (!config) {
|
||||
console.warn('Extension configuration not found');
|
||||
return;
|
||||
}
|
||||
|
||||
this.setEvaluators({
|
||||
'core.every': core.every,
|
||||
'core.some': core.some,
|
||||
'core.not': core.not
|
||||
});
|
||||
|
||||
this.rules = this.loader.getRules(config);
|
||||
this.actions = this.loader.getActions(config);
|
||||
this.routes = this.loader.getRoutes(config);
|
||||
}
|
||||
|
||||
setEvaluators(values: { [key: string]: RuleEvaluator }) {
|
||||
if (values) {
|
||||
this.evaluators = Object.assign({}, this.evaluators, values);
|
||||
}
|
||||
}
|
||||
|
||||
setAuthGuards(values: { [key: string]: Type<{}> }) {
|
||||
if (values) {
|
||||
this.authGuards = Object.assign({}, this.authGuards, values);
|
||||
}
|
||||
}
|
||||
|
||||
setComponents(values: { [key: string]: Type<{}> }) {
|
||||
if (values) {
|
||||
this.components = Object.assign({}, this.components, values);
|
||||
}
|
||||
}
|
||||
|
||||
getRouteById(id: string): RouteRef {
|
||||
return this.routes.find(route => route.id === id);
|
||||
}
|
||||
|
||||
getAuthGuards(ids: string[]): Array<Type<{}>> {
|
||||
return (ids || [])
|
||||
.map(id => this.authGuards[id])
|
||||
.filter(guard => guard);
|
||||
}
|
||||
|
||||
getActionById(id: string): ActionRef {
|
||||
return this.actions.find(action => action.id === id);
|
||||
}
|
||||
|
||||
getEvaluator(key: string): RuleEvaluator {
|
||||
if (key && key.startsWith('!')) {
|
||||
const fn = this.evaluators[key.substring(1)];
|
||||
return (context: RuleContext, ...args: RuleParameter[]): boolean => {
|
||||
return !fn(context, ...args);
|
||||
};
|
||||
}
|
||||
return this.evaluators[key];
|
||||
}
|
||||
|
||||
evaluateRule(ruleId: string, context: RuleContext): boolean {
|
||||
const ruleRef = this.getRuleById(ruleId);
|
||||
|
||||
if (ruleRef) {
|
||||
const evaluator = this.getEvaluator(ruleRef.type);
|
||||
if (evaluator) {
|
||||
return evaluator(context, ...ruleRef.parameters);
|
||||
}
|
||||
} else {
|
||||
const evaluator = this.getEvaluator(ruleId);
|
||||
if (evaluator) {
|
||||
return evaluator(context);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
getComponentById(id: string): Type<{}> {
|
||||
return this.components[id];
|
||||
}
|
||||
|
||||
getRuleById(id: string): RuleRef {
|
||||
return this.rules.find(ref => ref.id === id);
|
||||
}
|
||||
|
||||
runExpression(value: string, context?: any) {
|
||||
const pattern = new RegExp(/\$\((.*\)?)\)/g);
|
||||
const matches = pattern.exec(value);
|
||||
|
||||
if (matches && matches.length > 1) {
|
||||
const expression = matches[1];
|
||||
const fn = new Function('context', `return ${expression}`);
|
||||
const result = fn(context);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
}
|
@ -1,23 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { Node } from 'alfresco-js-api';
|
||||
|
||||
export interface NavigationState {
|
||||
currentFolder?: Node;
|
||||
url?: string;
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export interface ProfileState {
|
||||
id: string;
|
||||
isAdmin: boolean;
|
||||
firstName: string;
|
||||
lastName: string;
|
||||
userName?: string;
|
||||
initials?: string;
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 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 { MinimalNodeEntity, SiteEntry } from 'alfresco-js-api';
|
||||
|
||||
export interface SelectionState {
|
||||
count: number;
|
||||
nodes: MinimalNodeEntity[];
|
||||
libraries: SiteEntry[];
|
||||
isEmpty: boolean;
|
||||
first?: MinimalNodeEntity;
|
||||
last?: MinimalNodeEntity;
|
||||
folder?: MinimalNodeEntity;
|
||||
file?: MinimalNodeEntity;
|
||||
library?: SiteEntry;
|
||||
}
|
@ -1,36 +0,0 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2016 - 2018 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export * from './lib/config/action.extensions';
|
||||
export * from './lib/config/extension-element';
|
||||
export * from './lib/config/extension-utils';
|
||||
export * from './lib/config/extension.config';
|
||||
export * from './lib/config/navbar.extensions';
|
||||
export * from './lib/config/permission.extensions';
|
||||
export * from './lib/config/routing.extensions';
|
||||
export * from './lib/config/rule.extensions';
|
||||
export * from './lib/config/sidebar.extensions';
|
||||
export * from './lib/config/viewer.extensions';
|
||||
|
||||
export * from './lib/services/extension-loader.service';
|
||||
export * from './lib/services/extension.service';
|
||||
|
||||
export * from './lib/store/states/navigation.state';
|
||||
export * from './lib/store/states/profile.state';
|
||||
export * from './lib/store/states/selection.state';
|
||||
|
||||
export * from './lib/extensions.module';
|
@ -1,22 +0,0 @@
|
||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||
|
||||
import 'core-js/es7/reflect';
|
||||
import 'zone.js/dist/zone';
|
||||
import 'zone.js/dist/zone-testing';
|
||||
import { getTestBed } from '@angular/core/testing';
|
||||
import {
|
||||
BrowserDynamicTestingModule,
|
||||
platformBrowserDynamicTesting
|
||||
} from '@angular/platform-browser-dynamic/testing';
|
||||
|
||||
declare const require: any;
|
||||
|
||||
// First, initialize the Angular testing environment.
|
||||
getTestBed().initTestEnvironment(
|
||||
BrowserDynamicTestingModule,
|
||||
platformBrowserDynamicTesting()
|
||||
);
|
||||
// Then we find all the tests.
|
||||
const context = require.context('./', true, /\.spec\.ts$/);
|
||||
// And load the modules.
|
||||
context.keys().map(context);
|
@ -1,34 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../out-tsc/lib",
|
||||
"target": "es2015",
|
||||
"module": "es2015",
|
||||
"moduleResolution": "node",
|
||||
"declaration": true,
|
||||
"sourceMap": true,
|
||||
"inlineSources": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"importHelpers": true,
|
||||
"types": [],
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015"
|
||||
]
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotateForClosureCompiler": true,
|
||||
"skipTemplateCodegen": true,
|
||||
"strictMetadataEmit": true,
|
||||
"fullTemplateTypeCheck": true,
|
||||
"strictInjectionParameters": true,
|
||||
"flatModuleId": "AUTOGENERATED",
|
||||
"flatModuleOutFile": "AUTOGENERATED",
|
||||
"enableResourceInlining": true
|
||||
},
|
||||
"exclude": [
|
||||
"src/test.ts",
|
||||
"**/*.spec.ts"
|
||||
]
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../out-tsc/spec",
|
||||
"types": [
|
||||
"jasmine",
|
||||
"node"
|
||||
]
|
||||
},
|
||||
"files": [
|
||||
"src/test.ts"
|
||||
],
|
||||
"include": [
|
||||
"**/*.spec.ts",
|
||||
"**/*.d.ts"
|
||||
]
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": "../../tslint.json",
|
||||
"rules": {
|
||||
"directive-selector": [
|
||||
true,
|
||||
"attribute",
|
||||
"adf",
|
||||
"camelCase"
|
||||
],
|
||||
"component-selector": [
|
||||
true,
|
||||
"element",
|
||||
"adf",
|
||||
"kebab-case"
|
||||
]
|
||||
}
|
||||
}
|
@ -1,30 +0,0 @@
|
||||
{
|
||||
"$schema": "../../../extension.schema.json",
|
||||
"$version": "1.0.0",
|
||||
"$name": "plugin1",
|
||||
"$description": "demo plugin",
|
||||
|
||||
"routes": [
|
||||
{
|
||||
"id": "my.extension.route",
|
||||
"path": "ext/my/route",
|
||||
"component": "my-extension.main.component"
|
||||
}
|
||||
],
|
||||
|
||||
"features": {
|
||||
"navbar": [
|
||||
{
|
||||
"id": "my.extension.nav",
|
||||
"items": [
|
||||
{
|
||||
"id": "my.extension.main",
|
||||
"icon": "extension",
|
||||
"title": "My Extension",
|
||||
"route": "my.extension.route"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
@ -1,31 +0,0 @@
|
||||
// Karma configuration file, see link for more information
|
||||
// https://karma-runner.github.io/1.0/config/configuration-file.html
|
||||
|
||||
module.exports = function (config) {
|
||||
config.set({
|
||||
basePath: '',
|
||||
frameworks: ['jasmine', '@angular-devkit/build-angular'],
|
||||
plugins: [
|
||||
require('karma-jasmine'),
|
||||
require('karma-chrome-launcher'),
|
||||
require('karma-jasmine-html-reporter'),
|
||||
require('karma-coverage-istanbul-reporter'),
|
||||
require('@angular-devkit/build-angular/plugins/karma')
|
||||
],
|
||||
client: {
|
||||
clearContext: false // leave Jasmine Spec Runner output visible in browser
|
||||
},
|
||||
coverageIstanbulReporter: {
|
||||
dir: require('path').join(__dirname, '../../coverage'),
|
||||
reports: ['html', 'lcovonly'],
|
||||
fixWebpackSourcePaths: true
|
||||
},
|
||||
reporters: ['progress', 'kjhtml'],
|
||||
port: 9876,
|
||||
colors: true,
|
||||
logLevel: config.LOG_INFO,
|
||||
autoWatch: true,
|
||||
browsers: ['Chrome'],
|
||||
singleRun: false
|
||||
});
|
||||
};
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
"$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
|
||||
"dest": "../../dist/my-extension",
|
||||
"lib": {
|
||||
"entryFile": "src/public_api.ts",
|
||||
"umdModuleIds": {
|
||||
"@alfresco/adf-extensions": "@alfresco/adf-extensions"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
{
|
||||
"name": "my-extension",
|
||||
"version": "0.0.1",
|
||||
"peerDependencies": {
|
||||
"@angular/common": "^6.0.0-rc.0 || ^6.0.0",
|
||||
"@angular/core": "^6.0.0-rc.0 || ^6.0.0"
|
||||
}
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||
|
||||
import { MyExtensionComponent } from './my-extension.component';
|
||||
|
||||
describe('MyExtensionComponent', () => {
|
||||
let component: MyExtensionComponent;
|
||||
let fixture: ComponentFixture<MyExtensionComponent>;
|
||||
|
||||
beforeEach(async(() => {
|
||||
TestBed.configureTestingModule({
|
||||
declarations: [ MyExtensionComponent ]
|
||||
})
|
||||
.compileComponents();
|
||||
}));
|
||||
|
||||
beforeEach(() => {
|
||||
fixture = TestBed.createComponent(MyExtensionComponent);
|
||||
component = fixture.componentInstance;
|
||||
fixture.detectChanges();
|
||||
});
|
||||
|
||||
it('should create', () => {
|
||||
expect(component).toBeTruthy();
|
||||
});
|
||||
});
|
@ -1,19 +0,0 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
|
||||
@Component({
|
||||
selector: 'lib-my-extension',
|
||||
template: `
|
||||
<p>
|
||||
my-extension works!
|
||||
</p>
|
||||
`,
|
||||
styles: []
|
||||
})
|
||||
export class MyExtensionComponent implements OnInit {
|
||||
|
||||
constructor() { }
|
||||
|
||||
ngOnInit() {
|
||||
}
|
||||
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { MyExtensionComponent } from './my-extension.component';
|
||||
import { ExtensionService } from '@alfresco/adf-extensions';
|
||||
|
||||
@NgModule({
|
||||
imports: [
|
||||
],
|
||||
declarations: [MyExtensionComponent],
|
||||
exports: [MyExtensionComponent],
|
||||
entryComponents: [MyExtensionComponent]
|
||||
})
|
||||
export class MyExtensionModule {
|
||||
constructor(extensions: ExtensionService) {
|
||||
extensions.setComponents({
|
||||
'my-extension.main.component': MyExtensionComponent,
|
||||
});
|
||||
}
|
||||
}
|
@ -1,12 +0,0 @@
|
||||
import { TestBed } from '@angular/core/testing';
|
||||
|
||||
import { MyExtensionService } from './my-extension.service';
|
||||
|
||||
describe('MyExtensionService', () => {
|
||||
beforeEach(() => TestBed.configureTestingModule({}));
|
||||
|
||||
it('should be created', () => {
|
||||
const service: MyExtensionService = TestBed.get(MyExtensionService);
|
||||
expect(service).toBeTruthy();
|
||||
});
|
||||
});
|
@ -1,9 +0,0 @@
|
||||
import { Injectable } from '@angular/core';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class MyExtensionService {
|
||||
|
||||
constructor() { }
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
/*
|
||||
* Public API Surface of my-extension
|
||||
*/
|
||||
|
||||
export * from './lib/my-extension.service';
|
||||
export * from './lib/my-extension.component';
|
||||
export * from './lib/my-extension.module';
|
@ -1,22 +0,0 @@
|
||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||
|
||||
import 'core-js/es7/reflect';
|
||||
import 'zone.js/dist/zone';
|
||||
import 'zone.js/dist/zone-testing';
|
||||
import { getTestBed } from '@angular/core/testing';
|
||||
import {
|
||||
BrowserDynamicTestingModule,
|
||||
platformBrowserDynamicTesting
|
||||
} from '@angular/platform-browser-dynamic/testing';
|
||||
|
||||
declare const require: any;
|
||||
|
||||
// First, initialize the Angular testing environment.
|
||||
getTestBed().initTestEnvironment(
|
||||
BrowserDynamicTestingModule,
|
||||
platformBrowserDynamicTesting()
|
||||
);
|
||||
// Then we find all the tests.
|
||||
const context = require.context('./', true, /\.spec\.ts$/);
|
||||
// And load the modules.
|
||||
context.keys().map(context);
|
@ -1,32 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../out-tsc/lib",
|
||||
"target": "es2015",
|
||||
"module": "es2015",
|
||||
"moduleResolution": "node",
|
||||
"declaration": true,
|
||||
"sourceMap": true,
|
||||
"inlineSources": true,
|
||||
"emitDecoratorMetadata": true,
|
||||
"experimentalDecorators": true,
|
||||
"importHelpers": true,
|
||||
"types": [],
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015"
|
||||
]
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotateForClosureCompiler": true,
|
||||
"skipTemplateCodegen": true,
|
||||
"strictMetadataEmit": true,
|
||||
"fullTemplateTypeCheck": true,
|
||||
"strictInjectionParameters": true,
|
||||
"enableResourceInlining": true
|
||||
},
|
||||
"exclude": [
|
||||
"src/test.ts",
|
||||
"**/*.spec.ts"
|
||||
]
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": "../../tsconfig.json",
|
||||
"compilerOptions": {
|
||||
"outDir": "../../out-tsc/spec",
|
||||
"types": [
|
||||
"jasmine",
|
||||
"node"
|
||||
]
|
||||
},
|
||||
"files": [
|
||||
"src/test.ts"
|
||||
],
|
||||
"include": [
|
||||
"**/*.spec.ts",
|
||||
"**/*.d.ts"
|
||||
]
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
{
|
||||
"extends": "../../tslint.json",
|
||||
"rules": {
|
||||
"directive-selector": [
|
||||
true,
|
||||
"attribute",
|
||||
"lib",
|
||||
"camelCase"
|
||||
],
|
||||
"component-selector": [
|
||||
true,
|
||||
"element",
|
||||
"lib",
|
||||
"kebab-case"
|
||||
]
|
||||
}
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
import { NgModule } from '@angular/core';
|
||||
import { AcaDevToolsModule } from 'aca-dev-tools';
|
||||
import { AcaDevToolsModule } from '@denysvuika/aca-dev-tools';
|
||||
import { CodeEditorModule } from '@ngstack/code-editor';
|
||||
import { MyExtensionModule } from 'my-extension';
|
||||
|
||||
// Main entry point for external extensions only.
|
||||
// For any application-specific code use CoreExtensionsModule instead.
|
||||
@ -14,8 +13,7 @@ import { MyExtensionModule } from 'my-extension';
|
||||
// use local Typings Worker
|
||||
typingsWorkerUrl: 'assets/workers/typings-worker.js'
|
||||
}),
|
||||
AcaDevToolsModule,
|
||||
MyExtensionModule
|
||||
AcaDevToolsModule
|
||||
]
|
||||
})
|
||||
export class AppExtensionsModule {}
|
||||
|
@ -2,7 +2,7 @@
|
||||
"$schema": "../../extension.schema.json",
|
||||
"$name": "app",
|
||||
"$version": "1.0.0",
|
||||
"$references": ["plugin1.json", "dev.tools.json", "my-extension.json"],
|
||||
"$references": ["plugin1.json", "dev.tools.json"],
|
||||
|
||||
"rules": [
|
||||
{
|
||||
|
@ -1,46 +0,0 @@
|
||||
{
|
||||
"$schema": "../../../extension.schema.json",
|
||||
"$version": "1.0.0",
|
||||
"$name": "dev.tools",
|
||||
"$description": "ACA dev tools",
|
||||
|
||||
"routes": [
|
||||
{
|
||||
"id": "dev.tools",
|
||||
"component": "dev.tools.component",
|
||||
"path": "dev-tools",
|
||||
"data": {
|
||||
"configPath": "assets/app.extensions.json",
|
||||
"pluginsPath": "assets/plugins",
|
||||
"schemaUri": "../../extension.schema.json",
|
||||
"schemaPath": "assets/extension.schema.json"
|
||||
}
|
||||
}
|
||||
],
|
||||
|
||||
"features": {
|
||||
"navbar": [
|
||||
{
|
||||
"id": "app.navbar.dev.tools",
|
||||
"items": [
|
||||
{
|
||||
"id": "app.navbar.dev.tools.main",
|
||||
"icon": "build",
|
||||
"title": "dev tools",
|
||||
"route": "dev.tools"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
"viewer": {
|
||||
"content": [
|
||||
{
|
||||
"id": "dev.tools.viewer.markdown",
|
||||
"fileExtension": "md",
|
||||
"component": "dev.tools.viewer.markdown"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
@ -13,12 +13,7 @@
|
||||
"lib": ["es2017", "dom"],
|
||||
"module": "es2015",
|
||||
"baseUrl": "./",
|
||||
"paths": {
|
||||
"aca-dev-tools": ["dist/aca-dev-tools"],
|
||||
"aca-dev-tools/*": ["dist/aca-dev-tools/*"],
|
||||
"my-extension": ["dist/my-extension"],
|
||||
"my-extension/*": ["dist/my-extension/*"]
|
||||
}
|
||||
"paths": {}
|
||||
},
|
||||
"exclude": ["node_modules"],
|
||||
"angularCompilerOptions": {
|
||||
|
Loading…
x
Reference in New Issue
Block a user