mirror of
https://github.com/Alfresco/alfresco-ng2-components.git
synced 2025-07-24 17:32:15 +00:00
[ADF-4125] simplify extension load in extension module (#4214)
* add extension load in extension module * add viewer extensions * fix license header * fix node passed in the viewer extension * fix node passed in the viewer extension * startup factory extension * startup factory extension * fix script * fix beta tag build * fix build * fix build * refactoring configuration files * extension using map * fix build * fix config * fix test * fix test
This commit is contained in:
21
lib/extensions/src/lib/components/public-api.ts
Normal file
21
lib/extensions/src/lib/components/public-api.ts
Normal file
@@ -0,0 +1,21 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 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 './viewer/preview-extension.component';
|
||||
export * from './dynamic-column/dynamic-column.component';
|
||||
export * from './dynamic-component/dynamic.component';
|
||||
export * from './dynamic-tab/dynamic-tab.component';
|
@@ -0,0 +1,99 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 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,
|
||||
OnChanges
|
||||
} from '@angular/core';
|
||||
import { ExtensionService } from '../../services/extension.service';
|
||||
import { Node } from '@alfresco/js-api';
|
||||
|
||||
@Component({
|
||||
selector: 'adf-preview-extension',
|
||||
template: `
|
||||
<div #content></div>
|
||||
`
|
||||
})
|
||||
export class PreviewExtensionComponent implements OnInit, OnChanges, OnDestroy {
|
||||
@ViewChild('content', { read: ViewContainerRef })
|
||||
content: ViewContainerRef;
|
||||
|
||||
@Input()
|
||||
id: string;
|
||||
|
||||
@Input()
|
||||
url: string;
|
||||
|
||||
@Input()
|
||||
extension: string;
|
||||
|
||||
@Input()
|
||||
node: Node;
|
||||
|
||||
private componentRef: ComponentRef<any>;
|
||||
|
||||
constructor(
|
||||
private extensionService: ExtensionService,
|
||||
private componentFactoryResolver: ComponentFactoryResolver
|
||||
) {}
|
||||
|
||||
ngOnInit() {
|
||||
if (!this.id) {
|
||||
return;
|
||||
}
|
||||
|
||||
const componentType = this.extensionService.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() {
|
||||
this.updateInstance();
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
if (this.componentRef) {
|
||||
this.componentRef.destroy();
|
||||
this.componentRef = null;
|
||||
}
|
||||
}
|
||||
|
||||
private updateInstance() {
|
||||
if (this.componentRef && this.componentRef.instance) {
|
||||
const instance = this.componentRef.instance;
|
||||
|
||||
instance.node = this.node;
|
||||
instance.url = this.url;
|
||||
instance.extension = this.extension;
|
||||
}
|
||||
}
|
||||
}
|
@@ -146,5 +146,5 @@ export function mergeArrays(left: any[], right: any[]): any[] {
|
||||
}
|
||||
});
|
||||
|
||||
return Object.values(map).concat(result);
|
||||
return Object.keys(map).map((key) => map[key]).concat(result);
|
||||
}
|
||||
|
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"id": "https://github.com/Alfresco/alfresco-ng2-components/tree/master/lib/extensions/config/schema/app-extension.schema.json",
|
||||
"title": "ACA Extension Schema",
|
||||
"description": "Provides a validation schema for extensions",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"$references": {
|
||||
"description": "References to external files",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 0,
|
||||
"uniqueItems": true
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,751 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"id": "https://github.com/Alfresco/alfresco-ng2-components/tree/master/lib/extensions/config/schema/extension.schema.json",
|
||||
"title": "ACA Extension Schema",
|
||||
"description": "Provides a validation schema for extensions plugin JSON",
|
||||
"definitions": {
|
||||
"ruleRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "type"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique rule definition id",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "Rule evaluator type",
|
||||
"type": "string"
|
||||
},
|
||||
"parameters": {
|
||||
"description": "Rule evaluator parameters",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/ruleParameter" },
|
||||
"minItems": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"ruleParameter": {
|
||||
"type": "object",
|
||||
"required": ["type", "value"],
|
||||
"properties": {
|
||||
"type": {
|
||||
"description": "Rule parameter type",
|
||||
"type": "string"
|
||||
},
|
||||
"value": {
|
||||
"description": "Rule parameter value",
|
||||
"type": "string"
|
||||
},
|
||||
"parameters": {
|
||||
"description": "Parameters",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/ruleParameter" },
|
||||
"minItems": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"routeRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "path", "component"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique route reference identifier.",
|
||||
"type": "string"
|
||||
},
|
||||
"path": {
|
||||
"description": "Route path to register.",
|
||||
"type": "string"
|
||||
},
|
||||
"component": {
|
||||
"description": "Unique identifier for the Component to use with the route.",
|
||||
"type": "string"
|
||||
},
|
||||
"layout": {
|
||||
"description": "Unique identifier for the custom layout component to use.",
|
||||
"type": "string"
|
||||
},
|
||||
"auth": {
|
||||
"description": "List of the authentication guards to use with the route.",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minLength": 1,
|
||||
"uniqueItems": true
|
||||
},
|
||||
"data": {
|
||||
"description": "Custom data to pass to the activated route so that your components can access it",
|
||||
"type": "object"
|
||||
}
|
||||
}
|
||||
},
|
||||
"actionRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "type"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique action identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "Action type",
|
||||
"type": "string"
|
||||
},
|
||||
"payload": {
|
||||
"description": "Action payload value (string or expression)",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"contentActionRef": {
|
||||
"type": "object",
|
||||
"required": ["id"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique action identifier.",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "Element type",
|
||||
"type": "string",
|
||||
"enum": ["default", "button", "separator", "menu", "custom"]
|
||||
},
|
||||
"title": {
|
||||
"description": "Element title",
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"description": "Element description, used for the tooltips.",
|
||||
"type": "string"
|
||||
},
|
||||
"description-disabled": {
|
||||
"description": "Description to use when element is in the disabled state.",
|
||||
"type": "string"
|
||||
},
|
||||
"order": {
|
||||
"description": "Element order",
|
||||
"type": "number"
|
||||
},
|
||||
"icon": {
|
||||
"description": "Element icon",
|
||||
"type": "string"
|
||||
},
|
||||
"disabled": {
|
||||
"description": "Toggles disabled state",
|
||||
"type": "boolean"
|
||||
},
|
||||
"component": {
|
||||
"description": "Custom component id (requires type to be 'custom')",
|
||||
"type": "string"
|
||||
},
|
||||
"children": {
|
||||
"description": "Child entries for the container types.",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"actions": {
|
||||
"description": "Element actions",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"click": {
|
||||
"description": "Action reference for the click handler",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
},
|
||||
"rules": {
|
||||
"description": "Element rules",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"enabled": {
|
||||
"description": "Rule to evaluate the enabled state",
|
||||
"type": "string"
|
||||
},
|
||||
"visible": {
|
||||
"description": "Rule to evaluate the visibility state",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"navBarLinkRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "icon", "title"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"icon": {
|
||||
"description": "Element icon",
|
||||
"type": "string"
|
||||
},
|
||||
"title": {
|
||||
"description": "Element title",
|
||||
"type": "string"
|
||||
},
|
||||
"route": {
|
||||
"description": "Route reference identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"description": {
|
||||
"description": "Element description or tooltip",
|
||||
"type": "string"
|
||||
},
|
||||
"order": {
|
||||
"description": "Element order",
|
||||
"type": "number"
|
||||
},
|
||||
"children": {
|
||||
"description": "Navigation children items",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"title",
|
||||
"route"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"title": {
|
||||
"description": "Element title",
|
||||
"type": "string"
|
||||
},
|
||||
"route": {
|
||||
"description": "Route reference identifier",
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"not": {
|
||||
"required": ["children"]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"minItems": 1
|
||||
},
|
||||
"rules": {
|
||||
"description": "Element rules",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"visible": {
|
||||
"description": "Rule to evaluate the visibility state",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"oneOf": [
|
||||
{
|
||||
"required": ["route"],
|
||||
"not": {
|
||||
"required": ["children"]
|
||||
}
|
||||
},
|
||||
{
|
||||
"required": ["children"],
|
||||
"not": {
|
||||
"required": ["route"]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"navBarGroupRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "items"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier for the navigation group",
|
||||
"type": "string"
|
||||
},
|
||||
"items": {
|
||||
"description": "Navigation group items",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/navBarLinkRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"order": {
|
||||
"description": "Group order",
|
||||
"type": "number"
|
||||
},
|
||||
"rules": {
|
||||
"description": "Element rules",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"visible": {
|
||||
"description": "Rule to evaluate the visibility state",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sidebarTabRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "component"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier for the navigation group",
|
||||
"type": "string"
|
||||
},
|
||||
"title": {
|
||||
"description": "Element title",
|
||||
"type": "string"
|
||||
},
|
||||
"component": {
|
||||
"description": "Component id",
|
||||
"type": "string"
|
||||
},
|
||||
"icon": {
|
||||
"description": "Material icon name",
|
||||
"type": "string"
|
||||
},
|
||||
"disabled": {
|
||||
"description": "Toggles disabled state",
|
||||
"type": "boolean"
|
||||
},
|
||||
"order": {
|
||||
"description": "Element order",
|
||||
"type": "number"
|
||||
},
|
||||
"rules": {
|
||||
"description": "Element rules",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"visible": {
|
||||
"description": "Rule to evaluate the visibility state",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"viewerExtensionRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "component", "fileExtension"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier for the navigation group",
|
||||
"type": "string"
|
||||
},
|
||||
"component": {
|
||||
"description": "Component id",
|
||||
"type": "string"
|
||||
},
|
||||
"fileExtension": {
|
||||
"description": "Target file extension",
|
||||
"type": "string"
|
||||
},
|
||||
"order": {
|
||||
"description": "Group order",
|
||||
"type": "number"
|
||||
},
|
||||
"disabled": {
|
||||
"description": "Toggles the disabled state",
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
},
|
||||
"content-metadata-aspect": {
|
||||
"description": "Content metadata aspect definition",
|
||||
"type": "object",
|
||||
"required": ["id"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Unique identifier"
|
||||
}
|
||||
},
|
||||
"patternProperties": {
|
||||
".*": {
|
||||
"oneOf": [
|
||||
{
|
||||
"description": "Wildcard for every property",
|
||||
"type": "string",
|
||||
"pattern": "^\\*$"
|
||||
},
|
||||
{
|
||||
"description": "Properties array",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"description": "Property name",
|
||||
"type": "string"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
"content-metadata-layout-group": {
|
||||
"description": "Content metadata's layout groups definition",
|
||||
"type": "array",
|
||||
"items": [
|
||||
{
|
||||
"description": "Content metadata's one layout group definition",
|
||||
"type": "object",
|
||||
"required": ["id"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Unique identifier"
|
||||
},
|
||||
"title": {
|
||||
"type": "string",
|
||||
"description": "Content metadata's one layout group definition's title"
|
||||
},
|
||||
"items": {
|
||||
"type": "array",
|
||||
"description": "Content metadata's one layout group definition's items",
|
||||
"items": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"aspect",
|
||||
"properties"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"aspect": {
|
||||
"description": "Aspect group",
|
||||
"type": "string"
|
||||
},
|
||||
"properties": {
|
||||
"description": "Wildcard character",
|
||||
"type": "string",
|
||||
"pattern": "^\\*$"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"aspect",
|
||||
"properties"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"aspect": {
|
||||
"description": "Aspect group",
|
||||
"type": "string"
|
||||
},
|
||||
"properties": {
|
||||
"description": "list of aspect properties",
|
||||
"type": "array"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"type",
|
||||
"properties"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "Type group",
|
||||
"type": "string"
|
||||
},
|
||||
"properties": {
|
||||
"description": "Wildcard character",
|
||||
"type": "string",
|
||||
"pattern": "^\\*$"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"type",
|
||||
"properties"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "Type group",
|
||||
"type": "string"
|
||||
},
|
||||
"properties": {
|
||||
"description": "list of type properties",
|
||||
"type": "array"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
"required": [
|
||||
"id",
|
||||
"disabled"
|
||||
],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier",
|
||||
"type": "string"
|
||||
},
|
||||
"disabled": {
|
||||
"description": "Toggles disabled state",
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"documentListPresetRef": {
|
||||
"type": "object",
|
||||
"required": ["id", "key", "type"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"description": "Unique identifier.",
|
||||
"type": "string"
|
||||
},
|
||||
"key": {
|
||||
"description": "Property key",
|
||||
"type": "string"
|
||||
},
|
||||
"type": {
|
||||
"description": "Column type",
|
||||
"type": "string",
|
||||
"enum": ["text", "image", "date", "fileSize"]
|
||||
},
|
||||
"title": {
|
||||
"description": "Column title",
|
||||
"type": "string"
|
||||
},
|
||||
"format": {
|
||||
"description": "Column format",
|
||||
"type": "string"
|
||||
},
|
||||
"class": {
|
||||
"description": "CSS class name",
|
||||
"type": "string"
|
||||
},
|
||||
"sortable": {
|
||||
"description": "Toggles sortable state of the column",
|
||||
"type": "boolean"
|
||||
},
|
||||
"template": {
|
||||
"description": "Column template id",
|
||||
"type": "string"
|
||||
},
|
||||
"desktopOnly": {
|
||||
"description": "Display column only for large screens",
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"type": "object",
|
||||
"required": ["$name", "$version"],
|
||||
"properties": {
|
||||
"$name": {
|
||||
"description": "Extension name",
|
||||
"type": "string"
|
||||
},
|
||||
"$version": {
|
||||
"description": "Extension version",
|
||||
"type": "string"
|
||||
},
|
||||
"$description": {
|
||||
"description": "Brief description on what the extension does"
|
||||
},
|
||||
"$references": {
|
||||
"description": "References to external files",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"minItems": 0,
|
||||
"uniqueItems": true
|
||||
},
|
||||
"rules": {
|
||||
"description": "List of rule definitions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/ruleRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"routes": {
|
||||
"description": "List of custom application routes",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/routeRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"actions": {
|
||||
"description": "List of action definitions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/actionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"features": {
|
||||
"description": "Application-specific features and extensions",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"header": {
|
||||
"description": "Application header extensions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"create": {
|
||||
"description": "The [New] menu component extensions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"viewer": {
|
||||
"description": "Viewer component extensions",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"openWith": {
|
||||
"description": "The [Open With] menu extensions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"toolbarMoreMenu": {
|
||||
"description": "Toolbar entries from the More actions menu",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"toolbarActions": {
|
||||
"description": "Toolbar entries from outside the More menu",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"content": {
|
||||
"description": "Viewer content extensions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/viewerExtensionRef" },
|
||||
"minItems": 1
|
||||
}
|
||||
}
|
||||
},
|
||||
"navbar": {
|
||||
"description": "Navigation bar extensions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/navBarGroupRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"sidebar": {
|
||||
"description": "Sidebar extensions",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/sidebarTabRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"toolbar": {
|
||||
"description": "Toolbar entries",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"contextMenu": {
|
||||
"description": "Context menu entries",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/contentActionRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"content-metadata-presets": {
|
||||
"description": "Configuration for the presets for content metadata component",
|
||||
"type": "array",
|
||||
"items": {
|
||||
"type": "object",
|
||||
"required": ["id"],
|
||||
"properties": {
|
||||
"id": {
|
||||
"type": "string",
|
||||
"description": "Unique identifier"
|
||||
}
|
||||
},
|
||||
"patternProperties": {
|
||||
".*": {
|
||||
"oneOf": [
|
||||
{
|
||||
"type": "string",
|
||||
"pattern": "^\\*$",
|
||||
"description": "Wildcard for every aspect"
|
||||
},
|
||||
{ "$ref": "#/definitions/content-metadata-aspect" },
|
||||
{ "$ref": "#/definitions/content-metadata-layout-group" }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"documentList": {
|
||||
"description": "Document list extensions",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"files": {
|
||||
"description": "Files document list preset",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/documentListPresetRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"libraries": {
|
||||
"description": "Libraries document list preset",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/documentListPresetRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"shared": {
|
||||
"description": "Shared Files document list preset",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/documentListPresetRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"recent": {
|
||||
"description": "Recent Files document list preset",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/documentListPresetRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"favorites": {
|
||||
"description": "Favorites document list preset",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/documentListPresetRef" },
|
||||
"minItems": 1
|
||||
},
|
||||
"trashcan": {
|
||||
"description": "Trashcan document list preset",
|
||||
"type": "array",
|
||||
"items": { "$ref": "#/definitions/documentListPresetRef" },
|
||||
"minItems": 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -15,21 +15,46 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { NgModule } from '@angular/core';
|
||||
import { DynamicExtensionComponent } from './components/dynamic-component/dynamic.component';
|
||||
import { DynamicTabComponent } from './components/dynamic-tab/dynamic-tab.component';
|
||||
import { DynamicColumnComponent } from './components/dynamic-column/dynamic-column.component';
|
||||
import { PreviewExtensionComponent } from './components/viewer/preview-extension.component';
|
||||
import { NgModule, ModuleWithProviders, APP_INITIALIZER } from '@angular/core';
|
||||
import { AppExtensionService } from './services/app-extension.service';
|
||||
import { setupExtensions } from './services/startup-extension-factory';
|
||||
|
||||
@NgModule({
|
||||
declarations: [
|
||||
DynamicExtensionComponent,
|
||||
DynamicTabComponent,
|
||||
DynamicColumnComponent
|
||||
DynamicColumnComponent,
|
||||
PreviewExtensionComponent
|
||||
],
|
||||
exports: [
|
||||
DynamicExtensionComponent,
|
||||
DynamicTabComponent,
|
||||
DynamicColumnComponent
|
||||
DynamicColumnComponent,
|
||||
PreviewExtensionComponent
|
||||
]
|
||||
})
|
||||
export class ExtensionsModule {}
|
||||
export class ExtensionsModule {
|
||||
static forRoot(): ModuleWithProviders {
|
||||
return {
|
||||
ngModule: ExtensionsModule,
|
||||
providers: [
|
||||
{
|
||||
provide: APP_INITIALIZER,
|
||||
useFactory: setupExtensions,
|
||||
deps: [AppExtensionService],
|
||||
multi: true
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
|
||||
static forChild(): ModuleWithProviders {
|
||||
return {
|
||||
ngModule: ExtensionsModule
|
||||
};
|
||||
}
|
||||
}
|
||||
|
50
lib/extensions/src/lib/services/app-extension.service.ts
Normal file
50
lib/extensions/src/lib/services/app-extension.service.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 Alfresco Software, Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import { Injectable } from '@angular/core';
|
||||
import { ExtensionConfig, ExtensionRef } from '../config/extension.config';
|
||||
import { ExtensionService } from '../services/extension.service';
|
||||
import { Observable, BehaviorSubject } from 'rxjs';
|
||||
|
||||
@Injectable({
|
||||
providedIn: 'root'
|
||||
})
|
||||
export class AppExtensionService {
|
||||
private _references = new BehaviorSubject<ExtensionRef[]>([]);
|
||||
|
||||
references$: Observable<ExtensionRef[]>;
|
||||
|
||||
constructor(protected extensionService: ExtensionService) {
|
||||
this.references$ = this._references.asObservable();
|
||||
}
|
||||
|
||||
async load() {
|
||||
const config = await this.extensionService.load();
|
||||
this.setup(config);
|
||||
}
|
||||
|
||||
setup(config: ExtensionConfig) {
|
||||
if (!config) {
|
||||
return;
|
||||
}
|
||||
|
||||
const references = (config.$references || [])
|
||||
.filter((entry) => typeof entry === 'object')
|
||||
.map((entry) => <ExtensionRef> entry);
|
||||
this._references.next(references);
|
||||
}
|
||||
}
|
@@ -34,38 +34,40 @@ export class ExtensionLoaderService {
|
||||
load(configPath: string, pluginsPath: string): Promise<ExtensionConfig> {
|
||||
return new Promise<any>((resolve) => {
|
||||
this.loadConfig(configPath, 0).then((result) => {
|
||||
let config = result.config;
|
||||
if (result) {
|
||||
let config = result.config;
|
||||
|
||||
const override = sessionStorage.getItem('app.extension.config');
|
||||
if (override) {
|
||||
config = JSON.parse(override);
|
||||
}
|
||||
const override = sessionStorage.getItem('app.extension.config');
|
||||
if (override) {
|
||||
config = JSON.parse(override);
|
||||
}
|
||||
|
||||
if (config.$references && config.$references.length > 0) {
|
||||
const plugins = config.$references.map((name, idx) =>
|
||||
this.loadConfig(`${pluginsPath}/${name}`, idx)
|
||||
);
|
||||
if (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);
|
||||
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);
|
||||
}
|
||||
if (configs.length > 0) {
|
||||
config = mergeObjects(config, ...configs);
|
||||
}
|
||||
|
||||
config = {
|
||||
...config,
|
||||
...this.getMetadata(result.config),
|
||||
$references: configs.map((ext) => this.getMetadata(ext))
|
||||
};
|
||||
config = {
|
||||
...config,
|
||||
...this.getMetadata(result.config),
|
||||
$references: configs.map((ext) => this.getMetadata(ext))
|
||||
};
|
||||
|
||||
resolve(config);
|
||||
});
|
||||
} else {
|
||||
resolve(config);
|
||||
});
|
||||
} else {
|
||||
resolve(config);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -140,6 +142,13 @@ export class ExtensionLoaderService {
|
||||
return [];
|
||||
}
|
||||
|
||||
getFeatures(config: ExtensionConfig): any {
|
||||
if (config) {
|
||||
return config.features || [];
|
||||
}
|
||||
return [];
|
||||
}
|
||||
|
||||
protected setActionDefaults(action: ContentActionRef): ContentActionRef {
|
||||
if (action) {
|
||||
action.type = action.type || ContentActionType.default;
|
||||
|
@@ -34,6 +34,7 @@ export class ExtensionService {
|
||||
rules: Array<RuleRef> = [];
|
||||
routes: Array<RouteRef> = [];
|
||||
actions: Array<ActionRef> = [];
|
||||
features: Array<any> = [];
|
||||
|
||||
authGuards: { [key: string]: Type<{}> } = {};
|
||||
evaluators: { [key: string]: RuleEvaluator } = {};
|
||||
@@ -41,7 +42,8 @@ export class ExtensionService {
|
||||
constructor(
|
||||
private loader: ExtensionLoaderService,
|
||||
private componentRegister: ComponentRegisterService
|
||||
) {}
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads and registers an extension config file and plugins (specified by path properties).
|
||||
@@ -75,6 +77,12 @@ export class ExtensionService {
|
||||
this.rules = this.loader.getRules(config);
|
||||
this.actions = this.loader.getActions(config);
|
||||
this.routes = this.loader.getRoutes(config);
|
||||
this.features = this.loader.getFeatures(config);
|
||||
}
|
||||
|
||||
getFeature(key: string): any[] {
|
||||
let properties: string[] = Array.isArray(key) ? [key] : key.split('.');
|
||||
return properties.reduce((prev, curr) => prev && prev[curr], this.features) || [];
|
||||
}
|
||||
|
||||
/**
|
||||
|
22
lib/extensions/src/lib/services/startup-extension-factory.ts
Normal file
22
lib/extensions/src/lib/services/startup-extension-factory.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
/*!
|
||||
* @license
|
||||
* Copyright 2019 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 { AppExtensionService } from './app-extension.service';
|
||||
|
||||
export function setupExtensions(appExtensionService: AppExtensionService): Function {
|
||||
return () => appExtensionService.load();
|
||||
}
|
@@ -15,6 +15,8 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
export * from './lib/extensions.module';
|
||||
|
||||
export * from './lib/config/action.extensions';
|
||||
export * from './lib/config/extension-element';
|
||||
export * from './lib/config/extension-utils';
|
||||
@@ -29,10 +31,11 @@ export * from './lib/config/viewer.extensions';
|
||||
export * from './lib/services/extension-loader.service';
|
||||
export * from './lib/services/extension.service';
|
||||
export * from './lib/services/component-register.service';
|
||||
export * from './lib/services/app-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/store/states/repository.state';
|
||||
|
||||
export * from './lib/extensions.module';
|
||||
export * from './lib/components/public-api';
|
||||
|
Reference in New Issue
Block a user