diff --git a/src/app/extensions/extension.service.spec.ts b/src/app/extensions/extension.service.spec.ts index 0583b55a9..4734aaa53 100644 --- a/src/app/extensions/extension.service.spec.ts +++ b/src/app/extensions/extension.service.spec.ts @@ -540,6 +540,35 @@ describe('AppExtensionService', () => { expect(items.length).toBe(1); expect(items[0].id).toBe(2); }); + + it('should filter out all disabled items', () => { + const items = [ + { id: '1', disabled: true }, + { + id: '2', + someItems: [ + { id: '21', disabled: true }, + { id: '22', disabled: false }, + { id: '23' } + ], + someObjectProp: { + innerItems: [{ id: '24' }, { id: '25', disabled: true }] + } + }, + { id: 3, disabled: true } + ]; + + const result = service.filterDisabled(items); + + expect(result.length).toBe(1); + expect(result[0].id).toBe('2'); + expect(result[0].someItems.length).toBe(2); + expect(result[0].someItems[0].id).toBe('22'); + expect(result[0].someItems[1].id).toBe('23'); + expect(result[0].someObjectProp).not.toBeNull(); + expect(result[0].someObjectProp.innerItems.length).toBe(1); + expect(result[0].someObjectProp.innerItems[0].id).toBe('24'); + }); }); it('should reduce duplicate separators', () => { diff --git a/src/app/extensions/extension.service.ts b/src/app/extensions/extension.service.ts index 57c3ce2b6..d83fe79ba 100644 --- a/src/app/extensions/extension.service.ts +++ b/src/app/extensions/extension.service.ts @@ -46,8 +46,10 @@ import { reduceSeparators, reduceEmptyMenus, ExtensionService, - ProfileState + ProfileState, + mergeObjects } from '@alfresco/adf-extensions'; +import { AppConfigService } from '@alfresco/adf-core'; @Injectable({ providedIn: 'root' @@ -68,6 +70,7 @@ export class AppExtensionService implements RuleContext { createActions: Array = []; navbar: Array = []; sidebar: Array = []; + contentMetadata: any; selection: SelectionState; navigation: NavigationState; @@ -77,7 +80,8 @@ export class AppExtensionService implements RuleContext { private store: Store, private loader: ExtensionLoaderService, private extensions: ExtensionService, - public permissions: NodePermissionService + public permissions: NodePermissionService, + private appConfig: AppConfigService ) { this.store.select(ruleContext).subscribe(result => { this.selection = result.selection; @@ -133,6 +137,7 @@ export class AppExtensionService implements RuleContext { config, 'features.sidebar' ); + this.contentMetadata = this.loadContentMetadata(config); } protected loadNavBar(config: ExtensionConfig): Array { @@ -159,6 +164,40 @@ export class AppExtensionService implements RuleContext { }); } + loadContentMetadata(config: ExtensionConfig): any { + const elements = this.loader.getElements( + config, + 'features.content-metadata-presets' + ); + let presets = {}; + presets = this.filterDisabled(mergeObjects(presets, ...elements)); + + try { + this.appConfig.config['content-metadata'] = { presets }; + } catch (error) { + console.error(error); + } + + return presets; + } + + filterDisabled(object) { + if (Array.isArray(object)) { + return object + .filter(item => !item.disabled) + .map(item => this.filterDisabled(item)); + } else if (typeof object === 'object') { + if (!object.disabled) { + Object.keys(object).forEach(prop => { + object[prop] = this.filterDisabled(object[prop]); + }); + return object; + } + } else { + return object; + } + } + getNavigationGroups(): Array { return this.navbar; } diff --git a/src/assets/app.extensions.json b/src/assets/app.extensions.json index 8afaa93b1..1b581c7ed 100644 --- a/src/assets/app.extensions.json +++ b/src/assets/app.extensions.json @@ -6,7 +6,8 @@ "plugin1.json", "dev.tools.json", "app.header.json", - "app.create.json" + "app.create.json", + "metadata-plugin.json" ], "rules": [ @@ -827,6 +828,37 @@ "title": "APP.INFO_DRAWER.TABS.VERSIONS", "component": "app.components.tabs.versions" } + ], + "content-metadata-presets": [ + { + "id": "app.content.metadata.custom", + "custom": [ + { + "id": "app.content.metadata.customGroup", + "title": "APP.CONTENT_METADATA.EXIF_GROUP_TITLE", + "items": [ + { + "id": "app.content.metadata.exifAspect", + "aspect": "exif:exif", + "properties": [ + "exif:pixelXDimension", + "exif:pixelYDimension", + "exif:dateTimeOriginal", + "exif:exposureTime", + "exif:fNumber", + "exif:flash", + "exif:focalLength", + "exif:isoSpeedRatings", + "exif:orientation", + "exif:manufacturer", + "exif:model", + "exif:software" + ] + } + ] + } + ] + } ] } } diff --git a/src/assets/extension.schema.json b/src/assets/extension.schema.json index e801b081f..a8a7011a3 100644 --- a/src/assets/extension.schema.json +++ b/src/assets/extension.schema.json @@ -294,6 +294,127 @@ "type": "boolean" } } + }, + "content-metadata-aspect": { + "description": "Content metadata's aspect definition", + "type": "object", + "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": [ + "title", + "items" + ], + "properties": { + "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": [ + "aspect", + "properties" + ], + "properties": { + "aspect": { + "description": "Aspect group", + "type": "string" + }, + "properties": { + "description": "Wildcard character", + "type": "string", + "pattern": "^\\*$" + } + } + }, + { + "type": "object", + "required": [ + "aspect", + "properties" + ], + "properties": { + "aspect": { + "description": "Aspect group", + "type": "string" + }, + "properties": { + "description": "list of aspect properties", + "type": "array" + } + } + }, + { + "type": "object", + "required": [ + "type", + "properties" + ], + "properties": { + "type": { + "description": "Type group", + "type": "string" + }, + "properties": { + "description": "Wildcard character", + "type": "string", + "pattern": "^\\*$" + } + } + }, + { + "type": "object", + "required": [ + "type", + "properties" + ], + "properties": { + "type": { + "description": "Type group", + "type": "string" + }, + "properties": { + "description": "list of type properties", + "type": "array" + } + } + } + ] + } + } + } + } + ] } }, @@ -407,6 +528,27 @@ "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"], + "patternProperties": { + ".*": { + "oneOf": [ + { + "type": "string", + "pattern": "^\\*$", + "description": "Wildcard for every aspect" + }, + { "$ref": "#/definitions/content-metadata-aspect" }, + { "$ref": "#/definitions/content-metadata-layout-group" } + ] + } + } + } } } } diff --git a/src/assets/plugins/metadata-plugin.json b/src/assets/plugins/metadata-plugin.json new file mode 100644 index 000000000..c32332dcd --- /dev/null +++ b/src/assets/plugins/metadata-plugin.json @@ -0,0 +1,56 @@ +{ + "$schema": "../../../extension.schema.json", + "$version": "1.0.0", + "$name": "metadata-plugin", + "$description": "metadata card configuration plugin - testing purpose", + "features": { + "content-metadata-presets": [ + { + "id": "app.content.metadata.custom", + "custom": [ + { + "id": "app.content.metadata.customGroup", + "title": "testing extension props", + "items": [ + { + "id": "app.content.metadata.exifAspect", + "disabled": true + }, + { + "id": "app.content.metadata.exifAspect2", + "aspect": "exif:exif", + "properties": [ + "exif:orientation", + "exif:manufacturer", + "exif:model", + "exif:software" + ] + } + ] + }, + { + "id": "app.content.metadata.customGroup2", + "title": "testing extension props2", + "items": [ + { + "id": "app.content.metadata.exifAspect", + "aspect": "exif:exif", + "properties": [ + "exif:pixelXDimension", + "exif:pixelYDimension", + "exif:dateTimeOriginal" + ] + } + ] + } + ] + }, + { + "kitten-images": { + "custom:aspect": "*", + "exif:exif": [ "exif:pixelXDimension", "exif:pixelYDimension"] + } + } + ] + } +}