[ACA-805] about screen enhancements (#813)

* upgrade to latest adf-extensions

* switch to ADF RepositoryState

* show extensions on About page, i18n fixes

* update docs

* cleanup about styles

* greatly simplify app dependencies rendering

* fix linting

* fix tests
This commit is contained in:
Denys Vuika 2018-11-20 19:15:05 +00:00 committed by Cilibiu Bogdan
parent 01ea887d5d
commit 26b4b0684f
27 changed files with 6106 additions and 147 deletions

1
.gitignore vendored
View File

@ -4,7 +4,6 @@
/dist
/tmp
/out-tsc
/src/versions.json
# dependencies
/node_modules

View File

@ -25,7 +25,6 @@
"src/assets",
"src/favicon-96x96.png",
"src/app.config.json",
"src/versions.json",
{
"glob": "**/*",
"input": "node_modules/@alfresco/adf-core/prebuilt-themes",
@ -155,7 +154,6 @@
"src/assets",
"src/favicon-96x96.png",
"src/app.config.json",
"src/versions.json",
{
"glob": "**/*",
"input": "node_modules/@alfresco/adf-core/prebuilt-themes",
@ -187,7 +185,8 @@
"src/tsconfig.spec.json"
],
"exclude": [
"**/node_modules/**"
"**/node_modules/**",
"package.json"
]
}
}
@ -217,7 +216,8 @@
"e2e/tsconfig.e2e.json"
],
"exclude": [
"**/node_modules/**"
"**/node_modules/**",
"package.json"
]
}
}

View File

@ -7,8 +7,13 @@ The format is represented by a JSON file with the structure similar to the follo
```json
{
"$name": "app",
"$id": "unique.id",
"$name": "extension.name",
"$version": "1.0.0",
"$vendor": "author.name",
"$license": "license",
"$runtime": "1.5.0",
"$description": "some description",
"routes": [],
"actions": [],

View File

@ -567,8 +567,12 @@
},
"type": "object",
"required": ["$name", "$version"],
"required": ["$id", "$name", "$version", "$vendor", "$license", "$runtime"],
"properties": {
"$id": {
"description": "Unique identifier",
"type": "string"
},
"$name": {
"description": "Extension name",
"type": "string"
@ -577,8 +581,21 @@
"description": "Extension version",
"type": "string"
},
"$vendor": {
"description": "Extension owner",
"type": "string"
},
"$license": {
"description": "Indicates the license of the extension.",
"type": "string"
},
"$runtime": {
"description": "Minimal extension runtime supported by extension",
"type": "string"
},
"$description": {
"description": "Brief description on what the extension does"
"description": "Brief description on what the extension does",
"type": "string"
},
"$references": {
"description": "References to external files",

6
package-lock.json generated
View File

@ -21,9 +21,9 @@
}
},
"@alfresco/adf-extensions": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-2.6.1.tgz",
"integrity": "sha512-YF2+wd2Tsy7wk3TjoJNli7B0J3WOowD1wsOdve0RHQdBlkG90tfVqHEVIQgRm24N2T4d0tOxhxcfGwaJcWE6Rw==",
"version": "3.0.0-383b74151a47e188020249aea7ec0dfb586bd0b6",
"resolved": "https://registry.npmjs.org/@alfresco/adf-extensions/-/adf-extensions-3.0.0-383b74151a47e188020249aea7ec0dfb586bd0b6.tgz",
"integrity": "sha512-pAI4DoDMqek2G1sEFeHpgZ0OkUhSTmp95XWC+b3OoUroztwOC0y2a/PqLUvDgm5aTe4hVsA+r6IRMkp7aA1KAA==",
"requires": {
"tslib": "^1.9.0"
}

View File

@ -4,15 +4,14 @@
"license": "LGPL-3.0",
"scripts": {
"ng": "ng",
"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",
"build.e2e": "npm run server-versions && node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng build app --configuration=e2e",
"start": "ng serve --open",
"start:prod": "ng serve --prod --open",
"build": "node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng build app --prod",
"build:dev": "ng build",
"build.e2e": "node --max-old-space-size=8192 node_modules/@angular/cli/bin/ng build app --configuration=e2e",
"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",
"wd:update": "webdriver-manager update --gecko=false",
"e2e": "npm run wd:update && protractor --baseUrl=http://localhost:4000",
"e2e.local": "npm run wd:update && protractor --baseUrl=http://localhost:4200",
@ -33,7 +32,7 @@
"dependencies": {
"@alfresco/adf-content-services": "2.6.1",
"@alfresco/adf-core": "2.6.1",
"@alfresco/adf-extensions": "2.6.1",
"@alfresco/adf-extensions": "3.0.0-383b74151a47e188020249aea7ec0dfb586bd0b6",
"@angular/animations": "7.0.3",
"@angular/cdk": "^7.0.3",
"@angular/common": "7.0.3",

View File

@ -15,7 +15,7 @@
"redirectUriLogout": "/logout"
},
"application": {
"name": "Alfresco",
"name": "Alfresco Content Application",
"logo": "assets/images/alfresco-logo-flower.svg",
"copyright": "© 2017 - 2018 Alfresco Software, Inc. All rights reserved."
},

View File

@ -1,38 +1,126 @@
<app-page-layout>
<app-page-layout-content [scrollable]="true">
<div class="main-content">
<article class="padding">
<header class="header padding-left">Alfresco Content Application</header>
<p class="padding-left"> version: {{ releaseVersion }} </p>
<article>
<header>{{ 'application.name' | adfAppConfig }}</header>
<p>{{ 'APP.ABOUT.VERSION' | translate }} {{ releaseVersion }}</p>
</article>
<article *ngIf="repository" class="padding">
<header class="header padding-left">Alfresco Content Services</header>
<p class="padding-left"> version: {{ repository.edition }} {{ repository.version.display }} </p>
<article>
<header>{{ 'APP.ABOUT.PLUGINS.TITLE' | translate }}</header>
<div>
<mat-table [dataSource]="extensions$ | async">
<ng-container matColumnDef="$id">
<mat-header-cell *matHeaderCellDef
>{{ 'APP.ABOUT.PLUGINS.ID' | translate }}
</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.$id }}</mat-cell>
</ng-container>
<ng-container matColumnDef="$name">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PLUGINS.NAME' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.$name }}</mat-cell>
</ng-container>
<ng-container matColumnDef="$version">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PLUGINS.VERSION' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{
element.$version
}}</mat-cell>
</ng-container>
<ng-container matColumnDef="$vendor">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PLUGINS.VENDOR' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{
element.$vendor
}}</mat-cell>
</ng-container>
<ng-container matColumnDef="$license">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PLUGINS.LICENSE' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{
element.$license
}}</mat-cell>
</ng-container>
<ng-container matColumnDef="$runtime">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PLUGINS.RUNTIME' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{
element.$runtime
}}</mat-cell>
</ng-container>
<ng-container matColumnDef="$description">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PLUGINS.DESCRIPTION' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{
element.$description
}}</mat-cell>
</ng-container>
<mat-header-row
*matHeaderRowDef="extensionColumns"
></mat-header-row>
<mat-row *matRowDef="let row; columns: extensionColumns"></mat-row>
</mat-table>
</div>
</article>
<article class="padding-top-bottom" *ngIf="license">
<header class="header padding-left-right">License</header>
<article *ngIf="repository">
<header>Alfresco Content Services</header>
<p>
{{ 'APP.ABOUT.VERSION' | translate }} {{ repository.edition }}
{{ repository.version.display }}
</p>
</article>
<article *ngIf="license">
<header>{{ 'APP.ABOUT.LICENSE.TITLE' | translate }}</header>
<adf-datatable [data]="license"></adf-datatable>
</article>
<article class="padding-top-bottom">
<header class="header padding-left-right">Status</header>
<article>
<header>{{ 'APP.ABOUT.STATUS.TITLE' | translate }}</header>
<adf-datatable [data]="status"></adf-datatable>
</article>
<article class="padding-top-bottom">
<header class="header padding-left-right">Modules</header>
<article>
<header>{{ 'APP.ABOUT.MODULES.TITLE' | translate }}</header>
<adf-datatable [data]="modules"></adf-datatable>
</article>
<article>
<header class="header padding-left-right">Packages</header>
<small class="padding-left-right">Current project is using the following ADF libraries:</small>
<adf-datatable [data]="data"></adf-datatable>
<header>{{ 'APP.ABOUT.PACKAGES.TITLE' | translate }}</header>
<mat-table [dataSource]="dependencyEntries">
<ng-container matColumnDef="name">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PACKAGES.NAME' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.name }}</mat-cell>
</ng-container>
<ng-container matColumnDef="version">
<mat-header-cell *matHeaderCellDef>{{
'APP.ABOUT.PACKAGES.VERSION' | translate
}}</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.version }}</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="dependencyColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: dependencyColumns"></mat-row>
</mat-table>
</article>
</div>
</app-page-layout-content>
</app-page-layout>

View File

@ -1,8 +1,20 @@
@mixin aca-about-component-theme($theme) {
$foreground: map-get($theme, foreground);
.app-about {
.main-content {
padding: 10px;
article {
color: mat-color($foreground, text, 0.54);
padding: 25px 0 25px 0;
& > header {
line-height: 24px;
font-size: 14px;
font-weight: 800;
letter-spacing: -0.2px;
}
}
article:first-of-type {
@ -12,28 +24,6 @@
article:last-of-type {
margin-bottom: 50px;
}
header {
line-height: 24px;
font-size: 14px;
font-weight: 800;
letter-spacing: -0.2px;
}
a {
text-decoration: none;
color: mat-color($foreground, text, 0.87);
}
.padding {
padding: 25px;
}
.padding-top-bottom {
padding: 25px 0 25px 0;
}
.padding-left-right {
padding: 0 25px 0 25px;
}
}
}

View File

@ -23,31 +23,57 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { ObjectDataTableAdapter } from '@alfresco/adf-core';
import { ContentApiService } from '../../services/content-api.service';
import { ExtensionRef } from '@alfresco/adf-extensions';
import { Component, OnInit, ViewEncapsulation } from '@angular/core';
import { RepositoryInfo } from 'alfresco-js-api';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { AppExtensionService } from '../../extensions/extension.service';
import { ContentApiService } from '../../services/content-api.service';
import { version, dependencies } from '../../../../package.json';
@Component({
selector: 'app-about',
templateUrl: './about.component.html'
templateUrl: './about.component.html',
encapsulation: ViewEncapsulation.None,
host: { class: 'app-about' }
})
export class AboutComponent implements OnInit {
repository: RepositoryInfo;
data: ObjectDataTableAdapter;
status: ObjectDataTableAdapter;
license: ObjectDataTableAdapter;
modules: ObjectDataTableAdapter;
releaseVersion = '';
releaseVersion = version;
extensionColumns: string[] = [
'$id',
'$name',
'$version',
'$vendor',
'$license',
'$runtime',
'$description'
];
extensions$: Observable<ExtensionRef[]>;
dependencyColumns: string[] = ['name', 'version'];
dependencyEntries: Array<{ name: string; version: string }> = [];
constructor(
private contentApi: ContentApiService,
private http: HttpClient
) {}
appExtensions: AppExtensionService
) {
this.extensions$ = appExtensions.references$;
}
ngOnInit() {
this.dependencyEntries = Object.keys(dependencies).map(key => {
return {
name: key,
version: dependencies[key]
};
});
this.contentApi
.getRepositoryInformation()
.pipe(map(node => node.entry.repository))
@ -159,28 +185,5 @@ export class AboutComponent implements OnInit {
);
}
});
this.http.get('/versions.json').subscribe((response: any) => {
const regexp = new RegExp('^(@alfresco|alfresco-)');
const alfrescoPackagesTableRepresentation = Object.keys(
response.dependencies
)
.filter(val => regexp.test(val))
.map(val => ({
name: val,
version: response.dependencies[val].version
}));
this.data = new ObjectDataTableAdapter(
alfrescoPackagesTableRepresentation,
[
{ type: 'text', key: 'name', title: 'Name', sortable: true },
{ type: 'text', key: 'version', title: 'Version', sortable: true }
]
);
this.releaseVersion = response.version;
});
}
}

View File

@ -29,6 +29,7 @@ import { AboutComponent } from './about.component';
import { CommonModule } from '@angular/common';
import { CoreModule } from '@alfresco/adf-core';
import { AppLayoutModule } from '../layout/layout.module';
import { MatTableModule } from '@angular/material';
const routes: Routes = [
{
@ -45,7 +46,8 @@ const routes: Routes = [
CommonModule,
CoreModule.forChild(),
RouterModule.forChild(routes),
AppLayoutModule
AppLayoutModule,
MatTableModule
],
declarations: [AboutComponent]
})

View File

@ -23,8 +23,7 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { RuleContext } from '@alfresco/adf-extensions';
import { RepositoryState } from '../store/states';
import { RuleContext, RepositoryState } from '@alfresco/adf-extensions';
export interface AppRuleContext extends RuleContext {
repository: RepositoryState;

View File

@ -110,8 +110,12 @@ describe('AppExtensionService', () => {
describe('actions', () => {
beforeEach(() => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
actions: [
{
id: 'aca:actions/create-folder',
@ -242,8 +246,12 @@ describe('AppExtensionService', () => {
beforeEach(() => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
routes: [
{
id: 'aca:routes/about',
@ -301,8 +309,12 @@ describe('AppExtensionService', () => {
describe('content actions', () => {
it('should load content actions from the config', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
toolbar: [
{
@ -326,8 +338,12 @@ describe('AppExtensionService', () => {
it('should sort content actions by order', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
toolbar: [
{
@ -355,8 +371,12 @@ describe('AppExtensionService', () => {
describe('open with', () => {
it('should load [open with] actions for the viewer', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
viewer: {
openWith: [
@ -381,8 +401,12 @@ describe('AppExtensionService', () => {
it('should load only enabled [open with] actions for the viewer', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
viewer: {
openWith: [
@ -418,8 +442,12 @@ describe('AppExtensionService', () => {
it('should sort [open with] actions by order', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
viewer: {
openWith: [
@ -457,8 +485,12 @@ describe('AppExtensionService', () => {
describe('create', () => {
it('should load [create] actions from config', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
create: [
{
@ -477,8 +509,12 @@ describe('AppExtensionService', () => {
it('should sort [create] actions by order', () => {
applyConfig({
$id: 'test',
$name: 'test',
$version: '1.0.0',
$license: 'MIT',
$vendor: 'Good company',
$runtime: '1.5.0',
features: {
create: [
{

View File

@ -26,7 +26,7 @@
import { Injectable, Type } from '@angular/core';
import { Store } from '@ngrx/store';
import { Route } from '@angular/router';
import { AppStore, RepositoryState } from '../store/states';
import { AppStore } from '../store/states';
import { ruleContext } from '../store/selectors/app.selectors';
import { NodePermissionService } from '../services/node-permission.service';
import {
@ -46,15 +46,20 @@ import {
reduceEmptyMenus,
ExtensionService,
ProfileState,
mergeObjects
mergeObjects,
RepositoryState,
ExtensionRef
} from '@alfresco/adf-extensions';
import { AppConfigService } from '@alfresco/adf-core';
import { DocumentListPresetRef } from './document-list.extensions';
import { BehaviorSubject, Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AppExtensionService implements RuleContext {
private _references = new BehaviorSubject<ExtensionRef[]>([]);
defaults = {
layout: 'app.layout.main',
auth: ['app.auth']
@ -97,6 +102,8 @@ export class AppExtensionService implements RuleContext {
profile: ProfileState;
repository: RepositoryState;
references$: Observable<ExtensionRef[]>;
constructor(
private store: Store<AppStore>,
private loader: ExtensionLoaderService,
@ -104,6 +111,8 @@ export class AppExtensionService implements RuleContext {
public permissions: NodePermissionService,
private appConfig: AppConfigService
) {
this.references$ = this._references.asObservable();
this.store.select(ruleContext).subscribe(result => {
this.selection = result.selection;
this.navigation = result.navigation;
@ -174,6 +183,11 @@ export class AppExtensionService implements RuleContext {
trashcan: this.getDocumentListPreset(config, 'trashcan'),
searchLibraries: this.getDocumentListPreset(config, 'search-libraries')
};
const references = (config.$references || [])
.filter(entry => typeof entry === 'object')
.map(entry => <ExtensionRef>entry);
this._references.next(references);
}
protected loadNavBar(config: ExtensionConfig): Array<NavBarGroupRef> {

View File

@ -24,7 +24,7 @@
*/
import { Action } from '@ngrx/store';
import { RepositoryState } from '../states';
import { RepositoryState } from '@alfresco/adf-extensions';
export const SET_REPOSITORY_STATUS = 'SET_REPOSITORY_STATUS';
export const GET_REPOSITORY_STATUS = 'GET_REPOSITORY_STATUS';

View File

@ -24,4 +24,3 @@
*/
export * from './states/app.state';
export * from './states/repository.state';

View File

@ -26,9 +26,9 @@
import {
SelectionState,
ProfileState,
NavigationState
NavigationState,
RepositoryState
} from '@alfresco/adf-extensions';
import { RepositoryState } from '../states';
export interface AppState {
appName: string;

View File

@ -1,31 +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/>.
*/
export interface RepositoryState {
isAuditEnabled?: boolean;
isQuickShareEnabled?: boolean;
isReadOnly?: boolean;
isThumbnailGenerationEnabled?: boolean;
}

View File

@ -1,7 +1,12 @@
{
"$schema": "../../extension.schema.json",
"$name": "app",
"$id": "app.core",
"$name": "app.core",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Core application extensions and features",
"$references": [],
"rules": [

View File

@ -1,5 +1,32 @@
{
"APP": {
"ABOUT": {
"VERSION": "Version:",
"PLUGINS": {
"TITLE": "Plugins",
"ID": "ID",
"NAME": "Name",
"VERSION": "Version",
"VENDOR": "Vendor",
"LICENSE": "License",
"RUNTIME": "Runtime",
"DESCRIPTION": "Description"
},
"LICENSE": {
"TITLE": "License"
},
"STATUS": {
"TITLE": "Status"
},
"MODULES": {
"TITLE": "Modules"
},
"PACKAGES": {
"TITLE": "Packages",
"NAME": "Name",
"VERSION": "Version"
}
},
"LANGUAGE": "Language",
"SIGN_IN": "Sign in",
"SIGN_OUT": "Sign out",

View File

@ -1,7 +1,12 @@
{
"$schema": "../../../extension.schema.json",
"$id": "app.demo.cardView",
"$name": "app.demo.cardView",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Simple extension that provides Card View toolbar button",
"features": {
"toolbar": [

View File

@ -1,8 +1,12 @@
{
"$schema": "../../../extension.schema.json",
"$name": "app.create",
"$id": "app.demo.create",
"$name": "app.demo.create",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Simple extension that provides custom entries for Create menu",
"features": {
"create": [

View File

@ -1,8 +1,12 @@
{
"$schema": "../../../extension.schema.json",
"$id": "app.debug.plugin",
"$version": "1.0.0",
"$name": "plugin1",
"$description": "demo plugin",
"$name": "app.debug.plugin",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Plugin for debugging and testing purposes",
"actions": [
{

View File

@ -1,7 +1,12 @@
{
"$schema": "../../../extension.schema.json",
"$name": "app",
"$id": "app.demo.header",
"$name": "app.demo.header",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "Sample app header extension",
"actions": [
{

View File

@ -1,8 +1,13 @@
{
"$schema": "../../../extension.schema.json",
"$version": "1.0.0",
"$id": "app.demo.metadata",
"$name": "metadata-plugin",
"$version": "1.0.0",
"$vendor": "Alfresco Software, Ltd.",
"$license": "LGPL-3.0",
"$runtime": "1.5.0",
"$description": "metadata card configuration plugin - testing purpose",
"features": {
"content-metadata-presets": [
{

5783
src/versions.json Normal file

File diff suppressed because one or more lines are too long

View File

@ -13,7 +13,8 @@
"lib": ["es2018", "dom"],
"module": "es2015",
"baseUrl": "./",
"paths": {}
"paths": {},
"resolveJsonModule": true
},
"exclude": ["node_modules"],
"angularCompilerOptions": {